diff --git a/generated/googleapis/CHANGELOG.md b/generated/googleapis/CHANGELOG.md
index 3ece7df..8e0209c 100644
--- a/generated/googleapis/CHANGELOG.md
+++ b/generated/googleapis/CHANGELOG.md
@@ -1,3 +1,34 @@
+## 0.40.0
+
+* [api] classroom:v1
+* [api] content:v2
+* [api] content:v2sandbox
+* [api] androiddeviceprovisioning:v1
+* [api] monitoring:v3
+* [api] storage:v1
+* [api] androidpublisher:v2
+* [api] androidmanagement:v1
+* [api] cloudtrace:v2
+* [api] youtubereporting:v1
+* [api] servicecontrol:v1
+* [api] cloudbuild:v1
+* [api] calendar:v3
+* [api] slides:v1
+* [api] bigquery:v2
+* [api] ml:v1
+* [api] sheets:v4
+* [api] testing:v1
+* [api] safebrowsing:v4
+* [api] androidenterprise:v1
+* [api] admin:reports_v1
+* [api] admin:directory_v1
+* [api-breaking] cloudtrace:v2
+* [api-breaking] youtubereporting:v1
+* [api-breaking] iam:v1
+* [api-breaking] speech:v1
+* [api-breaking] youtube:v3
+* [api-removed] consumersurveys:v2
+
 ## 0.47.1
 
 * [api-new] oslogin:v1
diff --git a/generated/googleapis/README.md b/generated/googleapis/README.md
index 30404c3..e9c56ca 100644
--- a/generated/googleapis/README.md
+++ b/generated/googleapis/README.md
@@ -68,6 +68,12 @@
 The following is a list of APIs that are currently available inside this
 package.
 
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Abusive Experience Report API - abusiveexperiencereport v1
+
+View Abusive Experience Report data, and get a list of sites that have a significant number of abusive experiences.
+
+Official API documentation: https://developers.google.com/abusive-experience-report/
+
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Accelerated Mobile Pages (AMP) URL API - acceleratedmobilepageurl v1
 
 Retrieves the list of AMP URLs (and equivalent AMP Cache URLs) for a given list of public URL(s).
@@ -282,6 +288,13 @@
 
 Official API documentation: https://cloud.google.com/resource-manager
 
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Cloud Shell API - cloudshell v1
+
+Allows users to start, configure, and connect to interactive shell sessions running in the cloud.
+
+
+Official API documentation: https://cloud.google.com/shell/docs/
+
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Stackdriver Trace API - cloudtrace v1
 
 Sends application trace data to Stackdriver Trace for viewing. Trace data is collected for all App Engine applications by default. Trace data from other applications can be provided using this API.
@@ -302,13 +315,9 @@
 
 Official API documentation: https://developers.google.com/compute/docs/reference/latest/
 
-#### ![Logo](https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png) Consumer Surveys API - consumersurveys v2
-
-Creates and conducts surveys, lists the surveys that an authenticated user owns, and retrieves survey results and information about specified surveys.
-
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Container Engine API - container v1
 
-The Google Container Engine API is used for building and managing container based applications, powered by the open source Kubernetes technology.
+The Google Kubernetes Engine API is used for building and managing container based applications, powered by the open source Kubernetes technology.
 
 Official API documentation: https://cloud.google.com/container-engine/
 
@@ -361,6 +370,12 @@
 
 Official API documentation: https://developers.google.com/doubleclick-advertisers/
 
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Digital Asset Links API - digitalassetlinks v1
+
+API for discovering relationships between online assets such as web sites or mobile apps.
+
+Official API documentation: https://developers.google.com/digital-asset-links/
+
 #### ![Logo](http://www.google.com/images/icons/feature/filing_cabinet_search-g16.png) APIs Discovery Service - discovery v1
 
 Provides information about other Google APIs, such as what APIs are available, the resource, and method details for each API.
@@ -595,7 +610,7 @@
 The Poly API provides read-only access to assets hosted on <a href="https://poly.google.com">poly.google.com</a>.
 
 
-Official API documentation: https://devsite.googleplex.com/poly/
+Official API documentation: https://developers.google.com/poly/
 
 #### ![Logo](https://www.google.com/images/icons/feature/predictionapi-16.png) Prediction API - prediction v1.6
 
diff --git a/generated/googleapis/lib/abusiveexperiencereport/v1.dart b/generated/googleapis/lib/abusiveexperiencereport/v1.dart
new file mode 100644
index 0000000..1aca944
--- /dev/null
+++ b/generated/googleapis/lib/abusiveexperiencereport/v1.dart
@@ -0,0 +1,247 @@
+// This is a generated file (see the discoveryapis_generator project).
+
+library googleapis.abusiveexperiencereport.v1;
+
+import 'dart:core' as core;
+import 'dart:async' as async;
+import 'dart:convert' as convert;
+
+import 'package:_discoveryapis_commons/_discoveryapis_commons.dart' as commons;
+import 'package:http/http.dart' as http;
+
+export 'package:_discoveryapis_commons/_discoveryapis_commons.dart'
+    show ApiRequestError, DetailedApiRequestError;
+
+const core.String USER_AGENT = 'dart-api-client abusiveexperiencereport/v1';
+
+/// View Abusive Experience Report data, and get a list of sites that have a
+/// significant number of abusive experiences.
+class AbusiveexperiencereportApi {
+  /// Test scope for access to the Zoo service
+  static const XapiZooScope = "https://www.googleapis.com/auth/xapi.zoo";
+
+  final commons.ApiRequester _requester;
+
+  SitesResourceApi get sites => new SitesResourceApi(_requester);
+  ViolatingSitesResourceApi get violatingSites =>
+      new ViolatingSitesResourceApi(_requester);
+
+  AbusiveexperiencereportApi(http.Client client,
+      {core.String rootUrl: "https://abusiveexperiencereport.googleapis.com/",
+      core.String servicePath: ""})
+      : _requester =
+            new commons.ApiRequester(client, rootUrl, servicePath, USER_AGENT);
+}
+
+class SitesResourceApi {
+  final commons.ApiRequester _requester;
+
+  SitesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets a summary of the abusive experience rating of a site.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - The required site name. This is the site property whose abusive
+  /// experiences have been reviewed, and it must be URL-encoded. For example,
+  /// sites/https%3A%2F%2Fwww.google.com. The server will return an error of
+  /// BAD_REQUEST if this field is not filled in. Note that if the site property
+  /// is not yet verified in Search Console, the reportUrl field
+  /// returned by the API will lead to the verification page, prompting the user
+  /// to go through that process before they can gain access to the Abusive
+  /// Experience Report.
+  /// Value must have pattern "^sites/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [SiteSummaryResponse].
+  ///
+  /// Completes with a [commons.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<SiteSummaryResponse> get(core.String name,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (name == null) {
+      throw new core.ArgumentError("Parameter name is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$name');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new SiteSummaryResponse.fromJson(data));
+  }
+}
+
+class ViolatingSitesResourceApi {
+  final commons.ApiRequester _requester;
+
+  ViolatingSitesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Lists sites with Abusive Experience Report statuses of "Failing".
+  ///
+  /// Request parameters:
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ViolatingSitesResponse].
+  ///
+  /// Completes with a [commons.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<ViolatingSitesResponse> list({core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/violatingSites';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ViolatingSitesResponse.fromJson(data));
+  }
+}
+
+/// Response message for GetSiteSummary.
+class SiteSummaryResponse {
+  /// The status of the site reviewed for the abusive experiences.
+  /// Possible string values are:
+  /// - "UNKNOWN" : Not reviewed.
+  /// - "PASSING" : Passing.
+  /// - "FAILING" : Failing.
+  core.String abusiveStatus;
+
+  /// The date on which enforcement begins.
+  core.String enforcementTime;
+
+  /// The abusive experience enforcement status of the site.
+  /// Possible string values are:
+  /// - "UNKNOWN" : N/A.
+  /// - "ON" : Ad filtering is on.
+  /// - "OFF" : Ad filtering is off.
+  /// - "PAUSED" : Ad filtering is paused.
+  /// - "PENDING" : Ad filtering is pending.
+  core.String filterStatus;
+
+  /// The last time that the site changed status.
+  core.String lastChangeTime;
+
+  /// A link that leads to a full abusive experience report.
+  core.String reportUrl;
+
+  /// The name of the site reviewed.
+  core.String reviewedSite;
+
+  /// Whether the site is currently under review.
+  core.bool underReview;
+
+  SiteSummaryResponse();
+
+  SiteSummaryResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("abusiveStatus")) {
+      abusiveStatus = _json["abusiveStatus"];
+    }
+    if (_json.containsKey("enforcementTime")) {
+      enforcementTime = _json["enforcementTime"];
+    }
+    if (_json.containsKey("filterStatus")) {
+      filterStatus = _json["filterStatus"];
+    }
+    if (_json.containsKey("lastChangeTime")) {
+      lastChangeTime = _json["lastChangeTime"];
+    }
+    if (_json.containsKey("reportUrl")) {
+      reportUrl = _json["reportUrl"];
+    }
+    if (_json.containsKey("reviewedSite")) {
+      reviewedSite = _json["reviewedSite"];
+    }
+    if (_json.containsKey("underReview")) {
+      underReview = _json["underReview"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (abusiveStatus != null) {
+      _json["abusiveStatus"] = abusiveStatus;
+    }
+    if (enforcementTime != null) {
+      _json["enforcementTime"] = enforcementTime;
+    }
+    if (filterStatus != null) {
+      _json["filterStatus"] = filterStatus;
+    }
+    if (lastChangeTime != null) {
+      _json["lastChangeTime"] = lastChangeTime;
+    }
+    if (reportUrl != null) {
+      _json["reportUrl"] = reportUrl;
+    }
+    if (reviewedSite != null) {
+      _json["reviewedSite"] = reviewedSite;
+    }
+    if (underReview != null) {
+      _json["underReview"] = underReview;
+    }
+    return _json;
+  }
+}
+
+/// Response message for ListViolatingSites.
+class ViolatingSitesResponse {
+  /// A list of summaries of violating sites.
+  core.List<SiteSummaryResponse> violatingSites;
+
+  ViolatingSitesResponse();
+
+  ViolatingSitesResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("violatingSites")) {
+      violatingSites = _json["violatingSites"]
+          .map((value) => new SiteSummaryResponse.fromJson(value))
+          .toList();
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (violatingSites != null) {
+      _json["violatingSites"] =
+          violatingSites.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
diff --git a/generated/googleapis/lib/admin/directory_v1.dart b/generated/googleapis/lib/admin/directory_v1.dart
index d50e6b5..ab42fc7 100644
--- a/generated/googleapis/lib/admin/directory_v1.dart
+++ b/generated/googleapis/lib/admin/directory_v1.dart
@@ -3221,12 +3221,345 @@
 class ResourcesResourceApi {
   final commons.ApiRequester _requester;
 
+  ResourcesBuildingsResourceApi get buildings =>
+      new ResourcesBuildingsResourceApi(_requester);
   ResourcesCalendarsResourceApi get calendars =>
       new ResourcesCalendarsResourceApi(_requester);
+  ResourcesFeaturesResourceApi get features =>
+      new ResourcesFeaturesResourceApi(_requester);
 
   ResourcesResourceApi(commons.ApiRequester client) : _requester = client;
 }
 
+class ResourcesBuildingsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ResourcesBuildingsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Deletes a building.
+  ///
+  /// Request parameters:
+  ///
+  /// [customer] - The unique ID for the customer's G Suite account. As an
+  /// account administrator, you can also use the my_customer alias to represent
+  /// your account's customer ID.
+  ///
+  /// [buildingId] - The ID of the building to delete.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [commons.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 delete(core.String customer, core.String buildingId,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (customer == null) {
+      throw new core.ArgumentError("Parameter customer is required.");
+    }
+    if (buildingId == null) {
+      throw new core.ArgumentError("Parameter buildingId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'customer/' +
+        commons.Escaper.ecapeVariable('$customer') +
+        '/resources/buildings/' +
+        commons.Escaper.ecapeVariable('$buildingId');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Retrieves a building.
+  ///
+  /// Request parameters:
+  ///
+  /// [customer] - The unique ID for the customer's G Suite account. As an
+  /// account administrator, you can also use the my_customer alias to represent
+  /// your account's customer ID.
+  ///
+  /// [buildingId] - The unique ID of the building to retrieve.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Building].
+  ///
+  /// Completes with a [commons.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<Building> get(core.String customer, core.String buildingId,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (customer == null) {
+      throw new core.ArgumentError("Parameter customer is required.");
+    }
+    if (buildingId == null) {
+      throw new core.ArgumentError("Parameter buildingId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'customer/' +
+        commons.Escaper.ecapeVariable('$customer') +
+        '/resources/buildings/' +
+        commons.Escaper.ecapeVariable('$buildingId');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Building.fromJson(data));
+  }
+
+  /// Inserts a building.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [customer] - The unique ID for the customer's G Suite account. As an
+  /// account administrator, you can also use the my_customer alias to represent
+  /// your account's customer ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Building].
+  ///
+  /// Completes with a [commons.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<Building> insert(Building request, core.String customer,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (customer == null) {
+      throw new core.ArgumentError("Parameter customer is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'customer/' +
+        commons.Escaper.ecapeVariable('$customer') +
+        '/resources/buildings';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Building.fromJson(data));
+  }
+
+  /// Retrieves a list of buildings for an account.
+  ///
+  /// Request parameters:
+  ///
+  /// [customer] - The unique ID for the customer's G Suite account. As an
+  /// account administrator, you can also use the my_customer alias to represent
+  /// your account's customer ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Buildings].
+  ///
+  /// Completes with a [commons.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<Buildings> list(core.String customer, {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (customer == null) {
+      throw new core.ArgumentError("Parameter customer is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'customer/' +
+        commons.Escaper.ecapeVariable('$customer') +
+        '/resources/buildings';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Buildings.fromJson(data));
+  }
+
+  /// Updates a building. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [customer] - The unique ID for the customer's G Suite account. As an
+  /// account administrator, you can also use the my_customer alias to represent
+  /// your account's customer ID.
+  ///
+  /// [buildingId] - The ID of the building to update.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Building].
+  ///
+  /// Completes with a [commons.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<Building> patch(
+      Building request, core.String customer, core.String buildingId,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (customer == null) {
+      throw new core.ArgumentError("Parameter customer is required.");
+    }
+    if (buildingId == null) {
+      throw new core.ArgumentError("Parameter buildingId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'customer/' +
+        commons.Escaper.ecapeVariable('$customer') +
+        '/resources/buildings/' +
+        commons.Escaper.ecapeVariable('$buildingId');
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Building.fromJson(data));
+  }
+
+  /// Updates a building.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [customer] - The unique ID for the customer's G Suite account. As an
+  /// account administrator, you can also use the my_customer alias to represent
+  /// your account's customer ID.
+  ///
+  /// [buildingId] - The ID of the building to update.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Building].
+  ///
+  /// Completes with a [commons.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<Building> update(
+      Building request, core.String customer, core.String buildingId,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (customer == null) {
+      throw new core.ArgumentError("Parameter customer is required.");
+    }
+    if (buildingId == null) {
+      throw new core.ArgumentError("Parameter buildingId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'customer/' +
+        commons.Escaper.ecapeVariable('$customer') +
+        '/resources/buildings/' +
+        commons.Escaper.ecapeVariable('$buildingId');
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Building.fromJson(data));
+  }
+}
+
 class ResourcesCalendarsResourceApi {
   final commons.ApiRequester _requester;
 
@@ -3404,8 +3737,22 @@
   /// [maxResults] - Maximum number of results to return.
   /// Value must be between "1" and "500".
   ///
+  /// [orderBy] - Field(s) to sort results by in either ascending or descending
+  /// order. Supported fields include resourceId, resourceName, capacity,
+  /// buildingId, and floorName. If no order is specified, defaults to
+  /// ascending. Should be of the form "field [asc|desc], field [asc|desc],
+  /// ...". For example buildingId, capacity desc would return results sorted
+  /// first by buildingId in ascending order then by capacity in descending
+  /// order.
+  ///
   /// [pageToken] - Token to specify the next page in the list.
   ///
+  /// [query] - String query used to filter results. Should be of the form
+  /// "field operator value" where field can be any of supported fields and
+  /// operators can be any of supported operations. Operators include '=' for
+  /// exact match and ':' for prefix match where applicable. For prefix match,
+  /// the value should always be followed by a *.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -3417,7 +3764,11 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<CalendarResources> list(core.String customer,
-      {core.int maxResults, core.String pageToken, core.String $fields}) {
+      {core.int maxResults,
+      core.String orderBy,
+      core.String pageToken,
+      core.String query,
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -3431,9 +3782,15 @@
     if (maxResults != null) {
       _queryParams["maxResults"] = ["${maxResults}"];
     }
+    if (orderBy != null) {
+      _queryParams["orderBy"] = [orderBy];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (query != null) {
+      _queryParams["query"] = [query];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -3578,6 +3935,401 @@
   }
 }
 
+class ResourcesFeaturesResourceApi {
+  final commons.ApiRequester _requester;
+
+  ResourcesFeaturesResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Deletes a feature.
+  ///
+  /// Request parameters:
+  ///
+  /// [customer] - The unique ID for the customer's G Suite account. As an
+  /// account administrator, you can also use the my_customer alias to represent
+  /// your account's customer ID.
+  ///
+  /// [featureKey] - The unique ID of the feature to delete.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [commons.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 delete(core.String customer, core.String featureKey,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (customer == null) {
+      throw new core.ArgumentError("Parameter customer is required.");
+    }
+    if (featureKey == null) {
+      throw new core.ArgumentError("Parameter featureKey is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'customer/' +
+        commons.Escaper.ecapeVariable('$customer') +
+        '/resources/features/' +
+        commons.Escaper.ecapeVariable('$featureKey');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Retrieves a feature.
+  ///
+  /// Request parameters:
+  ///
+  /// [customer] - The unique ID for the customer's G Suite account. As an
+  /// account administrator, you can also use the my_customer alias to represent
+  /// your account's customer ID.
+  ///
+  /// [featureKey] - The unique ID of the feature to retrieve.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Feature].
+  ///
+  /// Completes with a [commons.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<Feature> get(core.String customer, core.String featureKey,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (customer == null) {
+      throw new core.ArgumentError("Parameter customer is required.");
+    }
+    if (featureKey == null) {
+      throw new core.ArgumentError("Parameter featureKey is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'customer/' +
+        commons.Escaper.ecapeVariable('$customer') +
+        '/resources/features/' +
+        commons.Escaper.ecapeVariable('$featureKey');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Feature.fromJson(data));
+  }
+
+  /// Inserts a feature.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [customer] - The unique ID for the customer's G Suite account. As an
+  /// account administrator, you can also use the my_customer alias to represent
+  /// your account's customer ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Feature].
+  ///
+  /// Completes with a [commons.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<Feature> insert(Feature request, core.String customer,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (customer == null) {
+      throw new core.ArgumentError("Parameter customer is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'customer/' +
+        commons.Escaper.ecapeVariable('$customer') +
+        '/resources/features';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Feature.fromJson(data));
+  }
+
+  /// Retrieves a list of features for an account.
+  ///
+  /// Request parameters:
+  ///
+  /// [customer] - The unique ID for the customer's G Suite account. As an
+  /// account administrator, you can also use the my_customer alias to represent
+  /// your account's customer ID.
+  ///
+  /// [pageToken] - Token to specify the next page in the list.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Features].
+  ///
+  /// Completes with a [commons.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<Features> list(core.String customer,
+      {core.String pageToken, core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (customer == null) {
+      throw new core.ArgumentError("Parameter customer is required.");
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'customer/' +
+        commons.Escaper.ecapeVariable('$customer') +
+        '/resources/features';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Features.fromJson(data));
+  }
+
+  /// Updates a feature. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [customer] - The unique ID for the customer's G Suite account. As an
+  /// account administrator, you can also use the my_customer alias to represent
+  /// your account's customer ID.
+  ///
+  /// [featureKey] - The unique ID of the feature to update.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Feature].
+  ///
+  /// Completes with a [commons.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<Feature> patch(
+      Feature request, core.String customer, core.String featureKey,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (customer == null) {
+      throw new core.ArgumentError("Parameter customer is required.");
+    }
+    if (featureKey == null) {
+      throw new core.ArgumentError("Parameter featureKey is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'customer/' +
+        commons.Escaper.ecapeVariable('$customer') +
+        '/resources/features/' +
+        commons.Escaper.ecapeVariable('$featureKey');
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Feature.fromJson(data));
+  }
+
+  /// Renames a feature.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [customer] - The unique ID for the customer's G Suite account. As an
+  /// account administrator, you can also use the my_customer alias to represent
+  /// your account's customer ID.
+  ///
+  /// [oldName] - The unique ID of the feature to rename.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [commons.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 rename(
+      FeatureRename request, core.String customer, core.String oldName,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (customer == null) {
+      throw new core.ArgumentError("Parameter customer is required.");
+    }
+    if (oldName == null) {
+      throw new core.ArgumentError("Parameter oldName is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'customer/' +
+        commons.Escaper.ecapeVariable('$customer') +
+        '/resources/features/' +
+        commons.Escaper.ecapeVariable('$oldName') +
+        '/rename';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Updates a feature.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [customer] - The unique ID for the customer's G Suite account. As an
+  /// account administrator, you can also use the my_customer alias to represent
+  /// your account's customer ID.
+  ///
+  /// [featureKey] - The unique ID of the feature to update.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Feature].
+  ///
+  /// Completes with a [commons.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<Feature> update(
+      Feature request, core.String customer, core.String featureKey,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (customer == null) {
+      throw new core.ArgumentError("Parameter customer is required.");
+    }
+    if (featureKey == null) {
+      throw new core.ArgumentError("Parameter featureKey is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'customer/' +
+        commons.Escaper.ecapeVariable('$customer') +
+        '/resources/features/' +
+        commons.Escaper.ecapeVariable('$featureKey');
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Feature.fromJson(data));
+  }
+}
+
 class RoleAssignmentsResourceApi {
   final commons.ApiRequester _requester;
 
@@ -6107,49 +6859,258 @@
   }
 }
 
-/// JSON template for Calendar Resource object in Directory API.
-class CalendarResource {
+/// JSON template for Building object in Directory API.
+class Building {
+  /// Unique identifier for the building. The maximum length is 100 characters.
+  core.String buildingId;
+
+  /// The building name as seen by users in Calendar. Must be unique for the
+  /// customer. For example, "NYC-CHEL". The maximum length is 100 characters.
+  core.String buildingName;
+
+  /// The geographic coordinates of the center of the building, expressed as
+  /// latitude and longitude in decimal degrees.
+  BuildingCoordinates coordinates;
+
+  /// A brief description of the building. For example, "Chelsea Market".
+  core.String description;
+
   /// ETag of the resource.
   core.String etags;
 
-  /// The auto-generated name of the calendar resource which includes metadata
-  /// about the resource such as building name, floor, capacity, etc. For
-  /// example, NYC-2-Training Room 1A (16)
+  /// The display names for all floors in this building. The floors are expected
+  /// to be sorted in ascending order, from lowest floor to highest floor. For
+  /// example, ["B2", "B1", "L", "1", "2", "2M", "3", "PH"] Must contain at
+  /// least one entry.
+  core.List<core.String> floorNames;
+
+  /// Kind of resource this is.
+  core.String kind;
+
+  Building();
+
+  Building.fromJson(core.Map _json) {
+    if (_json.containsKey("buildingId")) {
+      buildingId = _json["buildingId"];
+    }
+    if (_json.containsKey("buildingName")) {
+      buildingName = _json["buildingName"];
+    }
+    if (_json.containsKey("coordinates")) {
+      coordinates = new BuildingCoordinates.fromJson(_json["coordinates"]);
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("etags")) {
+      etags = _json["etags"];
+    }
+    if (_json.containsKey("floorNames")) {
+      floorNames = _json["floorNames"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (buildingId != null) {
+      _json["buildingId"] = buildingId;
+    }
+    if (buildingName != null) {
+      _json["buildingName"] = buildingName;
+    }
+    if (coordinates != null) {
+      _json["coordinates"] = (coordinates).toJson();
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (etags != null) {
+      _json["etags"] = etags;
+    }
+    if (floorNames != null) {
+      _json["floorNames"] = floorNames;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// JSON template for coordinates of a building in Directory API.
+class BuildingCoordinates {
+  /// Latitude in decimal degrees.
+  core.double latitude;
+
+  /// Longitude in decimal degrees.
+  core.double longitude;
+
+  BuildingCoordinates();
+
+  BuildingCoordinates.fromJson(core.Map _json) {
+    if (_json.containsKey("latitude")) {
+      latitude = _json["latitude"];
+    }
+    if (_json.containsKey("longitude")) {
+      longitude = _json["longitude"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (latitude != null) {
+      _json["latitude"] = latitude;
+    }
+    if (longitude != null) {
+      _json["longitude"] = longitude;
+    }
+    return _json;
+  }
+}
+
+/// JSON template for Building List Response object in Directory API.
+class Buildings {
+  /// The Buildings in this page of results.
+  core.List<Building> buildings;
+
+  /// ETag of the resource.
+  core.String etag;
+
+  /// Kind of resource this is.
+  core.String kind;
+
+  /// The continuation token, used to page through large result sets. Provide
+  /// this value in a subsequent request to return the next page of results.
+  core.String nextPageToken;
+
+  Buildings();
+
+  Buildings.fromJson(core.Map _json) {
+    if (_json.containsKey("buildings")) {
+      buildings = _json["buildings"]
+          .map((value) => new Building.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("etag")) {
+      etag = _json["etag"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (buildings != null) {
+      _json["buildings"] = buildings.map((value) => (value).toJson()).toList();
+    }
+    if (etag != null) {
+      _json["etag"] = etag;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// JSON template for Calendar Resource object in Directory API.
+class CalendarResource {
+  /// Unique ID for the building a resource is located in.
+  core.String buildingId;
+
+  /// Capacity of a resource, number of seats in a room.
+  core.int capacity;
+
+  /// ETag of the resource.
+  core.String etags;
+
+  ///
+  ///
+  /// The values for Object must be JSON objects. It can consist of `num`,
+  /// `String`, `bool` and `null` as well as `Map` and `List` values.
+  core.Object featureInstances;
+
+  /// Name of the floor a resource is located on.
+  core.String floorName;
+
+  /// Name of the section within a floor a resource is located in.
+  core.String floorSection;
+
+  /// The read-only auto-generated name of the calendar resource which includes
+  /// metadata about the resource such as building name, floor, capacity, etc.
+  /// For example, "NYC-2-Training Room 1A (16)".
   core.String generatedResourceName;
 
   /// The type of the resource. For calendar resources, the value is
   /// admin#directory#resources#calendars#CalendarResource.
   core.String kind;
 
-  /// The brief description of the calendar resource.
+  /// The category of the calendar resource. Either CONFERENCE_ROOM or OTHER.
+  /// Legacy data is set to CATEGORY_UNKNOWN.
+  core.String resourceCategory;
+
+  /// Description of the resource, visible only to admins.
   core.String resourceDescription;
 
-  /// The read-only email ID for the calendar resource. Generated as part of
+  /// The read-only email for the calendar resource. Generated as part of
   /// creating a new calendar resource.
   core.String resourceEmail;
 
   /// The unique ID for the calendar resource.
   core.String resourceId;
 
-  /// The name of the calendar resource. For example, Training Room 1A
+  /// The name of the calendar resource. For example, "Training Room 1A".
   core.String resourceName;
 
-  /// The type of the calendar resource. Used for grouping resources in the
-  /// calendar user interface.
+  /// The type of the calendar resource, intended for non-room resources.
   core.String resourceType;
 
+  /// Description of the resource, visible to users and admins.
+  core.String userVisibleDescription;
+
   CalendarResource();
 
   CalendarResource.fromJson(core.Map _json) {
+    if (_json.containsKey("buildingId")) {
+      buildingId = _json["buildingId"];
+    }
+    if (_json.containsKey("capacity")) {
+      capacity = _json["capacity"];
+    }
     if (_json.containsKey("etags")) {
       etags = _json["etags"];
     }
+    if (_json.containsKey("featureInstances")) {
+      featureInstances = _json["featureInstances"];
+    }
+    if (_json.containsKey("floorName")) {
+      floorName = _json["floorName"];
+    }
+    if (_json.containsKey("floorSection")) {
+      floorSection = _json["floorSection"];
+    }
     if (_json.containsKey("generatedResourceName")) {
       generatedResourceName = _json["generatedResourceName"];
     }
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
+    if (_json.containsKey("resourceCategory")) {
+      resourceCategory = _json["resourceCategory"];
+    }
     if (_json.containsKey("resourceDescription")) {
       resourceDescription = _json["resourceDescription"];
     }
@@ -6165,20 +7126,41 @@
     if (_json.containsKey("resourceType")) {
       resourceType = _json["resourceType"];
     }
+    if (_json.containsKey("userVisibleDescription")) {
+      userVisibleDescription = _json["userVisibleDescription"];
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (buildingId != null) {
+      _json["buildingId"] = buildingId;
+    }
+    if (capacity != null) {
+      _json["capacity"] = capacity;
+    }
     if (etags != null) {
       _json["etags"] = etags;
     }
+    if (featureInstances != null) {
+      _json["featureInstances"] = featureInstances;
+    }
+    if (floorName != null) {
+      _json["floorName"] = floorName;
+    }
+    if (floorSection != null) {
+      _json["floorSection"] = floorSection;
+    }
     if (generatedResourceName != null) {
       _json["generatedResourceName"] = generatedResourceName;
     }
     if (kind != null) {
       _json["kind"] = kind;
     }
+    if (resourceCategory != null) {
+      _json["resourceCategory"] = resourceCategory;
+    }
     if (resourceDescription != null) {
       _json["resourceDescription"] = resourceDescription;
     }
@@ -6194,6 +7176,9 @@
     if (resourceType != null) {
       _json["resourceType"] = resourceType;
     }
+    if (userVisibleDescription != null) {
+      _json["userVisibleDescription"] = userVisibleDescription;
+    }
     return _json;
   }
 }
@@ -6392,6 +7377,55 @@
   }
 }
 
+class ChromeOsDeviceDeviceFiles {
+  /// Date and time the file was created
+  core.DateTime createTime;
+
+  /// File downlod URL
+  core.String downloadUrl;
+
+  /// File name
+  core.String name;
+
+  /// File type
+  core.String type;
+
+  ChromeOsDeviceDeviceFiles();
+
+  ChromeOsDeviceDeviceFiles.fromJson(core.Map _json) {
+    if (_json.containsKey("createTime")) {
+      createTime = core.DateTime.parse(_json["createTime"]);
+    }
+    if (_json.containsKey("downloadUrl")) {
+      downloadUrl = _json["downloadUrl"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (createTime != null) {
+      _json["createTime"] = (createTime).toIso8601String();
+    }
+    if (downloadUrl != null) {
+      _json["downloadUrl"] = downloadUrl;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
 class ChromeOsDeviceRecentUsers {
   /// Email address of the user. Present only if the user type is managed
   core.String email;
@@ -6423,6 +7457,62 @@
   }
 }
 
+class ChromeOsDeviceTpmVersionInfo {
+  core.String family;
+  core.String firmwareVersion;
+  core.String manufacturer;
+  core.String specLevel;
+  core.String tpmModel;
+  core.String vendorSpecific;
+
+  ChromeOsDeviceTpmVersionInfo();
+
+  ChromeOsDeviceTpmVersionInfo.fromJson(core.Map _json) {
+    if (_json.containsKey("family")) {
+      family = _json["family"];
+    }
+    if (_json.containsKey("firmwareVersion")) {
+      firmwareVersion = _json["firmwareVersion"];
+    }
+    if (_json.containsKey("manufacturer")) {
+      manufacturer = _json["manufacturer"];
+    }
+    if (_json.containsKey("specLevel")) {
+      specLevel = _json["specLevel"];
+    }
+    if (_json.containsKey("tpmModel")) {
+      tpmModel = _json["tpmModel"];
+    }
+    if (_json.containsKey("vendorSpecific")) {
+      vendorSpecific = _json["vendorSpecific"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (family != null) {
+      _json["family"] = family;
+    }
+    if (firmwareVersion != null) {
+      _json["firmwareVersion"] = firmwareVersion;
+    }
+    if (manufacturer != null) {
+      _json["manufacturer"] = manufacturer;
+    }
+    if (specLevel != null) {
+      _json["specLevel"] = specLevel;
+    }
+    if (tpmModel != null) {
+      _json["tpmModel"] = tpmModel;
+    }
+    if (vendorSpecific != null) {
+      _json["vendorSpecific"] = vendorSpecific;
+    }
+    return _json;
+  }
+}
+
 /// JSON template for Chrome Os Device resource in Directory API.
 class ChromeOsDevice {
   /// List of active time ranges (Read-only)
@@ -6440,6 +7530,9 @@
   /// Chromebook boot mode (Read-only)
   core.String bootMode;
 
+  /// List of device files to download (Read-only)
+  core.List<ChromeOsDeviceDeviceFiles> deviceFiles;
+
   /// Unique identifier of Chrome OS Device (Read-only)
   core.String deviceId;
 
@@ -6499,6 +7592,7 @@
 
   /// Final date the device will be supported (Read-only)
   core.DateTime supportEndDate;
+  ChromeOsDeviceTpmVersionInfo tpmVersionInfo;
 
   /// Will Chromebook auto renew after support end date (Read-only)
   core.bool willAutoRenew;
@@ -6523,6 +7617,11 @@
     if (_json.containsKey("bootMode")) {
       bootMode = _json["bootMode"];
     }
+    if (_json.containsKey("deviceFiles")) {
+      deviceFiles = _json["deviceFiles"]
+          .map((value) => new ChromeOsDeviceDeviceFiles.fromJson(value))
+          .toList();
+    }
     if (_json.containsKey("deviceId")) {
       deviceId = _json["deviceId"];
     }
@@ -6582,6 +7681,10 @@
     if (_json.containsKey("supportEndDate")) {
       supportEndDate = core.DateTime.parse(_json["supportEndDate"]);
     }
+    if (_json.containsKey("tpmVersionInfo")) {
+      tpmVersionInfo =
+          new ChromeOsDeviceTpmVersionInfo.fromJson(_json["tpmVersionInfo"]);
+    }
     if (_json.containsKey("willAutoRenew")) {
       willAutoRenew = _json["willAutoRenew"];
     }
@@ -6606,6 +7709,10 @@
     if (bootMode != null) {
       _json["bootMode"] = bootMode;
     }
+    if (deviceFiles != null) {
+      _json["deviceFiles"] =
+          deviceFiles.map((value) => (value).toJson()).toList();
+    }
     if (deviceId != null) {
       _json["deviceId"] = deviceId;
     }
@@ -6664,6 +7771,9 @@
     if (supportEndDate != null) {
       _json["supportEndDate"] = (supportEndDate).toIso8601String();
     }
+    if (tpmVersionInfo != null) {
+      _json["tpmVersionInfo"] = (tpmVersionInfo).toJson();
+    }
     if (willAutoRenew != null) {
       _json["willAutoRenew"] = willAutoRenew;
     }
@@ -7214,6 +8324,145 @@
   }
 }
 
+/// JSON template for Feature object in Directory API.
+class Feature {
+  /// ETag of the resource.
+  core.String etags;
+
+  /// Kind of resource this is.
+  core.String kind;
+
+  /// The name of the feature.
+  core.String name;
+
+  Feature();
+
+  Feature.fromJson(core.Map _json) {
+    if (_json.containsKey("etags")) {
+      etags = _json["etags"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (etags != null) {
+      _json["etags"] = etags;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// JSON template for a "feature instance".
+class FeatureInstance {
+  Feature feature;
+
+  FeatureInstance();
+
+  FeatureInstance.fromJson(core.Map _json) {
+    if (_json.containsKey("feature")) {
+      feature = new Feature.fromJson(_json["feature"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (feature != null) {
+      _json["feature"] = (feature).toJson();
+    }
+    return _json;
+  }
+}
+
+/// JSON request template for renaming a feature.
+class FeatureRename {
+  /// New name of the feature.
+  core.String newName;
+
+  FeatureRename();
+
+  FeatureRename.fromJson(core.Map _json) {
+    if (_json.containsKey("newName")) {
+      newName = _json["newName"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (newName != null) {
+      _json["newName"] = newName;
+    }
+    return _json;
+  }
+}
+
+/// JSON template for Feature List Response object in Directory API.
+class Features {
+  /// ETag of the resource.
+  core.String etag;
+
+  /// The Features in this page of results.
+  core.List<Feature> features;
+
+  /// Kind of resource this is.
+  core.String kind;
+
+  /// The continuation token, used to page through large result sets. Provide
+  /// this value in a subsequent request to return the next page of results.
+  core.String nextPageToken;
+
+  Features();
+
+  Features.fromJson(core.Map _json) {
+    if (_json.containsKey("etag")) {
+      etag = _json["etag"];
+    }
+    if (_json.containsKey("features")) {
+      features = _json["features"]
+          .map((value) => new Feature.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (etag != null) {
+      _json["etag"] = etag;
+    }
+    if (features != null) {
+      _json["features"] = features.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
 /// JSON template for Group resource in Directory API.
 class Group {
   /// Is the group created by admin (Read-only) *
diff --git a/generated/googleapis/lib/admin/reports_v1.dart b/generated/googleapis/lib/admin/reports_v1.dart
index efa1f1f..ae243c6 100644
--- a/generated/googleapis/lib/admin/reports_v1.dart
+++ b/generated/googleapis/lib/admin/reports_v1.dart
@@ -31,6 +31,8 @@
   ChannelsResourceApi get channels => new ChannelsResourceApi(_requester);
   CustomerUsageReportsResourceApi get customerUsageReports =>
       new CustomerUsageReportsResourceApi(_requester);
+  EntityUsageReportsResourceApi get entityUsageReports =>
+      new EntityUsageReportsResourceApi(_requester);
   UserUsageReportResourceApi get userUsageReport =>
       new UserUsageReportResourceApi(_requester);
 
@@ -411,6 +413,115 @@
   }
 }
 
+class EntityUsageReportsResourceApi {
+  final commons.ApiRequester _requester;
+
+  EntityUsageReportsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Retrieves a report which is a collection of properties / statistics for a
+  /// set of objects.
+  ///
+  /// Request parameters:
+  ///
+  /// [entityType] - Type of object. Should be one of - gplus_communities.
+  /// Value must have pattern "(gplus_communities)".
+  ///
+  /// [entityKey] - Represents the key of object for which the data should be
+  /// filtered.
+  ///
+  /// [date] - Represents the date in yyyy-mm-dd format for which the data is to
+  /// be fetched.
+  /// Value must have pattern "(\d){4}-(\d){2}-(\d){2}".
+  ///
+  /// [customerId] - Represents the customer for which the data is to be
+  /// fetched.
+  /// Value must have pattern "C.+".
+  ///
+  /// [filters] - Represents the set of filters including parameter operator
+  /// value.
+  /// Value must have pattern
+  /// "(((gplus)):[a-z0-9_]+[<,<=,==,>=,>,!=][^,]+,)*(((gplus)):[a-z0-9_]+[<,<=,==,>=,>,!=][^,]+)".
+  ///
+  /// [maxResults] - Maximum number of results to return. Maximum allowed is
+  /// 1000
+  ///
+  /// [pageToken] - Token to specify next page.
+  ///
+  /// [parameters] - Represents the application name, parameter name pairs to
+  /// fetch in csv as app_name1:param_name1, app_name2:param_name2.
+  /// Value must have pattern "(((gplus)):[^,]+,)*(((gplus)):[^,]+)".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [UsageReports].
+  ///
+  /// Completes with a [commons.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<UsageReports> get(
+      core.String entityType, core.String entityKey, core.String date,
+      {core.String customerId,
+      core.String filters,
+      core.int maxResults,
+      core.String pageToken,
+      core.String parameters,
+      core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (entityType == null) {
+      throw new core.ArgumentError("Parameter entityType is required.");
+    }
+    if (entityKey == null) {
+      throw new core.ArgumentError("Parameter entityKey is required.");
+    }
+    if (date == null) {
+      throw new core.ArgumentError("Parameter date is required.");
+    }
+    if (customerId != null) {
+      _queryParams["customerId"] = [customerId];
+    }
+    if (filters != null) {
+      _queryParams["filters"] = [filters];
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (parameters != null) {
+      _queryParams["parameters"] = [parameters];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'usage/' +
+        commons.Escaper.ecapeVariable('$entityType') +
+        '/' +
+        commons.Escaper.ecapeVariable('$entityKey') +
+        '/dates/' +
+        commons.Escaper.ecapeVariable('$date');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new UsageReports.fromJson(data));
+  }
+}
+
 class UserUsageReportResourceApi {
   final commons.ApiRequester _requester;
 
@@ -964,13 +1075,17 @@
   /// Obfuscated customer id for the record.
   core.String customerId;
 
+  /// Object key. Only relevant if entity.type = "OBJECT" Note: external-facing
+  /// name of report is "Entities" rather than "Objects".
+  core.String entityId;
+
   /// Obfuscated user id for the record.
   core.String profileId;
 
-  /// The type of item, can be a customer or user.
+  /// The type of item, can be customer, user, or entity (aka. object).
   core.String type;
 
-  /// user's email.
+  /// user's email. Only relevant if entity.type = "USER"
   core.String userEmail;
 
   UsageReportEntity();
@@ -979,6 +1094,9 @@
     if (_json.containsKey("customerId")) {
       customerId = _json["customerId"];
     }
+    if (_json.containsKey("entityId")) {
+      entityId = _json["entityId"];
+    }
     if (_json.containsKey("profileId")) {
       profileId = _json["profileId"];
     }
@@ -996,6 +1114,9 @@
     if (customerId != null) {
       _json["customerId"] = customerId;
     }
+    if (entityId != null) {
+      _json["entityId"] = entityId;
+    }
     if (profileId != null) {
       _json["profileId"] = profileId;
     }
diff --git a/generated/googleapis/lib/androiddeviceprovisioning/v1.dart b/generated/googleapis/lib/androiddeviceprovisioning/v1.dart
index 9d2cd75..ac07a91 100644
--- a/generated/googleapis/lib/androiddeviceprovisioning/v1.dart
+++ b/generated/googleapis/lib/androiddeviceprovisioning/v1.dart
@@ -19,6 +19,7 @@
 class AndroiddeviceprovisioningApi {
   final commons.ApiRequester _requester;
 
+  CustomersResourceApi get customers => new CustomersResourceApi(_requester);
   OperationsResourceApi get operations => new OperationsResourceApi(_requester);
   PartnersResourceApi get partners => new PartnersResourceApi(_requester);
 
@@ -29,6 +30,664 @@
             new commons.ApiRequester(client, rootUrl, servicePath, USER_AGENT);
 }
 
+class CustomersResourceApi {
+  final commons.ApiRequester _requester;
+
+  CustomersConfigurationsResourceApi get configurations =>
+      new CustomersConfigurationsResourceApi(_requester);
+  CustomersDevicesResourceApi get devices =>
+      new CustomersDevicesResourceApi(_requester);
+  CustomersDpcsResourceApi get dpcs => new CustomersDpcsResourceApi(_requester);
+
+  CustomersResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// List the user's customer accounts.
+  ///
+  /// Request parameters:
+  ///
+  /// [pageToken] - The next_page_token value returned from a previous List
+  /// request, if any.
+  ///
+  /// [pageSize] - The maximum number of items to return.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CustomerListCustomersResponse].
+  ///
+  /// Completes with a [commons.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<CustomerListCustomersResponse> list(
+      {core.String pageToken, core.int pageSize, core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/customers';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new CustomerListCustomersResponse.fromJson(data));
+  }
+}
+
+class CustomersConfigurationsResourceApi {
+  final commons.ApiRequester _requester;
+
+  CustomersConfigurationsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Creates a new configuration. Once created, a customer can apply the
+  /// configuration to devices.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Required. The customer that manages the configuration. An API
+  /// resource name
+  /// in the format `customers/[CUSTOMER_ID]`.
+  /// Value must have pattern "^customers/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Configuration].
+  ///
+  /// Completes with a [commons.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<Configuration> create(Configuration request, core.String parent,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (parent == null) {
+      throw new core.ArgumentError("Parameter parent is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' +
+        commons.Escaper.ecapeVariableReserved('$parent') +
+        '/configurations';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Configuration.fromJson(data));
+  }
+
+  /// Deletes an unused configuration. The API call fails if the customer has
+  /// devices with the configuration applied.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Required. The configuration to delete. An API resource name in
+  /// the format
+  /// `customers/[CUSTOMER_ID]/configurations/[CONFIGURATION_ID]`. If the
+  /// configuration is applied to any devices, the API call fails.
+  /// Value must have pattern "^customers/[^/]+/configurations/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Empty].
+  ///
+  /// Completes with a [commons.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<Empty> delete(core.String name, {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (name == null) {
+      throw new core.ArgumentError("Parameter name is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$name');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Empty.fromJson(data));
+  }
+
+  /// Gets the details of a configuration.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Required. The configuration to get. An API resource name in the
+  /// format
+  /// `customers/[CUSTOMER_ID]/configurations/[CONFIGURATION_ID]`.
+  /// Value must have pattern "^customers/[^/]+/configurations/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Configuration].
+  ///
+  /// Completes with a [commons.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<Configuration> get(core.String name, {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (name == null) {
+      throw new core.ArgumentError("Parameter name is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$name');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Configuration.fromJson(data));
+  }
+
+  /// Lists a customer's configurations.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Required. The customer that manages the listed configurations.
+  /// An API
+  /// resource name in the format `customers/[CUSTOMER_ID]`.
+  /// Value must have pattern "^customers/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CustomerListConfigurationsResponse].
+  ///
+  /// Completes with a [commons.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<CustomerListConfigurationsResponse> list(core.String parent,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (parent == null) {
+      throw new core.ArgumentError("Parameter parent is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' +
+        commons.Escaper.ecapeVariableReserved('$parent') +
+        '/configurations';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new CustomerListConfigurationsResponse.fromJson(data));
+  }
+
+  /// Updates a configuration's field values.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Output only. The API resource name in the format
+  /// `customers/[CUSTOMER_ID]/configurations/[CONFIGURATION_ID]`. Assigned by
+  /// the server.
+  /// Value must have pattern "^customers/[^/]+/configurations/[^/]+$".
+  ///
+  /// [updateMask] - Required. The field mask applied to the target
+  /// `Configuration` before
+  /// updating the fields. To learn more about using field masks, read
+  /// [FieldMask](/protocol-buffers/docs/reference/google.protobuf#fieldmask) in
+  /// the Protocol Buffers documentation.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Configuration].
+  ///
+  /// Completes with a [commons.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<Configuration> patch(Configuration request, core.String name,
+      {core.String updateMask, core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (name == null) {
+      throw new core.ArgumentError("Parameter name is required.");
+    }
+    if (updateMask != null) {
+      _queryParams["updateMask"] = [updateMask];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$name');
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Configuration.fromJson(data));
+  }
+}
+
+class CustomersDevicesResourceApi {
+  final commons.ApiRequester _requester;
+
+  CustomersDevicesResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Applies a Configuration to the device to register the device for
+  /// zero-touch
+  /// enrollment. After applying a configuration to a device, the device
+  /// automatically provisions itself on first boot, or next factory reset.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Required. The customer managing the device. An API resource
+  /// name in the
+  /// format `customers/[CUSTOMER_ID]`.
+  /// Value must have pattern "^customers/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Empty].
+  ///
+  /// Completes with a [commons.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<Empty> applyConfiguration(
+      CustomerApplyConfigurationRequest request, core.String parent,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (parent == null) {
+      throw new core.ArgumentError("Parameter parent is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' +
+        commons.Escaper.ecapeVariableReserved('$parent') +
+        '/devices:applyConfiguration';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Empty.fromJson(data));
+  }
+
+  /// Gets the details of a device.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Required. The device to get. An API resource name in the format
+  /// `customers/[CUSTOMER_ID]/devices/[DEVICE_ID]`.
+  /// Value must have pattern "^customers/[^/]+/devices/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Device].
+  ///
+  /// Completes with a [commons.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<Device> get(core.String name, {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (name == null) {
+      throw new core.ArgumentError("Parameter name is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$name');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Device.fromJson(data));
+  }
+
+  /// Lists a customer's devices.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Required. The customer managing the devices. An API resource
+  /// name in the
+  /// format `customers/[CUSTOMER_ID]`.
+  /// Value must have pattern "^customers/[^/]+$".
+  ///
+  /// [pageToken] - A token specifying which result page to return.
+  ///
+  /// [pageSize] - The maximum number of devices to show in a page of results.
+  /// The default
+  /// value returns all the devices in a single page.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CustomerListDevicesResponse].
+  ///
+  /// Completes with a [commons.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<CustomerListDevicesResponse> list(core.String parent,
+      {core.String pageToken, core.String pageSize, core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (parent == null) {
+      throw new core.ArgumentError("Parameter parent is required.");
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = [pageSize];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url =
+        'v1/' + commons.Escaper.ecapeVariableReserved('$parent') + '/devices';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new CustomerListDevicesResponse.fromJson(data));
+  }
+
+  /// Removes a configuration from device.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Required. The customer managing the device in the format
+  /// `customers/[CUSTOMER_ID]`.
+  /// Value must have pattern "^customers/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Empty].
+  ///
+  /// Completes with a [commons.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<Empty> removeConfiguration(
+      CustomerRemoveConfigurationRequest request, core.String parent,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (parent == null) {
+      throw new core.ArgumentError("Parameter parent is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' +
+        commons.Escaper.ecapeVariableReserved('$parent') +
+        '/devices:removeConfiguration';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Empty.fromJson(data));
+  }
+
+  /// Unclaims a device from a customer and removes it from zero-touch
+  /// enrollment.
+  ///
+  /// After removing a device, a customer must contact their reseller to
+  /// register
+  /// the device into zero-touch enrollment again.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Required. The customer managing the device. An API resource
+  /// name in the
+  /// format `customers/[CUSTOMER_ID]`.
+  /// Value must have pattern "^customers/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Empty].
+  ///
+  /// Completes with a [commons.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<Empty> unclaim(
+      CustomerUnclaimDeviceRequest request, core.String parent,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (parent == null) {
+      throw new core.ArgumentError("Parameter parent is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' +
+        commons.Escaper.ecapeVariableReserved('$parent') +
+        '/devices:unclaim';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Empty.fromJson(data));
+  }
+}
+
+class CustomersDpcsResourceApi {
+  final commons.ApiRequester _requester;
+
+  CustomersDpcsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Lists the DPCs (device policy controllers) that support zero-touch
+  /// enrollment.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Required. The customer that can use the DPCs in configurations.
+  /// An API
+  /// resource name in the format `customers/[CUSTOMER_ID]`.
+  /// Value must have pattern "^customers/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CustomerListDpcsResponse].
+  ///
+  /// Completes with a [commons.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<CustomerListDpcsResponse> list(core.String parent,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (parent == null) {
+      throw new core.ArgumentError("Parameter parent is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$parent') + '/dpcs';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new CustomerListDpcsResponse.fromJson(data));
+  }
+}
+
 class OperationsResourceApi {
   final commons.ApiRequester _requester;
 
@@ -851,6 +1510,139 @@
   }
 }
 
+/// A configuration collects the provisioning options for Android devices. Each
+/// configuration combines the following:
+///
+/// * The EMM device policy controller (DPC) installed on the devices.
+/// * EMM policies enforced on the devices.
+/// * Metadata displayed on the device to help users during setup.
+///
+/// Customers can add as many configurations as they need. However, zero-touch
+/// enrollment works best when a customer sets a default configuration that's
+/// applied to any new devices the organization purchases.
+class Configuration {
+  /// Required. The name of the organization. Zero-touch enrollment shows this
+  /// organization name to device users during device provisioning.
+  core.String companyName;
+
+  /// Output only. The ID of the configuration. Assigned by the server.
+  core.String configurationId;
+
+  /// Required. A short name that describes the configuration's purpose. For
+  /// example, _Sales team_ or _Temporary employees_. The zero-touch enrollment
+  /// portal displays this name to IT admins.
+  core.String configurationName;
+
+  /// Required. The email address that device users can contact to get help.
+  /// Zero-touch enrollment shows this email address to device users before
+  /// device provisioning. The value is validated on input.
+  core.String contactEmail;
+
+  /// Required. The telephone number that device users can call, using another
+  /// device, to get help. Zero-touch enrollment shows this number to device
+  /// users before device provisioning. Accepts numerals, spaces, the plus sign,
+  /// hyphens, and parentheses.
+  core.String contactPhone;
+
+  /// A message, containing one or two sentences, to help device users get help
+  /// or give them more details about what’s happening to their device.
+  /// Zero-touch enrollment shows this message before the device is provisioned.
+  core.String customMessage;
+
+  /// The JSON-formatted EMM provisioning extras that are passed to the DPC.
+  core.String dpcExtras;
+
+  /// Required. The resource name of the selected DPC (device policy controller)
+  /// in the format `customers/[CUSTOMER_ID]/dpcs / * `. To list the supported
+  /// DPCs,
+  /// call
+  /// `customers.dpcs.list`.
+  core.String dpcResourcePath;
+
+  /// Required. Whether this is the default configuration that zero-touch
+  /// enrollment applies to any new devices the organization purchases in the
+  /// future. Only one customer configuration can be the default. Setting this
+  /// value to `true`, changes the previous default configuration's `isDefault`
+  /// value to `false`.
+  core.bool isDefault;
+
+  /// Output only. The API resource name in the format
+  /// `customers/[CUSTOMER_ID]/configurations/[CONFIGURATION_ID]`. Assigned by
+  /// the server.
+  core.String name;
+
+  Configuration();
+
+  Configuration.fromJson(core.Map _json) {
+    if (_json.containsKey("companyName")) {
+      companyName = _json["companyName"];
+    }
+    if (_json.containsKey("configurationId")) {
+      configurationId = _json["configurationId"];
+    }
+    if (_json.containsKey("configurationName")) {
+      configurationName = _json["configurationName"];
+    }
+    if (_json.containsKey("contactEmail")) {
+      contactEmail = _json["contactEmail"];
+    }
+    if (_json.containsKey("contactPhone")) {
+      contactPhone = _json["contactPhone"];
+    }
+    if (_json.containsKey("customMessage")) {
+      customMessage = _json["customMessage"];
+    }
+    if (_json.containsKey("dpcExtras")) {
+      dpcExtras = _json["dpcExtras"];
+    }
+    if (_json.containsKey("dpcResourcePath")) {
+      dpcResourcePath = _json["dpcResourcePath"];
+    }
+    if (_json.containsKey("isDefault")) {
+      isDefault = _json["isDefault"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (companyName != null) {
+      _json["companyName"] = companyName;
+    }
+    if (configurationId != null) {
+      _json["configurationId"] = configurationId;
+    }
+    if (configurationName != null) {
+      _json["configurationName"] = configurationName;
+    }
+    if (contactEmail != null) {
+      _json["contactEmail"] = contactEmail;
+    }
+    if (contactPhone != null) {
+      _json["contactPhone"] = contactPhone;
+    }
+    if (customMessage != null) {
+      _json["customMessage"] = customMessage;
+    }
+    if (dpcExtras != null) {
+      _json["dpcExtras"] = dpcExtras;
+    }
+    if (dpcResourcePath != null) {
+      _json["dpcResourcePath"] = dpcResourcePath;
+    }
+    if (isDefault != null) {
+      _json["isDefault"] = isDefault;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
 /// Request message to create a customer.
 class CreateCustomerRequest {
   /// Required. The company data to populate the new customer. Must contain a
@@ -877,6 +1669,204 @@
   }
 }
 
+/// Request message for customer to assign a configuration to device.
+class CustomerApplyConfigurationRequest {
+  /// Required. The configuration applied to the device in the format
+  /// `customers/[CUSTOMER_ID]/configurations/[CONFIGURATION_ID]`.
+  core.String configuration;
+
+  /// Required. The device the configuration is applied to.
+  DeviceReference device;
+
+  CustomerApplyConfigurationRequest();
+
+  CustomerApplyConfigurationRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("configuration")) {
+      configuration = _json["configuration"];
+    }
+    if (_json.containsKey("device")) {
+      device = new DeviceReference.fromJson(_json["device"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (configuration != null) {
+      _json["configuration"] = configuration;
+    }
+    if (device != null) {
+      _json["device"] = (device).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Response message of customer's listing configuration.
+class CustomerListConfigurationsResponse {
+  /// The configurations.
+  core.List<Configuration> configurations;
+
+  CustomerListConfigurationsResponse();
+
+  CustomerListConfigurationsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("configurations")) {
+      configurations = _json["configurations"]
+          .map((value) => new Configuration.fromJson(value))
+          .toList();
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (configurations != null) {
+      _json["configurations"] =
+          configurations.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Response message for listing my customers.
+class CustomerListCustomersResponse {
+  /// Customers the current user can act as.
+  core.List<Company> customers;
+
+  /// Token to retrieve the next page of results, or empty if there are no
+  /// more results in the list.
+  core.String nextPageToken;
+
+  CustomerListCustomersResponse();
+
+  CustomerListCustomersResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("customers")) {
+      customers = _json["customers"]
+          .map((value) => new Company.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (customers != null) {
+      _json["customers"] = customers.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Response message of customer's liting devices.
+class CustomerListDevicesResponse {
+  /// The customer's devices.
+  core.List<Device> devices;
+
+  /// A token used to access the next page of results. Omitted if no further
+  /// results are available.
+  core.String nextPageToken;
+
+  CustomerListDevicesResponse();
+
+  CustomerListDevicesResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("devices")) {
+      devices =
+          _json["devices"].map((value) => new Device.fromJson(value)).toList();
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (devices != null) {
+      _json["devices"] = devices.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Response message of customer's listing DPCs.
+class CustomerListDpcsResponse {
+  /// The list of DPCs available to the customer that support zero-touch
+  /// enrollment.
+  core.List<Dpc> dpcs;
+
+  CustomerListDpcsResponse();
+
+  CustomerListDpcsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("dpcs")) {
+      dpcs = _json["dpcs"].map((value) => new Dpc.fromJson(value)).toList();
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (dpcs != null) {
+      _json["dpcs"] = dpcs.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Request message for customer to remove the configuration from device.
+class CustomerRemoveConfigurationRequest {
+  /// Required. The device to remove the configuration from.
+  DeviceReference device;
+
+  CustomerRemoveConfigurationRequest();
+
+  CustomerRemoveConfigurationRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("device")) {
+      device = new DeviceReference.fromJson(_json["device"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (device != null) {
+      _json["device"] = (device).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Request message for customer to unclaim a device.
+class CustomerUnclaimDeviceRequest {
+  /// Required. The device to unclaim.
+  DeviceReference device;
+
+  CustomerUnclaimDeviceRequest();
+
+  CustomerUnclaimDeviceRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("device")) {
+      device = new DeviceReference.fromJson(_json["device"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (device != null) {
+      _json["device"] = (device).toJson();
+    }
+    return _json;
+  }
+}
+
 /// An Android device registered for zero-touch enrollment.
 class Device {
   /// Output only. The provisioning claims for a device. Devices claimed for
@@ -1074,6 +2064,49 @@
   }
 }
 
+/// A `DeviceReference` is an API abstraction that lets you supply a _device_
+/// argument to a method using one of the following identifier types:
+///
+/// * A numeric API resource ID.
+/// * Real-world hardware IDs, such as IMEI number, belonging to the
+/// manufactured
+///   device.
+///
+/// Methods that operate on devices take a `DeviceReference` as a parameter type
+/// because it's more flexible for the caller. To learn more about device
+/// identifiers, read [Identifiers](/zero-touch/guides/identifiers).
+class DeviceReference {
+  /// The ID of the device.
+  core.String deviceId;
+
+  /// The hardware IDs of the device.
+  DeviceIdentifier deviceIdentifier;
+
+  DeviceReference();
+
+  DeviceReference.fromJson(core.Map _json) {
+    if (_json.containsKey("deviceId")) {
+      deviceId = _json["deviceId"];
+    }
+    if (_json.containsKey("deviceIdentifier")) {
+      deviceIdentifier =
+          new DeviceIdentifier.fromJson(_json["deviceIdentifier"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (deviceId != null) {
+      _json["deviceId"] = deviceId;
+    }
+    if (deviceIdentifier != null) {
+      _json["deviceIdentifier"] = (deviceIdentifier).toJson();
+    }
+    return _json;
+  }
+}
+
 /// Long running operation metadata.
 class DevicesLongRunningOperationMetadata {
   /// Number of devices parsed in your requests.
@@ -1159,6 +2192,57 @@
   }
 }
 
+/// An EMM's DPC ([device policy controller](/android/work/dpc/build-dpc)).
+/// Zero-touch enrollment installs a DPC (listed in the `Configuration`) on a
+/// device to maintain the customer's mobile policies. All the DPCs listed by
+/// the
+/// API support zero-touch enrollment and are available in Google Play.
+class Dpc {
+  /// Output only. The title of the DPC app in Google Play. For example, _Google
+  /// Apps Device Policy_. Useful in an application's user interface.
+  core.String dpcName;
+
+  /// Output only. The API resource name in the format
+  /// `customers/[CUSTOMER_ID]/dpcs/[DPC_ID]`. Assigned by
+  /// the server. To maintain a reference to a DPC across customer accounts,
+  /// persist and match the last path component (`DPC_ID`).
+  core.String name;
+
+  /// Output only. The DPC's Android application ID that looks like a Java
+  /// package name. Zero-touch enrollment installs the DPC app onto a device
+  /// using this identifier.
+  core.String packageName;
+
+  Dpc();
+
+  Dpc.fromJson(core.Map _json) {
+    if (_json.containsKey("dpcName")) {
+      dpcName = _json["dpcName"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("packageName")) {
+      packageName = _json["packageName"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (dpcName != null) {
+      _json["dpcName"] = dpcName;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (packageName != null) {
+      _json["packageName"] = packageName;
+    }
+    return _json;
+  }
+}
+
 /// A generic empty message that you can re-use to avoid defining duplicated
 /// empty messages in your APIs. A typical example is to use it as the request
 /// or the response type of an API method. For instance:
diff --git a/generated/googleapis/lib/androidenterprise/v1.dart b/generated/googleapis/lib/androidenterprise/v1.dart
index 55778be..747ed6d 100644
--- a/generated/googleapis/lib/androidenterprise/v1.dart
+++ b/generated/googleapis/lib/androidenterprise/v1.dart
@@ -7148,9 +7148,21 @@
   /// The name of the author of the product (for example, the app developer).
   core.String authorName;
 
+  /// The countries which this app is available in.
+  core.List<core.String> availableCountries;
+
   /// The tracks that are visible to the enterprise.
   core.List<core.String> availableTracks;
 
+  /// The app category (e.g. RACING, SOCIAL, etc.)
+  core.String category;
+
+  /// The content rating for this app.
+  core.String contentRating;
+
+  /// A localized promotional description, if available.
+  core.String description;
+
   /// A link to the (consumer) Google Play details page for the product.
   core.String detailsUrl;
 
@@ -7171,6 +7183,17 @@
   /// "androidenterprise#product".
   core.String kind;
 
+  /// The time (in milliseconds since epoch) when application was last
+  /// published. (Timestamp is approximate within 7 days of actual publish
+  /// time.)
+  core.String lastUpdatedTimestampMillis;
+
+  /// The minimum Android SDK necessary to run the app.
+  core.int minAndroidSdkVersion;
+
+  /// The permissions required for this app.
+  core.List<ProductPermission> permissions;
+
   /// A string of the form app:<package name>. For example,
   /// app:com.google.android.gm represents the Gmail app.
   core.String productId;
@@ -7180,9 +7203,15 @@
   /// anymore (even though it might still be available to people who own it).
   core.String productPricing;
 
+  /// A description of the recent changes made to the app.
+  core.String recentChanges;
+
   /// Deprecated.
   core.bool requiresContainerApp;
 
+  /// A list of screenshot links representing the app.
+  core.List<core.String> screenshotUrls;
+
   /// The certificate used to sign this product.
   ProductSigningCertificate signingCertificate;
 
@@ -7208,9 +7237,21 @@
     if (_json.containsKey("authorName")) {
       authorName = _json["authorName"];
     }
+    if (_json.containsKey("availableCountries")) {
+      availableCountries = _json["availableCountries"];
+    }
     if (_json.containsKey("availableTracks")) {
       availableTracks = _json["availableTracks"];
     }
+    if (_json.containsKey("category")) {
+      category = _json["category"];
+    }
+    if (_json.containsKey("contentRating")) {
+      contentRating = _json["contentRating"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
     if (_json.containsKey("detailsUrl")) {
       detailsUrl = _json["detailsUrl"];
     }
@@ -7223,15 +7264,32 @@
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
+    if (_json.containsKey("lastUpdatedTimestampMillis")) {
+      lastUpdatedTimestampMillis = _json["lastUpdatedTimestampMillis"];
+    }
+    if (_json.containsKey("minAndroidSdkVersion")) {
+      minAndroidSdkVersion = _json["minAndroidSdkVersion"];
+    }
+    if (_json.containsKey("permissions")) {
+      permissions = _json["permissions"]
+          .map((value) => new ProductPermission.fromJson(value))
+          .toList();
+    }
     if (_json.containsKey("productId")) {
       productId = _json["productId"];
     }
     if (_json.containsKey("productPricing")) {
       productPricing = _json["productPricing"];
     }
+    if (_json.containsKey("recentChanges")) {
+      recentChanges = _json["recentChanges"];
+    }
     if (_json.containsKey("requiresContainerApp")) {
       requiresContainerApp = _json["requiresContainerApp"];
     }
+    if (_json.containsKey("screenshotUrls")) {
+      screenshotUrls = _json["screenshotUrls"];
+    }
     if (_json.containsKey("signingCertificate")) {
       signingCertificate =
           new ProductSigningCertificate.fromJson(_json["signingCertificate"]);
@@ -7257,9 +7315,21 @@
     if (authorName != null) {
       _json["authorName"] = authorName;
     }
+    if (availableCountries != null) {
+      _json["availableCountries"] = availableCountries;
+    }
     if (availableTracks != null) {
       _json["availableTracks"] = availableTracks;
     }
+    if (category != null) {
+      _json["category"] = category;
+    }
+    if (contentRating != null) {
+      _json["contentRating"] = contentRating;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
     if (detailsUrl != null) {
       _json["detailsUrl"] = detailsUrl;
     }
@@ -7272,15 +7342,31 @@
     if (kind != null) {
       _json["kind"] = kind;
     }
+    if (lastUpdatedTimestampMillis != null) {
+      _json["lastUpdatedTimestampMillis"] = lastUpdatedTimestampMillis;
+    }
+    if (minAndroidSdkVersion != null) {
+      _json["minAndroidSdkVersion"] = minAndroidSdkVersion;
+    }
+    if (permissions != null) {
+      _json["permissions"] =
+          permissions.map((value) => (value).toJson()).toList();
+    }
     if (productId != null) {
       _json["productId"] = productId;
     }
     if (productPricing != null) {
       _json["productPricing"] = productPricing;
     }
+    if (recentChanges != null) {
+      _json["recentChanges"] = recentChanges;
+    }
     if (requiresContainerApp != null) {
       _json["requiresContainerApp"] = requiresContainerApp;
     }
+    if (screenshotUrls != null) {
+      _json["screenshotUrls"] = screenshotUrls;
+    }
     if (signingCertificate != null) {
       _json["signingCertificate"] = (signingCertificate).toJson();
     }
diff --git a/generated/googleapis/lib/androidmanagement/v1.dart b/generated/googleapis/lib/androidmanagement/v1.dart
index 027613c..941c077 100644
--- a/generated/googleapis/lib/androidmanagement/v1.dart
+++ b/generated/googleapis/lib/androidmanagement/v1.dart
@@ -1600,6 +1600,10 @@
   /// will be in this state until they have applied policy.
   core.String appliedState;
 
+  /// Device settings information. This information is only available when
+  /// deviceSettingsEnabled is true in the device's policy.
+  DeviceSettings deviceSettings;
+
   /// If the device state is DISABLED, an optional message that is displayed on
   /// the device indicating the reason the device is disabled. This field may be
   /// modified by an update request.
@@ -1717,6 +1721,9 @@
     if (_json.containsKey("appliedState")) {
       appliedState = _json["appliedState"];
     }
+    if (_json.containsKey("deviceSettings")) {
+      deviceSettings = new DeviceSettings.fromJson(_json["deviceSettings"]);
+    }
     if (_json.containsKey("disabledReason")) {
       disabledReason = new UserFacingMessage.fromJson(_json["disabledReason"]);
     }
@@ -1810,6 +1817,9 @@
     if (appliedState != null) {
       _json["appliedState"] = appliedState;
     }
+    if (deviceSettings != null) {
+      _json["deviceSettings"] = (deviceSettings).toJson();
+    }
     if (disabledReason != null) {
       _json["disabledReason"] = (disabledReason).toJson();
     }
@@ -1884,6 +1894,91 @@
   }
 }
 
+/// Information about security related device settings on device.
+class DeviceSettings {
+  /// If the ADB is enabled Settings.Global.ADB_ENABLED.
+  core.bool adbEnabled;
+
+  /// If the developer mode is enabled
+  /// Settings.Global.DEVELOPMENT_SETTINGS_ENABLED.
+  core.bool developmentSettingsEnabled;
+
+  /// Encryption status from DevicePolicyManager.
+  /// Possible string values are:
+  /// - "ENCRYPTION_STATUS_UNSPECIFIED" : Unspecified. No device should have
+  /// this type.
+  /// - "UNSUPPORTED" : Encryption is not supported by the device.
+  /// - "INACTIVE" : Encryption is supported by the device, but not currently
+  /// active.
+  /// - "ACTIVATING" : Encryption is not currently active, but is currently
+  /// being activated.
+  /// - "ACTIVE" : Encryption is active
+  /// - "ACTIVE_DEFAULT_KEY" : Encryption is active, but an encryption key is
+  /// not set by the user
+  /// - "ACTIVE_PER_USER" : Encrpyiton is active, and the encryption key is tied
+  /// to the user profile.
+  core.String encryptionStatus;
+
+  /// Device secured with PIN/password.
+  core.bool isDeviceSecure;
+
+  /// Whether the storage encryption is enabled
+  /// DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE or
+  /// DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER in N+ devices.
+  core.bool isEncrypted;
+
+  /// If installing apps from unknown sources is enabled.
+  /// Settings.Secure.INSTALL_NON_MARKET_APPS.
+  core.bool unknownSourcesEnabled;
+
+  DeviceSettings();
+
+  DeviceSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("adbEnabled")) {
+      adbEnabled = _json["adbEnabled"];
+    }
+    if (_json.containsKey("developmentSettingsEnabled")) {
+      developmentSettingsEnabled = _json["developmentSettingsEnabled"];
+    }
+    if (_json.containsKey("encryptionStatus")) {
+      encryptionStatus = _json["encryptionStatus"];
+    }
+    if (_json.containsKey("isDeviceSecure")) {
+      isDeviceSecure = _json["isDeviceSecure"];
+    }
+    if (_json.containsKey("isEncrypted")) {
+      isEncrypted = _json["isEncrypted"];
+    }
+    if (_json.containsKey("unknownSourcesEnabled")) {
+      unknownSourcesEnabled = _json["unknownSourcesEnabled"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (adbEnabled != null) {
+      _json["adbEnabled"] = adbEnabled;
+    }
+    if (developmentSettingsEnabled != null) {
+      _json["developmentSettingsEnabled"] = developmentSettingsEnabled;
+    }
+    if (encryptionStatus != null) {
+      _json["encryptionStatus"] = encryptionStatus;
+    }
+    if (isDeviceSecure != null) {
+      _json["isDeviceSecure"] = isDeviceSecure;
+    }
+    if (isEncrypted != null) {
+      _json["isEncrypted"] = isEncrypted;
+    }
+    if (unknownSourcesEnabled != null) {
+      _json["unknownSourcesEnabled"] = unknownSourcesEnabled;
+    }
+    return _json;
+  }
+}
+
 /// Device display information.
 class Display {
   /// Display density expressed as dots-per-inch.
@@ -3334,7 +3429,7 @@
 /// A policy, which governs behavior for a device.
 class Policy {
   /// Account types that cannot be managed by the user. <i>Requires the beta
-  /// version of Android Cloud Policy.</i>
+  /// version of the Android Device Policy app.</i>
   core.List<core.String> accountTypesWithManagementDisabled;
 
   /// Whether adding new users and profiles is disabled.
@@ -3343,8 +3438,9 @@
   /// Whether adjusting the master volume is disabled.
   core.bool adjustVolumeDisabled;
 
-  /// Configuration for an always-on VPN connection. <i>Requires the beta
-  /// version of Android Cloud Policy.</i>
+  /// Configuration for an always-on VPN connection. Use with
+  /// vpn_config_disabled to prevent modification of this setting. <i>Requires
+  /// the beta version of the Android Device Policy app.</i>
   AlwaysOnVpnPackage alwaysOnVpnPackage;
 
   /// Policy applied to apps.
@@ -3361,24 +3457,24 @@
   core.bool blockApplicationsEnabled;
 
   /// Whether configuring bluetooth is disabled. <i>Requires the beta version of
-  /// Android Cloud Policy.</i>
+  /// the Android Device Policy app.</i>
   core.bool bluetoothConfigDisabled;
 
   /// Whether bluetooth contact sharing is disabled. <i>Requires the beta
-  /// version of Android Cloud Policy.</i>
+  /// version of the Android Device Policy app.</i>
   core.bool bluetoothContactSharingDisabled;
 
   /// Whether bluetooth is disabled. Prefer this setting over
   /// bluetooth_config_disabled because bluetooth_config_disabled can be
-  /// bypassed by the user. <i>Requires the beta version of Android Cloud
-  /// Policy.</i>
+  /// bypassed by the user. <i>Requires the beta version of the Android Device
+  /// Policy app.</i>
   core.bool bluetoothDisabled;
 
   /// Whether all cameras on the device are disabled.
   core.bool cameraDisabled;
 
   /// Whether configuring cell broadcast is disabled. <i>Requires the beta
-  /// version of Android Cloud Policy.</i>
+  /// version of the Android Device Policy app.</i>
   core.bool cellBroadcastsConfigDisabled;
 
   /// Rules declaring which mitigating actions to take when a device is not
@@ -3388,15 +3484,15 @@
   core.List<ComplianceRule> complianceRules;
 
   /// Whether creating windows besides app windows is disabled. <i>Requires the
-  /// beta version of Android Cloud Policy.</i>
+  /// beta version of the Android Device Policy app.</i>
   core.bool createWindowsDisabled;
 
   /// Whether configuring user credentials is disabled. <i>Requires the beta
-  /// version of Android Cloud Policy.</i>
+  /// version of the Android Device Policy app.</i>
   core.bool credentialsConfigDisabled;
 
   /// Whether roaming data services are disabled. <i>Requires the beta version
-  /// of Android Cloud Policy.</i>
+  /// of the Android Device Policy app.</i>
   core.bool dataRoamingDisabled;
 
   /// Whether the user is allowed to enable debugging features.
@@ -3413,7 +3509,7 @@
   core.String defaultPermissionPolicy;
 
   /// Whether application verification is forced to be enabled. <i>Requires the
-  /// beta version of Android Cloud Policy.</i>
+  /// beta version of the Android Device Policy app.</i>
   core.bool ensureVerifyAppsEnabled;
 
   /// Whether factory resetting from settings is disabled.
@@ -3431,7 +3527,7 @@
   core.bool funDisabled;
 
   /// Whether user installation of apps is disabled. <i>Requires the beta
-  /// version of Android Cloud Policy.</i>
+  /// version of the Android Device Policy app.</i>
   core.bool installAppsDisabled;
 
   /// Whether the user is allowed to enable the "Unknown Sources" setting, which
@@ -3442,11 +3538,11 @@
   core.bool keyguardDisabled;
 
   /// Disabled keyguard customizations, such as widgets. <i>Requires the beta
-  /// version of Android Cloud Policy.</i>
+  /// version of the Android Device Policy app.</i>
   core.List<core.String> keyguardDisabledFeatures;
 
   /// A message displayed to the user in the device administators settings
-  /// screen. <i>Requires the beta version of Android Cloud Policy.</i>
+  /// screen. <i>Requires the beta version of the Android Device Policy app.</i>
   UserFacingMessage longSupportMessage;
 
   /// Maximum time in milliseconds for user activity until the device will lock.
@@ -3454,14 +3550,14 @@
   core.String maximumTimeToLock;
 
   /// Whether configuring mobile networks is disabled. <i>Requires the beta
-  /// version of Android Cloud Policy.</i>
+  /// version of the Android Device Policy app.</i>
   core.bool mobileNetworksConfigDisabled;
 
   /// Whether adding or removing accounts is disabled.
   core.bool modifyAccountsDisabled;
 
   /// Whether the user mounting physical external media is disabled. <i>Requires
-  /// the beta version of Android Cloud Policy.</i>
+  /// the beta version of the Android Device Policy app.</i>
   core.bool mountPhysicalMediaDisabled;
 
   /// The name of the policy in the form
@@ -3479,7 +3575,7 @@
   core.bool networkEscapeHatchEnabled;
 
   /// Whether resetting network settings is disabled. <i>Requires the beta
-  /// version of Android Cloud Policy.</i>
+  /// version of the Android Device Policy app.</i>
   core.bool networkResetDisabled;
 
   /// Network configuration for the device. See configure networks for more
@@ -3490,11 +3586,11 @@
   core.Map<core.String, core.Object> openNetworkConfiguration;
 
   /// Whether using NFC to beam out data from apps is disabled. <i>Requires the
-  /// beta version of Android Cloud Policy.</i>
+  /// beta version of the Android Device Policy app.</i>
   core.bool outgoingBeamDisabled;
 
-  /// Whether outgoing calls are disabled. <i>Requires the beta version of
-  /// Android Cloud Policy.</i>
+  /// Whether outgoing calls are disabled. <i>Requires the beta version of the
+  /// Android Device Policy app.</i>
   core.bool outgoingCallsDisabled;
 
   /// Password requirements.
@@ -3502,8 +3598,8 @@
 
   /// If present, only input methods provided by packages in this list are
   /// permitted. If this field is present, but the list is empty, then only
-  /// system input methods are permitted. <i>Requires the beta version of
-  /// Android Cloud Policy.</i>
+  /// system input methods are permitted. <i>Requires the beta version of the
+  /// Android Device Policy app.</i>
   PackageNameList permittedInputMethods;
 
   /// Default intent handler activities.
@@ -3514,7 +3610,7 @@
   /// configurations like general internal filtering a global HTTP proxy may be
   /// useful. If the proxy is not accessible, network access may break. The
   /// global proxy is only a recommendation and some apps may ignore it.
-  /// <i>Requires the beta version of Android Cloud Policy.</i>
+  /// <i>Requires the beta version of the Android Device Policy app.</i>
   ProxyInfo recommendedGlobalProxy;
 
   /// Whether removing other users is disabled.
@@ -3527,20 +3623,20 @@
   core.bool screenCaptureDisabled;
 
   /// Whether changing the user icon is disabled. <i>Requires the beta version
-  /// of Android Cloud Policy.</i>
+  /// of the Android Device Policy app.</i>
   core.bool setUserIconDisabled;
 
   /// Whether changing the wallpaper is disabled. <i>Requires the beta version
-  /// of Android Cloud Policy.</i>
+  /// of the Android Device Policy app.</i>
   core.bool setWallpaperDisabled;
 
   /// A message displayed to the user in the settings screen wherever
   /// functionality has been disabled by the admin. <i>Requires the beta version
-  /// of Android Cloud Policy.</i>
+  /// of the Android Device Policy app.</i>
   UserFacingMessage shortSupportMessage;
 
   /// Whether sending or receiving SMS messages is disabled. <i>Requires the
-  /// beta version of Android Cloud Policy.</i>
+  /// beta version of the Android Device Policy app.</i>
   core.bool smsDisabled;
 
   /// Whether the status bar is disabled. This disables notifications, quick
@@ -3562,11 +3658,11 @@
   SystemUpdate systemUpdate;
 
   /// Whether configuring tethering and portable hotspots is disabled.
-  /// <i>Requires the beta version of Android Cloud Policy.</i>
+  /// <i>Requires the beta version of the Android Device Policy app.</i>
   core.bool tetheringConfigDisabled;
 
   /// Whether user uninstallation of applications is disabled. <i>Requires the
-  /// beta version of Android Cloud Policy.</i>
+  /// beta version of the Android Device Policy app.</i>
   core.bool uninstallAppsDisabled;
 
   /// Whether the microphone is muted and adjusting microphone volume is
@@ -3574,15 +3670,15 @@
   core.bool unmuteMicrophoneDisabled;
 
   /// Whether transferring files over USB is disabled. <i>Requires the beta
-  /// version of Android Cloud Policy.</i>
+  /// version of the Android Device Policy app.</i>
   core.bool usbFileTransferDisabled;
 
   /// The version of the policy. This is a read-only field. The version is
   /// incremented each time the policy is updated.
   core.String version;
 
-  /// Whether configuring VPN is disabled. <i>Requires the beta version of
-  /// Android Cloud Policy.</i>
+  /// Whether configuring VPN is disabled. <i>Requires the beta version of the
+  /// Android Device Policy app.</i>
   core.bool vpnConfigDisabled;
 
   /// Whether configuring WiFi access points is disabled.
@@ -4132,6 +4228,12 @@
   /// Build time.
   core.String androidBuildTime;
 
+  /// The Android Device Policy app version code.
+  core.int androidDevicePolicyVersionCode;
+
+  /// The Android Device Policy app version as displayed to the user.
+  core.String androidDevicePolicyVersionName;
+
   /// The user visible Android version string, e.g. 6.0.1.
   core.String androidVersion;
 
@@ -4153,6 +4255,12 @@
     if (_json.containsKey("androidBuildTime")) {
       androidBuildTime = _json["androidBuildTime"];
     }
+    if (_json.containsKey("androidDevicePolicyVersionCode")) {
+      androidDevicePolicyVersionCode = _json["androidDevicePolicyVersionCode"];
+    }
+    if (_json.containsKey("androidDevicePolicyVersionName")) {
+      androidDevicePolicyVersionName = _json["androidDevicePolicyVersionName"];
+    }
     if (_json.containsKey("androidVersion")) {
       androidVersion = _json["androidVersion"];
     }
@@ -4176,6 +4284,12 @@
     if (androidBuildTime != null) {
       _json["androidBuildTime"] = androidBuildTime;
     }
+    if (androidDevicePolicyVersionCode != null) {
+      _json["androidDevicePolicyVersionCode"] = androidDevicePolicyVersionCode;
+    }
+    if (androidDevicePolicyVersionName != null) {
+      _json["androidDevicePolicyVersionName"] = androidDevicePolicyVersionName;
+    }
     if (androidVersion != null) {
       _json["androidVersion"] = androidVersion;
     }
@@ -4275,6 +4389,9 @@
 
 /// Settings controlling the behavior of status reports.
 class StatusReportingSettings {
+  /// Whether device settings reporting is enabled.
+  core.bool deviceSettingsEnabled;
+
   /// Whether displays reporting is enabled.
   core.bool displayInfoEnabled;
 
@@ -4296,6 +4413,9 @@
   StatusReportingSettings();
 
   StatusReportingSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("deviceSettingsEnabled")) {
+      deviceSettingsEnabled = _json["deviceSettingsEnabled"];
+    }
     if (_json.containsKey("displayInfoEnabled")) {
       displayInfoEnabled = _json["displayInfoEnabled"];
     }
@@ -4319,6 +4439,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (deviceSettingsEnabled != null) {
+      _json["deviceSettingsEnabled"] = deviceSettingsEnabled;
+    }
     if (displayInfoEnabled != null) {
       _json["displayInfoEnabled"] = displayInfoEnabled;
     }
diff --git a/generated/googleapis/lib/androidpublisher/v2.dart b/generated/googleapis/lib/androidpublisher/v2.dart
index d47c9a1..f418713 100644
--- a/generated/googleapis/lib/androidpublisher/v2.dart
+++ b/generated/googleapis/lib/androidpublisher/v2.dart
@@ -5270,6 +5270,12 @@
   /// 1, 1970).
   core.String purchaseTimeMillis;
 
+  /// The type of purchase of the inapp product. This field is only set if this
+  /// purchase was not made using the standard in-app billing flow. Possible
+  /// values are:
+  /// - Test (i.e. purchased from a license testing account)
+  core.int purchaseType;
+
   ProductPurchase();
 
   ProductPurchase.fromJson(core.Map _json) {
@@ -5291,6 +5297,9 @@
     if (_json.containsKey("purchaseTimeMillis")) {
       purchaseTimeMillis = _json["purchaseTimeMillis"];
     }
+    if (_json.containsKey("purchaseType")) {
+      purchaseType = _json["purchaseType"];
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -5314,6 +5323,9 @@
     if (purchaseTimeMillis != null) {
       _json["purchaseTimeMillis"] = purchaseTimeMillis;
     }
+    if (purchaseType != null) {
+      _json["purchaseType"] = purchaseType;
+    }
     return _json;
   }
 }
@@ -5601,6 +5613,7 @@
   /// - Subscription was cancelled by the system, for example because of a
   /// billing problem
   /// - Subscription was replaced with a new subscription
+  /// - Subscription was cancelled by the developer
   core.int cancelReason;
 
   /// ISO 3166-1 alpha-2 billing country/region code of the user at the time the
@@ -5619,6 +5632,19 @@
   /// service.
   core.String kind;
 
+  /// The purchase token of the originating purchase if this subscription is one
+  /// of the following:
+  /// - Re-signup of a cancelled but non-lapsed subscription
+  /// - Upgrade/downgrade from a previous subscription  For example, suppose a
+  /// user originally signs up and you receive purchase token X, then the user
+  /// cancels and goes through the resignup flow and you receive purchase token
+  /// Y. If you call this API with purchase token Y, this field will be set to
+  /// X. If you call this API with purchase token X, this field will not be set.
+  /// If user upgrade his subscription after the first resignup. You receive
+  /// purchase token Z. If you call this API with purchase token Z, this field
+  /// will be set to Y.
+  core.String linkedPurchaseToken;
+
   /// The order id of the latest recurring order associated with the purchase of
   /// the subscription.
   core.String orderId;
@@ -5640,6 +5666,12 @@
   /// "GBP".
   core.String priceCurrencyCode;
 
+  /// The type of purchase of the subscription. This field is only set if this
+  /// purchase was not made using the standard in-app billing flow. Possible
+  /// values are:
+  /// - Test (i.e. purchased from a license testing account)
+  core.int purchaseType;
+
   /// Time at which the subscription was granted, in milliseconds since the
   /// Epoch.
   core.String startTimeMillis;
@@ -5669,6 +5701,9 @@
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
+    if (_json.containsKey("linkedPurchaseToken")) {
+      linkedPurchaseToken = _json["linkedPurchaseToken"];
+    }
     if (_json.containsKey("orderId")) {
       orderId = _json["orderId"];
     }
@@ -5681,6 +5716,9 @@
     if (_json.containsKey("priceCurrencyCode")) {
       priceCurrencyCode = _json["priceCurrencyCode"];
     }
+    if (_json.containsKey("purchaseType")) {
+      purchaseType = _json["purchaseType"];
+    }
     if (_json.containsKey("startTimeMillis")) {
       startTimeMillis = _json["startTimeMillis"];
     }
@@ -5710,6 +5748,9 @@
     if (kind != null) {
       _json["kind"] = kind;
     }
+    if (linkedPurchaseToken != null) {
+      _json["linkedPurchaseToken"] = linkedPurchaseToken;
+    }
     if (orderId != null) {
       _json["orderId"] = orderId;
     }
@@ -5722,6 +5763,9 @@
     if (priceCurrencyCode != null) {
       _json["priceCurrencyCode"] = priceCurrencyCode;
     }
+    if (purchaseType != null) {
+      _json["purchaseType"] = purchaseType;
+    }
     if (startTimeMillis != null) {
       _json["startTimeMillis"] = startTimeMillis;
     }
diff --git a/generated/googleapis/lib/appengine/v1.dart b/generated/googleapis/lib/appengine/v1.dart
index 1df6545..1be694f 100644
--- a/generated/googleapis/lib/appengine/v1.dart
+++ b/generated/googleapis/lib/appengine/v1.dart
@@ -828,10 +828,10 @@
   /// [appsId] - Part of `parent`. Name of the parent Application resource.
   /// Example: apps/myapp.
   ///
-  /// [pageSize] - Maximum results to return per page.
-  ///
   /// [pageToken] - Continuation token for fetching the next page of results.
   ///
+  /// [pageSize] - Maximum results to return per page.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -843,7 +843,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListDomainMappingsResponse> list(core.String appsId,
-      {core.int pageSize, core.String pageToken, core.String $fields}) {
+      {core.String pageToken, core.int pageSize, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -854,12 +854,12 @@
     if (appsId == null) {
       throw new core.ArgumentError("Parameter appsId is required.");
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1178,14 +1178,14 @@
   /// [appsId] - Part of `parent`. Name of the Firewall collection to retrieve.
   /// Example: apps/myapp/firewall/ingressRules.
   ///
+  /// [pageSize] - Maximum results to return per page.
+  ///
   /// [matchingAddress] - A valid IP Address. If set, only rules matching this
   /// address will be returned. The first returned rule will be the rule that
   /// fires on requests from this IP.
   ///
   /// [pageToken] - Continuation token for fetching the next page of results.
   ///
-  /// [pageSize] - Maximum results to return per page.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1197,9 +1197,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListIngressRulesResponse> list(core.String appsId,
-      {core.String matchingAddress,
+      {core.int pageSize,
+      core.String matchingAddress,
       core.String pageToken,
-      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1211,15 +1211,15 @@
     if (appsId == null) {
       throw new core.ArgumentError("Parameter appsId is required.");
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if (matchingAddress != null) {
       _queryParams["matchingAddress"] = [matchingAddress];
     }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1365,12 +1365,12 @@
   /// [appsId] - Part of `name`. The resource that owns the locations
   /// collection, if applicable.
   ///
+  /// [filter] - The standard list filter.
+  ///
   /// [pageToken] - The standard list page token.
   ///
   /// [pageSize] - The standard list page size.
   ///
-  /// [filter] - The standard list filter.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1382,9 +1382,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListLocationsResponse> list(core.String appsId,
-      {core.String pageToken,
+      {core.String filter,
+      core.String pageToken,
       core.int pageSize,
-      core.String filter,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1396,15 +1396,15 @@
     if (appsId == null) {
       throw new core.ArgumentError("Parameter appsId is required.");
     }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1493,12 +1493,12 @@
   ///
   /// [appsId] - Part of `name`. The name of the operation's parent resource.
   ///
-  /// [pageSize] - The standard list page size.
-  ///
   /// [filter] - The standard list filter.
   ///
   /// [pageToken] - The standard list page token.
   ///
+  /// [pageSize] - The standard list page size.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1510,9 +1510,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListOperationsResponse> list(core.String appsId,
-      {core.int pageSize,
-      core.String filter,
+      {core.String filter,
       core.String pageToken,
+      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1524,15 +1524,15 @@
     if (appsId == null) {
       throw new core.ArgumentError("Parameter appsId is required.");
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (filter != null) {
       _queryParams["filter"] = [filter];
     }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1727,6 +1727,8 @@
   ///
   /// [servicesId] - Part of `name`. See documentation of `appsId`.
   ///
+  /// [updateMask] - Standard field mask for the set of fields to be updated.
+  ///
   /// [migrateTraffic] - Set to true to gradually shift traffic to one or more
   /// versions that you specify. By default, traffic is shifted immediately. For
   /// gradual traffic migration, the target versions must be located within
@@ -1741,8 +1743,6 @@
   /// Splitting Traffic
   /// (https://cloud.google.com/appengine/docs/admin-api/migrating-splitting-traffic).
   ///
-  /// [updateMask] - Standard field mask for the set of fields to be updated.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1755,7 +1755,7 @@
   /// this method will complete with the same error.
   async.Future<Operation> patch(
       Service request, core.String appsId, core.String servicesId,
-      {core.bool migrateTraffic, core.String updateMask, core.String $fields}) {
+      {core.String updateMask, core.bool migrateTraffic, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1772,12 +1772,12 @@
     if (servicesId == null) {
       throw new core.ArgumentError("Parameter servicesId is required.");
     }
-    if (migrateTraffic != null) {
-      _queryParams["migrateTraffic"] = ["${migrateTraffic}"];
-    }
     if (updateMask != null) {
       _queryParams["updateMask"] = [updateMask];
     }
+    if (migrateTraffic != null) {
+      _queryParams["migrateTraffic"] = ["${migrateTraffic}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2003,8 +2003,6 @@
   ///
   /// [servicesId] - Part of `parent`. See documentation of `appsId`.
   ///
-  /// [pageToken] - Continuation token for fetching the next page of results.
-  ///
   /// [pageSize] - Maximum results to return per page.
   ///
   /// [view] - Controls the set of fields returned in the List response.
@@ -2012,6 +2010,8 @@
   /// - "BASIC" : A BASIC.
   /// - "FULL" : A FULL.
   ///
+  /// [pageToken] - Continuation token for fetching the next page of results.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2024,9 +2024,9 @@
   /// this method will complete with the same error.
   async.Future<ListVersionsResponse> list(
       core.String appsId, core.String servicesId,
-      {core.String pageToken,
-      core.int pageSize,
+      {core.int pageSize,
       core.String view,
+      core.String pageToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -2041,15 +2041,15 @@
     if (servicesId == null) {
       throw new core.ArgumentError("Parameter servicesId is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
     if (view != null) {
       _queryParams["view"] = [view];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2883,8 +2883,8 @@
 class AutomaticScaling {
   /// Amount of time that the Autoscaler
   /// (https://cloud.google.com/compute/docs/autoscaler/) should wait between
-  /// changes to the number of virtual machines. Only applicable for VM
-  /// runtimes.
+  /// changes to the number of virtual machines. Only applicable in the App
+  /// Engine flexible environment.
   core.String coolDownPeriod;
 
   /// Target scaling by CPU usage.
@@ -3286,7 +3286,8 @@
   }
 }
 
-/// Target scaling by disk usage. Only applicable for VM runtimes.
+/// Target scaling by disk usage. Only applicable in the App Engine flexible
+/// environment.
 class DiskUtilization {
   /// Target bytes read per second.
   core.int targetReadBytesPerSecond;
@@ -4486,16 +4487,16 @@
   }
 }
 
-/// Extra network settings. Only applicable for App Engine flexible environment
-/// versions
+/// Extra network settings. Only applicable in the App Engine flexible
+/// environment.
 class Network {
   /// List of ports, or port pairs, to forward from the virtual machine to the
-  /// application container. Only applicable for App Engine flexible environment
-  /// versions.
+  /// application container. Only applicable in the App Engine flexible
+  /// environment.
   core.List<core.String> forwardedPorts;
 
-  /// Tag to apply to the VM instance during creation. Only applicable for for
-  /// App Engine flexible environment versions.
+  /// Tag to apply to the VM instance during creation. for Only applicable in
+  /// the App Engine flexible environment.
   core.String instanceTag;
 
   /// Google Compute Engine network where the virtual machines are created.
@@ -4555,7 +4556,8 @@
   }
 }
 
-/// Target scaling by network usage. Only applicable for VM runtimes.
+/// Target scaling by network usage. Only applicable in the App Engine flexible
+/// environment.
 class NetworkUtilization {
   /// Target bytes received per second.
   core.int targetReceivedBytesPerSecond;
@@ -5150,7 +5152,8 @@
   }
 }
 
-/// Target scaling by request utilization. Only applicable for VM runtimes.
+/// Target scaling by request utilization. Only applicable in the App Engine
+/// flexible environment.
 class RequestUtilization {
   /// Target number of concurrent requests.
   core.int targetConcurrentRequests;
@@ -5868,7 +5871,7 @@
   Deployment deployment;
 
   /// Total size in bytes of all the files that are included in this version and
-  /// curerntly hosted on the App Engine disk.@OutputOnly
+  /// currently hosted on the App Engine disk.@OutputOnly
   core.String diskUsageBytes;
 
   /// Cloud Endpoints configuration.If endpoints_api_service is set, the Cloud
@@ -5894,8 +5897,8 @@
   core.List<UrlMap> handlers;
 
   /// Configures health checking for VM instances. Unhealthy instances are
-  /// stopped and replaced with new instances. Only applicable for VM
-  /// runtimes.Only returned in GET requests if view=FULL is set.
+  /// stopped and replaced with new instances. Only applicable in the App Engine
+  /// flexible environment.Only returned in GET requests if view=FULL is set.
   HealthCheck healthCheck;
 
   /// Relative name of the version within the service. Example: v1. Version
@@ -5930,8 +5933,8 @@
   /// apps/myapp/services/default/versions/v1.@OutputOnly
   core.String name;
 
-  /// Extra network settings. Only applicable for App Engine flexible
-  /// environment versions.
+  /// Extra network settings. Only applicable in the App Engine flexible
+  /// environment.
   Network network;
 
   /// Files that match this pattern will not be built into this version. Only
@@ -6188,7 +6191,8 @@
   }
 }
 
-/// Volumes mounted within the app container. Only applicable for VM runtimes.
+/// Volumes mounted within the app container. Only applicable in the App Engine
+/// flexible environment.
 class Volume {
   /// Unique name for the volume.
   core.String name;
diff --git a/generated/googleapis/lib/bigquery/v2.dart b/generated/googleapis/lib/bigquery/v2.dart
index 79d6a5b..844fb0c 100644
--- a/generated/googleapis/lib/bigquery/v2.dart
+++ b/generated/googleapis/lib/bigquery/v2.dart
@@ -2254,6 +2254,9 @@
 }
 
 class ExplainQueryStage {
+  /// Number of parallel input segments completed.
+  core.String completedParallelInputs;
+
   /// Milliseconds the average shard spent on CPU-bound tasks.
   core.String computeMsAvg;
 
@@ -2272,6 +2275,9 @@
   /// Human-readable name for stage.
   core.String name;
 
+  /// Number of parallel input segments to be processed.
+  core.String parallelInputs;
+
   /// Milliseconds the average shard spent reading input.
   core.String readMsAvg;
 
@@ -2330,6 +2336,9 @@
   ExplainQueryStage();
 
   ExplainQueryStage.fromJson(core.Map _json) {
+    if (_json.containsKey("completedParallelInputs")) {
+      completedParallelInputs = _json["completedParallelInputs"];
+    }
     if (_json.containsKey("computeMsAvg")) {
       computeMsAvg = _json["computeMsAvg"];
     }
@@ -2348,6 +2357,9 @@
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
+    if (_json.containsKey("parallelInputs")) {
+      parallelInputs = _json["parallelInputs"];
+    }
     if (_json.containsKey("readMsAvg")) {
       readMsAvg = _json["readMsAvg"];
     }
@@ -2409,6 +2421,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (completedParallelInputs != null) {
+      _json["completedParallelInputs"] = completedParallelInputs;
+    }
     if (computeMsAvg != null) {
       _json["computeMsAvg"] = computeMsAvg;
     }
@@ -2427,6 +2442,9 @@
     if (name != null) {
       _json["name"] = name;
     }
+    if (parallelInputs != null) {
+      _json["parallelInputs"] = parallelInputs;
+    }
     if (readMsAvg != null) {
       _json["readMsAvg"] = readMsAvg;
     }
@@ -4062,6 +4080,9 @@
   /// CREATE/DROP TABLE/VIEW queries.
   TableReference ddlTargetTable;
 
+  /// [Output-only] The original estimate of bytes processed for the job.
+  core.String estimatedBytesProcessed;
+
   /// [Output-only] The number of rows affected by a DML statement. Present only
   /// for DML statements INSERT, UPDATE or DELETE.
   core.String numDmlAffectedRows;
@@ -4078,8 +4099,22 @@
   TableSchema schema;
 
   /// [Output-only, Experimental] The type of query statement, if valid.
+  /// Possible values (new values might be added in the future): "SELECT":
+  /// SELECT query. "INSERT": INSERT query; see
+  /// https://cloud.google.com/bigquery/docs/reference/standard-sql/data-manipulation-language
+  /// "UPDATE": UPDATE query; see
+  /// https://cloud.google.com/bigquery/docs/reference/standard-sql/data-manipulation-language
+  /// "DELETE": DELETE query; see
+  /// https://cloud.google.com/bigquery/docs/reference/standard-sql/data-manipulation-language
+  /// "CREATE_TABLE": CREATE [OR REPLACE] TABLE without AS SELECT.
+  /// "CREATE_TABLE_AS_SELECT": CREATE [OR REPLACE] TABLE ... AS SELECT ...
+  /// "DROP_TABLE": DROP TABLE query. "CREATE_VIEW": CREATE [OR REPLACE] VIEW
+  /// ... AS SELECT ... "DROP_VIEW": DROP VIEW query.
   core.String statementType;
 
+  /// [Output-only] Describes a timeline of job execution.
+  core.List<QueryTimelineSample> timeline;
+
   /// [Output-only] Total bytes billed for the job.
   core.String totalBytesBilled;
 
@@ -4108,6 +4143,9 @@
     if (_json.containsKey("ddlTargetTable")) {
       ddlTargetTable = new TableReference.fromJson(_json["ddlTargetTable"]);
     }
+    if (_json.containsKey("estimatedBytesProcessed")) {
+      estimatedBytesProcessed = _json["estimatedBytesProcessed"];
+    }
     if (_json.containsKey("numDmlAffectedRows")) {
       numDmlAffectedRows = _json["numDmlAffectedRows"];
     }
@@ -4127,6 +4165,11 @@
     if (_json.containsKey("statementType")) {
       statementType = _json["statementType"];
     }
+    if (_json.containsKey("timeline")) {
+      timeline = _json["timeline"]
+          .map((value) => new QueryTimelineSample.fromJson(value))
+          .toList();
+    }
     if (_json.containsKey("totalBytesBilled")) {
       totalBytesBilled = _json["totalBytesBilled"];
     }
@@ -4158,6 +4201,9 @@
     if (ddlTargetTable != null) {
       _json["ddlTargetTable"] = (ddlTargetTable).toJson();
     }
+    if (estimatedBytesProcessed != null) {
+      _json["estimatedBytesProcessed"] = estimatedBytesProcessed;
+    }
     if (numDmlAffectedRows != null) {
       _json["numDmlAffectedRows"] = numDmlAffectedRows;
     }
@@ -4174,6 +4220,9 @@
     if (statementType != null) {
       _json["statementType"] = statementType;
     }
+    if (timeline != null) {
+      _json["timeline"] = timeline.map((value) => (value).toJson()).toList();
+    }
     if (totalBytesBilled != null) {
       _json["totalBytesBilled"] = totalBytesBilled;
     }
@@ -4949,6 +4998,74 @@
   }
 }
 
+class QueryTimelineSample {
+  /// Total number of active workers. This does not correspond directly to slot
+  /// usage. This is the largest value observed since the last sample.
+  core.int activeInputs;
+
+  /// Total parallel units of work completed by this query.
+  core.int completedInputs;
+
+  /// Total parallel units of work completed by the currently active stages.
+  core.int completedInputsForActiveStages;
+
+  /// Milliseconds elapsed since the start of query execution.
+  core.String elapsedMs;
+
+  /// Total parallel units of work remaining for the active stages.
+  core.String pendingInputs;
+
+  /// Cumulative slot-ms consumed by the query.
+  core.String totalSlotMs;
+
+  QueryTimelineSample();
+
+  QueryTimelineSample.fromJson(core.Map _json) {
+    if (_json.containsKey("activeInputs")) {
+      activeInputs = _json["activeInputs"];
+    }
+    if (_json.containsKey("completedInputs")) {
+      completedInputs = _json["completedInputs"];
+    }
+    if (_json.containsKey("completedInputsForActiveStages")) {
+      completedInputsForActiveStages = _json["completedInputsForActiveStages"];
+    }
+    if (_json.containsKey("elapsedMs")) {
+      elapsedMs = _json["elapsedMs"];
+    }
+    if (_json.containsKey("pendingInputs")) {
+      pendingInputs = _json["pendingInputs"];
+    }
+    if (_json.containsKey("totalSlotMs")) {
+      totalSlotMs = _json["totalSlotMs"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (activeInputs != null) {
+      _json["activeInputs"] = activeInputs;
+    }
+    if (completedInputs != null) {
+      _json["completedInputs"] = completedInputs;
+    }
+    if (completedInputsForActiveStages != null) {
+      _json["completedInputsForActiveStages"] = completedInputsForActiveStages;
+    }
+    if (elapsedMs != null) {
+      _json["elapsedMs"] = elapsedMs;
+    }
+    if (pendingInputs != null) {
+      _json["pendingInputs"] = pendingInputs;
+    }
+    if (totalSlotMs != null) {
+      _json["totalSlotMs"] = totalSlotMs;
+    }
+    return _json;
+  }
+}
+
 class Streamingbuffer {
   /// [Output-only] A lower-bound estimate of the number of bytes currently in
   /// the streaming buffer.
@@ -5009,7 +5126,9 @@
 
   /// [Optional] The time when this table expires, in milliseconds since the
   /// epoch. If not present, the table will persist indefinitely. Expired tables
-  /// will be deleted and their storage reclaimed.
+  /// will be deleted and their storage reclaimed. The defaultTableExpirationMs
+  /// property of the encapsulating dataset can be used to set a default
+  /// expirationTime on newly created tables.
   core.String expirationTime;
 
   /// [Optional] Describes the data format, location, and other properties of a
diff --git a/generated/googleapis/lib/bigquerydatatransfer/v1.dart b/generated/googleapis/lib/bigquerydatatransfer/v1.dart
index 70536c2..3548777 100644
--- a/generated/googleapis/lib/bigquerydatatransfer/v1.dart
+++ b/generated/googleapis/lib/bigquerydatatransfer/v1.dart
@@ -289,12 +289,12 @@
   /// [name] - The resource that owns the locations collection, if applicable.
   /// Value must have pattern "^projects/[^/]+$".
   ///
+  /// [filter] - The standard list filter.
+  ///
   /// [pageToken] - The standard list page token.
   ///
   /// [pageSize] - The standard list page size.
   ///
-  /// [filter] - The standard list filter.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -306,9 +306,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListLocationsResponse> list(core.String name,
-      {core.String pageToken,
+      {core.String filter,
+      core.String pageToken,
       core.int pageSize,
-      core.String filter,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -320,15 +320,15 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -711,9 +711,6 @@
   /// should be returned: `projects/{project_id}`.
   /// Value must have pattern "^projects/[^/]+/locations/[^/]+$".
   ///
-  /// [dataSourceIds] - When specified, only configurations of requested data
-  /// sources are returned.
-  ///
   /// [pageToken] - Pagination token, which can be used to request a specific
   /// page
   /// of `ListTransfersRequest` list results. For multiple-page
@@ -724,6 +721,9 @@
   /// [pageSize] - Page size. The default page size is the maximum value of 1000
   /// results.
   ///
+  /// [dataSourceIds] - When specified, only configurations of requested data
+  /// sources are returned.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -735,9 +735,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListTransferConfigsResponse> list(core.String parent,
-      {core.List<core.String> dataSourceIds,
-      core.String pageToken,
+      {core.String pageToken,
       core.int pageSize,
+      core.List<core.String> dataSourceIds,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -749,15 +749,15 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (dataSourceIds != null) {
-      _queryParams["dataSourceIds"] = dataSourceIds;
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (dataSourceIds != null) {
+      _queryParams["dataSourceIds"] = dataSourceIds;
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -792,8 +792,6 @@
   /// Value must have pattern
   /// "^projects/[^/]+/locations/[^/]+/transferConfigs/[^/]+$".
   ///
-  /// [updateMask] - Required list of fields to be updated in this request.
-  ///
   /// [authorizationCode] - Optional OAuth2 authorization code to use with this
   /// transfer configuration.
   /// If it is provided, the transfer configuration will be associated with the
@@ -812,6 +810,8 @@
   ///   returned in the title bar of the browser, with the page text prompting
   ///   the user to copy the code and paste it in the application.
   ///
+  /// [updateMask] - Required list of fields to be updated in this request.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -823,8 +823,8 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<TransferConfig> patch(TransferConfig request, core.String name,
-      {core.String updateMask,
-      core.String authorizationCode,
+      {core.String authorizationCode,
+      core.String updateMask,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -839,12 +839,12 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
-    if (updateMask != null) {
-      _queryParams["updateMask"] = [updateMask];
-    }
     if (authorizationCode != null) {
       _queryParams["authorizationCode"] = [authorizationCode];
     }
+    if (updateMask != null) {
+      _queryParams["updateMask"] = [updateMask];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1033,6 +1033,11 @@
   /// Value must have pattern
   /// "^projects/[^/]+/locations/[^/]+/transferConfigs/[^/]+$".
   ///
+  /// [runAttempt] - Indicates how run attempts are to be pulled.
+  /// Possible string values are:
+  /// - "RUN_ATTEMPT_UNSPECIFIED" : A RUN_ATTEMPT_UNSPECIFIED.
+  /// - "LATEST" : A LATEST.
+  ///
   /// [pageToken] - Pagination token, which can be used to request a specific
   /// page
   /// of `ListTransferRunsRequest` list results. For multiple-page
@@ -1046,11 +1051,6 @@
   /// [pageSize] - Page size. The default page size is the maximum value of 1000
   /// results.
   ///
-  /// [runAttempt] - Indicates how run attempts are to be pulled.
-  /// Possible string values are:
-  /// - "RUN_ATTEMPT_UNSPECIFIED" : A RUN_ATTEMPT_UNSPECIFIED.
-  /// - "LATEST" : A LATEST.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1062,10 +1062,10 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListTransferRunsResponse> list(core.String parent,
-      {core.String pageToken,
+      {core.String runAttempt,
+      core.String pageToken,
       core.List<core.String> states,
       core.int pageSize,
-      core.String runAttempt,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1077,6 +1077,9 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
+    if (runAttempt != null) {
+      _queryParams["runAttempt"] = [runAttempt];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
@@ -1086,9 +1089,6 @@
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (runAttempt != null) {
-      _queryParams["runAttempt"] = [runAttempt];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1691,6 +1691,11 @@
   /// `projects/{project_id}/transferConfigs/{config_id}`.
   /// Value must have pattern "^projects/[^/]+/transferConfigs/[^/]+$".
   ///
+  /// [runAttempt] - Indicates how run attempts are to be pulled.
+  /// Possible string values are:
+  /// - "RUN_ATTEMPT_UNSPECIFIED" : A RUN_ATTEMPT_UNSPECIFIED.
+  /// - "LATEST" : A LATEST.
+  ///
   /// [pageToken] - Pagination token, which can be used to request a specific
   /// page
   /// of `ListTransferRunsRequest` list results. For multiple-page
@@ -1704,11 +1709,6 @@
   /// [pageSize] - Page size. The default page size is the maximum value of 1000
   /// results.
   ///
-  /// [runAttempt] - Indicates how run attempts are to be pulled.
-  /// Possible string values are:
-  /// - "RUN_ATTEMPT_UNSPECIFIED" : A RUN_ATTEMPT_UNSPECIFIED.
-  /// - "LATEST" : A LATEST.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1720,10 +1720,10 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListTransferRunsResponse> list(core.String parent,
-      {core.String pageToken,
+      {core.String runAttempt,
+      core.String pageToken,
       core.List<core.String> states,
       core.int pageSize,
-      core.String runAttempt,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1735,6 +1735,9 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
+    if (runAttempt != null) {
+      _queryParams["runAttempt"] = [runAttempt];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
@@ -1744,9 +1747,6 @@
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (runAttempt != null) {
-      _queryParams["runAttempt"] = [runAttempt];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1950,7 +1950,7 @@
   /// for the data source.
   core.bool manualRunsDisabled;
 
-  /// The minimum interval between two consecutive scheduled runs.
+  /// The minimum interval for scheduler to schedule runs.
   core.String minimumScheduleInterval;
 
   /// Data source resource name.
@@ -2927,7 +2927,7 @@
 }
 
 /// Represents a data transfer run.
-/// Next id: 24
+/// Next id: 27
 class TransferRun {
   /// Output only. Data source id.
   core.String dataSourceId;
diff --git a/generated/googleapis/lib/calendar/v3.dart b/generated/googleapis/lib/calendar/v3.dart
index a7bb10b..269e46b 100644
--- a/generated/googleapis/lib/calendar/v3.dart
+++ b/generated/googleapis/lib/calendar/v3.dart
@@ -1509,6 +1509,13 @@
   /// calendarList.list method. If you want to access the primary calendar of
   /// the currently logged in user, use the "primary" keyword.
   ///
+  /// [conferenceDataVersion] - Version number of conference data supported by
+  /// the API client. Version 0 assumes no conference data support and ignores
+  /// conference data in the event's body. Version 1 enables support for copying
+  /// of ConferenceData as well as for creating new conferences using the
+  /// createRequest field of conferenceData. The default is 0.
+  /// Value must be between "0" and "1".
+  ///
   /// [supportsAttachments] - Whether API client performing operation supports
   /// event attachments. Optional. The default is False.
   ///
@@ -1523,7 +1530,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<Event> import(Event request, core.String calendarId,
-      {core.bool supportsAttachments, core.String $fields}) {
+      {core.int conferenceDataVersion,
+      core.bool supportsAttachments,
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1537,6 +1546,9 @@
     if (calendarId == null) {
       throw new core.ArgumentError("Parameter calendarId is required.");
     }
+    if (conferenceDataVersion != null) {
+      _queryParams["conferenceDataVersion"] = ["${conferenceDataVersion}"];
+    }
     if (supportsAttachments != null) {
       _queryParams["supportsAttachments"] = ["${supportsAttachments}"];
     }
@@ -1567,6 +1579,13 @@
   /// calendarList.list method. If you want to access the primary calendar of
   /// the currently logged in user, use the "primary" keyword.
   ///
+  /// [conferenceDataVersion] - Version number of conference data supported by
+  /// the API client. Version 0 assumes no conference data support and ignores
+  /// conference data in the event's body. Version 1 enables support for copying
+  /// of ConferenceData as well as for creating new conferences using the
+  /// createRequest field of conferenceData. The default is 0.
+  /// Value must be between "0" and "1".
+  ///
   /// [maxAttendees] - The maximum number of attendees to include in the
   /// response. If there are more than the specified number of attendees, only
   /// the participant is returned. Optional.
@@ -1588,7 +1607,8 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<Event> insert(Event request, core.String calendarId,
-      {core.int maxAttendees,
+      {core.int conferenceDataVersion,
+      core.int maxAttendees,
       core.bool sendNotifications,
       core.bool supportsAttachments,
       core.String $fields}) {
@@ -1605,6 +1625,9 @@
     if (calendarId == null) {
       throw new core.ArgumentError("Parameter calendarId is required.");
     }
+    if (conferenceDataVersion != null) {
+      _queryParams["conferenceDataVersion"] = ["${conferenceDataVersion}"];
+    }
     if (maxAttendees != null) {
       _queryParams["maxAttendees"] = ["${maxAttendees}"];
     }
@@ -2059,6 +2082,13 @@
   /// cannot handle the absence of an email address value in the mentioned
   /// places. Optional. The default is False.
   ///
+  /// [conferenceDataVersion] - Version number of conference data supported by
+  /// the API client. Version 0 assumes no conference data support and ignores
+  /// conference data in the event's body. Version 1 enables support for copying
+  /// of ConferenceData as well as for creating new conferences using the
+  /// createRequest field of conferenceData. The default is 0.
+  /// Value must be between "0" and "1".
+  ///
   /// [maxAttendees] - The maximum number of attendees to include in the
   /// response. If there are more than the specified number of attendees, only
   /// the participant is returned. Optional.
@@ -2083,6 +2113,7 @@
   async.Future<Event> patch(
       Event request, core.String calendarId, core.String eventId,
       {core.bool alwaysIncludeEmail,
+      core.int conferenceDataVersion,
       core.int maxAttendees,
       core.bool sendNotifications,
       core.bool supportsAttachments,
@@ -2106,6 +2137,9 @@
     if (alwaysIncludeEmail != null) {
       _queryParams["alwaysIncludeEmail"] = ["${alwaysIncludeEmail}"];
     }
+    if (conferenceDataVersion != null) {
+      _queryParams["conferenceDataVersion"] = ["${conferenceDataVersion}"];
+    }
     if (maxAttendees != null) {
       _queryParams["maxAttendees"] = ["${maxAttendees}"];
     }
@@ -2211,6 +2245,13 @@
   /// cannot handle the absence of an email address value in the mentioned
   /// places. Optional. The default is False.
   ///
+  /// [conferenceDataVersion] - Version number of conference data supported by
+  /// the API client. Version 0 assumes no conference data support and ignores
+  /// conference data in the event's body. Version 1 enables support for copying
+  /// of ConferenceData as well as for creating new conferences using the
+  /// createRequest field of conferenceData. The default is 0.
+  /// Value must be between "0" and "1".
+  ///
   /// [maxAttendees] - The maximum number of attendees to include in the
   /// response. If there are more than the specified number of attendees, only
   /// the participant is returned. Optional.
@@ -2235,6 +2276,7 @@
   async.Future<Event> update(
       Event request, core.String calendarId, core.String eventId,
       {core.bool alwaysIncludeEmail,
+      core.int conferenceDataVersion,
       core.int maxAttendees,
       core.bool sendNotifications,
       core.bool supportsAttachments,
@@ -2258,6 +2300,9 @@
     if (alwaysIncludeEmail != null) {
       _queryParams["alwaysIncludeEmail"] = ["${alwaysIncludeEmail}"];
     }
+    if (conferenceDataVersion != null) {
+      _queryParams["conferenceDataVersion"] = ["${conferenceDataVersion}"];
+    }
     if (maxAttendees != null) {
       _queryParams["maxAttendees"] = ["${maxAttendees}"];
     }
@@ -2911,6 +2956,10 @@
 }
 
 class Calendar {
+  /// Conferencing properties for this calendar, for example what types of
+  /// conferences are allowed.
+  ConferenceProperties conferenceProperties;
+
   /// Description of the calendar. Optional.
   core.String description;
 
@@ -2937,6 +2986,10 @@
   Calendar();
 
   Calendar.fromJson(core.Map _json) {
+    if (_json.containsKey("conferenceProperties")) {
+      conferenceProperties =
+          new ConferenceProperties.fromJson(_json["conferenceProperties"]);
+    }
     if (_json.containsKey("description")) {
       description = _json["description"];
     }
@@ -2963,6 +3016,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (conferenceProperties != null) {
+      _json["conferenceProperties"] = (conferenceProperties).toJson();
+    }
     if (description != null) {
       _json["description"] = description;
     }
@@ -3104,6 +3160,10 @@
   /// properties and can be ignored when using these properties. Optional.
   core.String colorId;
 
+  /// Conferencing properties for this calendar, for example what types of
+  /// conferences are allowed.
+  ConferenceProperties conferenceProperties;
+
   /// The default reminders that the authenticated user has for this calendar.
   core.List<EventReminder> defaultReminders;
 
@@ -3171,6 +3231,10 @@
     if (_json.containsKey("colorId")) {
       colorId = _json["colorId"];
     }
+    if (_json.containsKey("conferenceProperties")) {
+      conferenceProperties =
+          new ConferenceProperties.fromJson(_json["conferenceProperties"]);
+    }
     if (_json.containsKey("defaultReminders")) {
       defaultReminders = _json["defaultReminders"]
           .map((value) => new EventReminder.fromJson(value))
@@ -3233,6 +3297,9 @@
     if (colorId != null) {
       _json["colorId"] = colorId;
     }
+    if (conferenceProperties != null) {
+      _json["conferenceProperties"] = (conferenceProperties).toJson();
+    }
     if (defaultReminders != null) {
       _json["defaultReminders"] =
           defaultReminders.map((value) => (value).toJson()).toList();
@@ -3530,6 +3597,406 @@
   }
 }
 
+class ConferenceData {
+  /// The ID of the conference.
+  /// Can be used by developers to keep track of conferences, should not be
+  /// displayed to users.
+  /// Values for solution types:
+  /// - "eventHangout": unset
+  /// - "eventNamedHangout": the name of the Hangout.
+  /// - "hangoutsMeet": the 10-letter meeting code, for example "aaa-bbbb-ccc".
+  /// Optional.
+  core.String conferenceId;
+
+  /// The conference solution, such as Hangouts or Hangouts Meet.
+  /// Unset for a conference with failed create request.
+  /// Either conferenceSolution and at least one entryPoint, or createRequest is
+  /// required.
+  ConferenceSolution conferenceSolution;
+
+  /// A request to generate a new conference and attach it to the event. The
+  /// data is generated asynchronously. To see whether the data is present check
+  /// the status field.
+  /// Either conferenceSolution and at least one entryPoint, or createRequest is
+  /// required.
+  CreateConferenceRequest createRequest;
+
+  /// Information about individual conference entry points, such as URLs or
+  /// phone numbers.
+  /// All of them must belong to the same conference.
+  /// Either conferenceSolution and at least one entryPoint, or createRequest is
+  /// required.
+  core.List<EntryPoint> entryPoints;
+
+  /// Additional notes (such as instructions from the domain administrator,
+  /// legal notices) to display to the user. Can contain HTML. The maximum
+  /// length is 2048 characters. Optional.
+  core.String notes;
+
+  /// The signature of the conference data.
+  /// Genereated on server side. Must be preserved while copying the conference
+  /// data between events, otherwise the conference data will not be copied.
+  /// Unset for a conference with failed create request.
+  /// Optional for a conference with a pending create request.
+  core.String signature;
+
+  ConferenceData();
+
+  ConferenceData.fromJson(core.Map _json) {
+    if (_json.containsKey("conferenceId")) {
+      conferenceId = _json["conferenceId"];
+    }
+    if (_json.containsKey("conferenceSolution")) {
+      conferenceSolution =
+          new ConferenceSolution.fromJson(_json["conferenceSolution"]);
+    }
+    if (_json.containsKey("createRequest")) {
+      createRequest =
+          new CreateConferenceRequest.fromJson(_json["createRequest"]);
+    }
+    if (_json.containsKey("entryPoints")) {
+      entryPoints = _json["entryPoints"]
+          .map((value) => new EntryPoint.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("notes")) {
+      notes = _json["notes"];
+    }
+    if (_json.containsKey("signature")) {
+      signature = _json["signature"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (conferenceId != null) {
+      _json["conferenceId"] = conferenceId;
+    }
+    if (conferenceSolution != null) {
+      _json["conferenceSolution"] = (conferenceSolution).toJson();
+    }
+    if (createRequest != null) {
+      _json["createRequest"] = (createRequest).toJson();
+    }
+    if (entryPoints != null) {
+      _json["entryPoints"] =
+          entryPoints.map((value) => (value).toJson()).toList();
+    }
+    if (notes != null) {
+      _json["notes"] = notes;
+    }
+    if (signature != null) {
+      _json["signature"] = signature;
+    }
+    return _json;
+  }
+}
+
+class ConferenceProperties {
+  /// The types of conference solutions that are supported for this calendar.
+  /// The possible values are:
+  /// - "eventHangout"
+  /// - "eventNamedHangout"
+  /// - "hangoutsMeet"  Optional.
+  core.List<core.String> allowedConferenceSolutionTypes;
+
+  ConferenceProperties();
+
+  ConferenceProperties.fromJson(core.Map _json) {
+    if (_json.containsKey("allowedConferenceSolutionTypes")) {
+      allowedConferenceSolutionTypes = _json["allowedConferenceSolutionTypes"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (allowedConferenceSolutionTypes != null) {
+      _json["allowedConferenceSolutionTypes"] = allowedConferenceSolutionTypes;
+    }
+    return _json;
+  }
+}
+
+class ConferenceRequestStatus {
+  /// The current status of the conference create request. Read-only.
+  /// The possible values are:
+  /// - "pending": the conference create request is still being processed.
+  /// - "success": the conference create request succeeded, the entry points are
+  /// populated.
+  /// - "failure": the conference create request failed, there are no entry
+  /// points.
+  core.String statusCode;
+
+  ConferenceRequestStatus();
+
+  ConferenceRequestStatus.fromJson(core.Map _json) {
+    if (_json.containsKey("statusCode")) {
+      statusCode = _json["statusCode"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (statusCode != null) {
+      _json["statusCode"] = statusCode;
+    }
+    return _json;
+  }
+}
+
+class ConferenceSolution {
+  /// The user-visible icon for this solution. Read-only.
+  core.String iconUri;
+
+  /// The key which can uniquely identify the conference solution for this
+  /// event.
+  ConferenceSolutionKey key;
+
+  /// The user-visible name of this solution. Not localized. Read-only.
+  core.String name;
+
+  ConferenceSolution();
+
+  ConferenceSolution.fromJson(core.Map _json) {
+    if (_json.containsKey("iconUri")) {
+      iconUri = _json["iconUri"];
+    }
+    if (_json.containsKey("key")) {
+      key = new ConferenceSolutionKey.fromJson(_json["key"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (iconUri != null) {
+      _json["iconUri"] = iconUri;
+    }
+    if (key != null) {
+      _json["key"] = (key).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+class ConferenceSolutionKey {
+  /// The conference solution type.
+  /// If a client encounters an unfamiliar or empty type, it should still be
+  /// able to display the entry points. However, it should disallow
+  /// modifications.
+  /// The possible values are:
+  /// - "eventHangout" for Hangouts for consumers (http://hangouts.google.com)
+  /// - "eventNamedHangout" for Classic Hangouts for GSuite users
+  /// (http://hangouts.google.com)
+  /// - "hangoutsMeet" for Hangouts Meet (http://meet.google.com)
+  core.String type;
+
+  ConferenceSolutionKey();
+
+  ConferenceSolutionKey.fromJson(core.Map _json) {
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+class CreateConferenceRequest {
+  /// The conference solution, such as Hangouts or Hangouts Meet.
+  ConferenceSolutionKey conferenceSolutionKey;
+
+  /// The client-generated unique ID for this request.
+  /// Clients should regenerate this ID for every new request. If an ID provided
+  /// is the same as for the previous request, the request is ignored.
+  core.String requestId;
+
+  /// The status of the conference create request.
+  ConferenceRequestStatus status;
+
+  CreateConferenceRequest();
+
+  CreateConferenceRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("conferenceSolutionKey")) {
+      conferenceSolutionKey =
+          new ConferenceSolutionKey.fromJson(_json["conferenceSolutionKey"]);
+    }
+    if (_json.containsKey("requestId")) {
+      requestId = _json["requestId"];
+    }
+    if (_json.containsKey("status")) {
+      status = new ConferenceRequestStatus.fromJson(_json["status"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (conferenceSolutionKey != null) {
+      _json["conferenceSolutionKey"] = (conferenceSolutionKey).toJson();
+    }
+    if (requestId != null) {
+      _json["requestId"] = requestId;
+    }
+    if (status != null) {
+      _json["status"] = (status).toJson();
+    }
+    return _json;
+  }
+}
+
+class EntryPoint {
+  /// The Access Code to access the conference. The maximum length is 128
+  /// characters.
+  /// When creating new conference data, populate only the subset of
+  /// {meetingCode, accessCode, passcode, password, pin} fields that match the
+  /// terminology that the conference provider uses. Only the populated fields
+  /// should be displayed.
+  /// Optional.
+  core.String accessCode;
+
+  /// The type of the conference entry point.
+  /// Possible values are:
+  /// - "video" - joining a conference over HTTP. A conference can have zero or
+  /// one video entry point.
+  /// - "phone" - joining a conference by dialing a phone number. A conference
+  /// can have zero or more phone entry points.
+  /// - "sip" - joining a conference over SIP. A conference can have zero or one
+  /// sip entry point.
+  /// - "more" - further conference joining instructions, for example additional
+  /// phone numbers. A conference can have zero or one more entry point. A
+  /// conference with only a more entry point is not a valid conference.
+  core.String entryPointType;
+
+  /// The label for the URI.Visible to end users. Not localized. The maximum
+  /// length is 512 characters.
+  /// Examples:
+  /// - for video: meet.google.com/aaa-bbbb-ccc
+  /// - for phone: +1 123 268 2601
+  /// - for sip: sip:12345678@myprovider.com
+  /// - for more: should not be filled
+  /// Optional.
+  core.String label;
+
+  /// The Meeting Code to access the conference. The maximum length is 128
+  /// characters.
+  /// When creating new conference data, populate only the subset of
+  /// {meetingCode, accessCode, passcode, password, pin} fields that match the
+  /// terminology that the conference provider uses. Only the populated fields
+  /// should be displayed.
+  /// Optional.
+  core.String meetingCode;
+
+  /// The Passcode to access the conference. The maximum length is 128
+  /// characters.
+  /// When creating new conference data, populate only the subset of
+  /// {meetingCode, accessCode, passcode, password, pin} fields that match the
+  /// terminology that the conference provider uses. Only the populated fields
+  /// should be displayed.
+  core.String passcode;
+
+  /// The Password to access the conference. The maximum length is 128
+  /// characters.
+  /// When creating new conference data, populate only the subset of
+  /// {meetingCode, accessCode, passcode, password, pin} fields that match the
+  /// terminology that the conference provider uses. Only the populated fields
+  /// should be displayed.
+  /// Optional.
+  core.String password;
+
+  /// The PIN to access the conference. The maximum length is 128 characters.
+  /// When creating new conference data, populate only the subset of
+  /// {meetingCode, accessCode, passcode, password, pin} fields that match the
+  /// terminology that the conference provider uses. Only the populated fields
+  /// should be displayed.
+  /// Optional.
+  core.String pin;
+
+  /// The "URI" of the entry point. The maximum length is 1300 characters.
+  /// Format:
+  /// - for video, http: or https: schema is required.
+  /// - for phone, tel: schema is required. The URI should include the entire
+  /// dial sequence (e.g., tel:+12345678900,,,123456789;1234).
+  /// - for sip, sip: schema is required, e.g., sip:12345678@myprovider.com.
+  /// - for more, http: or https: schema is required.
+  core.String uri;
+
+  EntryPoint();
+
+  EntryPoint.fromJson(core.Map _json) {
+    if (_json.containsKey("accessCode")) {
+      accessCode = _json["accessCode"];
+    }
+    if (_json.containsKey("entryPointType")) {
+      entryPointType = _json["entryPointType"];
+    }
+    if (_json.containsKey("label")) {
+      label = _json["label"];
+    }
+    if (_json.containsKey("meetingCode")) {
+      meetingCode = _json["meetingCode"];
+    }
+    if (_json.containsKey("passcode")) {
+      passcode = _json["passcode"];
+    }
+    if (_json.containsKey("password")) {
+      password = _json["password"];
+    }
+    if (_json.containsKey("pin")) {
+      pin = _json["pin"];
+    }
+    if (_json.containsKey("uri")) {
+      uri = _json["uri"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accessCode != null) {
+      _json["accessCode"] = accessCode;
+    }
+    if (entryPointType != null) {
+      _json["entryPointType"] = entryPointType;
+    }
+    if (label != null) {
+      _json["label"] = label;
+    }
+    if (meetingCode != null) {
+      _json["meetingCode"] = meetingCode;
+    }
+    if (passcode != null) {
+      _json["passcode"] = passcode;
+    }
+    if (password != null) {
+      _json["password"] = password;
+    }
+    if (pin != null) {
+      _json["pin"] = pin;
+    }
+    if (uri != null) {
+      _json["uri"] = uri;
+    }
+    return _json;
+  }
+}
+
 class Error {
   /// Domain, or broad category, of the error.
   core.String domain;
@@ -3900,6 +4367,12 @@
   /// section of the colors definition (see the  colors endpoint). Optional.
   core.String colorId;
 
+  /// The conference-related information, such as details of a Hangouts Meet
+  /// conference. To create new conference details use the createRequest field.
+  /// To persist your changes, remember to set the conferenceDataVersion request
+  /// parameter to 1 for all event modification requests.
+  ConferenceData conferenceData;
+
   /// Creation time of the event (as a RFC3339 timestamp). Read-only.
   core.DateTime created;
 
@@ -4079,6 +4552,9 @@
     if (_json.containsKey("colorId")) {
       colorId = _json["colorId"];
     }
+    if (_json.containsKey("conferenceData")) {
+      conferenceData = new ConferenceData.fromJson(_json["conferenceData"]);
+    }
     if (_json.containsKey("created")) {
       created = core.DateTime.parse(_json["created"]);
     }
@@ -4198,6 +4674,9 @@
     if (colorId != null) {
       _json["colorId"] = colorId;
     }
+    if (conferenceData != null) {
+      _json["conferenceData"] = (conferenceData).toJson();
+    }
     if (created != null) {
       _json["created"] = (created).toIso8601String();
     }
diff --git a/generated/googleapis/lib/classroom/v1.dart b/generated/googleapis/lib/classroom/v1.dart
index c31af3e..7f365bc 100644
--- a/generated/googleapis/lib/classroom/v1.dart
+++ b/generated/googleapis/lib/classroom/v1.dart
@@ -121,6 +121,8 @@
       new CoursesStudentsResourceApi(_requester);
   CoursesTeachersResourceApi get teachers =>
       new CoursesTeachersResourceApi(_requester);
+  CoursesTopicsResourceApi get topics =>
+      new CoursesTopicsResourceApi(_requester);
 
   CoursesResourceApi(commons.ApiRequester client) : _requester = client;
 
@@ -949,12 +951,6 @@
   /// This identifier can be either the Classroom-assigned identifier or an
   /// alias.
   ///
-  /// [pageSize] - Maximum number of items to return. Zero or unspecified
-  /// indicates that the
-  /// server may assign a maximum.
-  ///
-  /// The server may return fewer than the specified number of results.
-  ///
   /// [announcementStates] - Restriction on the `state` of announcements
   /// returned.
   /// If this argument is left unspecified, the default value is `PUBLISHED`.
@@ -974,6 +970,12 @@
   /// The list request
   /// must be otherwise identical to the one that resulted in this token.
   ///
+  /// [pageSize] - Maximum number of items to return. Zero or unspecified
+  /// indicates that the
+  /// server may assign a maximum.
+  ///
+  /// The server may return fewer than the specified number of results.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -985,10 +987,10 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListAnnouncementsResponse> list(core.String courseId,
-      {core.int pageSize,
-      core.List<core.String> announcementStates,
+      {core.List<core.String> announcementStates,
       core.String orderBy,
       core.String pageToken,
+      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1000,9 +1002,6 @@
     if (courseId == null) {
       throw new core.ArgumentError("Parameter courseId is required.");
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (announcementStates != null) {
       _queryParams["announcementStates"] = announcementStates;
     }
@@ -1012,6 +1011,9 @@
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1774,15 +1776,6 @@
   /// This may be set to the string literal `"-"` to request student work for
   /// all course work in the specified course.
   ///
-  /// [userId] - Optional argument to restrict returned student work to those
-  /// owned by the
-  /// student with the specified identifier. The identifier can be one of the
-  /// following:
-  ///
-  /// * the numeric identifier for the user
-  /// * the email address of the user
-  /// * the string literal `"me"`, indicating the requesting user
-  ///
   /// [late] - Requested lateness value. If specified, returned student
   /// submissions are
   /// restricted by the requested value.
@@ -1810,6 +1803,15 @@
   ///
   /// The server may return fewer than the specified number of results.
   ///
+  /// [userId] - Optional argument to restrict returned student work to those
+  /// owned by the
+  /// student with the specified identifier. The identifier can be one of the
+  /// following:
+  ///
+  /// * the numeric identifier for the user
+  /// * the email address of the user
+  /// * the string literal `"me"`, indicating the requesting user
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1822,11 +1824,11 @@
   /// this method will complete with the same error.
   async.Future<ListStudentSubmissionsResponse> list(
       core.String courseId, core.String courseWorkId,
-      {core.String userId,
-      core.String late,
+      {core.String late,
       core.String pageToken,
       core.List<core.String> states,
       core.int pageSize,
+      core.String userId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1841,9 +1843,6 @@
     if (courseWorkId == null) {
       throw new core.ArgumentError("Parameter courseWorkId is required.");
     }
-    if (userId != null) {
-      _queryParams["userId"] = [userId];
-    }
     if (late != null) {
       _queryParams["late"] = [late];
     }
@@ -1856,6 +1855,9 @@
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (userId != null) {
+      _queryParams["userId"] = [userId];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2886,6 +2888,144 @@
   }
 }
 
+class CoursesTopicsResourceApi {
+  final commons.ApiRequester _requester;
+
+  CoursesTopicsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Returns a topic.
+  ///
+  /// This method returns the following error codes:
+  ///
+  /// * `PERMISSION_DENIED` if the requesting user is not permitted to access
+  /// the
+  /// requested course or topic, or for access errors.
+  /// * `INVALID_ARGUMENT` if the request is malformed.
+  /// * `NOT_FOUND` if the requested course or topic does not exist.
+  ///
+  /// Request parameters:
+  ///
+  /// [courseId] - Identifier of the course.
+  ///
+  /// [id] - Identifier of the topic.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Topic].
+  ///
+  /// Completes with a [commons.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<Topic> get(core.String courseId, core.String id,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (courseId == null) {
+      throw new core.ArgumentError("Parameter courseId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/courses/' +
+        commons.Escaper.ecapeVariable('$courseId') +
+        '/topics/' +
+        commons.Escaper.ecapeVariable('$id');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Topic.fromJson(data));
+  }
+
+  /// Returns the list of topics that the requester is permitted to view.
+  ///
+  /// This method returns the following error codes:
+  ///
+  /// * `PERMISSION_DENIED` if the requesting user is not permitted to access
+  /// the requested course or for access errors.
+  /// * `INVALID_ARGUMENT` if the request is malformed.
+  /// * `NOT_FOUND` if the requested course does not exist.
+  ///
+  /// Request parameters:
+  ///
+  /// [courseId] - Identifier of the course.
+  /// This identifier can be either the Classroom-assigned identifier or an
+  /// alias.
+  ///
+  /// [pageToken] - nextPageToken
+  /// value returned from a previous
+  /// list call,
+  /// indicating that the subsequent page of results should be returned.
+  ///
+  /// The list request
+  /// must be otherwise identical to the one that resulted in this token.
+  ///
+  /// [pageSize] - Maximum number of items to return. Zero or unspecified
+  /// indicates that the
+  /// server may assign a maximum.
+  ///
+  /// The server may return fewer than the specified number of results.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListTopicResponse].
+  ///
+  /// Completes with a [commons.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<ListTopicResponse> list(core.String courseId,
+      {core.String pageToken, core.int pageSize, core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (courseId == null) {
+      throw new core.ArgumentError("Parameter courseId is required.");
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url =
+        'v1/courses/' + commons.Escaper.ecapeVariable('$courseId') + '/topics';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListTopicResponse.fromJson(data));
+  }
+}
+
 class InvitationsResourceApi {
   final commons.ApiRequester _requester;
 
@@ -3109,10 +3249,6 @@
   ///
   /// Request parameters:
   ///
-  /// [courseId] - Restricts returned invitations to those for a course with the
-  /// specified
-  /// identifier.
-  ///
   /// [userId] - Restricts returned invitations to those for a specific user.
   /// The identifier
   /// can be one of the following:
@@ -3133,6 +3269,10 @@
   ///
   /// The server may return fewer than the specified number of results.
   ///
+  /// [courseId] - Restricts returned invitations to those for a course with the
+  /// specified
+  /// identifier.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -3144,10 +3284,10 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListInvitationsResponse> list(
-      {core.String courseId,
-      core.String userId,
+      {core.String userId,
       core.String pageToken,
       core.int pageSize,
+      core.String courseId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -3156,9 +3296,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (courseId != null) {
-      _queryParams["courseId"] = [courseId];
-    }
     if (userId != null) {
       _queryParams["userId"] = [userId];
     }
@@ -3168,6 +3305,9 @@
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (courseId != null) {
+      _queryParams["courseId"] = [courseId];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -3910,6 +4050,14 @@
   /// * the string literal `"-"`, indicating that results should be returned for
   ///   all students that the requesting user has access to view.
   ///
+  /// [pageToken] - nextPageToken
+  /// value returned from a previous
+  /// list call,
+  /// indicating that the subsequent page of results should be returned.
+  ///
+  /// The list request
+  /// must be otherwise identical to the one that resulted in this token.
+  ///
   /// [invitedEmailAddress] - Filter results by the email address that the
   /// original invitation was sent
   /// to, resulting in this guardian link.
@@ -3921,14 +4069,6 @@
   ///
   /// The server may return fewer than the specified number of results.
   ///
-  /// [pageToken] - nextPageToken
-  /// value returned from a previous
-  /// list call,
-  /// indicating that the subsequent page of results should be returned.
-  ///
-  /// The list request
-  /// must be otherwise identical to the one that resulted in this token.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -3940,9 +4080,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListGuardiansResponse> list(core.String studentId,
-      {core.String invitedEmailAddress,
+      {core.String pageToken,
+      core.String invitedEmailAddress,
       core.int pageSize,
-      core.String pageToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -3954,15 +4094,15 @@
     if (studentId == null) {
       throw new core.ArgumentError("Parameter studentId is required.");
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if (invitedEmailAddress != null) {
       _queryParams["invitedEmailAddress"] = [invitedEmailAddress];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -5988,6 +6128,39 @@
   }
 }
 
+/// Response when listing topics.
+class ListTopicResponse {
+  /// Token identifying the next page of results to return. If empty, no further
+  /// results are available.
+  core.String nextPageToken;
+
+  /// Topic items that match the request.
+  core.List<Topic> topic;
+
+  ListTopicResponse();
+
+  ListTopicResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("topic")) {
+      topic = _json["topic"].map((value) => new Topic.fromJson(value)).toList();
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (topic != null) {
+      _json["topic"] = topic.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
 /// Material attached to course work.
 ///
 /// When creating attachments, setting the `form` field is not supported.
@@ -6922,6 +7095,65 @@
   }
 }
 
+/// Topic created by a teacher for the course
+class Topic {
+  /// Identifier of the course.
+  ///
+  /// Read-only.
+  core.String courseId;
+
+  /// The name of the topic, generated by the user.
+  /// Leading and trailing whitespaces, if any, will be trimmed. Also, multiple
+  /// consecutive whitespaces will be collapsed into one inside the name.
+  /// Topic names are case sensitive, and must be no longer than 100 characters.
+  core.String name;
+
+  /// Unique identifier for the topic.
+  ///
+  /// Read-only.
+  core.String topicId;
+
+  /// The time the topic was last updated by the system.
+  ///
+  /// Read-only.
+  core.String updateTime;
+
+  Topic();
+
+  Topic.fromJson(core.Map _json) {
+    if (_json.containsKey("courseId")) {
+      courseId = _json["courseId"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("topicId")) {
+      topicId = _json["topicId"];
+    }
+    if (_json.containsKey("updateTime")) {
+      updateTime = _json["updateTime"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (courseId != null) {
+      _json["courseId"] = courseId;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (topicId != null) {
+      _json["topicId"] = topicId;
+    }
+    if (updateTime != null) {
+      _json["updateTime"] = updateTime;
+    }
+    return _json;
+  }
+}
+
 /// Request to turn in a student submission.
 class TurnInStudentSubmissionRequest {
   TurnInStudentSubmissionRequest();
diff --git a/generated/googleapis/lib/cloudbuild/v1.dart b/generated/googleapis/lib/cloudbuild/v1.dart
index 4c47b64..a44d480 100644
--- a/generated/googleapis/lib/cloudbuild/v1.dart
+++ b/generated/googleapis/lib/cloudbuild/v1.dart
@@ -404,12 +404,12 @@
   ///
   /// [projectId] - ID of the project.
   ///
+  /// [filter] - The raw filter text to constrain the results.
+  ///
   /// [pageToken] - Token to provide to skip to a particular spot in the list.
   ///
   /// [pageSize] - Number of results to return in the list.
   ///
-  /// [filter] - The raw filter text to constrain the results.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -421,9 +421,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListBuildsResponse> list(core.String projectId,
-      {core.String pageToken,
+      {core.String filter,
+      core.String pageToken,
       core.int pageSize,
-      core.String filter,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -435,15 +435,15 @@
     if (projectId == null) {
       throw new core.ArgumentError("Parameter projectId is required.");
     }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -996,6 +996,15 @@
   /// Default time is ten minutes.
   core.String timeout;
 
+  /// Stores timing information for phases of the build.
+  /// Valid keys are:
+  /// - BUILD: time to execute all build steps
+  /// - PUSH: time to push all specified images.
+  /// - FETCHSOURCE: time to fetch source.
+  /// If the build does not specify source, or does not specify images,
+  /// these keys will not be included.
+  core.Map<core.String, TimeSpan> timing;
+
   Build();
 
   Build.fromJson(core.Map _json) {
@@ -1062,6 +1071,12 @@
     if (_json.containsKey("timeout")) {
       timeout = _json["timeout"];
     }
+    if (_json.containsKey("timing")) {
+      timing = commons.mapMap<core.Map<core.String, core.Object>, TimeSpan>(
+          _json["timing"],
+          (core.Map<core.String, core.Object> item) =>
+              new TimeSpan.fromJson(item));
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -1127,6 +1142,11 @@
     if (timeout != null) {
       _json["timeout"] = timeout;
     }
+    if (timing != null) {
+      _json["timing"] =
+          commons.mapMap<TimeSpan, core.Map<core.String, core.Object>>(
+              timing, (TimeSpan item) => (item).toJson());
+    }
     return _json;
   }
 }
@@ -1303,6 +1323,9 @@
   /// crypto key. These values must be specified in the build's secrets.
   core.List<core.String> secretEnv;
 
+  /// Stores timing information for executing this build step.
+  TimeSpan timing;
+
   /// List of volumes to mount into the build step.
   ///
   /// Each volume will be created as an empty volume prior to execution of the
@@ -1344,6 +1367,9 @@
     if (_json.containsKey("secretEnv")) {
       secretEnv = _json["secretEnv"];
     }
+    if (_json.containsKey("timing")) {
+      timing = new TimeSpan.fromJson(_json["timing"]);
+    }
     if (_json.containsKey("volumes")) {
       volumes =
           _json["volumes"].map((value) => new Volume.fromJson(value)).toList();
@@ -1377,6 +1403,9 @@
     if (secretEnv != null) {
       _json["secretEnv"] = secretEnv;
     }
+    if (timing != null) {
+      _json["timing"] = (timing).toJson();
+    }
     if (volumes != null) {
       _json["volumes"] = volumes.map((value) => (value).toJson()).toList();
     }
@@ -1492,6 +1521,9 @@
   /// presented to `docker push`.
   core.String name;
 
+  /// Stores timing information for pushing the specified image.
+  TimeSpan pushTiming;
+
   BuiltImage();
 
   BuiltImage.fromJson(core.Map _json) {
@@ -1501,6 +1533,9 @@
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
+    if (_json.containsKey("pushTiming")) {
+      pushTiming = new TimeSpan.fromJson(_json["pushTiming"]);
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -1512,6 +1547,9 @@
     if (name != null) {
       _json["name"] = name;
     }
+    if (pushTiming != null) {
+      _json["pushTiming"] = (pushTiming).toJson();
+    }
     return _json;
   }
 }
@@ -2206,6 +2244,38 @@
   }
 }
 
+/// Stores start and end times for a build execution phase.
+class TimeSpan {
+  /// End of time span.
+  core.String endTime;
+
+  /// Start of time span.
+  core.String startTime;
+
+  TimeSpan();
+
+  TimeSpan.fromJson(core.Map _json) {
+    if (_json.containsKey("endTime")) {
+      endTime = _json["endTime"];
+    }
+    if (_json.containsKey("startTime")) {
+      startTime = _json["startTime"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (endTime != null) {
+      _json["endTime"] = endTime;
+    }
+    if (startTime != null) {
+      _json["startTime"] = startTime;
+    }
+    return _json;
+  }
+}
+
 /// Volume describes a Docker container volume which is mounted into build steps
 /// in order to persist files across build step execution.
 class Volume {
diff --git a/generated/googleapis/lib/clouddebugger/v2.dart b/generated/googleapis/lib/clouddebugger/v2.dart
index 16dfe93..e23a631 100644
--- a/generated/googleapis/lib/clouddebugger/v2.dart
+++ b/generated/googleapis/lib/clouddebugger/v2.dart
@@ -288,16 +288,16 @@
   ///
   /// Request parameters:
   ///
+  /// [includeInactive] - When set to `true`, the result includes all debuggees.
+  /// Otherwise, the
+  /// result includes only debuggees that are active.
+  ///
   /// [project] - Project number of a Google Cloud project whose debuggees to
   /// list.
   ///
   /// [clientVersion] - The client version making the call.
   /// Schema: `domain/type/version` (e.g., `google.com/intellij/v1`).
   ///
-  /// [includeInactive] - When set to `true`, the result includes all debuggees.
-  /// Otherwise, the
-  /// result includes only debuggees that are active.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -309,9 +309,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListDebuggeesResponse> list(
-      {core.String project,
+      {core.bool includeInactive,
+      core.String project,
       core.String clientVersion,
-      core.bool includeInactive,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -320,15 +320,15 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
+    if (includeInactive != null) {
+      _queryParams["includeInactive"] = ["${includeInactive}"];
+    }
     if (project != null) {
       _queryParams["project"] = [project];
     }
     if (clientVersion != null) {
       _queryParams["clientVersion"] = [clientVersion];
     }
-    if (includeInactive != null) {
-      _queryParams["includeInactive"] = ["${includeInactive}"];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -472,6 +472,13 @@
   ///
   /// [debuggeeId] - ID of the debuggee whose breakpoints to list.
   ///
+  /// [waitToken] - A wait token that, if specified, blocks the call until the
+  /// breakpoints
+  /// list has changed, or a server selected timeout has expired.  The value
+  /// should be set from the last response. The error code
+  /// `google.rpc.Code.ABORTED` (RPC) is returned on wait timeout, which
+  /// should be called again with the same `wait_token`.
+  ///
   /// [clientVersion] - The client version making the call.
   /// Schema: `domain/type/version` (e.g., `google.com/intellij/v1`).
   ///
@@ -493,13 +500,6 @@
   /// stripped out of
   /// the result: `stack_frames`, `evaluated_expressions` and `variable_table`.
   ///
-  /// [waitToken] - A wait token that, if specified, blocks the call until the
-  /// breakpoints
-  /// list has changed, or a server selected timeout has expired.  The value
-  /// should be set from the last response. The error code
-  /// `google.rpc.Code.ABORTED` (RPC) is returned on wait timeout, which
-  /// should be called again with the same `wait_token`.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -511,12 +511,12 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListBreakpointsResponse> list(core.String debuggeeId,
-      {core.String clientVersion,
+      {core.String waitToken,
+      core.String clientVersion,
       core.String action_value,
       core.bool includeInactive,
       core.bool includeAllUsers,
       core.bool stripResults,
-      core.String waitToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -528,6 +528,9 @@
     if (debuggeeId == null) {
       throw new core.ArgumentError("Parameter debuggeeId is required.");
     }
+    if (waitToken != null) {
+      _queryParams["waitToken"] = [waitToken];
+    }
     if (clientVersion != null) {
       _queryParams["clientVersion"] = [clientVersion];
     }
@@ -543,9 +546,6 @@
     if (stripResults != null) {
       _queryParams["stripResults"] = ["${stripResults}"];
     }
-    if (waitToken != null) {
-      _queryParams["waitToken"] = [waitToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/cloudfunctions/v1.dart b/generated/googleapis/lib/cloudfunctions/v1.dart
index d576c72..cf932c5 100644
--- a/generated/googleapis/lib/cloudfunctions/v1.dart
+++ b/generated/googleapis/lib/cloudfunctions/v1.dart
@@ -97,14 +97,14 @@
   ///
   /// Request parameters:
   ///
+  /// [filter] - The standard list filter.
+  ///
   /// [name] - The name of the operation's parent resource.
   ///
   /// [pageToken] - The standard list page token.
   ///
   /// [pageSize] - The standard list page size.
   ///
-  /// [filter] - The standard list filter.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -116,10 +116,10 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListOperationsResponse> list(
-      {core.String name,
+      {core.String filter,
+      core.String name,
       core.String pageToken,
       core.int pageSize,
-      core.String filter,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -128,6 +128,9 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
     if (name != null) {
       _queryParams["name"] = [name];
     }
@@ -137,9 +140,6 @@
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -181,12 +181,12 @@
   /// [name] - The resource that owns the locations collection, if applicable.
   /// Value must have pattern "^projects/[^/]+$".
   ///
-  /// [filter] - The standard list filter.
-  ///
   /// [pageToken] - The standard list page token.
   ///
   /// [pageSize] - The standard list page size.
   ///
+  /// [filter] - The standard list filter.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -198,9 +198,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListLocationsResponse> list(core.String name,
-      {core.String filter,
-      core.String pageToken,
+      {core.String pageToken,
       core.int pageSize,
+      core.String filter,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -212,15 +212,15 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -460,11 +460,22 @@
 
   /// Returns a signed URL for uploading a function source code.
   /// For more information about the signed URL usage see:
-  /// https://cloud.google.com/storage/docs/access-control/signed-urls
+  /// https://cloud.google.com/storage/docs/access-control/signed-urls.
   /// Once the function source code upload is complete, the used signed
   /// URL should be provided in CreateFunction or UpdateFunction request
   /// as a reference to the function source code.
   ///
+  /// When uploading source code to the generated signed URL, please follow
+  /// these restrictions:
+  ///
+  /// * Source file type should be a zip file.
+  /// * Source file size should not exceed 100MB limit.
+  ///
+  /// When making a HTTP PUT request, these two headers need to be specified:
+  ///
+  /// * `content-type: application/zip`
+  /// * `x-google-content-length-range: 0,104857600`
+  ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
@@ -472,6 +483,7 @@
   /// [parent] - The project and location in which the Google Cloud Storage
   /// signed URL
   /// should be generated, specified in the format `projects / * /locations / *
+  /// `.
   /// Value must have pattern "^projects/[^/]+/locations/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -927,21 +939,19 @@
 /// service.
 class EventTrigger {
   /// Required. The type of event to observe. For example:
-  /// `google.storage.object.finalized` and
-  /// `google.firebase.analytics.event.log`.
+  /// `providers/cloud.storage/eventTypes/object.change` and
+  /// `providers/cloud.pubsub/eventTypes/topic.publish`.
   ///
-  /// Event type consists of three parts:
-  ///  1. namespace: The domain name of the organization in reverse-domain
-  ///     notation (e.g. `acme.net` appears as `net.acme`) and any orginization
-  /// specific subdivisions. If the organization's top-level domain is `com`,
-  ///     the top-level domain is ommited (e.g. `google.com` appears as
-  ///     `google`). For example, `google.storage` and
-  ///     `google.firebase.analytics`.
-  ///  2. resource type: The type of resource on which event ocurs. For
-  ///     example, the Google Cloud Storage API includes the type `object`.
-  ///  3. action: The action that generates the event. For example, actions for
-  ///     a Google Cloud Storage Object include 'finalize' and 'delete'.
-  /// These parts are lower case and joined by '.'.
+  /// Event types match pattern `providers / * /eventTypes / * .*`.
+  /// The pattern contains:
+  ///
+  /// 1. namespace: For example, `cloud.storage` and
+  ///    `google.firebase.analytics`.
+  /// 2. resource type: The type of resource on which event occurs. For
+  ///    example, the Google Cloud Storage API includes the type `object`.
+  /// 3. action: The action that generates the event. For example, action for
+  ///    a Google Cloud Storage Object is 'change'.
+  /// These parts are lower case.
   core.String eventType;
 
   /// Specifies policy for failed executions.
diff --git a/generated/googleapis/lib/cloudiot/v1.dart b/generated/googleapis/lib/cloudiot/v1.dart
index 0ca1801..cad96a8 100644
--- a/generated/googleapis/lib/cloudiot/v1.dart
+++ b/generated/googleapis/lib/cloudiot/v1.dart
@@ -683,15 +683,6 @@
   /// Value must have pattern
   /// "^projects/[^/]+/locations/[^/]+/registries/[^/]+$".
   ///
-  /// [deviceIds] - A list of device string identifiers. If empty, it will
-  /// ignore this field.
-  /// For example, `['device0', 'device12']`. This field cannot hold more than
-  /// 10,000 entries.
-  ///
-  /// [deviceNumIds] - A list of device numerical ids. If empty, it will ignore
-  /// this field. This
-  /// field cannot hold more than 10,000 entries.
-  ///
   /// [pageToken] - The value returned by the last `ListDevicesResponse`;
   /// indicates
   /// that this is a continuation of a prior `ListDevices` call, and
@@ -708,6 +699,15 @@
   /// objects than requested, but if there is a non-empty `page_token`, it
   /// indicates that more entries are available.
   ///
+  /// [deviceIds] - A list of device string identifiers. If empty, it will
+  /// ignore this field.
+  /// For example, `['device0', 'device12']`. This field cannot hold more than
+  /// 10,000 entries.
+  ///
+  /// [deviceNumIds] - A list of device numerical ids. If empty, it will ignore
+  /// this field. This
+  /// field cannot hold more than 10,000 entries.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -719,11 +719,11 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListDevicesResponse> list(core.String parent,
-      {core.List<core.String> deviceIds,
-      core.List<core.String> deviceNumIds,
-      core.String pageToken,
+      {core.String pageToken,
       core.String fieldMask,
       core.int pageSize,
+      core.List<core.String> deviceIds,
+      core.List<core.String> deviceNumIds,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -735,12 +735,6 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (deviceIds != null) {
-      _queryParams["deviceIds"] = deviceIds;
-    }
-    if (deviceNumIds != null) {
-      _queryParams["deviceNumIds"] = deviceNumIds;
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
@@ -750,6 +744,12 @@
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (deviceIds != null) {
+      _queryParams["deviceIds"] = deviceIds;
+    }
+    if (deviceNumIds != null) {
+      _queryParams["deviceNumIds"] = deviceNumIds;
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/cloudkms/v1.dart b/generated/googleapis/lib/cloudkms/v1.dart
index af141e3..18988a5 100644
--- a/generated/googleapis/lib/cloudkms/v1.dart
+++ b/generated/googleapis/lib/cloudkms/v1.dart
@@ -100,12 +100,12 @@
   /// [name] - The resource that owns the locations collection, if applicable.
   /// Value must have pattern "^projects/[^/]+$".
   ///
+  /// [pageToken] - The standard list page token.
+  ///
   /// [pageSize] - The standard list page size.
   ///
   /// [filter] - The standard list filter.
   ///
-  /// [pageToken] - The standard list page token.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -117,9 +117,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListLocationsResponse> list(core.String name,
-      {core.int pageSize,
+      {core.String pageToken,
+      core.int pageSize,
       core.String filter,
-      core.String pageToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -131,15 +131,15 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
     if (filter != null) {
       _queryParams["filter"] = [filter];
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -779,14 +779,14 @@
   /// `projects / * /locations / * /keyRings / * `.
   /// Value must have pattern "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$".
   ///
+  /// [pageToken] - Optional pagination token, returned earlier via
+  /// ListCryptoKeysResponse.next_page_token.
+  ///
   /// [pageSize] - Optional limit on the number of CryptoKeys to include in the
   /// response.  Further CryptoKeys can subsequently be obtained by
   /// including the ListCryptoKeysResponse.next_page_token in a subsequent
   /// request.  If unspecified, the server will pick an appropriate default.
   ///
-  /// [pageToken] - Optional pagination token, returned earlier via
-  /// ListCryptoKeysResponse.next_page_token.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -798,7 +798,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListCryptoKeysResponse> list(core.String parent,
-      {core.int pageSize, core.String pageToken, core.String $fields}) {
+      {core.String pageToken, core.int pageSize, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -809,12 +809,12 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/cloudresourcemanager/v1.dart b/generated/googleapis/lib/cloudresourcemanager/v1.dart
index 133306f..6de997d 100644
--- a/generated/googleapis/lib/cloudresourcemanager/v1.dart
+++ b/generated/googleapis/lib/cloudresourcemanager/v1.dart
@@ -1650,22 +1650,14 @@
 
   /// Lists Projects that are visible to the user and satisfy the
   /// specified filter. This method returns Projects in an unspecified order.
-  /// New Projects do not necessarily appear at the end of the list.
+  /// This method is eventually consistent with project mutations; this means
+  /// that a newly created project may not appear in the results or recent
+  /// updates to an existing project may not be reflected in the results. To
+  /// retrieve the latest state of a project, use the
+  /// GetProject method.
   ///
   /// Request parameters:
   ///
-  /// [pageToken] - A pagination token returned from a previous call to
-  /// ListProjects
-  /// that indicates from where listing should continue.
-  ///
-  /// Optional.
-  ///
-  /// [pageSize] - The maximum number of Projects to return in the response.
-  /// The server can return fewer Projects than requested.
-  /// If unspecified, server picks an appropriate default.
-  ///
-  /// Optional.
-  ///
   /// [filter] - An expression for filtering the results of the request.  Filter
   /// rules are
   /// case insensitive. The fields eligible for filtering are:
@@ -1699,6 +1691,18 @@
   ///
   /// Optional.
   ///
+  /// [pageToken] - A pagination token returned from a previous call to
+  /// ListProjects
+  /// that indicates from where listing should continue.
+  ///
+  /// Optional.
+  ///
+  /// [pageSize] - The maximum number of Projects to return in the response.
+  /// The server can return fewer Projects than requested.
+  /// If unspecified, server picks an appropriate default.
+  ///
+  /// Optional.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1710,9 +1714,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListProjectsResponse> list(
-      {core.String pageToken,
+      {core.String filter,
+      core.String pageToken,
       core.int pageSize,
-      core.String filter,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1721,15 +1725,15 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1852,7 +1856,7 @@
     return _response.then((data) => new ListOrgPoliciesResponse.fromJson(data));
   }
 
-  /// Sets the IAM access control policy for the specified Project. Replaces
+  /// Sets the IAM access control policy for the specified Project. Overwrites
   /// any existing policy.
   ///
   /// The following constraints apply when using `setIamPolicy()`:
@@ -1885,7 +1889,8 @@
   /// IAM policies will be rejected until the lack of a ToS-accepting owner is
   /// rectified.
   ///
-  /// + Calling this method requires enabling the App Engine Admin API.
+  /// + This method will replace the existing policy, and cannot be used to
+  /// append additional IAM settings.
   ///
   /// Note: Removing service accounts from policies or changing their roles
   /// can render services completely inoperable. It is important to understand
@@ -3805,8 +3810,8 @@
 
   /// An optional reference to a parent Resource.
   ///
-  /// The only supported parent type is "organization". Once set, the parent
-  /// cannot be modified. The `parent` can be set on creation or using the
+  /// Supported parent types include "organization" and "folder". Once set, the
+  /// parent cannot be cleared. The `parent` can be set on creation or using the
   /// `UpdateProject` method; the end user must have the
   /// `resourcemanager.projects.create` permission on the parent.
   ///
diff --git a/generated/googleapis/lib/cloudresourcemanager/v2beta1.dart b/generated/googleapis/lib/cloudresourcemanager/v2beta1.dart
index 5d4563f..46946c2 100644
--- a/generated/googleapis/lib/cloudresourcemanager/v2beta1.dart
+++ b/generated/googleapis/lib/cloudresourcemanager/v2beta1.dart
@@ -49,6 +49,7 @@
   ///
   /// In order to succeed, the addition of this new Folder must not violate
   /// the Folder naming, height or fanout constraints.
+  ///
   /// + The Folder's display_name must be distinct from all other Folder's that
   /// share its parent.
   /// + The addition of the Folder must not cause the active Folder hierarchy
@@ -116,10 +117,12 @@
   }
 
   /// Requests deletion of a Folder. The Folder is moved into the
-  /// [DELETE_REQUESTED] state immediately, and is deleted approximately 30 days
-  /// later. This method may only be called on an empty Folder in the [ACTIVE]
-  /// state, where a Folder is empty if it doesn't contain any Folders or
-  /// Projects in the [ACTIVE] state.
+  /// DELETE_REQUESTED state
+  /// immediately, and is deleted approximately 30 days later. This method may
+  /// only be called on an empty Folder in the
+  /// ACTIVE state, where a Folder is empty if
+  /// it doesn't contain any Folders or Projects in the
+  /// ACTIVE state.
   /// The caller must have `resourcemanager.folders.delete` permission on the
   /// identified folder.
   ///
@@ -281,6 +284,15 @@
   ///
   /// Request parameters:
   ///
+  /// [showDeleted] - Controls whether Folders in the
+  /// DELETE_REQUESTED
+  /// state should be returned.
+  ///
+  /// [pageToken] - A pagination token returned from a previous call to
+  /// `ListFolders`
+  /// that indicates where this listing should continue from.
+  /// This field is optional.
+  ///
   /// [pageSize] - The maximum number of Folders to return in the response.
   /// This field is optional.
   ///
@@ -291,15 +303,6 @@
   /// Access to this method is controlled by checking the
   /// `resourcemanager.folders.list` permission on the `parent`.
   ///
-  /// [showDeleted] - Controls whether Folders in the [DELETE_REQUESTED} state
-  /// should
-  /// be returned.
-  ///
-  /// [pageToken] - A pagination token returned from a previous call to
-  /// `ListFolders`
-  /// that indicates where this listing should continue from.
-  /// This field is optional.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -311,10 +314,10 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListFoldersResponse> list(
-      {core.int pageSize,
-      core.String parent,
-      core.bool showDeleted,
+      {core.bool showDeleted,
       core.String pageToken,
+      core.int pageSize,
+      core.String parent,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -323,18 +326,18 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
-    if (parent != null) {
-      _queryParams["parent"] = [parent];
-    }
     if (showDeleted != null) {
       _queryParams["showDeleted"] = ["${showDeleted}"];
     }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (parent != null) {
+      _queryParams["parent"] = [parent];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -363,7 +366,8 @@
   /// In addition, the Operation.metadata field will be populated with a
   /// FolderOperation message as an aid to stateless clients.
   /// Folder moves will be rejected if they violate either the naming, height
-  /// or fanout constraints described in the [CreateFolder] documentation.
+  /// or fanout constraints described in the
+  /// CreateFolder documentation.
   /// The caller must have `resourcemanager.folders.move` permission on the
   /// folder's current and proposed new parent.
   ///
@@ -418,9 +422,10 @@
 
   /// Updates a Folder, changing its display_name.
   /// Changes to the folder display_name will be rejected if they violate either
-  /// the display_name formatting rules or naming constraints described in
-  /// the [CreateFolder] documentation.
-  /// + The Folder's display name must start and end with a letter or digit,
+  /// the display_name formatting rules or naming constraints described in the
+  /// CreateFolder documentation.
+  ///
+  /// The Folder's display name must start and end with a letter or digit,
   /// may contain letters, digits, spaces, hyphens and underscores and can be
   /// no longer than 30 characters. This is captured by the regular expression:
   /// [\p{L}\p{N}]({\p{L}\p{N}_- ]{0,28}[\p{L}\p{N}])?.
@@ -651,11 +656,13 @@
   }
 
   /// Cancels the deletion request for a Folder. This method may only be
-  /// called on a Folder in the [DELETE_REQUESTED] state.
-  /// In order to succeed, the Folder's parent must be in the [ACTIVE] state.
+  /// called on a Folder in the
+  /// DELETE_REQUESTED state.
+  /// In order to succeed, the Folder's parent must be in the
+  /// ACTIVE state.
   /// In addition, reintroducing the folder into the tree must not violate
   /// folder naming, height and fanout constraints described in the
-  /// [CreateFolder] documentation.
+  /// CreateFolder documentation.
   /// The caller must have `resourcemanager.folders.undelete` permission on the
   /// identified folder.
   ///
@@ -928,7 +935,8 @@
 
   /// Output only.  The lifecycle state of the folder.
   /// Updates to the lifecycle_state must be performed via
-  /// [DeleteFolder] and [UndeleteFolder].
+  /// DeleteFolder and
+  /// UndeleteFolder.
   /// Possible string values are:
   /// - "LIFECYCLE_STATE_UNSPECIFIED" : Unspecified state.
   /// - "ACTIVE" : The normal and active state.
@@ -941,7 +949,8 @@
   core.String name;
 
   /// The Folder’s parent's resource name.
-  /// Updates to the folder's parent must be performed via [MoveFolders].
+  /// Updates to the folder's parent must be performed via
+  /// MoveFolder.
   core.String parent;
 
   Folder();
@@ -1415,13 +1424,14 @@
   /// can be used along with the suffix wildcard symbol `*`.
   ///
   /// Some example queries are:
-  /// |Query|Description|
-  /// |------|-----------|
+  ///
+  /// |Query | Description|
+  /// |----- | -----------|
   /// |displayName=Test*|Folders whose display name starts with "Test".|
   /// |lifecycleState=ACTIVE|Folders whose lifecycleState is ACTIVE.|
   /// |parent=folders/123|Folders whose parent is "folders/123".|
-  /// |parent=folders/123 AND lifecycleState=ACTIVE|Active folders whose
-  /// parent is "folders/123".|
+  /// |parent=folders/123 AND lifecycleState=ACTIVE|Active folders whose parent
+  /// is "folders/123".|
   core.String query;
 
   SearchFoldersRequest();
diff --git a/generated/googleapis/lib/cloudshell/v1.dart b/generated/googleapis/lib/cloudshell/v1.dart
new file mode 100644
index 0000000..9ba22a1
--- /dev/null
+++ b/generated/googleapis/lib/cloudshell/v1.dart
@@ -0,0 +1,753 @@
+// This is a generated file (see the discoveryapis_generator project).
+
+library googleapis.cloudshell.v1;
+
+import 'dart:core' as core;
+import 'dart:async' as async;
+import 'dart:convert' as convert;
+
+import 'package:_discoveryapis_commons/_discoveryapis_commons.dart' as commons;
+import 'package:http/http.dart' as http;
+
+export 'package:_discoveryapis_commons/_discoveryapis_commons.dart'
+    show ApiRequestError, DetailedApiRequestError;
+
+const core.String USER_AGENT = 'dart-api-client cloudshell/v1';
+
+/// Allows users to start, configure, and connect to interactive shell sessions
+/// running in the cloud.
+class CloudshellApi {
+  /// View and manage your data across Google Cloud Platform services
+  static const CloudPlatformScope =
+      "https://www.googleapis.com/auth/cloud-platform";
+
+  final commons.ApiRequester _requester;
+
+  OperationsResourceApi get operations => new OperationsResourceApi(_requester);
+
+  CloudshellApi(http.Client client,
+      {core.String rootUrl: "https://cloudshell.googleapis.com/",
+      core.String servicePath: ""})
+      : _requester =
+            new commons.ApiRequester(client, rootUrl, servicePath, USER_AGENT);
+}
+
+class OperationsResourceApi {
+  final commons.ApiRequester _requester;
+
+  OperationsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Starts asynchronous cancellation on a long-running operation.  The server
+  /// makes a best effort to cancel the operation, but success is not
+  /// guaranteed.  If the server doesn't support this method, it returns
+  /// `google.rpc.Code.UNIMPLEMENTED`.  Clients can use
+  /// Operations.GetOperation or
+  /// other methods to check whether the cancellation succeeded or whether the
+  /// operation completed despite cancellation. On successful cancellation,
+  /// the operation is not deleted; instead, it becomes an operation with
+  /// an Operation.error value with a google.rpc.Status.code of 1,
+  /// corresponding to `Code.CANCELLED`.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - The name of the operation resource to be cancelled.
+  /// Value must have pattern "^operations/.+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Empty].
+  ///
+  /// Completes with a [commons.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<Empty> cancel(CancelOperationRequest request, core.String name,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (name == null) {
+      throw new core.ArgumentError("Parameter name is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$name') + ':cancel';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Empty.fromJson(data));
+  }
+
+  /// Deletes a long-running operation. This method indicates that the client is
+  /// no longer interested in the operation result. It does not cancel the
+  /// operation. If the server doesn't support this method, it returns
+  /// `google.rpc.Code.UNIMPLEMENTED`.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - The name of the operation resource to be deleted.
+  /// Value must have pattern "^operations/.+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Empty].
+  ///
+  /// Completes with a [commons.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<Empty> delete(core.String name, {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (name == null) {
+      throw new core.ArgumentError("Parameter name is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$name');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Empty.fromJson(data));
+  }
+
+  /// Gets the latest state of a long-running operation.  Clients can use this
+  /// method to poll the operation result at intervals as recommended by the API
+  /// service.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - The name of the operation resource.
+  /// Value must have pattern "^operations/.+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Operation].
+  ///
+  /// Completes with a [commons.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<Operation> get(core.String name, {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (name == null) {
+      throw new core.ArgumentError("Parameter name is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$name');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /// Lists operations that match the specified filter in the request. If the
+  /// server doesn't support this method, it returns `UNIMPLEMENTED`.
+  ///
+  /// NOTE: the `name` binding allows API services to override the binding
+  /// to use different resource name schemes, such as `users / * /operations`.
+  /// To
+  /// override the binding, API services can add a binding such as
+  /// `"/v1/{name=users / * }/operations"` to their service configuration.
+  /// For backwards compatibility, the default name includes the operations
+  /// collection id, however overriding users must ensure the name binding
+  /// is the parent resource, without the operations collection id.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - The name of the operation's parent resource.
+  /// Value must have pattern "^operations$".
+  ///
+  /// [pageToken] - The standard list page token.
+  ///
+  /// [pageSize] - The standard list page size.
+  ///
+  /// [filter] - The standard list filter.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListOperationsResponse].
+  ///
+  /// Completes with a [commons.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<ListOperationsResponse> list(core.String name,
+      {core.String pageToken,
+      core.int pageSize,
+      core.String filter,
+      core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (name == null) {
+      throw new core.ArgumentError("Parameter name is required.");
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$name');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListOperationsResponse.fromJson(data));
+  }
+}
+
+/// The request message for Operations.CancelOperation.
+class CancelOperationRequest {
+  CancelOperationRequest();
+
+  CancelOperationRequest.fromJson(core.Map _json) {}
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    return _json;
+  }
+}
+
+/// A generic empty message that you can re-use to avoid defining duplicated
+/// empty messages in your APIs. A typical example is to use it as the request
+/// or the response type of an API method. For instance:
+///
+///     service Foo {
+///       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
+///     }
+///
+/// The JSON representation for `Empty` is empty JSON object `{}`.
+class Empty {
+  Empty();
+
+  Empty.fromJson(core.Map _json) {}
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    return _json;
+  }
+}
+
+/// A Cloud Shell environment, which is defined as the combination of a Docker
+/// image specifying what is installed on the environment and a home directory
+/// containing the user's data that will remain across sessions. Each user has a
+/// single environment with the ID "default".
+class Environment {
+  /// Required. Full path to the Docker image used to run this environment, e.g.
+  /// "gcr.io/dev-con/cloud-devshell:latest".
+  core.String dockerImage;
+
+  /// Output only. The environment's identifier, which is always "default".
+  core.String id;
+
+  /// Output only. Full name of this resource, in the format
+  /// `users/{owner_email}/environments/{environment_id}`. `{owner_email}` is
+  /// the
+  /// email address of the user to whom this environment belongs, and
+  /// `{environment_id}` is the identifier of this environment. For example,
+  /// `users/someone@example.com/environments/default`.
+  core.String name;
+
+  /// Output only. Public keys associated with the environment. Clients can
+  /// connect to this environment via SSH only if they possess a private key
+  /// corresponding to at least one of these public keys. Keys can be added to
+  /// or
+  /// removed from the environment using the CreatePublicKey and DeletePublicKey
+  /// methods.
+  core.List<PublicKey> publicKeys;
+
+  /// Output only. Host to which clients can connect to initiate SSH sessions
+  /// with the environment.
+  core.String sshHost;
+
+  /// Output only. Port to which clients can connect to initiate SSH sessions
+  /// with the environment.
+  core.int sshPort;
+
+  /// Output only. Username that clients should use when initiating SSH sessions
+  /// with the environment.
+  core.String sshUsername;
+
+  /// Output only. Current execution state of this environment.
+  /// Possible string values are:
+  /// - "STATE_UNSPECIFIED" : The environment's states is unknown.
+  /// - "DISABLED" : The environment is not running and can't be connected to.
+  /// Starting the
+  /// environment will transition it to the STARTING state.
+  /// - "STARTING" : The environment is being started but is not yet ready to
+  /// accept
+  /// connections.
+  /// - "RUNNING" : The environment is running and ready to accept connections.
+  /// It will
+  /// automatically transition back to DISABLED after a period of inactivity or
+  /// if another environment is started.
+  core.String state;
+
+  Environment();
+
+  Environment.fromJson(core.Map _json) {
+    if (_json.containsKey("dockerImage")) {
+      dockerImage = _json["dockerImage"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("publicKeys")) {
+      publicKeys = _json["publicKeys"]
+          .map((value) => new PublicKey.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("sshHost")) {
+      sshHost = _json["sshHost"];
+    }
+    if (_json.containsKey("sshPort")) {
+      sshPort = _json["sshPort"];
+    }
+    if (_json.containsKey("sshUsername")) {
+      sshUsername = _json["sshUsername"];
+    }
+    if (_json.containsKey("state")) {
+      state = _json["state"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (dockerImage != null) {
+      _json["dockerImage"] = dockerImage;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (publicKeys != null) {
+      _json["publicKeys"] =
+          publicKeys.map((value) => (value).toJson()).toList();
+    }
+    if (sshHost != null) {
+      _json["sshHost"] = sshHost;
+    }
+    if (sshPort != null) {
+      _json["sshPort"] = sshPort;
+    }
+    if (sshUsername != null) {
+      _json["sshUsername"] = sshUsername;
+    }
+    if (state != null) {
+      _json["state"] = state;
+    }
+    return _json;
+  }
+}
+
+/// The response message for Operations.ListOperations.
+class ListOperationsResponse {
+  /// The standard List next-page token.
+  core.String nextPageToken;
+
+  /// A list of operations that matches the specified filter in the request.
+  core.List<Operation> operations;
+
+  ListOperationsResponse();
+
+  ListOperationsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("operations")) {
+      operations = _json["operations"]
+          .map((value) => new Operation.fromJson(value))
+          .toList();
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (operations != null) {
+      _json["operations"] =
+          operations.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// This resource represents a long-running operation that is the result of a
+/// network API call.
+class Operation {
+  /// If the value is `false`, it means the operation is still in progress.
+  /// If `true`, the operation is completed, and either `error` or `response` is
+  /// available.
+  core.bool done;
+
+  /// The error result of the operation in case of failure or cancellation.
+  Status error;
+
+  /// Service-specific metadata associated with the operation.  It typically
+  /// contains progress information and common metadata such as create time.
+  /// Some services might not provide such metadata.  Any method that returns a
+  /// long-running operation should document the metadata type, if any.
+  ///
+  /// The values for Object must be JSON objects. It can consist of `num`,
+  /// `String`, `bool` and `null` as well as `Map` and `List` values.
+  core.Map<core.String, core.Object> metadata;
+
+  /// The server-assigned name, which is only unique within the same service
+  /// that
+  /// originally returns it. If you use the default HTTP mapping, the
+  /// `name` should have the format of `operations/some/unique/name`.
+  core.String name;
+
+  /// The normal response of the operation in case of success.  If the original
+  /// method returns no data on success, such as `Delete`, the response is
+  /// `google.protobuf.Empty`.  If the original method is standard
+  /// `Get`/`Create`/`Update`, the response should be the resource.  For other
+  /// methods, the response should have the type `XxxResponse`, where `Xxx`
+  /// is the original method name.  For example, if the original method name
+  /// is `TakeSnapshot()`, the inferred response type is
+  /// `TakeSnapshotResponse`.
+  ///
+  /// The values for Object must be JSON objects. It can consist of `num`,
+  /// `String`, `bool` and `null` as well as `Map` and `List` values.
+  core.Map<core.String, core.Object> response;
+
+  Operation();
+
+  Operation.fromJson(core.Map _json) {
+    if (_json.containsKey("done")) {
+      done = _json["done"];
+    }
+    if (_json.containsKey("error")) {
+      error = new Status.fromJson(_json["error"]);
+    }
+    if (_json.containsKey("metadata")) {
+      metadata = _json["metadata"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("response")) {
+      response = _json["response"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (done != null) {
+      _json["done"] = done;
+    }
+    if (error != null) {
+      _json["error"] = (error).toJson();
+    }
+    if (metadata != null) {
+      _json["metadata"] = metadata;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (response != null) {
+      _json["response"] = response;
+    }
+    return _json;
+  }
+}
+
+/// A public SSH key, corresponding to a private SSH key held by the client.
+class PublicKey {
+  /// Required. Format of this key's content.
+  /// Possible string values are:
+  /// - "FORMAT_UNSPECIFIED" : Unknown format. Do not use.
+  /// - "SSH_DSS" : `ssh-dss` key format (see RFC4253).
+  /// - "SSH_RSA" : `ssh-rsa` key format (see RFC4253).
+  /// - "ECDSA_SHA2_NISTP256" : `ecdsa-sha2-nistp256` key format (see RFC5656).
+  /// - "ECDSA_SHA2_NISTP384" : `ecdsa-sha2-nistp384` key format (see RFC5656).
+  /// - "ECDSA_SHA2_NISTP521" : `ecdsa-sha2-nistp521` key format (see RFC5656).
+  core.String format;
+
+  /// Required. Content of this key.
+  core.String key;
+  core.List<core.int> get keyAsBytes {
+    return convert.BASE64.decode(key);
+  }
+
+  void set keyAsBytes(core.List<core.int> _bytes) {
+    key =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// Output only. Full name of this resource, in the format
+  /// `users/{owner_email}/environments/{environment_id}/publicKeys/{key_id}`.
+  /// `{owner_email}` is the email address of the user to whom the key belongs.
+  /// `{environment_id}` is the identifier of the environment to which the key
+  /// grants access. `{key_id}` is the unique identifier of the key. For
+  /// example,
+  /// `users/someone@example.com/environments/default/publicKeys/myKey`.
+  core.String name;
+
+  PublicKey();
+
+  PublicKey.fromJson(core.Map _json) {
+    if (_json.containsKey("format")) {
+      format = _json["format"];
+    }
+    if (_json.containsKey("key")) {
+      key = _json["key"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (format != null) {
+      _json["format"] = format;
+    }
+    if (key != null) {
+      _json["key"] = key;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Message included in the metadata field of operations returned from
+/// StartEnvironment.
+class StartEnvironmentMetadata {
+  /// Current state of the environment being started.
+  /// Possible string values are:
+  /// - "STATE_UNSPECIFIED" : The environment's start state is unknown.
+  /// - "STARTING" : The environment is in the process of being started, but no
+  /// additional
+  /// details are available.
+  /// - "UNARCHIVING_DISK" : Startup is waiting for the user's disk to be
+  /// unarchived. This can happen
+  /// when the user returns to Cloud Shell after not having used it for a
+  /// while, and suggests that startup will take longer than normal.
+  /// - "FINISHED" : Startup is complete and the user should be able to
+  /// establish an SSH
+  /// connection to their environment.
+  core.String state;
+
+  StartEnvironmentMetadata();
+
+  StartEnvironmentMetadata.fromJson(core.Map _json) {
+    if (_json.containsKey("state")) {
+      state = _json["state"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (state != null) {
+      _json["state"] = state;
+    }
+    return _json;
+  }
+}
+
+/// Message included in the response field of operations returned from
+/// StartEnvironment once the
+/// operation is complete.
+class StartEnvironmentResponse {
+  /// Environment that was started.
+  Environment environment;
+
+  StartEnvironmentResponse();
+
+  StartEnvironmentResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("environment")) {
+      environment = new Environment.fromJson(_json["environment"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (environment != null) {
+      _json["environment"] = (environment).toJson();
+    }
+    return _json;
+  }
+}
+
+/// The `Status` type defines a logical error model that is suitable for
+/// different
+/// programming environments, including REST APIs and RPC APIs. It is used by
+/// [gRPC](https://github.com/grpc). The error model is designed to be:
+///
+/// - Simple to use and understand for most users
+/// - Flexible enough to meet unexpected needs
+///
+/// # Overview
+///
+/// The `Status` message contains three pieces of data: error code, error
+/// message,
+/// and error details. The error code should be an enum value of
+/// google.rpc.Code, but it may accept additional error codes if needed.  The
+/// error message should be a developer-facing English message that helps
+/// developers *understand* and *resolve* the error. If a localized user-facing
+/// error message is needed, put the localized message in the error details or
+/// localize it in the client. The optional error details may contain arbitrary
+/// information about the error. There is a predefined set of error detail types
+/// in the package `google.rpc` that can be used for common error conditions.
+///
+/// # Language mapping
+///
+/// The `Status` message is the logical representation of the error model, but
+/// it
+/// is not necessarily the actual wire format. When the `Status` message is
+/// exposed in different client libraries and different wire protocols, it can
+/// be
+/// mapped differently. For example, it will likely be mapped to some exceptions
+/// in Java, but more likely mapped to some error codes in C.
+///
+/// # Other uses
+///
+/// The error model and the `Status` message can be used in a variety of
+/// environments, either with or without APIs, to provide a
+/// consistent developer experience across different environments.
+///
+/// Example uses of this error model include:
+///
+/// - Partial errors. If a service needs to return partial errors to the client,
+/// it may embed the `Status` in the normal response to indicate the partial
+///     errors.
+///
+/// - Workflow errors. A typical workflow has multiple steps. Each step may
+///     have a `Status` message for error reporting.
+///
+/// - Batch operations. If a client uses batch request and batch response, the
+///     `Status` message should be used directly inside batch response, one for
+///     each error sub-response.
+///
+/// - Asynchronous operations. If an API call embeds asynchronous operation
+///     results in its response, the status of those operations should be
+///     represented directly using the `Status` message.
+///
+/// - Logging. If some API errors are stored in logs, the message `Status` could
+/// be used directly after any stripping needed for security/privacy reasons.
+class Status {
+  /// The status code, which should be an enum value of google.rpc.Code.
+  core.int code;
+
+  /// A list of messages that carry the error details.  There is a common set of
+  /// message types for APIs to use.
+  ///
+  /// The values for Object must be JSON objects. It can consist of `num`,
+  /// `String`, `bool` and `null` as well as `Map` and `List` values.
+  core.List<core.Map<core.String, core.Object>> details;
+
+  /// A developer-facing error message, which should be in English. Any
+  /// user-facing error message should be localized and sent in the
+  /// google.rpc.Status.details field, or localized by the client.
+  core.String message;
+
+  Status();
+
+  Status.fromJson(core.Map _json) {
+    if (_json.containsKey("code")) {
+      code = _json["code"];
+    }
+    if (_json.containsKey("details")) {
+      details = _json["details"];
+    }
+    if (_json.containsKey("message")) {
+      message = _json["message"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (code != null) {
+      _json["code"] = code;
+    }
+    if (details != null) {
+      _json["details"] = details;
+    }
+    if (message != null) {
+      _json["message"] = message;
+    }
+    return _json;
+  }
+}
diff --git a/generated/googleapis/lib/cloudtrace/v2.dart b/generated/googleapis/lib/cloudtrace/v2.dart
index 3f3bb45..1393d50 100644
--- a/generated/googleapis/lib/cloudtrace/v2.dart
+++ b/generated/googleapis/lib/cloudtrace/v2.dart
@@ -130,7 +130,7 @@
   ///
   /// [SPAN_ID] is a unique identifier for a span within a trace; it
   /// is a 16-character hexadecimal encoding of an 8-byte array.
-  /// Value must have pattern "^projects/[^/]+/traces/[^/]+$".
+  /// Value must have pattern "^projects/[^/]+/traces/[^/]+/spans/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -142,7 +142,7 @@
   ///
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
-  async.Future<Span> create(Span request, core.String name,
+  async.Future<Span> createSpan(Span request, core.String name,
       {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -161,7 +161,7 @@
       _queryParams["fields"] = [$fields];
     }
 
-    _url = 'v2/' + commons.Escaper.ecapeVariableReserved('$name') + '/spans';
+    _url = 'v2/' + commons.Escaper.ecapeVariableReserved('$name');
 
     var _response = _requester.request(_url, "POST",
         body: _body,
diff --git a/generated/googleapis/lib/compute/v1.dart b/generated/googleapis/lib/compute/v1.dart
index d8cb616..facc79a 100644
--- a/generated/googleapis/lib/compute/v1.dart
+++ b/generated/googleapis/lib/compute/v1.dart
@@ -3427,7 +3427,8 @@
     return _response.then((data) => new DiskList.fromJson(data));
   }
 
-  /// Resizes the specified persistent disk.
+  /// Resizes the specified persistent disk. You can only increase the size of
+  /// the disk.
   ///
   /// [request] - The metadata request object.
   ///
@@ -13621,7 +13622,8 @@
     return _response.then((data) => new NetworkList.fromJson(data));
   }
 
-  /// Patches the specified network with the data included in the request.
+  /// Patches the specified network with the data included in the request. Only
+  /// the following fields can be modified: routingConfig.routingMode.
   ///
   /// [request] - The metadata request object.
   ///
@@ -25422,7 +25424,8 @@
   }
 }
 
-/// An Accelerator Type resource.
+/// An Accelerator Type resource. (== resource_for beta.acceleratorTypes ==) (==
+/// resource_for v1.acceleratorTypes ==)
 class AcceleratorType {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -26096,7 +26099,9 @@
   }
 }
 
-/// A reserved address resource.
+/// A reserved address resource. (== resource_for beta.addresses ==) (==
+/// resource_for v1.addresses ==) (== resource_for beta.globalAddresses ==) (==
+/// resource_for v1.globalAddresses ==)
 class Address {
   /// The static IP address represented by this resource.
   core.String address;
@@ -26157,10 +26162,10 @@
   /// - "RESERVED"
   core.String status;
 
-  /// For external addresses, this field should not be used.
-  ///
   /// The URL of the subnetwork in which to reserve the address. If an IP
-  /// address is specified, it must be within the subnetwork's IP range.
+  /// address is specified, it must be within the subnetwork's IP range. This
+  /// field can only be used with INTERNAL type with GCE_ENDPOINT/DNS_RESOLVER
+  /// purposes.
   core.String subnetwork;
 
   /// [Output Only] The URLs of the resources that are using this address.
@@ -27095,7 +27100,9 @@
 /// Represents an Autoscaler resource. Autoscalers allow you to automatically
 /// scale virtual machine instances in managed instance groups according to an
 /// autoscaling policy that you define. For more information, read Autoscaling
-/// Groups of Instances.
+/// Groups of Instances. (== resource_for beta.autoscalers ==) (== resource_for
+/// v1.autoscalers ==) (== resource_for beta.regionAutoscalers ==) (==
+/// resource_for v1.regionAutoscalers ==)
 class Autoscaler {
   /// The configuration parameters for the autoscaling algorithm. You can define
   /// one or more of the policies for an autoscaler: cpuUtilization,
@@ -28424,7 +28431,8 @@
 }
 
 /// A BackendService resource. This resource defines a group of backend virtual
-/// machines and their serving capacity.
+/// machines and their serving capacity. (== resource_for v1.backendService ==)
+/// (== resource_for beta.backendService ==)
 class BackendService {
   /// Lifetime of cookies in seconds if session_affinity is GENERATED_COOKIE. If
   /// set to 0, the cookie is non-persistent and lasts only until the end of the
@@ -29424,7 +29432,8 @@
 /// Committed use discounts are subject to Google Cloud Platform's Service
 /// Specific Terms. By purchasing a committed use discount, you agree to these
 /// terms. Committed use discounts will not renew, so you must purchase a new
-/// commitment to continue receiving discounts.
+/// commitment to continue receiving discounts. (== resource_for
+/// beta.commitments ==) (== resource_for v1.commitments ==)
 class Commitment {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -30258,7 +30267,8 @@
   }
 }
 
-/// A Disk resource.
+/// A Disk resource. (== resource_for beta.disks ==) (== resource_for v1.disks
+/// ==)
 class Disk {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -30983,7 +30993,8 @@
   }
 }
 
-/// A DiskType resource.
+/// A DiskType resource. (== resource_for beta.diskTypes ==) (== resource_for
+/// v1.diskTypes ==)
 class DiskType {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -32257,7 +32268,11 @@
 
 /// A ForwardingRule resource. A ForwardingRule resource specifies which pool of
 /// target virtual machines to forward a packet to if it matches the given
-/// [IPAddress, IPProtocol, ports] tuple.
+/// [IPAddress, IPProtocol, ports] tuple. (== resource_for beta.forwardingRules
+/// ==) (== resource_for v1.forwardingRules ==) (== resource_for
+/// beta.globalForwardingRules ==) (== resource_for v1.globalForwardingRules ==)
+/// (== resource_for beta.regionForwardingRules ==) (== resource_for
+/// v1.regionForwardingRules ==)
 class ForwardingRule {
   /// The IP address that this forwarding rule is serving on behalf of.
   ///
@@ -33093,9 +33108,8 @@
 
 /// Guest OS features.
 class GuestOsFeature {
-  /// The type of supported feature. Currently only VIRTIO_SCSI_MULTIQUEUE is
-  /// supported. For newer Windows images, the server might also populate this
-  /// property with the value WINDOWS to indicate that this is a Windows image.
+  /// The ID of a supported feature. Read  Enabling guest operating system
+  /// features to see a list of available options.
   /// Possible string values are:
   /// - "FEATURE_TYPE_UNSPECIFIED"
   /// - "VIRTIO_SCSI_MULTIQUEUE"
@@ -34431,7 +34445,8 @@
   }
 }
 
-/// An Image resource.
+/// An Image resource. (== resource_for beta.images ==) (== resource_for
+/// v1.images ==)
 class Image {
   /// Size of the image tar.gz archive stored in Google Cloud Storage (in
   /// bytes).
@@ -34456,15 +34471,9 @@
   /// name of the image family must comply with RFC1035.
   core.String family;
 
-  /// A list of features to enable on the guest OS. Applicable for bootable
-  /// images only. Currently, only one feature can be enabled,
-  /// VIRTIO_SCSI_MULTIQUEUE, which allows each virtual CPU to have its own
-  /// queue. For Windows images, you can only enable VIRTIO_SCSI_MULTIQUEUE on
-  /// images with driver version 1.2.0.1621 or higher. Linux images with kernel
-  /// versions 3.17 and higher will support VIRTIO_SCSI_MULTIQUEUE.
-  ///
-  /// For newer Windows images, the server might also populate this property
-  /// with the value WINDOWS to indicate that this is a Windows image.
+  /// A list of features to enable on the guest operating system. Applicable
+  /// only for bootable images. Read  Enabling guest operating system features
+  /// to see a list of available options.
   core.List<GuestOsFeature> guestOsFeatures;
 
   /// [Output Only] The unique identifier for the resource. This identifier is
@@ -34919,7 +34928,8 @@
   }
 }
 
-/// An Instance resource.
+/// An Instance resource. (== resource_for beta.instances ==) (== resource_for
+/// v1.instances ==)
 class Instance {
   /// Allows this instance to send and receive packets with non-matching
   /// destination or source IPs. This is required if you plan to use this
@@ -35416,6 +35426,9 @@
   }
 }
 
+/// InstanceGroups (== resource_for beta.instanceGroups ==) (== resource_for
+/// v1.instanceGroups ==) (== resource_for beta.regionInstanceGroups ==) (==
+/// resource_for v1.regionInstanceGroups ==)
 class InstanceGroup {
   /// [Output Only] The creation timestamp for this instance group in RFC3339
   /// text format.
@@ -35945,7 +35958,10 @@
   }
 }
 
-/// An Instance Group Manager resource.
+/// An Instance Group Manager resource. (== resource_for
+/// beta.instanceGroupManagers ==) (== resource_for v1.instanceGroupManagers ==)
+/// (== resource_for beta.regionInstanceGroupManagers ==) (== resource_for
+/// v1.regionInstanceGroupManagers ==)
 class InstanceGroupManager {
   /// The base instance name to use for instances in this group. The value must
   /// be 1-58 characters long. Instances are named by appending a hyphen and a
@@ -37770,7 +37786,8 @@
   }
 }
 
-/// An Instance Template resource.
+/// An Instance Template resource. (== resource_for beta.instanceTemplates ==)
+/// (== resource_for v1.instanceTemplates ==)
 class InstanceTemplate {
   /// [Output Only] The creation timestamp for this instance template in RFC3339
   /// text format.
@@ -38410,7 +38427,8 @@
 
 /// Represents an Interconnects resource. The Interconnects resource is a
 /// dedicated connection between Google's network and your on-premises network.
-/// For more information, see the  Dedicated overview page.
+/// For more information, see the  Dedicated overview page. (== resource_for
+/// v1.interconnects ==) (== resource_for beta.interconnects ==)
 class Interconnect {
   /// Administrative status of the interconnect. When this is set to true, the
   /// Interconnect is functional and can carry traffic. When set to false, no
@@ -38656,7 +38674,9 @@
 }
 
 /// Represents an InterconnectAttachment (VLAN attachment) resource. For more
-/// information, see  Creating VLAN Attachments.
+/// information, see  Creating VLAN Attachments. (== resource_for
+/// beta.interconnectAttachments ==) (== resource_for v1.interconnectAttachments
+/// ==)
 class InterconnectAttachment {
   /// [Output Only] IPv4 address + prefix length to be configured on Cloud
   /// Router Interface for this interconnect attachment.
@@ -40165,7 +40185,8 @@
   }
 }
 
-/// A Machine Type resource.
+/// A Machine Type resource. (== resource_for v1.machineTypes ==) (==
+/// resource_for beta.machineTypes ==)
 class MachineType {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -41155,7 +41176,8 @@
 }
 
 /// Represents a Network resource. Read Networks and Firewalls for more
-/// information.
+/// information. (== resource_for v1.networks ==) (== resource_for beta.networks
+/// ==)
 class Network {
   /// The range of internal addresses that are legal on this network. This range
   /// is a CIDR specification, for example: 192.168.0.0/16. Provided by the
@@ -41938,7 +41960,11 @@
   }
 }
 
-/// An Operation resource, used to manage asynchronous API requests.
+/// An Operation resource, used to manage asynchronous API requests. (==
+/// resource_for v1.globalOperations ==) (== resource_for beta.globalOperations
+/// ==) (== resource_for v1.regionOperations ==) (== resource_for
+/// beta.regionOperations ==) (== resource_for v1.zoneOperations ==) (==
+/// resource_for beta.zoneOperations ==)
 class Operation {
   /// [Output Only] Reserved for future use.
   core.String clientOperationId;
@@ -42801,7 +42827,8 @@
 
 /// A Project resource. Projects can only be created in the Google Cloud
 /// Platform Console. Unless marked otherwise, values can only be modified in
-/// the console.
+/// the console. (== resource_for v1.projects ==) (== resource_for beta.projects
+/// ==)
 class Project {
   /// Metadata key/value pairs available to all instances contained in this
   /// project. See Custom metadata for more information.
@@ -43139,7 +43166,8 @@
   }
 }
 
-/// Region resource.
+/// Region resource. (== resource_for beta.regions ==) (== resource_for
+/// v1.regions ==)
 class Region {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -44589,7 +44617,7 @@
 /// or a Google Compute Engine-operated gateway.
 ///
 /// Packets that do not match any route in the sending instance's routing table
-/// are dropped.
+/// are dropped. (== resource_for beta.routes ==) (== resource_for v1.routes ==)
 class Route {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -46186,7 +46214,8 @@
   }
 }
 
-/// A persistent disk snapshot resource.
+/// A persistent disk snapshot resource. (== resource_for beta.snapshots ==) (==
+/// resource_for v1.snapshots ==)
 class Snapshot {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -46594,7 +46623,8 @@
 
 /// An SslCertificate resource. This resource provides a mechanism to upload an
 /// SSL key and certificate to the load balancer to serve secure connections
-/// from the user.
+/// from the user. (== resource_for beta.sslCertificates ==) (== resource_for
+/// v1.sslCertificates ==)
 class SslCertificate {
   /// A local certificate file. The certificate must be in PEM format. The
   /// certificate chain must be no greater than 5 certs long. The chain must
@@ -46873,7 +46903,8 @@
   }
 }
 
-/// A Subnetwork resource.
+/// A Subnetwork resource. (== resource_for beta.subnetworks ==) (==
+/// resource_for v1.subnetworks ==)
 class Subnetwork {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -47730,7 +47761,9 @@
   }
 }
 
-/// A TargetHttpProxy resource. This resource defines an HTTP proxy.
+/// A TargetHttpProxy resource. This resource defines an HTTP proxy. (==
+/// resource_for beta.targetHttpProxies ==) (== resource_for
+/// v1.targetHttpProxies ==)
 class TargetHttpProxy {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -48023,7 +48056,9 @@
   }
 }
 
-/// A TargetHttpsProxy resource. This resource defines an HTTPS proxy.
+/// A TargetHttpsProxy resource. This resource defines an HTTPS proxy. (==
+/// resource_for beta.targetHttpsProxies ==) (== resource_for
+/// v1.targetHttpsProxies ==)
 class TargetHttpsProxy {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -48309,7 +48344,8 @@
 }
 
 /// A TargetInstance resource. This resource defines an endpoint instance that
-/// terminates traffic of certain protocols.
+/// terminates traffic of certain protocols. (== resource_for
+/// beta.targetInstances ==) (== resource_for v1.targetInstances ==)
 class TargetInstance {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -48935,7 +48971,8 @@
 }
 
 /// A TargetPool resource. This resource defines a pool of instances, an
-/// associated HttpHealthCheck resource, and the fallback target pool.
+/// associated HttpHealthCheck resource, and the fallback target pool. (==
+/// resource_for beta.targetPools ==) (== resource_for v1.targetPools ==)
 class TargetPool {
   /// This field is applicable only when the containing target pool is serving a
   /// forwarding rule as the primary pool, and its failoverRatio field is
@@ -49853,7 +49890,9 @@
   }
 }
 
-/// A TargetSslProxy resource. This resource defines an SSL proxy.
+/// A TargetSslProxy resource. This resource defines an SSL proxy. (==
+/// resource_for beta.targetSslProxies ==) (== resource_for v1.targetSslProxies
+/// ==)
 class TargetSslProxy {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -50191,7 +50230,9 @@
   }
 }
 
-/// A TargetTcpProxy resource. This resource defines a TCP proxy.
+/// A TargetTcpProxy resource. This resource defines a TCP proxy. (==
+/// resource_for beta.targetTcpProxies ==) (== resource_for v1.targetTcpProxies
+/// ==)
 class TargetTcpProxy {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -50471,7 +50512,8 @@
   }
 }
 
-/// Represents a Target VPN gateway resource.
+/// Represents a Target VPN gateway resource. (== resource_for
+/// beta.targetVpnGateways ==) (== resource_for v1.targetVpnGateways ==)
 class TargetVpnGateway {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -51689,6 +51731,8 @@
   }
 }
 
+/// VPN tunnel resource. (== resource_for beta.vpnTunnels ==) (== resource_for
+/// v1.vpnTunnels ==)
 class VpnTunnel {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -52608,7 +52652,8 @@
   }
 }
 
-/// A Zone resource.
+/// A Zone resource. (== resource_for beta.zones ==) (== resource_for v1.zones
+/// ==)
 class Zone {
   /// [Output Only] Available cpu/platform selections for the zone.
   core.List<core.String> availableCpuPlatforms;
diff --git a/generated/googleapis/lib/consumersurveys/v2.dart b/generated/googleapis/lib/consumersurveys/v2.dart
deleted file mode 100644
index c18fff7..0000000
--- a/generated/googleapis/lib/consumersurveys/v2.dart
+++ /dev/null
@@ -1,1450 +0,0 @@
-// This is a generated file (see the discoveryapis_generator project).
-
-library googleapis.consumersurveys.v2;
-
-import 'dart:core' as core;
-import 'dart:async' as async;
-import 'dart:convert' as convert;
-
-import 'package:_discoveryapis_commons/_discoveryapis_commons.dart' as commons;
-import 'package:http/http.dart' as http;
-
-export 'package:_discoveryapis_commons/_discoveryapis_commons.dart'
-    show
-        ApiRequestError,
-        DetailedApiRequestError,
-        Media,
-        UploadOptions,
-        ResumableUploadOptions,
-        DownloadOptions,
-        PartialDownloadOptions,
-        ByteRange;
-
-const core.String USER_AGENT = 'dart-api-client consumersurveys/v2';
-
-/// Creates and conducts surveys, lists the surveys that an authenticated user
-/// owns, and retrieves survey results and information about specified surveys.
-class ConsumersurveysApi {
-  /// View and edit your surveys and results
-  static const ConsumersurveysScope =
-      "https://www.googleapis.com/auth/consumersurveys";
-
-  /// View the results for your surveys
-  static const ConsumersurveysReadonlyScope =
-      "https://www.googleapis.com/auth/consumersurveys.readonly";
-
-  /// View your email address
-  static const UserinfoEmailScope =
-      "https://www.googleapis.com/auth/userinfo.email";
-
-  final commons.ApiRequester _requester;
-
-  MobileapppanelsResourceApi get mobileapppanels =>
-      new MobileapppanelsResourceApi(_requester);
-  ResultsResourceApi get results => new ResultsResourceApi(_requester);
-  SurveysResourceApi get surveys => new SurveysResourceApi(_requester);
-
-  ConsumersurveysApi(http.Client client,
-      {core.String rootUrl: "https://www.googleapis.com/",
-      core.String servicePath: "consumersurveys/v2/"})
-      : _requester =
-            new commons.ApiRequester(client, rootUrl, servicePath, USER_AGENT);
-}
-
-class MobileapppanelsResourceApi {
-  final commons.ApiRequester _requester;
-
-  MobileapppanelsResourceApi(commons.ApiRequester client) : _requester = client;
-
-  /// Retrieves a MobileAppPanel that is available to the authenticated user.
-  ///
-  /// Request parameters:
-  ///
-  /// [panelId] - External URL ID for the panel.
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [MobileAppPanel].
-  ///
-  /// Completes with a [commons.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<MobileAppPanel> get(core.String panelId, {core.String $fields}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = commons.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (panelId == null) {
-      throw new core.ArgumentError("Parameter panelId is required.");
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'mobileAppPanels/' + commons.Escaper.ecapeVariable('$panelId');
-
-    var _response = _requester.request(_url, "GET",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new MobileAppPanel.fromJson(data));
-  }
-
-  /// Lists the MobileAppPanels available to the authenticated user.
-  ///
-  /// Request parameters:
-  ///
-  /// [maxResults] - null
-  ///
-  /// [startIndex] - null
-  ///
-  /// [token] - null
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [MobileAppPanelsListResponse].
-  ///
-  /// Completes with a [commons.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<MobileAppPanelsListResponse> list(
-      {core.int maxResults,
-      core.int startIndex,
-      core.String token,
-      core.String $fields}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = commons.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (maxResults != null) {
-      _queryParams["maxResults"] = ["${maxResults}"];
-    }
-    if (startIndex != null) {
-      _queryParams["startIndex"] = ["${startIndex}"];
-    }
-    if (token != null) {
-      _queryParams["token"] = [token];
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'mobileAppPanels';
-
-    var _response = _requester.request(_url, "GET",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response
-        .then((data) => new MobileAppPanelsListResponse.fromJson(data));
-  }
-
-  /// Updates a MobileAppPanel. Currently the only property that can be updated
-  /// is the owners property.
-  ///
-  /// [request] - The metadata request object.
-  ///
-  /// Request parameters:
-  ///
-  /// [panelId] - External URL ID for the panel.
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [MobileAppPanel].
-  ///
-  /// Completes with a [commons.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<MobileAppPanel> update(
-      MobileAppPanel request, core.String panelId,
-      {core.String $fields}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = commons.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (request != null) {
-      _body = convert.JSON.encode((request).toJson());
-    }
-    if (panelId == null) {
-      throw new core.ArgumentError("Parameter panelId is required.");
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'mobileAppPanels/' + commons.Escaper.ecapeVariable('$panelId');
-
-    var _response = _requester.request(_url, "PUT",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new MobileAppPanel.fromJson(data));
-  }
-}
-
-class ResultsResourceApi {
-  final commons.ApiRequester _requester;
-
-  ResultsResourceApi(commons.ApiRequester client) : _requester = client;
-
-  /// Retrieves any survey results that have been produced so far. Results are
-  /// formatted as an Excel file. You must add "?alt=media" to the URL as an
-  /// argument to get results.
-  ///
-  /// [request] - The metadata request object.
-  ///
-  /// Request parameters:
-  ///
-  /// [surveyUrlId] - External URL ID for the survey.
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// [downloadOptions] - Options for downloading. A download can be either a
-  /// Metadata (default) or Media download. Partial Media downloads are possible
-  /// as well.
-  ///
-  /// Completes with a
-  ///
-  /// - [SurveyResults] for Metadata downloads (see [downloadOptions]).
-  ///
-  /// - [commons.Media] for Media downloads (see [downloadOptions]).
-  ///
-  /// Completes with a [commons.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 get(ResultsGetRequest request, core.String surveyUrlId,
-      {core.String $fields,
-      commons.DownloadOptions downloadOptions:
-          commons.DownloadOptions.Metadata}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = commons.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (request != null) {
-      _body = convert.JSON.encode((request).toJson());
-    }
-    if (surveyUrlId == null) {
-      throw new core.ArgumentError("Parameter surveyUrlId is required.");
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _downloadOptions = downloadOptions;
-
-    _url =
-        'surveys/' + commons.Escaper.ecapeVariable('$surveyUrlId') + '/results';
-
-    var _response = _requester.request(_url, "GET",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    if (_downloadOptions == null ||
-        _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => new SurveyResults.fromJson(data));
-    } else {
-      return _response;
-    }
-  }
-}
-
-class SurveysResourceApi {
-  final commons.ApiRequester _requester;
-
-  SurveysResourceApi(commons.ApiRequester client) : _requester = client;
-
-  /// Removes a survey from view in all user GET requests.
-  ///
-  /// Request parameters:
-  ///
-  /// [surveyUrlId] - External URL ID for the survey.
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [SurveysDeleteResponse].
-  ///
-  /// Completes with a [commons.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<SurveysDeleteResponse> delete(core.String surveyUrlId,
-      {core.String $fields}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = commons.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (surveyUrlId == null) {
-      throw new core.ArgumentError("Parameter surveyUrlId is required.");
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'surveys/' + commons.Escaper.ecapeVariable('$surveyUrlId');
-
-    var _response = _requester.request(_url, "DELETE",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new SurveysDeleteResponse.fromJson(data));
-  }
-
-  /// Retrieves information about the specified survey.
-  ///
-  /// Request parameters:
-  ///
-  /// [surveyUrlId] - External URL ID for the survey.
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [Survey].
-  ///
-  /// Completes with a [commons.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<Survey> get(core.String surveyUrlId, {core.String $fields}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = commons.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (surveyUrlId == null) {
-      throw new core.ArgumentError("Parameter surveyUrlId is required.");
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'surveys/' + commons.Escaper.ecapeVariable('$surveyUrlId');
-
-    var _response = _requester.request(_url, "GET",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new Survey.fromJson(data));
-  }
-
-  /// Creates a survey.
-  ///
-  /// [request] - The metadata request object.
-  ///
-  /// Request parameters:
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [Survey].
-  ///
-  /// Completes with a [commons.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<Survey> insert(Survey request, {core.String $fields}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = commons.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (request != null) {
-      _body = convert.JSON.encode((request).toJson());
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'surveys';
-
-    var _response = _requester.request(_url, "POST",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new Survey.fromJson(data));
-  }
-
-  /// Lists the surveys owned by the authenticated user.
-  ///
-  /// Request parameters:
-  ///
-  /// [maxResults] - null
-  ///
-  /// [startIndex] - null
-  ///
-  /// [token] - null
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [SurveysListResponse].
-  ///
-  /// Completes with a [commons.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<SurveysListResponse> list(
-      {core.int maxResults,
-      core.int startIndex,
-      core.String token,
-      core.String $fields}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = commons.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (maxResults != null) {
-      _queryParams["maxResults"] = ["${maxResults}"];
-    }
-    if (startIndex != null) {
-      _queryParams["startIndex"] = ["${startIndex}"];
-    }
-    if (token != null) {
-      _queryParams["token"] = [token];
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'surveys';
-
-    var _response = _requester.request(_url, "GET",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new SurveysListResponse.fromJson(data));
-  }
-
-  /// Begins running a survey.
-  ///
-  /// [request] - The metadata request object.
-  ///
-  /// Request parameters:
-  ///
-  /// [resourceId] - null
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [SurveysStartResponse].
-  ///
-  /// Completes with a [commons.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<SurveysStartResponse> start(
-      SurveysStartRequest request, core.String resourceId,
-      {core.String $fields}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = commons.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (request != null) {
-      _body = convert.JSON.encode((request).toJson());
-    }
-    if (resourceId == null) {
-      throw new core.ArgumentError("Parameter resourceId is required.");
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'surveys/' + commons.Escaper.ecapeVariable('$resourceId') + '/start';
-
-    var _response = _requester.request(_url, "POST",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new SurveysStartResponse.fromJson(data));
-  }
-
-  /// Stops a running survey.
-  ///
-  /// Request parameters:
-  ///
-  /// [resourceId] - null
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [SurveysStopResponse].
-  ///
-  /// Completes with a [commons.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<SurveysStopResponse> stop(core.String resourceId,
-      {core.String $fields}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = commons.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (resourceId == null) {
-      throw new core.ArgumentError("Parameter resourceId is required.");
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'surveys/' + commons.Escaper.ecapeVariable('$resourceId') + '/stop';
-
-    var _response = _requester.request(_url, "POST",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new SurveysStopResponse.fromJson(data));
-  }
-
-  /// Updates a survey. Currently the only property that can be updated is the
-  /// owners property.
-  ///
-  /// [request] - The metadata request object.
-  ///
-  /// Request parameters:
-  ///
-  /// [surveyUrlId] - External URL ID for the survey.
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [Survey].
-  ///
-  /// Completes with a [commons.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<Survey> update(Survey request, core.String surveyUrlId,
-      {core.String $fields}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = commons.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (request != null) {
-      _body = convert.JSON.encode((request).toJson());
-    }
-    if (surveyUrlId == null) {
-      throw new core.ArgumentError("Parameter surveyUrlId is required.");
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'surveys/' + commons.Escaper.ecapeVariable('$surveyUrlId');
-
-    var _response = _requester.request(_url, "PUT",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new Survey.fromJson(data));
-  }
-}
-
-class FieldMask {
-  core.List<FieldMask> fields;
-  core.int id;
-
-  FieldMask();
-
-  FieldMask.fromJson(core.Map _json) {
-    if (_json.containsKey("fields")) {
-      fields = _json["fields"]
-          .map((value) => new FieldMask.fromJson(value))
-          .toList();
-    }
-    if (_json.containsKey("id")) {
-      id = _json["id"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (fields != null) {
-      _json["fields"] = fields.map((value) => (value).toJson()).toList();
-    }
-    if (id != null) {
-      _json["id"] = id;
-    }
-    return _json;
-  }
-}
-
-class MobileAppPanel {
-  core.String country;
-  core.bool isPublicPanel;
-  core.String language;
-  core.String mobileAppPanelId;
-  core.String name;
-  core.List<core.String> owners;
-
-  MobileAppPanel();
-
-  MobileAppPanel.fromJson(core.Map _json) {
-    if (_json.containsKey("country")) {
-      country = _json["country"];
-    }
-    if (_json.containsKey("isPublicPanel")) {
-      isPublicPanel = _json["isPublicPanel"];
-    }
-    if (_json.containsKey("language")) {
-      language = _json["language"];
-    }
-    if (_json.containsKey("mobileAppPanelId")) {
-      mobileAppPanelId = _json["mobileAppPanelId"];
-    }
-    if (_json.containsKey("name")) {
-      name = _json["name"];
-    }
-    if (_json.containsKey("owners")) {
-      owners = _json["owners"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (country != null) {
-      _json["country"] = country;
-    }
-    if (isPublicPanel != null) {
-      _json["isPublicPanel"] = isPublicPanel;
-    }
-    if (language != null) {
-      _json["language"] = language;
-    }
-    if (mobileAppPanelId != null) {
-      _json["mobileAppPanelId"] = mobileAppPanelId;
-    }
-    if (name != null) {
-      _json["name"] = name;
-    }
-    if (owners != null) {
-      _json["owners"] = owners;
-    }
-    return _json;
-  }
-}
-
-class MobileAppPanelsListResponse {
-  PageInfo pageInfo;
-
-  /// Unique request ID used for logging and debugging. Please include in any
-  /// error reporting or troubleshooting requests.
-  core.String requestId;
-
-  /// An individual predefined panel of Opinion Rewards mobile users.
-  core.List<MobileAppPanel> resources;
-  TokenPagination tokenPagination;
-
-  MobileAppPanelsListResponse();
-
-  MobileAppPanelsListResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("pageInfo")) {
-      pageInfo = new PageInfo.fromJson(_json["pageInfo"]);
-    }
-    if (_json.containsKey("requestId")) {
-      requestId = _json["requestId"];
-    }
-    if (_json.containsKey("resources")) {
-      resources = _json["resources"]
-          .map((value) => new MobileAppPanel.fromJson(value))
-          .toList();
-    }
-    if (_json.containsKey("tokenPagination")) {
-      tokenPagination = new TokenPagination.fromJson(_json["tokenPagination"]);
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (pageInfo != null) {
-      _json["pageInfo"] = (pageInfo).toJson();
-    }
-    if (requestId != null) {
-      _json["requestId"] = requestId;
-    }
-    if (resources != null) {
-      _json["resources"] = resources.map((value) => (value).toJson()).toList();
-    }
-    if (tokenPagination != null) {
-      _json["tokenPagination"] = (tokenPagination).toJson();
-    }
-    return _json;
-  }
-}
-
-class PageInfo {
-  core.int resultPerPage;
-  core.int startIndex;
-  core.int totalResults;
-
-  PageInfo();
-
-  PageInfo.fromJson(core.Map _json) {
-    if (_json.containsKey("resultPerPage")) {
-      resultPerPage = _json["resultPerPage"];
-    }
-    if (_json.containsKey("startIndex")) {
-      startIndex = _json["startIndex"];
-    }
-    if (_json.containsKey("totalResults")) {
-      totalResults = _json["totalResults"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (resultPerPage != null) {
-      _json["resultPerPage"] = resultPerPage;
-    }
-    if (startIndex != null) {
-      _json["startIndex"] = startIndex;
-    }
-    if (totalResults != null) {
-      _json["totalResults"] = totalResults;
-    }
-    return _json;
-  }
-}
-
-class ResultsGetRequest {
-  ResultsMask resultMask;
-
-  ResultsGetRequest();
-
-  ResultsGetRequest.fromJson(core.Map _json) {
-    if (_json.containsKey("resultMask")) {
-      resultMask = new ResultsMask.fromJson(_json["resultMask"]);
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (resultMask != null) {
-      _json["resultMask"] = (resultMask).toJson();
-    }
-    return _json;
-  }
-}
-
-class ResultsMask {
-  core.List<FieldMask> fields;
-  core.String projection;
-
-  ResultsMask();
-
-  ResultsMask.fromJson(core.Map _json) {
-    if (_json.containsKey("fields")) {
-      fields = _json["fields"]
-          .map((value) => new FieldMask.fromJson(value))
-          .toList();
-    }
-    if (_json.containsKey("projection")) {
-      projection = _json["projection"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (fields != null) {
-      _json["fields"] = fields.map((value) => (value).toJson()).toList();
-    }
-    if (projection != null) {
-      _json["projection"] = projection;
-    }
-    return _json;
-  }
-}
-
-class Survey {
-  SurveyAudience audience;
-  SurveyCost cost;
-  core.String customerData;
-  core.List<core.int> get customerDataAsBytes {
-    return convert.BASE64.decode(customerData);
-  }
-
-  void set customerDataAsBytes(core.List<core.int> _bytes) {
-    customerData =
-        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
-  }
-
-  core.String description;
-  core.List<core.String> owners;
-  core.List<SurveyQuestion> questions;
-  SurveyRejection rejectionReason;
-  core.String state;
-  core.String surveyUrlId;
-  core.String title;
-  core.int wantedResponseCount;
-
-  Survey();
-
-  Survey.fromJson(core.Map _json) {
-    if (_json.containsKey("audience")) {
-      audience = new SurveyAudience.fromJson(_json["audience"]);
-    }
-    if (_json.containsKey("cost")) {
-      cost = new SurveyCost.fromJson(_json["cost"]);
-    }
-    if (_json.containsKey("customerData")) {
-      customerData = _json["customerData"];
-    }
-    if (_json.containsKey("description")) {
-      description = _json["description"];
-    }
-    if (_json.containsKey("owners")) {
-      owners = _json["owners"];
-    }
-    if (_json.containsKey("questions")) {
-      questions = _json["questions"]
-          .map((value) => new SurveyQuestion.fromJson(value))
-          .toList();
-    }
-    if (_json.containsKey("rejectionReason")) {
-      rejectionReason = new SurveyRejection.fromJson(_json["rejectionReason"]);
-    }
-    if (_json.containsKey("state")) {
-      state = _json["state"];
-    }
-    if (_json.containsKey("surveyUrlId")) {
-      surveyUrlId = _json["surveyUrlId"];
-    }
-    if (_json.containsKey("title")) {
-      title = _json["title"];
-    }
-    if (_json.containsKey("wantedResponseCount")) {
-      wantedResponseCount = _json["wantedResponseCount"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (audience != null) {
-      _json["audience"] = (audience).toJson();
-    }
-    if (cost != null) {
-      _json["cost"] = (cost).toJson();
-    }
-    if (customerData != null) {
-      _json["customerData"] = customerData;
-    }
-    if (description != null) {
-      _json["description"] = description;
-    }
-    if (owners != null) {
-      _json["owners"] = owners;
-    }
-    if (questions != null) {
-      _json["questions"] = questions.map((value) => (value).toJson()).toList();
-    }
-    if (rejectionReason != null) {
-      _json["rejectionReason"] = (rejectionReason).toJson();
-    }
-    if (state != null) {
-      _json["state"] = state;
-    }
-    if (surveyUrlId != null) {
-      _json["surveyUrlId"] = surveyUrlId;
-    }
-    if (title != null) {
-      _json["title"] = title;
-    }
-    if (wantedResponseCount != null) {
-      _json["wantedResponseCount"] = wantedResponseCount;
-    }
-    return _json;
-  }
-}
-
-class SurveyAudience {
-  core.List<core.String> ages;
-  core.String country;
-  core.String countrySubdivision;
-  core.String gender;
-  core.List<core.String> languages;
-  core.String mobileAppPanelId;
-  core.String populationSource;
-
-  SurveyAudience();
-
-  SurveyAudience.fromJson(core.Map _json) {
-    if (_json.containsKey("ages")) {
-      ages = _json["ages"];
-    }
-    if (_json.containsKey("country")) {
-      country = _json["country"];
-    }
-    if (_json.containsKey("countrySubdivision")) {
-      countrySubdivision = _json["countrySubdivision"];
-    }
-    if (_json.containsKey("gender")) {
-      gender = _json["gender"];
-    }
-    if (_json.containsKey("languages")) {
-      languages = _json["languages"];
-    }
-    if (_json.containsKey("mobileAppPanelId")) {
-      mobileAppPanelId = _json["mobileAppPanelId"];
-    }
-    if (_json.containsKey("populationSource")) {
-      populationSource = _json["populationSource"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (ages != null) {
-      _json["ages"] = ages;
-    }
-    if (country != null) {
-      _json["country"] = country;
-    }
-    if (countrySubdivision != null) {
-      _json["countrySubdivision"] = countrySubdivision;
-    }
-    if (gender != null) {
-      _json["gender"] = gender;
-    }
-    if (languages != null) {
-      _json["languages"] = languages;
-    }
-    if (mobileAppPanelId != null) {
-      _json["mobileAppPanelId"] = mobileAppPanelId;
-    }
-    if (populationSource != null) {
-      _json["populationSource"] = populationSource;
-    }
-    return _json;
-  }
-}
-
-class SurveyCost {
-  core.String costPerResponseNanos;
-  core.String currencyCode;
-  core.String maxCostPerResponseNanos;
-  core.String nanos;
-
-  SurveyCost();
-
-  SurveyCost.fromJson(core.Map _json) {
-    if (_json.containsKey("costPerResponseNanos")) {
-      costPerResponseNanos = _json["costPerResponseNanos"];
-    }
-    if (_json.containsKey("currencyCode")) {
-      currencyCode = _json["currencyCode"];
-    }
-    if (_json.containsKey("maxCostPerResponseNanos")) {
-      maxCostPerResponseNanos = _json["maxCostPerResponseNanos"];
-    }
-    if (_json.containsKey("nanos")) {
-      nanos = _json["nanos"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (costPerResponseNanos != null) {
-      _json["costPerResponseNanos"] = costPerResponseNanos;
-    }
-    if (currencyCode != null) {
-      _json["currencyCode"] = currencyCode;
-    }
-    if (maxCostPerResponseNanos != null) {
-      _json["maxCostPerResponseNanos"] = maxCostPerResponseNanos;
-    }
-    if (nanos != null) {
-      _json["nanos"] = nanos;
-    }
-    return _json;
-  }
-}
-
-class SurveyQuestion {
-  core.String answerOrder;
-  core.List<core.String> answers;
-  core.bool hasOther;
-  core.String highValueLabel;
-  core.List<SurveyQuestionImage> images;
-  core.bool lastAnswerPositionPinned;
-  core.String lowValueLabel;
-  core.bool mustPickSuggestion;
-  core.String numStars;
-  core.String openTextPlaceholder;
-  core.List<core.String> openTextSuggestions;
-  core.String question;
-  core.String sentimentText;
-  core.bool singleLineResponse;
-  core.List<core.String> thresholdAnswers;
-  core.String type;
-  core.String unitOfMeasurementLabel;
-  core.String videoId;
-
-  SurveyQuestion();
-
-  SurveyQuestion.fromJson(core.Map _json) {
-    if (_json.containsKey("answerOrder")) {
-      answerOrder = _json["answerOrder"];
-    }
-    if (_json.containsKey("answers")) {
-      answers = _json["answers"];
-    }
-    if (_json.containsKey("hasOther")) {
-      hasOther = _json["hasOther"];
-    }
-    if (_json.containsKey("highValueLabel")) {
-      highValueLabel = _json["highValueLabel"];
-    }
-    if (_json.containsKey("images")) {
-      images = _json["images"]
-          .map((value) => new SurveyQuestionImage.fromJson(value))
-          .toList();
-    }
-    if (_json.containsKey("lastAnswerPositionPinned")) {
-      lastAnswerPositionPinned = _json["lastAnswerPositionPinned"];
-    }
-    if (_json.containsKey("lowValueLabel")) {
-      lowValueLabel = _json["lowValueLabel"];
-    }
-    if (_json.containsKey("mustPickSuggestion")) {
-      mustPickSuggestion = _json["mustPickSuggestion"];
-    }
-    if (_json.containsKey("numStars")) {
-      numStars = _json["numStars"];
-    }
-    if (_json.containsKey("openTextPlaceholder")) {
-      openTextPlaceholder = _json["openTextPlaceholder"];
-    }
-    if (_json.containsKey("openTextSuggestions")) {
-      openTextSuggestions = _json["openTextSuggestions"];
-    }
-    if (_json.containsKey("question")) {
-      question = _json["question"];
-    }
-    if (_json.containsKey("sentimentText")) {
-      sentimentText = _json["sentimentText"];
-    }
-    if (_json.containsKey("singleLineResponse")) {
-      singleLineResponse = _json["singleLineResponse"];
-    }
-    if (_json.containsKey("thresholdAnswers")) {
-      thresholdAnswers = _json["thresholdAnswers"];
-    }
-    if (_json.containsKey("type")) {
-      type = _json["type"];
-    }
-    if (_json.containsKey("unitOfMeasurementLabel")) {
-      unitOfMeasurementLabel = _json["unitOfMeasurementLabel"];
-    }
-    if (_json.containsKey("videoId")) {
-      videoId = _json["videoId"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (answerOrder != null) {
-      _json["answerOrder"] = answerOrder;
-    }
-    if (answers != null) {
-      _json["answers"] = answers;
-    }
-    if (hasOther != null) {
-      _json["hasOther"] = hasOther;
-    }
-    if (highValueLabel != null) {
-      _json["highValueLabel"] = highValueLabel;
-    }
-    if (images != null) {
-      _json["images"] = images.map((value) => (value).toJson()).toList();
-    }
-    if (lastAnswerPositionPinned != null) {
-      _json["lastAnswerPositionPinned"] = lastAnswerPositionPinned;
-    }
-    if (lowValueLabel != null) {
-      _json["lowValueLabel"] = lowValueLabel;
-    }
-    if (mustPickSuggestion != null) {
-      _json["mustPickSuggestion"] = mustPickSuggestion;
-    }
-    if (numStars != null) {
-      _json["numStars"] = numStars;
-    }
-    if (openTextPlaceholder != null) {
-      _json["openTextPlaceholder"] = openTextPlaceholder;
-    }
-    if (openTextSuggestions != null) {
-      _json["openTextSuggestions"] = openTextSuggestions;
-    }
-    if (question != null) {
-      _json["question"] = question;
-    }
-    if (sentimentText != null) {
-      _json["sentimentText"] = sentimentText;
-    }
-    if (singleLineResponse != null) {
-      _json["singleLineResponse"] = singleLineResponse;
-    }
-    if (thresholdAnswers != null) {
-      _json["thresholdAnswers"] = thresholdAnswers;
-    }
-    if (type != null) {
-      _json["type"] = type;
-    }
-    if (unitOfMeasurementLabel != null) {
-      _json["unitOfMeasurementLabel"] = unitOfMeasurementLabel;
-    }
-    if (videoId != null) {
-      _json["videoId"] = videoId;
-    }
-    return _json;
-  }
-}
-
-class SurveyQuestionImage {
-  core.String altText;
-  core.String data;
-  core.List<core.int> get dataAsBytes {
-    return convert.BASE64.decode(data);
-  }
-
-  void set dataAsBytes(core.List<core.int> _bytes) {
-    data =
-        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
-  }
-
-  core.String url;
-
-  SurveyQuestionImage();
-
-  SurveyQuestionImage.fromJson(core.Map _json) {
-    if (_json.containsKey("altText")) {
-      altText = _json["altText"];
-    }
-    if (_json.containsKey("data")) {
-      data = _json["data"];
-    }
-    if (_json.containsKey("url")) {
-      url = _json["url"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (altText != null) {
-      _json["altText"] = altText;
-    }
-    if (data != null) {
-      _json["data"] = data;
-    }
-    if (url != null) {
-      _json["url"] = url;
-    }
-    return _json;
-  }
-}
-
-class SurveyRejection {
-  core.String explanation;
-  core.String type;
-
-  SurveyRejection();
-
-  SurveyRejection.fromJson(core.Map _json) {
-    if (_json.containsKey("explanation")) {
-      explanation = _json["explanation"];
-    }
-    if (_json.containsKey("type")) {
-      type = _json["type"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (explanation != null) {
-      _json["explanation"] = explanation;
-    }
-    if (type != null) {
-      _json["type"] = type;
-    }
-    return _json;
-  }
-}
-
-class SurveyResults {
-  core.String status;
-  core.String surveyUrlId;
-
-  SurveyResults();
-
-  SurveyResults.fromJson(core.Map _json) {
-    if (_json.containsKey("status")) {
-      status = _json["status"];
-    }
-    if (_json.containsKey("surveyUrlId")) {
-      surveyUrlId = _json["surveyUrlId"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (status != null) {
-      _json["status"] = status;
-    }
-    if (surveyUrlId != null) {
-      _json["surveyUrlId"] = surveyUrlId;
-    }
-    return _json;
-  }
-}
-
-class SurveysDeleteResponse {
-  /// Unique request ID used for logging and debugging. Please include in any
-  /// error reporting or troubleshooting requests.
-  core.String requestId;
-
-  SurveysDeleteResponse();
-
-  SurveysDeleteResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("requestId")) {
-      requestId = _json["requestId"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (requestId != null) {
-      _json["requestId"] = requestId;
-    }
-    return _json;
-  }
-}
-
-class SurveysListResponse {
-  PageInfo pageInfo;
-
-  /// Unique request ID used for logging and debugging. Please include in any
-  /// error reporting or troubleshooting requests.
-  core.String requestId;
-
-  /// An individual survey resource.
-  core.List<Survey> resources;
-  TokenPagination tokenPagination;
-
-  SurveysListResponse();
-
-  SurveysListResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("pageInfo")) {
-      pageInfo = new PageInfo.fromJson(_json["pageInfo"]);
-    }
-    if (_json.containsKey("requestId")) {
-      requestId = _json["requestId"];
-    }
-    if (_json.containsKey("resources")) {
-      resources = _json["resources"]
-          .map((value) => new Survey.fromJson(value))
-          .toList();
-    }
-    if (_json.containsKey("tokenPagination")) {
-      tokenPagination = new TokenPagination.fromJson(_json["tokenPagination"]);
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (pageInfo != null) {
-      _json["pageInfo"] = (pageInfo).toJson();
-    }
-    if (requestId != null) {
-      _json["requestId"] = requestId;
-    }
-    if (resources != null) {
-      _json["resources"] = resources.map((value) => (value).toJson()).toList();
-    }
-    if (tokenPagination != null) {
-      _json["tokenPagination"] = (tokenPagination).toJson();
-    }
-    return _json;
-  }
-}
-
-class SurveysStartRequest {
-  /// Threshold to start a survey automically if the quoted prices is less than
-  /// or equal to this value. See Survey.Cost for more details.
-  core.String maxCostPerResponseNanos;
-
-  SurveysStartRequest();
-
-  SurveysStartRequest.fromJson(core.Map _json) {
-    if (_json.containsKey("maxCostPerResponseNanos")) {
-      maxCostPerResponseNanos = _json["maxCostPerResponseNanos"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (maxCostPerResponseNanos != null) {
-      _json["maxCostPerResponseNanos"] = maxCostPerResponseNanos;
-    }
-    return _json;
-  }
-}
-
-class SurveysStartResponse {
-  /// Unique request ID used for logging and debugging. Please include in any
-  /// error reporting or troubleshooting requests.
-  core.String requestId;
-
-  SurveysStartResponse();
-
-  SurveysStartResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("requestId")) {
-      requestId = _json["requestId"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (requestId != null) {
-      _json["requestId"] = requestId;
-    }
-    return _json;
-  }
-}
-
-class SurveysStopResponse {
-  /// Unique request ID used for logging and debugging. Please include in any
-  /// error reporting or troubleshooting requests.
-  core.String requestId;
-
-  SurveysStopResponse();
-
-  SurveysStopResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("requestId")) {
-      requestId = _json["requestId"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (requestId != null) {
-      _json["requestId"] = requestId;
-    }
-    return _json;
-  }
-}
-
-class TokenPagination {
-  core.String nextPageToken;
-  core.String previousPageToken;
-
-  TokenPagination();
-
-  TokenPagination.fromJson(core.Map _json) {
-    if (_json.containsKey("nextPageToken")) {
-      nextPageToken = _json["nextPageToken"];
-    }
-    if (_json.containsKey("previousPageToken")) {
-      previousPageToken = _json["previousPageToken"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (nextPageToken != null) {
-      _json["nextPageToken"] = nextPageToken;
-    }
-    if (previousPageToken != null) {
-      _json["previousPageToken"] = previousPageToken;
-    }
-    return _json;
-  }
-}
diff --git a/generated/googleapis/lib/container/v1.dart b/generated/googleapis/lib/container/v1.dart
index 829b787..d864e19 100644
--- a/generated/googleapis/lib/container/v1.dart
+++ b/generated/googleapis/lib/container/v1.dart
@@ -14,7 +14,7 @@
 
 const core.String USER_AGENT = 'dart-api-client container/v1';
 
-/// The Google Container Engine API is used for building and managing container
+/// The Google Kubernetes Engine API is used for building and managing container
 /// based applications, powered by the open source Kubernetes technology.
 class ContainerApi {
   /// View and manage your data across Google Cloud Platform services
@@ -51,7 +51,7 @@
 
   ProjectsZonesResourceApi(commons.ApiRequester client) : _requester = client;
 
-  /// Returns configuration info about the Container Engine service.
+  /// Returns configuration info about the Kubernetes Engine service.
   ///
   /// Request parameters:
   ///
@@ -2329,7 +2329,7 @@
   }
 }
 
-/// A Google Container Engine cluster.
+/// A Google Kubernetes Engine cluster.
 class Cluster {
   /// Configurations for the various addons available to run in the cluster.
   AddonsConfig addonsConfig;
@@ -4155,7 +4155,7 @@
   }
 }
 
-/// Container Engine service configuration.
+/// Kubernetes Engine service configuration.
 class ServerConfig {
   /// Version of Kubernetes the service deploys by default.
   core.String defaultClusterVersion;
@@ -4244,7 +4244,7 @@
 class SetLabelsRequest {
   /// The fingerprint of the previous set of labels for this resource,
   /// used to detect conflicts. The fingerprint is initially generated by
-  /// Container Engine and changes after every request to modify or update
+  /// Kubernetes Engine and changes after every request to modify or update
   /// labels. You must always provide an up-to-date fingerprint hash when
   /// updating or changing labels. Make a <code>get()</code> request to the
   /// resource to get the latest fingerprint.
@@ -4584,10 +4584,8 @@
 
 /// UpdateMasterRequest updates the master of the cluster.
 class UpdateMasterRequest {
-  /// The Kubernetes version to change the master to. The only valid value is
-  /// the
-  /// latest supported version. Use "-" to have the server automatically select
-  /// the latest version.
+  /// The Kubernetes version to change the master to. Use "-" to have the server
+  /// automatically select the default version.
   core.String masterVersion;
 
   UpdateMasterRequest();
diff --git a/generated/googleapis/lib/content/v2.dart b/generated/googleapis/lib/content/v2.dart
index f00e9ce..792997b 100644
--- a/generated/googleapis/lib/content/v2.dart
+++ b/generated/googleapis/lib/content/v2.dart
@@ -2432,6 +2432,67 @@
         .then((data) => new OrdersReturnLineItemResponse.fromJson(data));
   }
 
+  /// Sets (overrides) merchant provided annotations on the line item.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
+  ///
+  /// [orderId] - The ID of the order.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [OrdersSetLineItemMetadataResponse].
+  ///
+  /// Completes with a [commons.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<OrdersSetLineItemMetadataResponse> setlineitemmetadata(
+      OrdersSetLineItemMetadataRequest request,
+      core.String merchantId,
+      core.String orderId,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (merchantId == null) {
+      throw new core.ArgumentError("Parameter merchantId is required.");
+    }
+    if (orderId == null) {
+      throw new core.ArgumentError("Parameter orderId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = commons.Escaper.ecapeVariable('$merchantId') +
+        '/orders/' +
+        commons.Escaper.ecapeVariable('$orderId') +
+        '/setLineItemMetadata';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new OrdersSetLineItemMetadataResponse.fromJson(data));
+  }
+
   /// Marks line item(s) as shipped.
   ///
   /// [request] - The metadata request object.
@@ -2493,6 +2554,68 @@
         .then((data) => new OrdersShipLineItemsResponse.fromJson(data));
   }
 
+  /// Updates ship by and delivery by dates for a line item.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
+  ///
+  /// [orderId] - The ID of the order.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [OrdersUpdateLineItemShippingDetailsResponse].
+  ///
+  /// Completes with a [commons.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<OrdersUpdateLineItemShippingDetailsResponse>
+      updatelineitemshippingdetails(
+          OrdersUpdateLineItemShippingDetailsRequest request,
+          core.String merchantId,
+          core.String orderId,
+          {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (merchantId == null) {
+      throw new core.ArgumentError("Parameter merchantId is required.");
+    }
+    if (orderId == null) {
+      throw new core.ArgumentError("Parameter orderId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = commons.Escaper.ecapeVariable('$merchantId') +
+        '/orders/' +
+        commons.Escaper.ecapeVariable('$orderId') +
+        '/updateLineItemShippingDetails';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) =>
+        new OrdersUpdateLineItemShippingDetailsResponse.fromJson(data));
+  }
+
   /// Updates the merchant order ID for a given order.
   ///
   /// [request] - The metadata request object.
@@ -7056,6 +7179,9 @@
 }
 
 class OrderLineItem {
+  /// Annotations that are attached to the line item.
+  core.List<OrderMerchantProvidedAnnotation> annotations;
+
   /// Cancellations of the line item.
   core.List<OrderCancellation> cancellations;
 
@@ -7104,6 +7230,11 @@
   OrderLineItem();
 
   OrderLineItem.fromJson(core.Map _json) {
+    if (_json.containsKey("annotations")) {
+      annotations = _json["annotations"]
+          .map((value) => new OrderMerchantProvidedAnnotation.fromJson(value))
+          .toList();
+    }
     if (_json.containsKey("cancellations")) {
       cancellations = _json["cancellations"]
           .map((value) => new OrderCancellation.fromJson(value))
@@ -7156,6 +7287,10 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (annotations != null) {
+      _json["annotations"] =
+          annotations.map((value) => (value).toJson()).toList();
+    }
     if (cancellations != null) {
       _json["cancellations"] =
           cancellations.map((value) => (value).toJson()).toList();
@@ -7518,6 +7653,39 @@
   }
 }
 
+class OrderMerchantProvidedAnnotation {
+  /// Key for additional merchant provided (as key-value pairs) annotation about
+  /// the line item.
+  core.String key;
+
+  /// Value for additional merchant provided (as key-value pairs) annotation
+  /// about the line item.
+  core.String value;
+
+  OrderMerchantProvidedAnnotation();
+
+  OrderMerchantProvidedAnnotation.fromJson(core.Map _json) {
+    if (_json.containsKey("key")) {
+      key = _json["key"];
+    }
+    if (_json.containsKey("value")) {
+      value = _json["value"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (key != null) {
+      _json["key"] = key;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
 class OrderPaymentMethod {
   /// The billing address.
   OrderAddress billingAddress;
@@ -8399,9 +8567,16 @@
   /// Required for returnLineItem method.
   OrdersCustomBatchRequestEntryReturnLineItem returnLineItem;
 
+  /// Required for setLineItemMetadata method.
+  OrdersCustomBatchRequestEntrySetLineItemMetadata setLineItemMetadata;
+
   /// Required for shipLineItems method.
   OrdersCustomBatchRequestEntryShipLineItems shipLineItems;
 
+  /// Required for updateLineItemShippingDate method.
+  OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails
+      updateLineItemShippingDetails;
+
   /// Required for updateShipment method.
   OrdersCustomBatchRequestEntryUpdateShipment updateShipment;
 
@@ -8442,10 +8617,20 @@
       returnLineItem = new OrdersCustomBatchRequestEntryReturnLineItem.fromJson(
           _json["returnLineItem"]);
     }
+    if (_json.containsKey("setLineItemMetadata")) {
+      setLineItemMetadata =
+          new OrdersCustomBatchRequestEntrySetLineItemMetadata.fromJson(
+              _json["setLineItemMetadata"]);
+    }
     if (_json.containsKey("shipLineItems")) {
       shipLineItems = new OrdersCustomBatchRequestEntryShipLineItems.fromJson(
           _json["shipLineItems"]);
     }
+    if (_json.containsKey("updateLineItemShippingDetails")) {
+      updateLineItemShippingDetails =
+          new OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails
+              .fromJson(_json["updateLineItemShippingDetails"]);
+    }
     if (_json.containsKey("updateShipment")) {
       updateShipment = new OrdersCustomBatchRequestEntryUpdateShipment.fromJson(
           _json["updateShipment"]);
@@ -8485,9 +8670,16 @@
     if (returnLineItem != null) {
       _json["returnLineItem"] = (returnLineItem).toJson();
     }
+    if (setLineItemMetadata != null) {
+      _json["setLineItemMetadata"] = (setLineItemMetadata).toJson();
+    }
     if (shipLineItems != null) {
       _json["shipLineItems"] = (shipLineItems).toJson();
     }
+    if (updateLineItemShippingDetails != null) {
+      _json["updateLineItemShippingDetails"] =
+          (updateLineItemShippingDetails).toJson();
+    }
     if (updateShipment != null) {
       _json["updateShipment"] = (updateShipment).toJson();
     }
@@ -8736,6 +8928,50 @@
   }
 }
 
+class OrdersCustomBatchRequestEntrySetLineItemMetadata {
+  core.List<OrderMerchantProvidedAnnotation> annotations;
+
+  /// The ID of the line item to set metadata. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the product to set metadata. This is the REST ID used in the
+  /// products service. Either lineItemId or productId is required.
+  core.String productId;
+
+  OrdersCustomBatchRequestEntrySetLineItemMetadata();
+
+  OrdersCustomBatchRequestEntrySetLineItemMetadata.fromJson(core.Map _json) {
+    if (_json.containsKey("annotations")) {
+      annotations = _json["annotations"]
+          .map((value) => new OrderMerchantProvidedAnnotation.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (annotations != null) {
+      _json["annotations"] =
+          annotations.map((value) => (value).toJson()).toList();
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    return _json;
+  }
+}
+
 class OrdersCustomBatchRequestEntryShipLineItems {
   /// Deprecated. Please use shipmentInfo instead. The carrier handling the
   /// shipment. See shipments[].carrier in the  Orders resource representation
@@ -8848,6 +9084,60 @@
   }
 }
 
+class OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails {
+  /// Updated delivery by date, in ISO 8601 format. If not specified only ship
+  /// by date is updated.
+  core.String deliverByDate;
+
+  /// The ID of the line item to set metadata. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the product to set metadata. This is the REST ID used in the
+  /// products service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// Updated ship by date, in ISO 8601 format. If not specified only deliver by
+  /// date is updated.
+  core.String shipByDate;
+
+  OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails();
+
+  OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails.fromJson(
+      core.Map _json) {
+    if (_json.containsKey("deliverByDate")) {
+      deliverByDate = _json["deliverByDate"];
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("shipByDate")) {
+      shipByDate = _json["shipByDate"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (deliverByDate != null) {
+      _json["deliverByDate"] = deliverByDate;
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (shipByDate != null) {
+      _json["shipByDate"] = shipByDate;
+    }
+    return _json;
+  }
+}
+
 class OrdersCustomBatchRequestEntryUpdateShipment {
   /// The carrier handling the shipment. Not updated if missing. See
   /// shipments[].carrier in the  Orders resource representation for a list of
@@ -9299,6 +9589,91 @@
   }
 }
 
+class OrdersSetLineItemMetadataRequest {
+  core.List<OrderMerchantProvidedAnnotation> annotations;
+
+  /// The ID of the line item to set metadata. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the operation. Unique across all operations for a given order.
+  core.String operationId;
+
+  /// The ID of the product to set metadata. This is the REST ID used in the
+  /// products service. Either lineItemId or productId is required.
+  core.String productId;
+
+  OrdersSetLineItemMetadataRequest();
+
+  OrdersSetLineItemMetadataRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("annotations")) {
+      annotations = _json["annotations"]
+          .map((value) => new OrderMerchantProvidedAnnotation.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("operationId")) {
+      operationId = _json["operationId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (annotations != null) {
+      _json["annotations"] =
+          annotations.map((value) => (value).toJson()).toList();
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (operationId != null) {
+      _json["operationId"] = operationId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    return _json;
+  }
+}
+
+class OrdersSetLineItemMetadataResponse {
+  /// The status of the execution.
+  core.String executionStatus;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "content#ordersSetLineItemMetadataResponse".
+  core.String kind;
+
+  OrdersSetLineItemMetadataResponse();
+
+  OrdersSetLineItemMetadataResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("executionStatus")) {
+      executionStatus = _json["executionStatus"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (executionStatus != null) {
+      _json["executionStatus"] = executionStatus;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
 class OrdersShipLineItemsRequest {
   /// Deprecated. Please use shipmentInfo instead. The carrier handling the
   /// shipment. See shipments[].carrier in the  Orders resource representation
@@ -9410,6 +9785,100 @@
   }
 }
 
+class OrdersUpdateLineItemShippingDetailsRequest {
+  /// Updated delivery by date, in ISO 8601 format. If not specified only ship
+  /// by date is updated.
+  core.String deliverByDate;
+
+  /// The ID of the line item to set metadata. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the operation. Unique across all operations for a given order.
+  core.String operationId;
+
+  /// The ID of the product to set metadata. This is the REST ID used in the
+  /// products service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// Updated ship by date, in ISO 8601 format. If not specified only deliver by
+  /// date is updated.
+  core.String shipByDate;
+
+  OrdersUpdateLineItemShippingDetailsRequest();
+
+  OrdersUpdateLineItemShippingDetailsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("deliverByDate")) {
+      deliverByDate = _json["deliverByDate"];
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("operationId")) {
+      operationId = _json["operationId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("shipByDate")) {
+      shipByDate = _json["shipByDate"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (deliverByDate != null) {
+      _json["deliverByDate"] = deliverByDate;
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (operationId != null) {
+      _json["operationId"] = operationId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (shipByDate != null) {
+      _json["shipByDate"] = shipByDate;
+    }
+    return _json;
+  }
+}
+
+class OrdersUpdateLineItemShippingDetailsResponse {
+  /// The status of the execution.
+  core.String executionStatus;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "content#ordersUpdateLineItemShippingDetailsResponse".
+  core.String kind;
+
+  OrdersUpdateLineItemShippingDetailsResponse();
+
+  OrdersUpdateLineItemShippingDetailsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("executionStatus")) {
+      executionStatus = _json["executionStatus"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (executionStatus != null) {
+      _json["executionStatus"] = executionStatus;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
 class OrdersUpdateMerchantOrderIdRequest {
   /// The merchant order id to be assigned to the order. Must be unique per
   /// merchant.
diff --git a/generated/googleapis/lib/content/v2sandbox.dart b/generated/googleapis/lib/content/v2sandbox.dart
index 3a3aba0..fa31e19 100644
--- a/generated/googleapis/lib/content/v2sandbox.dart
+++ b/generated/googleapis/lib/content/v2sandbox.dart
@@ -757,6 +757,67 @@
         .then((data) => new OrdersReturnLineItemResponse.fromJson(data));
   }
 
+  /// Sets (overrides) merchant provided annotations on the line item.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
+  ///
+  /// [orderId] - The ID of the order.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [OrdersSetLineItemMetadataResponse].
+  ///
+  /// Completes with a [commons.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<OrdersSetLineItemMetadataResponse> setlineitemmetadata(
+      OrdersSetLineItemMetadataRequest request,
+      core.String merchantId,
+      core.String orderId,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (merchantId == null) {
+      throw new core.ArgumentError("Parameter merchantId is required.");
+    }
+    if (orderId == null) {
+      throw new core.ArgumentError("Parameter orderId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = commons.Escaper.ecapeVariable('$merchantId') +
+        '/orders/' +
+        commons.Escaper.ecapeVariable('$orderId') +
+        '/setLineItemMetadata';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new OrdersSetLineItemMetadataResponse.fromJson(data));
+  }
+
   /// Marks line item(s) as shipped.
   ///
   /// [request] - The metadata request object.
@@ -818,6 +879,68 @@
         .then((data) => new OrdersShipLineItemsResponse.fromJson(data));
   }
 
+  /// Updates ship by and delivery by dates for a line item.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
+  ///
+  /// [orderId] - The ID of the order.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [OrdersUpdateLineItemShippingDetailsResponse].
+  ///
+  /// Completes with a [commons.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<OrdersUpdateLineItemShippingDetailsResponse>
+      updatelineitemshippingdetails(
+          OrdersUpdateLineItemShippingDetailsRequest request,
+          core.String merchantId,
+          core.String orderId,
+          {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (merchantId == null) {
+      throw new core.ArgumentError("Parameter merchantId is required.");
+    }
+    if (orderId == null) {
+      throw new core.ArgumentError("Parameter orderId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = commons.Escaper.ecapeVariable('$merchantId') +
+        '/orders/' +
+        commons.Escaper.ecapeVariable('$orderId') +
+        '/updateLineItemShippingDetails';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) =>
+        new OrdersUpdateLineItemShippingDetailsResponse.fromJson(data));
+  }
+
   /// Updates the merchant order ID for a given order.
   ///
   /// [request] - The metadata request object.
@@ -1456,6 +1579,9 @@
 }
 
 class OrderLineItem {
+  /// Annotations that are attached to the line item.
+  core.List<OrderMerchantProvidedAnnotation> annotations;
+
   /// Cancellations of the line item.
   core.List<OrderCancellation> cancellations;
 
@@ -1504,6 +1630,11 @@
   OrderLineItem();
 
   OrderLineItem.fromJson(core.Map _json) {
+    if (_json.containsKey("annotations")) {
+      annotations = _json["annotations"]
+          .map((value) => new OrderMerchantProvidedAnnotation.fromJson(value))
+          .toList();
+    }
     if (_json.containsKey("cancellations")) {
       cancellations = _json["cancellations"]
           .map((value) => new OrderCancellation.fromJson(value))
@@ -1556,6 +1687,10 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (annotations != null) {
+      _json["annotations"] =
+          annotations.map((value) => (value).toJson()).toList();
+    }
     if (cancellations != null) {
       _json["cancellations"] =
           cancellations.map((value) => (value).toJson()).toList();
@@ -1918,6 +2053,39 @@
   }
 }
 
+class OrderMerchantProvidedAnnotation {
+  /// Key for additional merchant provided (as key-value pairs) annotation about
+  /// the line item.
+  core.String key;
+
+  /// Value for additional merchant provided (as key-value pairs) annotation
+  /// about the line item.
+  core.String value;
+
+  OrderMerchantProvidedAnnotation();
+
+  OrderMerchantProvidedAnnotation.fromJson(core.Map _json) {
+    if (_json.containsKey("key")) {
+      key = _json["key"];
+    }
+    if (_json.containsKey("value")) {
+      value = _json["value"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (key != null) {
+      _json["key"] = key;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
 class OrderPaymentMethod {
   /// The billing address.
   OrderAddress billingAddress;
@@ -2799,9 +2967,16 @@
   /// Required for returnLineItem method.
   OrdersCustomBatchRequestEntryReturnLineItem returnLineItem;
 
+  /// Required for setLineItemMetadata method.
+  OrdersCustomBatchRequestEntrySetLineItemMetadata setLineItemMetadata;
+
   /// Required for shipLineItems method.
   OrdersCustomBatchRequestEntryShipLineItems shipLineItems;
 
+  /// Required for updateLineItemShippingDate method.
+  OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails
+      updateLineItemShippingDetails;
+
   /// Required for updateShipment method.
   OrdersCustomBatchRequestEntryUpdateShipment updateShipment;
 
@@ -2842,10 +3017,20 @@
       returnLineItem = new OrdersCustomBatchRequestEntryReturnLineItem.fromJson(
           _json["returnLineItem"]);
     }
+    if (_json.containsKey("setLineItemMetadata")) {
+      setLineItemMetadata =
+          new OrdersCustomBatchRequestEntrySetLineItemMetadata.fromJson(
+              _json["setLineItemMetadata"]);
+    }
     if (_json.containsKey("shipLineItems")) {
       shipLineItems = new OrdersCustomBatchRequestEntryShipLineItems.fromJson(
           _json["shipLineItems"]);
     }
+    if (_json.containsKey("updateLineItemShippingDetails")) {
+      updateLineItemShippingDetails =
+          new OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails
+              .fromJson(_json["updateLineItemShippingDetails"]);
+    }
     if (_json.containsKey("updateShipment")) {
       updateShipment = new OrdersCustomBatchRequestEntryUpdateShipment.fromJson(
           _json["updateShipment"]);
@@ -2885,9 +3070,16 @@
     if (returnLineItem != null) {
       _json["returnLineItem"] = (returnLineItem).toJson();
     }
+    if (setLineItemMetadata != null) {
+      _json["setLineItemMetadata"] = (setLineItemMetadata).toJson();
+    }
     if (shipLineItems != null) {
       _json["shipLineItems"] = (shipLineItems).toJson();
     }
+    if (updateLineItemShippingDetails != null) {
+      _json["updateLineItemShippingDetails"] =
+          (updateLineItemShippingDetails).toJson();
+    }
     if (updateShipment != null) {
       _json["updateShipment"] = (updateShipment).toJson();
     }
@@ -3136,6 +3328,50 @@
   }
 }
 
+class OrdersCustomBatchRequestEntrySetLineItemMetadata {
+  core.List<OrderMerchantProvidedAnnotation> annotations;
+
+  /// The ID of the line item to set metadata. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the product to set metadata. This is the REST ID used in the
+  /// products service. Either lineItemId or productId is required.
+  core.String productId;
+
+  OrdersCustomBatchRequestEntrySetLineItemMetadata();
+
+  OrdersCustomBatchRequestEntrySetLineItemMetadata.fromJson(core.Map _json) {
+    if (_json.containsKey("annotations")) {
+      annotations = _json["annotations"]
+          .map((value) => new OrderMerchantProvidedAnnotation.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (annotations != null) {
+      _json["annotations"] =
+          annotations.map((value) => (value).toJson()).toList();
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    return _json;
+  }
+}
+
 class OrdersCustomBatchRequestEntryShipLineItems {
   /// Deprecated. Please use shipmentInfo instead. The carrier handling the
   /// shipment. See shipments[].carrier in the  Orders resource representation
@@ -3248,6 +3484,60 @@
   }
 }
 
+class OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails {
+  /// Updated delivery by date, in ISO 8601 format. If not specified only ship
+  /// by date is updated.
+  core.String deliverByDate;
+
+  /// The ID of the line item to set metadata. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the product to set metadata. This is the REST ID used in the
+  /// products service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// Updated ship by date, in ISO 8601 format. If not specified only deliver by
+  /// date is updated.
+  core.String shipByDate;
+
+  OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails();
+
+  OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails.fromJson(
+      core.Map _json) {
+    if (_json.containsKey("deliverByDate")) {
+      deliverByDate = _json["deliverByDate"];
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("shipByDate")) {
+      shipByDate = _json["shipByDate"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (deliverByDate != null) {
+      _json["deliverByDate"] = deliverByDate;
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (shipByDate != null) {
+      _json["shipByDate"] = shipByDate;
+    }
+    return _json;
+  }
+}
+
 class OrdersCustomBatchRequestEntryUpdateShipment {
   /// The carrier handling the shipment. Not updated if missing. See
   /// shipments[].carrier in the  Orders resource representation for a list of
@@ -3699,6 +3989,91 @@
   }
 }
 
+class OrdersSetLineItemMetadataRequest {
+  core.List<OrderMerchantProvidedAnnotation> annotations;
+
+  /// The ID of the line item to set metadata. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the operation. Unique across all operations for a given order.
+  core.String operationId;
+
+  /// The ID of the product to set metadata. This is the REST ID used in the
+  /// products service. Either lineItemId or productId is required.
+  core.String productId;
+
+  OrdersSetLineItemMetadataRequest();
+
+  OrdersSetLineItemMetadataRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("annotations")) {
+      annotations = _json["annotations"]
+          .map((value) => new OrderMerchantProvidedAnnotation.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("operationId")) {
+      operationId = _json["operationId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (annotations != null) {
+      _json["annotations"] =
+          annotations.map((value) => (value).toJson()).toList();
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (operationId != null) {
+      _json["operationId"] = operationId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    return _json;
+  }
+}
+
+class OrdersSetLineItemMetadataResponse {
+  /// The status of the execution.
+  core.String executionStatus;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "content#ordersSetLineItemMetadataResponse".
+  core.String kind;
+
+  OrdersSetLineItemMetadataResponse();
+
+  OrdersSetLineItemMetadataResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("executionStatus")) {
+      executionStatus = _json["executionStatus"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (executionStatus != null) {
+      _json["executionStatus"] = executionStatus;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
 class OrdersShipLineItemsRequest {
   /// Deprecated. Please use shipmentInfo instead. The carrier handling the
   /// shipment. See shipments[].carrier in the  Orders resource representation
@@ -3810,6 +4185,100 @@
   }
 }
 
+class OrdersUpdateLineItemShippingDetailsRequest {
+  /// Updated delivery by date, in ISO 8601 format. If not specified only ship
+  /// by date is updated.
+  core.String deliverByDate;
+
+  /// The ID of the line item to set metadata. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the operation. Unique across all operations for a given order.
+  core.String operationId;
+
+  /// The ID of the product to set metadata. This is the REST ID used in the
+  /// products service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// Updated ship by date, in ISO 8601 format. If not specified only deliver by
+  /// date is updated.
+  core.String shipByDate;
+
+  OrdersUpdateLineItemShippingDetailsRequest();
+
+  OrdersUpdateLineItemShippingDetailsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("deliverByDate")) {
+      deliverByDate = _json["deliverByDate"];
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("operationId")) {
+      operationId = _json["operationId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("shipByDate")) {
+      shipByDate = _json["shipByDate"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (deliverByDate != null) {
+      _json["deliverByDate"] = deliverByDate;
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (operationId != null) {
+      _json["operationId"] = operationId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (shipByDate != null) {
+      _json["shipByDate"] = shipByDate;
+    }
+    return _json;
+  }
+}
+
+class OrdersUpdateLineItemShippingDetailsResponse {
+  /// The status of the execution.
+  core.String executionStatus;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "content#ordersUpdateLineItemShippingDetailsResponse".
+  core.String kind;
+
+  OrdersUpdateLineItemShippingDetailsResponse();
+
+  OrdersUpdateLineItemShippingDetailsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("executionStatus")) {
+      executionStatus = _json["executionStatus"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (executionStatus != null) {
+      _json["executionStatus"] = executionStatus;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
 class OrdersUpdateMerchantOrderIdRequest {
   /// The merchant order id to be assigned to the order. Must be unique per
   /// merchant.
diff --git a/generated/googleapis/lib/dataproc/v1.dart b/generated/googleapis/lib/dataproc/v1.dart
index 233666b..96f78f8 100644
--- a/generated/googleapis/lib/dataproc/v1.dart
+++ b/generated/googleapis/lib/dataproc/v1.dart
@@ -319,6 +319,8 @@
   /// [region] - Required. The Cloud Dataproc region in which to handle the
   /// request.
   ///
+  /// [pageToken] - Optional. The standard List page token.
+  ///
   /// [pageSize] - Optional. The standard List page size.
   ///
   /// [filter] - Optional. A filter constraining the clusters to list. Filters
@@ -333,8 +335,6 @@
   /// implicit AND operator.Example filter:status.state = ACTIVE AND clusterName
   /// = mycluster AND labels.env = staging AND labels.starred = *
   ///
-  /// [pageToken] - Optional. The standard List page token.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -347,9 +347,9 @@
   /// this method will complete with the same error.
   async.Future<ListClustersResponse> list(
       core.String projectId, core.String region,
-      {core.int pageSize,
+      {core.String pageToken,
+      core.int pageSize,
       core.String filter,
-      core.String pageToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -364,15 +364,15 @@
     if (region == null) {
       throw new core.ArgumentError("Parameter region is required.");
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
     if (filter != null) {
       _queryParams["filter"] = [filter];
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -406,6 +406,14 @@
   ///
   /// [clusterName] - Required. The cluster name.
   ///
+  /// [gracefulDecommissionTimeout] - Optional. Timeout for graceful YARN
+  /// decomissioning. Graceful decommissioning allows removing nodes from the
+  /// cluster without interrupting jobs in progress. Timeout specifies how long
+  /// to wait for jobs in progress to finish before forcefully removing nodes
+  /// (and potentially interrupting jobs). Default timeout is 0 (for forceful
+  /// decommission), and the maximum allowed timeout is 1 day.Only supported on
+  /// Dataproc image versions 1.2 and higher.
+  ///
   /// [updateMask] - Required. Specifies the path, relative to Cluster, of the
   /// field to update. For example, to change the number of workers in a cluster
   /// to 5, the update_mask parameter would be specified as
@@ -451,7 +459,9 @@
   /// this method will complete with the same error.
   async.Future<Operation> patch(Cluster request, core.String projectId,
       core.String region, core.String clusterName,
-      {core.String updateMask, core.String $fields}) {
+      {core.String gracefulDecommissionTimeout,
+      core.String updateMask,
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -471,6 +481,11 @@
     if (clusterName == null) {
       throw new core.ArgumentError("Parameter clusterName is required.");
     }
+    if (gracefulDecommissionTimeout != null) {
+      _queryParams["gracefulDecommissionTimeout"] = [
+        gracefulDecommissionTimeout
+      ];
+    }
     if (updateMask != null) {
       _queryParams["updateMask"] = [updateMask];
     }
@@ -2396,8 +2411,7 @@
   }
 }
 
-/// Job scheduling options.Beta Feature: These options are available for testing
-/// purposes only. They may be changed before final release.
+/// Job scheduling options.
 class JobScheduling {
   /// Optional. Maximum number of times per hour a driver may be restarted as a
   /// result of driver terminating with non-zero code before job is reported
diff --git a/generated/googleapis/lib/deploymentmanager/v2.dart b/generated/googleapis/lib/deploymentmanager/v2.dart
index 737d015..544efd1 100644
--- a/generated/googleapis/lib/deploymentmanager/v2.dart
+++ b/generated/googleapis/lib/deploymentmanager/v2.dart
@@ -2639,7 +2639,11 @@
   }
 }
 
-/// An Operation resource, used to manage asynchronous API requests.
+/// An Operation resource, used to manage asynchronous API requests. (==
+/// resource_for v1.globalOperations ==) (== resource_for beta.globalOperations
+/// ==) (== resource_for v1.regionOperations ==) (== resource_for
+/// beta.regionOperations ==) (== resource_for v1.zoneOperations ==) (==
+/// resource_for beta.zoneOperations ==)
 class Operation {
   /// [Output Only] Reserved for future use.
   core.String clientOperationId;
diff --git a/generated/googleapis/lib/digitalassetlinks/v1.dart b/generated/googleapis/lib/digitalassetlinks/v1.dart
new file mode 100644
index 0000000..e9a60f2
--- /dev/null
+++ b/generated/googleapis/lib/digitalassetlinks/v1.dart
@@ -0,0 +1,823 @@
+// This is a generated file (see the discoveryapis_generator project).
+
+library googleapis.digitalassetlinks.v1;
+
+import 'dart:core' as core;
+import 'dart:async' as async;
+import 'dart:convert' as convert;
+
+import 'package:_discoveryapis_commons/_discoveryapis_commons.dart' as commons;
+import 'package:http/http.dart' as http;
+
+export 'package:_discoveryapis_commons/_discoveryapis_commons.dart'
+    show ApiRequestError, DetailedApiRequestError;
+
+const core.String USER_AGENT = 'dart-api-client digitalassetlinks/v1';
+
+/// API for discovering relationships between online assets such as web sites or
+/// mobile apps.
+class DigitalassetlinksApi {
+  final commons.ApiRequester _requester;
+
+  AssetlinksResourceApi get assetlinks => new AssetlinksResourceApi(_requester);
+  StatementsResourceApi get statements => new StatementsResourceApi(_requester);
+
+  DigitalassetlinksApi(http.Client client,
+      {core.String rootUrl: "https://digitalassetlinks.googleapis.com/",
+      core.String servicePath: ""})
+      : _requester =
+            new commons.ApiRequester(client, rootUrl, servicePath, USER_AGENT);
+}
+
+class AssetlinksResourceApi {
+  final commons.ApiRequester _requester;
+
+  AssetlinksResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Determines whether the specified (directional) relationship exists between
+  /// the specified source and target assets.
+  ///
+  /// The relation describes the intent of the link between the two assets as
+  /// claimed by the source asset.  An example for such relationships is the
+  /// delegation of privileges or permissions.
+  ///
+  /// This command is most often used by infrastructure systems to check
+  /// preconditions for an action.  For example, a client may want to know if it
+  /// is OK to send a web URL to a particular mobile app instead. The client can
+  /// check for the relevant asset link from the website to the mobile app to
+  /// decide if the operation should be allowed.
+  ///
+  /// A note about security: if you specify a secure asset as the source, such
+  /// as
+  /// an HTTPS website or an Android app, the API will ensure that any
+  /// statements used to generate the response have been made in a secure way by
+  /// the owner of that asset.  Conversely, if the source asset is an insecure
+  /// HTTP website (that is, the URL starts with `http://` instead of
+  /// `https://`),
+  /// the API cannot verify its statements securely, and it is not possible to
+  /// ensure that the website's statements have not been altered by a third
+  /// party.  For more information, see the [Digital Asset Links technical
+  /// design
+  /// specification](https://github.com/google/digitalassetlinks/blob/master/well-known/details.md).
+  ///
+  /// Request parameters:
+  ///
+  /// [target_androidApp_packageName] - Android App assets are naturally
+  /// identified by their Java package name.
+  /// For example, the Google Maps app uses the package name
+  /// `com.google.android.apps.maps`.
+  /// REQUIRED
+  ///
+  /// [source_androidApp_certificate_sha256Fingerprint] - The uppercase SHA-265
+  /// fingerprint of the certificate.  From the PEM
+  ///  certificate, it can be acquired like this:
+  ///
+  ///     $ keytool -printcert -file $CERTFILE | grep SHA256:
+  ///     SHA256: 14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83: \
+  ///         42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5
+  ///
+  /// or like this:
+  ///
+  ///     $ openssl x509 -in $CERTFILE -noout -fingerprint -sha256
+  ///     SHA256 Fingerprint=14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64: \
+  ///         16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5
+  ///
+  /// In this example, the contents of this field would be `14:6D:E9:83:C5:73:
+  /// 06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:
+  /// 44:E5`.
+  ///
+  /// If these tools are not available to you, you can convert the PEM
+  /// certificate into the DER format, compute the SHA-256 hash of that string
+  /// and represent the result as a hexstring (that is, uppercase hexadecimal
+  /// representations of each octet, separated by colons).
+  ///
+  /// [relation] - Query string for the relation.
+  ///
+  /// We identify relations with strings of the format `<kind>/<detail>`, where
+  /// `<kind>` must be one of a set of pre-defined purpose categories, and
+  /// `<detail>` is a free-form lowercase alphanumeric string that describes the
+  /// specific use case of the statement.
+  ///
+  /// Refer to [our API documentation](/digital-asset-links/v1/relation-strings)
+  /// for the current list of supported relations.
+  ///
+  /// For a query to match an asset link, both the query's and the asset link's
+  /// relation strings must match exactly.
+  ///
+  /// Example: A query with relation
+  /// `delegate_permission/common.handle_all_urls`
+  /// matches an asset link with relation
+  /// `delegate_permission/common.handle_all_urls`.
+  ///
+  /// [target_web_site] - Web assets are identified by a URL that contains only
+  /// the scheme, hostname
+  /// and port parts.  The format is
+  ///
+  ///     http[s]://<hostname>[:<port>]
+  ///
+  /// Hostnames must be fully qualified: they must end in a single period
+  /// ("`.`").
+  ///
+  /// Only the schemes "http" and "https" are currently allowed.
+  ///
+  /// Port numbers are given as a decimal number, and they must be omitted if
+  /// the
+  /// standard port numbers are used: 80 for http and 443 for https.
+  ///
+  /// We call this limited URL the "site".  All URLs that share the same scheme,
+  /// hostname and port are considered to be a part of the site and thus belong
+  /// to the web asset.
+  ///
+  /// Example: the asset with the site `https://www.google.com` contains all
+  /// these URLs:
+  ///
+  ///   *   `https://www.google.com/`
+  ///   *   `https://www.google.com:443/`
+  ///   *   `https://www.google.com/foo`
+  ///   *   `https://www.google.com/foo?bar`
+  ///   *   `https://www.google.com/foo#bar`
+  ///   *   `https://user@password:www.google.com/`
+  ///
+  /// But it does not contain these URLs:
+  ///
+  ///   *   `http://www.google.com/`       (wrong scheme)
+  ///   *   `https://google.com/`          (hostname does not match)
+  ///   *   `https://www.google.com:444/`  (port does not match)
+  /// REQUIRED
+  ///
+  /// [target_androidApp_certificate_sha256Fingerprint] - The uppercase SHA-265
+  /// fingerprint of the certificate.  From the PEM
+  ///  certificate, it can be acquired like this:
+  ///
+  ///     $ keytool -printcert -file $CERTFILE | grep SHA256:
+  ///     SHA256: 14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83: \
+  ///         42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5
+  ///
+  /// or like this:
+  ///
+  ///     $ openssl x509 -in $CERTFILE -noout -fingerprint -sha256
+  ///     SHA256 Fingerprint=14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64: \
+  ///         16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5
+  ///
+  /// In this example, the contents of this field would be `14:6D:E9:83:C5:73:
+  /// 06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:
+  /// 44:E5`.
+  ///
+  /// If these tools are not available to you, you can convert the PEM
+  /// certificate into the DER format, compute the SHA-256 hash of that string
+  /// and represent the result as a hexstring (that is, uppercase hexadecimal
+  /// representations of each octet, separated by colons).
+  ///
+  /// [source_web_site] - Web assets are identified by a URL that contains only
+  /// the scheme, hostname
+  /// and port parts.  The format is
+  ///
+  ///     http[s]://<hostname>[:<port>]
+  ///
+  /// Hostnames must be fully qualified: they must end in a single period
+  /// ("`.`").
+  ///
+  /// Only the schemes "http" and "https" are currently allowed.
+  ///
+  /// Port numbers are given as a decimal number, and they must be omitted if
+  /// the
+  /// standard port numbers are used: 80 for http and 443 for https.
+  ///
+  /// We call this limited URL the "site".  All URLs that share the same scheme,
+  /// hostname and port are considered to be a part of the site and thus belong
+  /// to the web asset.
+  ///
+  /// Example: the asset with the site `https://www.google.com` contains all
+  /// these URLs:
+  ///
+  ///   *   `https://www.google.com/`
+  ///   *   `https://www.google.com:443/`
+  ///   *   `https://www.google.com/foo`
+  ///   *   `https://www.google.com/foo?bar`
+  ///   *   `https://www.google.com/foo#bar`
+  ///   *   `https://user@password:www.google.com/`
+  ///
+  /// But it does not contain these URLs:
+  ///
+  ///   *   `http://www.google.com/`       (wrong scheme)
+  ///   *   `https://google.com/`          (hostname does not match)
+  ///   *   `https://www.google.com:444/`  (port does not match)
+  /// REQUIRED
+  ///
+  /// [source_androidApp_packageName] - Android App assets are naturally
+  /// identified by their Java package name.
+  /// For example, the Google Maps app uses the package name
+  /// `com.google.android.apps.maps`.
+  /// REQUIRED
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CheckResponse].
+  ///
+  /// Completes with a [commons.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<CheckResponse> check(
+      {core.String target_androidApp_packageName,
+      core.String source_androidApp_certificate_sha256Fingerprint,
+      core.String relation,
+      core.String target_web_site,
+      core.String target_androidApp_certificate_sha256Fingerprint,
+      core.String source_web_site,
+      core.String source_androidApp_packageName,
+      core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (target_androidApp_packageName != null) {
+      _queryParams["target.androidApp.packageName"] = [
+        target_androidApp_packageName
+      ];
+    }
+    if (source_androidApp_certificate_sha256Fingerprint != null) {
+      _queryParams["source.androidApp.certificate.sha256Fingerprint"] = [
+        source_androidApp_certificate_sha256Fingerprint
+      ];
+    }
+    if (relation != null) {
+      _queryParams["relation"] = [relation];
+    }
+    if (target_web_site != null) {
+      _queryParams["target.web.site"] = [target_web_site];
+    }
+    if (target_androidApp_certificate_sha256Fingerprint != null) {
+      _queryParams["target.androidApp.certificate.sha256Fingerprint"] = [
+        target_androidApp_certificate_sha256Fingerprint
+      ];
+    }
+    if (source_web_site != null) {
+      _queryParams["source.web.site"] = [source_web_site];
+    }
+    if (source_androidApp_packageName != null) {
+      _queryParams["source.androidApp.packageName"] = [
+        source_androidApp_packageName
+      ];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/assetlinks:check';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CheckResponse.fromJson(data));
+  }
+}
+
+class StatementsResourceApi {
+  final commons.ApiRequester _requester;
+
+  StatementsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Retrieves a list of all statements from a given source that match the
+  /// specified target and statement string.
+  ///
+  /// The API guarantees that all statements with secure source assets, such as
+  /// HTTPS websites or Android apps, have been made in a secure way by the
+  /// owner
+  /// of those assets, as described in the [Digital Asset Links technical design
+  /// specification](https://github.com/google/digitalassetlinks/blob/master/well-known/details.md).
+  /// Specifically, you should consider that for insecure websites (that is,
+  /// where the URL starts with `http://` instead of `https://`), this guarantee
+  /// cannot be made.
+  ///
+  /// The `List` command is most useful in cases where the API client wants to
+  /// know all the ways in which two assets are related, or enumerate all the
+  /// relationships from a particular source asset.  Example: a feature that
+  /// helps users navigate to related items.  When a mobile app is running on a
+  /// device, the feature would make it easy to navigate to the corresponding
+  /// web
+  /// site or Google+ profile.
+  ///
+  /// Request parameters:
+  ///
+  /// [source_androidApp_certificate_sha256Fingerprint] - The uppercase SHA-265
+  /// fingerprint of the certificate.  From the PEM
+  ///  certificate, it can be acquired like this:
+  ///
+  ///     $ keytool -printcert -file $CERTFILE | grep SHA256:
+  ///     SHA256: 14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83: \
+  ///         42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5
+  ///
+  /// or like this:
+  ///
+  ///     $ openssl x509 -in $CERTFILE -noout -fingerprint -sha256
+  ///     SHA256 Fingerprint=14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64: \
+  ///         16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5
+  ///
+  /// In this example, the contents of this field would be `14:6D:E9:83:C5:73:
+  /// 06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:
+  /// 44:E5`.
+  ///
+  /// If these tools are not available to you, you can convert the PEM
+  /// certificate into the DER format, compute the SHA-256 hash of that string
+  /// and represent the result as a hexstring (that is, uppercase hexadecimal
+  /// representations of each octet, separated by colons).
+  ///
+  /// [relation] - Use only associations that match the specified relation.
+  ///
+  /// See the [`Statement`](#Statement) message for a detailed definition of
+  /// relation strings.
+  ///
+  /// For a query to match a statement, one of the following must be true:
+  ///
+  /// *    both the query's and the statement's relation strings match exactly,
+  ///      or
+  /// *    the query's relation string is empty or missing.
+  ///
+  /// Example: A query with relation
+  /// `delegate_permission/common.handle_all_urls`
+  /// matches an asset link with relation
+  /// `delegate_permission/common.handle_all_urls`.
+  ///
+  /// [source_web_site] - Web assets are identified by a URL that contains only
+  /// the scheme, hostname
+  /// and port parts.  The format is
+  ///
+  ///     http[s]://<hostname>[:<port>]
+  ///
+  /// Hostnames must be fully qualified: they must end in a single period
+  /// ("`.`").
+  ///
+  /// Only the schemes "http" and "https" are currently allowed.
+  ///
+  /// Port numbers are given as a decimal number, and they must be omitted if
+  /// the
+  /// standard port numbers are used: 80 for http and 443 for https.
+  ///
+  /// We call this limited URL the "site".  All URLs that share the same scheme,
+  /// hostname and port are considered to be a part of the site and thus belong
+  /// to the web asset.
+  ///
+  /// Example: the asset with the site `https://www.google.com` contains all
+  /// these URLs:
+  ///
+  ///   *   `https://www.google.com/`
+  ///   *   `https://www.google.com:443/`
+  ///   *   `https://www.google.com/foo`
+  ///   *   `https://www.google.com/foo?bar`
+  ///   *   `https://www.google.com/foo#bar`
+  ///   *   `https://user@password:www.google.com/`
+  ///
+  /// But it does not contain these URLs:
+  ///
+  ///   *   `http://www.google.com/`       (wrong scheme)
+  ///   *   `https://google.com/`          (hostname does not match)
+  ///   *   `https://www.google.com:444/`  (port does not match)
+  /// REQUIRED
+  ///
+  /// [source_androidApp_packageName] - Android App assets are naturally
+  /// identified by their Java package name.
+  /// For example, the Google Maps app uses the package name
+  /// `com.google.android.apps.maps`.
+  /// REQUIRED
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListResponse].
+  ///
+  /// Completes with a [commons.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<ListResponse> list(
+      {core.String source_androidApp_certificate_sha256Fingerprint,
+      core.String relation,
+      core.String source_web_site,
+      core.String source_androidApp_packageName,
+      core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (source_androidApp_certificate_sha256Fingerprint != null) {
+      _queryParams["source.androidApp.certificate.sha256Fingerprint"] = [
+        source_androidApp_certificate_sha256Fingerprint
+      ];
+    }
+    if (relation != null) {
+      _queryParams["relation"] = [relation];
+    }
+    if (source_web_site != null) {
+      _queryParams["source.web.site"] = [source_web_site];
+    }
+    if (source_androidApp_packageName != null) {
+      _queryParams["source.androidApp.packageName"] = [
+        source_androidApp_packageName
+      ];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/statements:list';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListResponse.fromJson(data));
+  }
+}
+
+/// Describes an android app asset.
+class AndroidAppAsset {
+  /// Because there is no global enforcement of package name uniqueness, we also
+  /// require a signing certificate, which in combination with the package name
+  /// uniquely identifies an app.
+  ///
+  /// Some apps' signing keys are rotated, so they may be signed by different
+  /// keys over time.  We treat these as distinct assets, since we use (package
+  /// name, cert) as the unique ID.  This should not normally pose any problems
+  /// as both versions of the app will make the same or similar statements.
+  /// Other assets making statements about the app will have to be updated when
+  /// a
+  /// key is rotated, however.
+  ///
+  /// (Note that the syntaxes for publishing and querying for statements contain
+  /// syntactic sugar to easily let you specify apps that are known by multiple
+  /// certificates.)
+  /// REQUIRED
+  CertificateInfo certificate;
+
+  /// Android App assets are naturally identified by their Java package name.
+  /// For example, the Google Maps app uses the package name
+  /// `com.google.android.apps.maps`.
+  /// REQUIRED
+  core.String packageName;
+
+  AndroidAppAsset();
+
+  AndroidAppAsset.fromJson(core.Map _json) {
+    if (_json.containsKey("certificate")) {
+      certificate = new CertificateInfo.fromJson(_json["certificate"]);
+    }
+    if (_json.containsKey("packageName")) {
+      packageName = _json["packageName"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (certificate != null) {
+      _json["certificate"] = (certificate).toJson();
+    }
+    if (packageName != null) {
+      _json["packageName"] = packageName;
+    }
+    return _json;
+  }
+}
+
+/// Uniquely identifies an asset.
+///
+/// A digital asset is an identifiable and addressable online entity that
+/// typically provides some service or content.  Examples of assets are
+/// websites,
+/// Android apps, Twitter feeds, and Plus Pages.
+class Asset {
+  /// Set if this is an Android App asset.
+  AndroidAppAsset androidApp;
+
+  /// Set if this is a web asset.
+  WebAsset web;
+
+  Asset();
+
+  Asset.fromJson(core.Map _json) {
+    if (_json.containsKey("androidApp")) {
+      androidApp = new AndroidAppAsset.fromJson(_json["androidApp"]);
+    }
+    if (_json.containsKey("web")) {
+      web = new WebAsset.fromJson(_json["web"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (androidApp != null) {
+      _json["androidApp"] = (androidApp).toJson();
+    }
+    if (web != null) {
+      _json["web"] = (web).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Describes an X509 certificate.
+class CertificateInfo {
+  /// The uppercase SHA-265 fingerprint of the certificate.  From the PEM
+  ///  certificate, it can be acquired like this:
+  ///
+  ///     $ keytool -printcert -file $CERTFILE | grep SHA256:
+  ///     SHA256: 14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83: \
+  ///         42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5
+  ///
+  /// or like this:
+  ///
+  ///     $ openssl x509 -in $CERTFILE -noout -fingerprint -sha256
+  ///     SHA256 Fingerprint=14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64: \
+  ///         16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5
+  ///
+  /// In this example, the contents of this field would be `14:6D:E9:83:C5:73:
+  /// 06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:
+  /// 44:E5`.
+  ///
+  /// If these tools are not available to you, you can convert the PEM
+  /// certificate into the DER format, compute the SHA-256 hash of that string
+  /// and represent the result as a hexstring (that is, uppercase hexadecimal
+  /// representations of each octet, separated by colons).
+  core.String sha256Fingerprint;
+
+  CertificateInfo();
+
+  CertificateInfo.fromJson(core.Map _json) {
+    if (_json.containsKey("sha256Fingerprint")) {
+      sha256Fingerprint = _json["sha256Fingerprint"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (sha256Fingerprint != null) {
+      _json["sha256Fingerprint"] = sha256Fingerprint;
+    }
+    return _json;
+  }
+}
+
+/// Response message for the CheckAssetLinks call.
+class CheckResponse {
+  /// Human-readable message containing information intended to help end users
+  /// understand, reproduce and debug the result.
+  ///
+  ///
+  /// The message will be in English and we are currently not planning to offer
+  /// any translations.
+  ///
+  /// Please note that no guarantees are made about the contents or format of
+  /// this string.  Any aspect of it may be subject to change without notice.
+  /// You should not attempt to programmatically parse this data.  For
+  /// programmatic access, use the error_code field below.
+  core.String debugString;
+
+  /// Error codes that describe the result of the Check operation.
+  core.List<core.String> errorCode;
+
+  /// Set to true if the assets specified in the request are linked by the
+  /// relation specified in the request.
+  core.bool linked;
+
+  /// From serving time, how much longer the response should be considered valid
+  /// barring further updates.
+  /// REQUIRED
+  core.String maxAge;
+
+  CheckResponse();
+
+  CheckResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("debugString")) {
+      debugString = _json["debugString"];
+    }
+    if (_json.containsKey("errorCode")) {
+      errorCode = _json["errorCode"];
+    }
+    if (_json.containsKey("linked")) {
+      linked = _json["linked"];
+    }
+    if (_json.containsKey("maxAge")) {
+      maxAge = _json["maxAge"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (debugString != null) {
+      _json["debugString"] = debugString;
+    }
+    if (errorCode != null) {
+      _json["errorCode"] = errorCode;
+    }
+    if (linked != null) {
+      _json["linked"] = linked;
+    }
+    if (maxAge != null) {
+      _json["maxAge"] = maxAge;
+    }
+    return _json;
+  }
+}
+
+/// Response message for the List call.
+class ListResponse {
+  /// Human-readable message containing information intended to help end users
+  /// understand, reproduce and debug the result.
+  ///
+  ///
+  /// The message will be in English and we are currently not planning to offer
+  /// any translations.
+  ///
+  /// Please note that no guarantees are made about the contents or format of
+  /// this string.  Any aspect of it may be subject to change without notice.
+  /// You should not attempt to programmatically parse this data.  For
+  /// programmatic access, use the error_code field below.
+  core.String debugString;
+
+  /// Error codes that describe the result of the List operation.
+  core.List<core.String> errorCode;
+
+  /// From serving time, how much longer the response should be considered valid
+  /// barring further updates.
+  /// REQUIRED
+  core.String maxAge;
+
+  /// A list of all the matching statements that have been found.
+  core.List<Statement> statements;
+
+  ListResponse();
+
+  ListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("debugString")) {
+      debugString = _json["debugString"];
+    }
+    if (_json.containsKey("errorCode")) {
+      errorCode = _json["errorCode"];
+    }
+    if (_json.containsKey("maxAge")) {
+      maxAge = _json["maxAge"];
+    }
+    if (_json.containsKey("statements")) {
+      statements = _json["statements"]
+          .map((value) => new Statement.fromJson(value))
+          .toList();
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (debugString != null) {
+      _json["debugString"] = debugString;
+    }
+    if (errorCode != null) {
+      _json["errorCode"] = errorCode;
+    }
+    if (maxAge != null) {
+      _json["maxAge"] = maxAge;
+    }
+    if (statements != null) {
+      _json["statements"] =
+          statements.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Describes a reliable statement that has been made about the relationship
+/// between a source asset and a target asset.
+///
+/// Statements are always made by the source asset, either directly or by
+/// delegating to a statement list that is stored elsewhere.
+///
+/// For more detailed definitions of statements and assets, please refer
+/// to our [API documentation landing
+/// page](/digital-asset-links/v1/getting-started).
+class Statement {
+  /// The relation identifies the use of the statement as intended by the source
+  /// asset's owner (that is, the person or entity who issued the statement).
+  /// Every complete statement has a relation.
+  ///
+  /// We identify relations with strings of the format `<kind>/<detail>`, where
+  /// `<kind>` must be one of a set of pre-defined purpose categories, and
+  /// `<detail>` is a free-form lowercase alphanumeric string that describes the
+  /// specific use case of the statement.
+  ///
+  /// Refer to [our API documentation](/digital-asset-links/v1/relation-strings)
+  /// for the current list of supported relations.
+  ///
+  /// Example: `delegate_permission/common.handle_all_urls`
+  /// REQUIRED
+  core.String relation;
+
+  /// Every statement has a source asset.
+  /// REQUIRED
+  Asset source;
+
+  /// Every statement has a target asset.
+  /// REQUIRED
+  Asset target;
+
+  Statement();
+
+  Statement.fromJson(core.Map _json) {
+    if (_json.containsKey("relation")) {
+      relation = _json["relation"];
+    }
+    if (_json.containsKey("source")) {
+      source = new Asset.fromJson(_json["source"]);
+    }
+    if (_json.containsKey("target")) {
+      target = new Asset.fromJson(_json["target"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (relation != null) {
+      _json["relation"] = relation;
+    }
+    if (source != null) {
+      _json["source"] = (source).toJson();
+    }
+    if (target != null) {
+      _json["target"] = (target).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Describes a web asset.
+class WebAsset {
+  /// Web assets are identified by a URL that contains only the scheme, hostname
+  /// and port parts.  The format is
+  ///
+  ///     http[s]://<hostname>[:<port>]
+  ///
+  /// Hostnames must be fully qualified: they must end in a single period
+  /// ("`.`").
+  ///
+  /// Only the schemes "http" and "https" are currently allowed.
+  ///
+  /// Port numbers are given as a decimal number, and they must be omitted if
+  /// the
+  /// standard port numbers are used: 80 for http and 443 for https.
+  ///
+  /// We call this limited URL the "site".  All URLs that share the same scheme,
+  /// hostname and port are considered to be a part of the site and thus belong
+  /// to the web asset.
+  ///
+  /// Example: the asset with the site `https://www.google.com` contains all
+  /// these URLs:
+  ///
+  ///   *   `https://www.google.com/`
+  ///   *   `https://www.google.com:443/`
+  ///   *   `https://www.google.com/foo`
+  ///   *   `https://www.google.com/foo?bar`
+  ///   *   `https://www.google.com/foo#bar`
+  ///   *   `https://user@password:www.google.com/`
+  ///
+  /// But it does not contain these URLs:
+  ///
+  ///   *   `http://www.google.com/`       (wrong scheme)
+  ///   *   `https://google.com/`          (hostname does not match)
+  ///   *   `https://www.google.com:444/`  (port does not match)
+  /// REQUIRED
+  core.String site;
+
+  WebAsset();
+
+  WebAsset.fromJson(core.Map _json) {
+    if (_json.containsKey("site")) {
+      site = _json["site"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (site != null) {
+      _json["site"] = site;
+    }
+    return _json;
+  }
+}
diff --git a/generated/googleapis/lib/drive/v2.dart b/generated/googleapis/lib/drive/v2.dart
index 20457ec..596e9af 100644
--- a/generated/googleapis/lib/drive/v2.dart
+++ b/generated/googleapis/lib/drive/v2.dart
@@ -94,10 +94,10 @@
   ///
   /// Request parameters:
   ///
-  /// [includeSubscribed] - When calculating the number of remaining change IDs,
-  /// whether to include public files the user has opened and shared files. When
-  /// set to false, this counts only change IDs for owned files and any shared
-  /// or public files that the user has explicitly added to a folder they own.
+  /// [includeSubscribed] - Whether to count changes outside the My Drive
+  /// hierarchy. When set to false, changes to files such as those in the
+  /// Application Data folder or shared files which have not been added to My
+  /// Drive will be omitted from the maxChangeIdCount.
   ///
   /// [maxChangeIdCount] - Maximum number of remaining change IDs to count
   ///
@@ -270,7 +270,8 @@
 
   ChangesResourceApi(commons.ApiRequester client) : _requester = client;
 
-  /// Gets a specific change.
+  /// Deprecated - Use changes.getStartPageToken and changes.list to retrieve
+  /// recent changes.
   ///
   /// Request parameters:
   ///
@@ -391,10 +392,10 @@
   /// been removed from the list of changes, for example by deletion or loss of
   /// access.
   ///
-  /// [includeSubscribed] - Whether to include public files the user has opened
-  /// and shared files. When set to false, the list only includes owned files
-  /// plus any shared or public files the user has explicitly added to a folder
-  /// they own.
+  /// [includeSubscribed] - Whether to include changes outside the My Drive
+  /// hierarchy in the result. When set to false, changes to files such as those
+  /// in the Application Data folder or shared files which have not been added
+  /// to My Drive will be omitted from the result.
   ///
   /// [includeTeamDriveItems] - Whether Team Drive files or changes should be
   /// included in results.
@@ -408,7 +409,7 @@
   /// [spaces] - A comma-separated list of spaces to query. Supported values are
   /// 'drive', 'appDataFolder' and 'photos'.
   ///
-  /// [startChangeId] - Change ID to start listing changes from.
+  /// [startChangeId] - Deprecated - use pageToken instead.
   ///
   /// [supportsTeamDrives] - Whether the requesting application supports Team
   /// Drives.
@@ -506,10 +507,10 @@
   /// been removed from the list of changes, for example by deletion or loss of
   /// access.
   ///
-  /// [includeSubscribed] - Whether to include public files the user has opened
-  /// and shared files. When set to false, the list only includes owned files
-  /// plus any shared or public files the user has explicitly added to a folder
-  /// they own.
+  /// [includeSubscribed] - Whether to include changes outside the My Drive
+  /// hierarchy in the result. When set to false, changes to files such as those
+  /// in the Application Data folder or shared files which have not been added
+  /// to My Drive will be omitted from the result.
   ///
   /// [includeTeamDriveItems] - Whether Team Drive files or changes should be
   /// included in results.
@@ -523,7 +524,7 @@
   /// [spaces] - A comma-separated list of spaces to query. Supported values are
   /// 'drive', 'appDataFolder' and 'photos'.
   ///
-  /// [startChangeId] - Change ID to start listing changes from.
+  /// [startChangeId] - Deprecated - use pageToken instead.
   ///
   /// [supportsTeamDrives] - Whether the requesting application supports Team
   /// Drives.
@@ -1949,8 +1950,11 @@
   ///
   /// [removeParents] - Comma-separated list of parent IDs to remove.
   ///
-  /// [setModifiedDate] - Whether to set the modified date with the supplied
-  /// modified date.
+  /// [setModifiedDate] - Whether to set the modified date using the value
+  /// supplied in the request body. Setting this field to true is equivalent to
+  /// modifiedDateBehavior=fromBodyOrNow, and false is equivalent to
+  /// modifiedDateBehavior=now. To prevent any changes to the modified date set
+  /// modifiedDateBehavior=noChange.
   ///
   /// [supportsTeamDrives] - Whether the requesting application supports Team
   /// Drives.
@@ -2255,8 +2259,11 @@
   ///
   /// [removeParents] - Comma-separated list of parent IDs to remove.
   ///
-  /// [setModifiedDate] - Whether to set the modified date with the supplied
-  /// modified date.
+  /// [setModifiedDate] - Whether to set the modified date using the value
+  /// supplied in the request body. Setting this field to true is equivalent to
+  /// modifiedDateBehavior=fromBodyOrNow, and false is equivalent to
+  /// modifiedDateBehavior=now. To prevent any changes to the modified date set
+  /// modifiedDateBehavior=noChange.
   ///
   /// [supportsTeamDrives] - Whether the requesting application supports Team
   /// Drives.
@@ -2887,7 +2894,8 @@
   ///
   /// [fileId] - The ID for the file or Team Drive.
   ///
-  /// [emailMessage] - A custom message to include in notification emails.
+  /// [emailMessage] - A plain text custom message to include in notification
+  /// emails.
   ///
   /// [sendNotificationEmails] - Whether to send notification emails when
   /// sharing to users or groups. This parameter is ignored and an email is sent
diff --git a/generated/googleapis/lib/drive/v3.dart b/generated/googleapis/lib/drive/v3.dart
index 5c253bc..3a9e773 100644
--- a/generated/googleapis/lib/drive/v3.dart
+++ b/generated/googleapis/lib/drive/v3.dart
@@ -1525,7 +1525,8 @@
   ///
   /// [fileId] - The ID of the file or Team Drive.
   ///
-  /// [emailMessage] - A custom message to include in the notification email.
+  /// [emailMessage] - A plain text custom message to include in the
+  /// notification email.
   ///
   /// [sendNotificationEmail] - Whether to send a notification email when
   /// sharing to users or groups. This defaults to true for users and groups,
diff --git a/generated/googleapis/lib/firebaserules/v1.dart b/generated/googleapis/lib/firebaserules/v1.dart
index d27ad80..e7ccf5b 100644
--- a/generated/googleapis/lib/firebaserules/v1.dart
+++ b/generated/googleapis/lib/firebaserules/v1.dart
@@ -367,6 +367,8 @@
   /// Format: `projects/{project_id}`
   /// Value must have pattern "^projects/[^/]+$".
   ///
+  /// [pageToken] - Next page token for the next batch of `Release` instances.
+  ///
   /// [pageSize] - Page size to load. Maximum of 100. Defaults to 10.
   /// Note: `page_size` is just a hint and the service may choose to load fewer
   /// than `page_size` results due to the size of the output. To traverse all of
@@ -400,8 +402,6 @@
   /// relative to the project. Fully qualified prefixed may also be used. e.g.
   /// `test_suite_name=projects/foo/testsuites/uuid1`
   ///
-  /// [pageToken] - Next page token for the next batch of `Release` instances.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -413,9 +413,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListReleasesResponse> list(core.String name,
-      {core.int pageSize,
+      {core.String pageToken,
+      core.int pageSize,
       core.String filter,
-      core.String pageToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -427,15 +427,15 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
     if (filter != null) {
       _queryParams["filter"] = [filter];
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/genomics/v1.dart b/generated/googleapis/lib/genomics/v1.dart
index 992eb53..95a1dbe 100644
--- a/generated/googleapis/lib/genomics/v1.dart
+++ b/generated/googleapis/lib/genomics/v1.dart
@@ -1122,17 +1122,17 @@
   ///
   /// Request parameters:
   ///
+  /// [pageToken] - The continuation token, which is used to page through large
+  /// result sets.
+  /// To get the next page of results, set this parameter to the value of
+  /// `nextPageToken` from the previous response.
+  ///
   /// [pageSize] - The maximum number of results to return in a single page. If
   /// unspecified,
   /// defaults to 50. The maximum value is 1024.
   ///
   /// [projectId] - Required. The Google Cloud project ID to list datasets for.
   ///
-  /// [pageToken] - The continuation token, which is used to page through large
-  /// result sets.
-  /// To get the next page of results, set this parameter to the value of
-  /// `nextPageToken` from the previous response.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1144,9 +1144,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListDatasetsResponse> list(
-      {core.int pageSize,
+      {core.String pageToken,
+      core.int pageSize,
       core.String projectId,
-      core.String pageToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1155,15 +1155,15 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
     if (projectId != null) {
       _queryParams["projectId"] = [projectId];
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1533,10 +1533,6 @@
   /// [name] - The name of the operation's parent resource.
   /// Value must have pattern "^operations$".
   ///
-  /// [pageSize] - The maximum number of results to return. If unspecified,
-  /// defaults to
-  /// 256. The maximum value is 2048.
-  ///
   /// [filter] - A string for filtering Operations.
   /// The following filter fields are supported&#58;
   ///
@@ -1559,6 +1555,10 @@
   ///
   /// [pageToken] - The standard list page token.
   ///
+  /// [pageSize] - The maximum number of results to return. If unspecified,
+  /// defaults to
+  /// 256. The maximum value is 2048.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1570,9 +1570,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListOperationsResponse> list(core.String name,
-      {core.int pageSize,
-      core.String filter,
+      {core.String filter,
       core.String pageToken,
+      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1584,15 +1584,15 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (filter != null) {
       _queryParams["filter"] = [filter];
     }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1986,6 +1986,19 @@
   /// [readGroupSetId] - Required. The ID of the read group set over which
   /// coverage is requested.
   ///
+  /// [start] - The start position of the range on the reference, 0-based
+  /// inclusive. If
+  /// specified, `referenceName` must also be specified. Defaults to 0.
+  ///
+  /// [targetBucketWidth] - The desired width of each reported coverage bucket
+  /// in base pairs. This
+  /// will be rounded down to the nearest precomputed bucket width; the value
+  /// of which is returned as `bucketWidth` in the response. Defaults
+  /// to infinity (each bucket spans an entire reference sequence) or the length
+  /// of the target range, if specified. The smallest precomputed
+  /// `bucketWidth` is currently 2048 base pairs; this is subject to
+  /// change.
+  ///
   /// [referenceName] - The name of the reference to query, within the reference
   /// set associated
   /// with this query. Optional.
@@ -2004,19 +2017,6 @@
   /// unspecified,
   /// defaults to 1024. The maximum value is 2048.
   ///
-  /// [start] - The start position of the range on the reference, 0-based
-  /// inclusive. If
-  /// specified, `referenceName` must also be specified. Defaults to 0.
-  ///
-  /// [targetBucketWidth] - The desired width of each reported coverage bucket
-  /// in base pairs. This
-  /// will be rounded down to the nearest precomputed bucket width; the value
-  /// of which is returned as `bucketWidth` in the response. Defaults
-  /// to infinity (each bucket spans an entire reference sequence) or the length
-  /// of the target range, if specified. The smallest precomputed
-  /// `bucketWidth` is currently 2048 base pairs; this is subject to
-  /// change.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2028,12 +2028,12 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListCoverageBucketsResponse> list(core.String readGroupSetId,
-      {core.String referenceName,
+      {core.String start,
+      core.String targetBucketWidth,
+      core.String referenceName,
       core.String end,
       core.String pageToken,
       core.int pageSize,
-      core.String start,
-      core.String targetBucketWidth,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -2045,6 +2045,12 @@
     if (readGroupSetId == null) {
       throw new core.ArgumentError("Parameter readGroupSetId is required.");
     }
+    if (start != null) {
+      _queryParams["start"] = [start];
+    }
+    if (targetBucketWidth != null) {
+      _queryParams["targetBucketWidth"] = [targetBucketWidth];
+    }
     if (referenceName != null) {
       _queryParams["referenceName"] = [referenceName];
     }
@@ -2057,12 +2063,6 @@
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (start != null) {
-      _queryParams["start"] = [start];
-    }
-    if (targetBucketWidth != null) {
-      _queryParams["targetBucketWidth"] = [targetBucketWidth];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2284,12 +2284,6 @@
   ///
   /// [referenceId] - The ID of the reference.
   ///
-  /// [pageSize] - The maximum number of bases to return in a single page. If
-  /// unspecified,
-  /// defaults to 200Kbp (kilo base pairs). The maximum value is 10Mbp (mega
-  /// base
-  /// pairs).
-  ///
   /// [start] - The start position (0-based) of this query. Defaults to 0.
   ///
   /// [end] - The end position (0-based, exclusive) of this query. Defaults to
@@ -2301,6 +2295,12 @@
   /// To get the next page of results, set this parameter to the value of
   /// `nextPageToken` from the previous response.
   ///
+  /// [pageSize] - The maximum number of bases to return in a single page. If
+  /// unspecified,
+  /// defaults to 200Kbp (kilo base pairs). The maximum value is 10Mbp (mega
+  /// base
+  /// pairs).
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2312,10 +2312,10 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListBasesResponse> list(core.String referenceId,
-      {core.int pageSize,
-      core.String start,
+      {core.String start,
       core.String end,
       core.String pageToken,
+      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -2327,9 +2327,6 @@
     if (referenceId == null) {
       throw new core.ArgumentError("Parameter referenceId is required.");
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (start != null) {
       _queryParams["start"] = [start];
     }
@@ -2339,6 +2336,9 @@
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/iam/v1.dart b/generated/googleapis/lib/iam/v1.dart
index 9d6aacc..cd5441e 100644
--- a/generated/googleapis/lib/iam/v1.dart
+++ b/generated/googleapis/lib/iam/v1.dart
@@ -222,8 +222,6 @@
   /// `projects/{PROJECT_ID}`
   /// Value must have pattern "^organizations/[^/]+$".
   ///
-  /// [showDeleted] - Include Roles that have been deleted.
-  ///
   /// [pageToken] - Optional pagination token returned in an earlier
   /// ListRolesResponse.
   ///
@@ -235,6 +233,8 @@
   /// - "BASIC" : A BASIC.
   /// - "FULL" : A FULL.
   ///
+  /// [showDeleted] - Include Roles that have been deleted.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -246,10 +246,10 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListRolesResponse> list(core.String parent,
-      {core.bool showDeleted,
-      core.String pageToken,
+      {core.String pageToken,
       core.int pageSize,
       core.String view,
+      core.bool showDeleted,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -261,9 +261,6 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (showDeleted != null) {
-      _queryParams["showDeleted"] = ["${showDeleted}"];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
@@ -273,6 +270,9 @@
     if (view != null) {
       _queryParams["view"] = [view];
     }
+    if (showDeleted != null) {
+      _queryParams["showDeleted"] = ["${showDeleted}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -635,6 +635,8 @@
   /// `projects/{PROJECT_ID}`
   /// Value must have pattern "^projects/[^/]+$".
   ///
+  /// [showDeleted] - Include Roles that have been deleted.
+  ///
   /// [pageToken] - Optional pagination token returned in an earlier
   /// ListRolesResponse.
   ///
@@ -646,8 +648,6 @@
   /// - "BASIC" : A BASIC.
   /// - "FULL" : A FULL.
   ///
-  /// [showDeleted] - Include Roles that have been deleted.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -659,10 +659,10 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListRolesResponse> list(core.String parent,
-      {core.String pageToken,
+      {core.bool showDeleted,
+      core.String pageToken,
       core.int pageSize,
       core.String view,
-      core.bool showDeleted,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -674,6 +674,9 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
+    if (showDeleted != null) {
+      _queryParams["showDeleted"] = ["${showDeleted}"];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
@@ -683,9 +686,6 @@
     if (view != null) {
       _queryParams["view"] = [view];
     }
-    if (showDeleted != null) {
-      _queryParams["showDeleted"] = ["${showDeleted}"];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1865,12 +1865,6 @@
   /// - "REMOVE" : Removal of a Binding.
   core.String action;
 
-  /// The condition that is associated with this binding.
-  /// This field is GOOGLE_INTERNAL.
-  /// This field is not logged in IAM side because it's only for audit logging.
-  /// Optional
-  Expr condition;
-
   /// A single identity requesting access for a Cloud Platform resource.
   /// Follows the same format of Binding.members.
   /// Required
@@ -1887,9 +1881,6 @@
     if (_json.containsKey("action")) {
       action = _json["action"];
     }
-    if (_json.containsKey("condition")) {
-      condition = new Expr.fromJson(_json["condition"]);
-    }
     if (_json.containsKey("member")) {
       member = _json["member"];
     }
@@ -1904,9 +1895,6 @@
     if (action != null) {
       _json["action"] = action;
     }
-    if (condition != null) {
-      _json["condition"] = (condition).toJson();
-    }
     if (member != null) {
       _json["member"] = member;
     }
@@ -1958,7 +1946,6 @@
   /// - "KEY_ALG_UNSPECIFIED" : An unspecified key algorithm.
   /// - "KEY_ALG_RSA_1024" : 1k RSA Key.
   /// - "KEY_ALG_RSA_2048" : 2k RSA Key.
-  /// - "KEY_ALG_GCS_SYMMETRIC_HMAC" : HMAC.
   core.String keyAlgorithm;
 
   /// The output format of the private key. `GOOGLE_CREDENTIALS_FILE` is the
@@ -2054,68 +2041,6 @@
   }
 }
 
-/// Represents an expression text. Example:
-///
-///     title: "User account presence"
-///     description: "Determines whether the request has a user account"
-///     expression: "size(request.user) > 0"
-class Expr {
-  /// An optional description of the expression. This is a longer text which
-  /// describes the expression, e.g. when hovered over it in a UI.
-  core.String description;
-
-  /// Textual representation of an expression in
-  /// Common Expression Language syntax.
-  ///
-  /// The application context of the containing message determines which
-  /// well-known feature set of CEL is supported.
-  core.String expression;
-
-  /// An optional string indicating the location of the expression for error
-  /// reporting, e.g. a file name and a position in the file.
-  core.String location;
-
-  /// An optional title for the expression, i.e. a short string describing
-  /// its purpose. This can be used e.g. in UIs which allow to enter the
-  /// expression.
-  core.String title;
-
-  Expr();
-
-  Expr.fromJson(core.Map _json) {
-    if (_json.containsKey("description")) {
-      description = _json["description"];
-    }
-    if (_json.containsKey("expression")) {
-      expression = _json["expression"];
-    }
-    if (_json.containsKey("location")) {
-      location = _json["location"];
-    }
-    if (_json.containsKey("title")) {
-      title = _json["title"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (description != null) {
-      _json["description"] = description;
-    }
-    if (expression != null) {
-      _json["expression"] = expression;
-    }
-    if (location != null) {
-      _json["location"] = location;
-    }
-    if (title != null) {
-      _json["title"] = title;
-    }
-    return _json;
-  }
-}
-
 /// The response containing the roles defined under a resource.
 class ListRolesResponse {
   /// To retrieve the next page of results, set
@@ -2820,7 +2745,6 @@
   /// - "KEY_ALG_UNSPECIFIED" : An unspecified key algorithm.
   /// - "KEY_ALG_RSA_1024" : 1k RSA Key.
   /// - "KEY_ALG_RSA_2048" : 2k RSA Key.
-  /// - "KEY_ALG_GCS_SYMMETRIC_HMAC" : HMAC.
   core.String keyAlgorithm;
 
   /// The resource name of the service account key in the following format
diff --git a/generated/googleapis/lib/kgsearch/v1.dart b/generated/googleapis/lib/kgsearch/v1.dart
index 67364b4..82d79ef 100644
--- a/generated/googleapis/lib/kgsearch/v1.dart
+++ b/generated/googleapis/lib/kgsearch/v1.dart
@@ -38,16 +38,6 @@
   ///
   /// Request parameters:
   ///
-  /// [prefix] - Enables prefix match against names and aliases of entities
-  ///
-  /// [query] - The literal query string for search.
-  ///
-  /// [types] - Restricts returned entities with these types, e.g. Person
-  /// (as defined in http://schema.org/Person). If multiple types are specified,
-  /// returned entities will contain one or more of these types.
-  ///
-  /// [indent] - Enables indenting of json results.
-  ///
   /// [languages] - The list of language codes (defined in ISO 693) to run the
   /// query with,
   /// e.g. 'en'.
@@ -59,6 +49,16 @@
   ///
   /// [limit] - Limits the number of entities to be returned.
   ///
+  /// [prefix] - Enables prefix match against names and aliases of entities
+  ///
+  /// [query] - The literal query string for search.
+  ///
+  /// [types] - Restricts returned entities with these types, e.g. Person
+  /// (as defined in http://schema.org/Person). If multiple types are specified,
+  /// returned entities will contain one or more of these types.
+  ///
+  /// [indent] - Enables indenting of json results.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -70,13 +70,13 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<SearchResponse> search(
-      {core.bool prefix,
+      {core.List<core.String> languages,
+      core.List<core.String> ids,
+      core.int limit,
+      core.bool prefix,
       core.String query,
       core.List<core.String> types,
       core.bool indent,
-      core.List<core.String> languages,
-      core.List<core.String> ids,
-      core.int limit,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -85,6 +85,15 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
+    if (languages != null) {
+      _queryParams["languages"] = languages;
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (limit != null) {
+      _queryParams["limit"] = ["${limit}"];
+    }
     if (prefix != null) {
       _queryParams["prefix"] = ["${prefix}"];
     }
@@ -97,15 +106,6 @@
     if (indent != null) {
       _queryParams["indent"] = ["${indent}"];
     }
-    if (languages != null) {
-      _queryParams["languages"] = languages;
-    }
-    if (ids != null) {
-      _queryParams["ids"] = ids;
-    }
-    if (limit != null) {
-      _queryParams["limit"] = ["${limit}"];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/logging/v2.dart b/generated/googleapis/lib/logging/v2.dart
index 6d2df7c..f1daccd 100644
--- a/generated/googleapis/lib/logging/v2.dart
+++ b/generated/googleapis/lib/logging/v2.dart
@@ -435,15 +435,15 @@
   ///
   /// Value must have pattern "^billingAccounts/[^/]+$".
   ///
+  /// [pageSize] - Optional. The maximum number of results to return from this
+  /// request. Non-positive values are ignored. The presence of nextPageToken in
+  /// the response indicates that more results might be available.
+  ///
   /// [pageToken] - Optional. If present, then retrieve the next batch of
   /// results from the preceding call to this method. pageToken must be the
   /// value of nextPageToken from the previous response. The values of other
   /// method parameters should be identical to those in the previous call.
   ///
-  /// [pageSize] - Optional. The maximum number of results to return from this
-  /// request. Non-positive values are ignored. The presence of nextPageToken in
-  /// the response indicates that more results might be available.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -455,7 +455,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListLogsResponse> list(core.String parent,
-      {core.String pageToken, core.int pageSize, core.String $fields}) {
+      {core.int pageSize, core.String pageToken, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -466,12 +466,12 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1170,15 +1170,15 @@
   ///
   /// Value must have pattern "^[^/]+/[^/]+$".
   ///
+  /// [pageSize] - Optional. The maximum number of results to return from this
+  /// request. Non-positive values are ignored. The presence of nextPageToken in
+  /// the response indicates that more results might be available.
+  ///
   /// [pageToken] - Optional. If present, then retrieve the next batch of
   /// results from the preceding call to this method. pageToken must be the
   /// value of nextPageToken from the previous response. The values of other
   /// method parameters should be identical to those in the previous call.
   ///
-  /// [pageSize] - Optional. The maximum number of results to return from this
-  /// request. Non-positive values are ignored. The presence of nextPageToken in
-  /// the response indicates that more results might be available.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1190,7 +1190,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListExclusionsResponse> list(core.String parent,
-      {core.String pageToken, core.int pageSize, core.String $fields}) {
+      {core.int pageSize, core.String pageToken, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1201,12 +1201,12 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1473,15 +1473,15 @@
   ///
   /// Value must have pattern "^folders/[^/]+$".
   ///
+  /// [pageSize] - Optional. The maximum number of results to return from this
+  /// request. Non-positive values are ignored. The presence of nextPageToken in
+  /// the response indicates that more results might be available.
+  ///
   /// [pageToken] - Optional. If present, then retrieve the next batch of
   /// results from the preceding call to this method. pageToken must be the
   /// value of nextPageToken from the previous response. The values of other
   /// method parameters should be identical to those in the previous call.
   ///
-  /// [pageSize] - Optional. The maximum number of results to return from this
-  /// request. Non-positive values are ignored. The presence of nextPageToken in
-  /// the response indicates that more results might be available.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1493,7 +1493,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListExclusionsResponse> list(core.String parent,
-      {core.String pageToken, core.int pageSize, core.String $fields}) {
+      {core.int pageSize, core.String pageToken, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1504,12 +1504,12 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1663,15 +1663,15 @@
   ///
   /// Value must have pattern "^folders/[^/]+$".
   ///
+  /// [pageSize] - Optional. The maximum number of results to return from this
+  /// request. Non-positive values are ignored. The presence of nextPageToken in
+  /// the response indicates that more results might be available.
+  ///
   /// [pageToken] - Optional. If present, then retrieve the next batch of
   /// results from the preceding call to this method. pageToken must be the
   /// value of nextPageToken from the previous response. The values of other
   /// method parameters should be identical to those in the previous call.
   ///
-  /// [pageSize] - Optional. The maximum number of results to return from this
-  /// request. Non-positive values are ignored. The presence of nextPageToken in
-  /// the response indicates that more results might be available.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1683,7 +1683,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListLogsResponse> list(core.String parent,
-      {core.String pageToken, core.int pageSize, core.String $fields}) {
+      {core.int pageSize, core.String pageToken, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1694,12 +1694,12 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2264,15 +2264,15 @@
   ///
   /// Request parameters:
   ///
+  /// [pageSize] - Optional. The maximum number of results to return from this
+  /// request. Non-positive values are ignored. The presence of nextPageToken in
+  /// the response indicates that more results might be available.
+  ///
   /// [pageToken] - Optional. If present, then retrieve the next batch of
   /// results from the preceding call to this method. pageToken must be the
   /// value of nextPageToken from the previous response. The values of other
   /// method parameters should be identical to those in the previous call.
   ///
-  /// [pageSize] - Optional. The maximum number of results to return from this
-  /// request. Non-positive values are ignored. The presence of nextPageToken in
-  /// the response indicates that more results might be available.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2284,7 +2284,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListMonitoredResourceDescriptorsResponse> list(
-      {core.String pageToken, core.int pageSize, core.String $fields}) {
+      {core.int pageSize, core.String pageToken, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2292,12 +2292,12 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2501,15 +2501,15 @@
   ///
   /// Value must have pattern "^organizations/[^/]+$".
   ///
+  /// [pageSize] - Optional. The maximum number of results to return from this
+  /// request. Non-positive values are ignored. The presence of nextPageToken in
+  /// the response indicates that more results might be available.
+  ///
   /// [pageToken] - Optional. If present, then retrieve the next batch of
   /// results from the preceding call to this method. pageToken must be the
   /// value of nextPageToken from the previous response. The values of other
   /// method parameters should be identical to those in the previous call.
   ///
-  /// [pageSize] - Optional. The maximum number of results to return from this
-  /// request. Non-positive values are ignored. The presence of nextPageToken in
-  /// the response indicates that more results might be available.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2521,7 +2521,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListExclusionsResponse> list(core.String parent,
-      {core.String pageToken, core.int pageSize, core.String $fields}) {
+      {core.int pageSize, core.String pageToken, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2532,12 +2532,12 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2932,15 +2932,15 @@
   ///
   /// Value must have pattern "^organizations/[^/]+$".
   ///
+  /// [pageSize] - Optional. The maximum number of results to return from this
+  /// request. Non-positive values are ignored. The presence of nextPageToken in
+  /// the response indicates that more results might be available.
+  ///
   /// [pageToken] - Optional. If present, then retrieve the next batch of
   /// results from the preceding call to this method. pageToken must be the
   /// value of nextPageToken from the previous response. The values of other
   /// method parameters should be identical to those in the previous call.
   ///
-  /// [pageSize] - Optional. The maximum number of results to return from this
-  /// request. Non-positive values are ignored. The presence of nextPageToken in
-  /// the response indicates that more results might be available.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2952,7 +2952,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListSinksResponse> list(core.String parent,
-      {core.String pageToken, core.int pageSize, core.String $fields}) {
+      {core.int pageSize, core.String pageToken, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2963,12 +2963,12 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -3745,15 +3745,15 @@
   ///
   /// Value must have pattern "^projects/[^/]+$".
   ///
+  /// [pageSize] - Optional. The maximum number of results to return from this
+  /// request. Non-positive values are ignored. The presence of nextPageToken in
+  /// the response indicates that more results might be available.
+  ///
   /// [pageToken] - Optional. If present, then retrieve the next batch of
   /// results from the preceding call to this method. pageToken must be the
   /// value of nextPageToken from the previous response. The values of other
   /// method parameters should be identical to those in the previous call.
   ///
-  /// [pageSize] - Optional. The maximum number of results to return from this
-  /// request. Non-positive values are ignored. The presence of nextPageToken in
-  /// the response indicates that more results might be available.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -3765,7 +3765,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListLogMetricsResponse> list(core.String parent,
-      {core.String pageToken, core.int pageSize, core.String $fields}) {
+      {core.int pageSize, core.String pageToken, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -3776,12 +3776,12 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -4451,15 +4451,15 @@
   ///
   /// Value must have pattern "^[^/]+/[^/]+$".
   ///
+  /// [pageSize] - Optional. The maximum number of results to return from this
+  /// request. Non-positive values are ignored. The presence of nextPageToken in
+  /// the response indicates that more results might be available.
+  ///
   /// [pageToken] - Optional. If present, then retrieve the next batch of
   /// results from the preceding call to this method. pageToken must be the
   /// value of nextPageToken from the previous response. The values of other
   /// method parameters should be identical to those in the previous call.
   ///
-  /// [pageSize] - Optional. The maximum number of results to return from this
-  /// request. Non-positive values are ignored. The presence of nextPageToken in
-  /// the response indicates that more results might be available.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -4471,7 +4471,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListSinksResponse> list(core.String parent,
-      {core.String pageToken, core.int pageSize, core.String $fields}) {
+      {core.int pageSize, core.String pageToken, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -4482,12 +4482,12 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -5408,8 +5408,9 @@
   /// retention period. If this field is omitted in a new log entry, then
   /// Stackdriver Logging assigns it the current time.Incoming log entries
   /// should have timestamps that are no more than the logs retention period in
-  /// the past, and no more than 24 hours in the future. See the entries.write
-  /// API method for more information.
+  /// the past, and no more than 24 hours in the future. Log entries outside
+  /// those time boundaries will not be available when calling entries.list, but
+  /// those log entries can still be exported with LogSinks.
   core.String timestamp;
 
   /// Optional. Resource name of the trace associated with the log entry, if
@@ -6735,10 +6736,11 @@
   /// entries earlier in the list will sort before the entries later in the
   /// list. See the entries.list method.Log entries with timestamps that are
   /// more than the logs retention period in the past or more than 24 hours in
-  /// the future might be discarded. Discarding does not return an error.To
-  /// improve throughput and to avoid exceeding the quota limit for calls to
-  /// entries.write, you should try to include several log entries in this list,
-  /// rather than calling this method for each individual log entry.
+  /// the future will not be available when calling entries.list. However, those
+  /// log entries can still be exported with LogSinks.To improve throughput and
+  /// to avoid exceeding the quota limit for calls to entries.write, you should
+  /// try to include several log entries in this list, rather than calling this
+  /// method for each individual log entry.
   core.List<LogEntry> entries;
 
   /// Optional. Default labels that are added to the labels field of all log
diff --git a/generated/googleapis/lib/ml/v1.dart b/generated/googleapis/lib/ml/v1.dart
index 7091648..4814f8a 100644
--- a/generated/googleapis/lib/ml/v1.dart
+++ b/generated/googleapis/lib/ml/v1.dart
@@ -35,6 +35,8 @@
   final commons.ApiRequester _requester;
 
   ProjectsJobsResourceApi get jobs => new ProjectsJobsResourceApi(_requester);
+  ProjectsLocationsResourceApi get locations =>
+      new ProjectsLocationsResourceApi(_requester);
   ProjectsModelsResourceApi get models =>
       new ProjectsModelsResourceApi(_requester);
   ProjectsOperationsResourceApi get operations =>
@@ -93,8 +95,8 @@
 
   /// Performs prediction on the data in the request.
   /// Cloud ML Engine implements a custom `predict` verb on top of an HTTP POST
-  /// method. For details of the format, see the **guide to the
-  /// [predict request format](/ml-engine/docs/v1/predict-request)**.
+  /// method. <p>For details of the request and response format, see the **guide
+  /// to the [predict request format](/ml-engine/docs/v1/predict-request)**.
   ///
   /// [request] - The metadata request object.
   ///
@@ -349,11 +351,25 @@
 
   /// Lists the jobs in the project.
   ///
+  /// If there are no jobs that match the request parameters, the list
+  /// request returns an empty response body: {}.
+  ///
   /// Request parameters:
   ///
   /// [parent] - Required. The name of the project for which to list jobs.
   /// Value must have pattern "^projects/[^/]+$".
   ///
+  /// [filter] - Optional. Specifies the subset of jobs to retrieve.
+  /// You can filter on the value of one or more attributes of the job object.
+  /// For example, retrieve jobs with a job identifier that starts with
+  /// 'census':
+  /// <p><code>gcloud ml-engine jobs list --filter='jobId:census*'</code>
+  /// <p>List all failed jobs with names that start with 'rnn':
+  /// <p><code>gcloud ml-engine jobs list --filter='jobId:rnn*
+  /// AND state:FAILED'</code>
+  /// <p>For more examples, see the guide to
+  /// <a href="/ml-engine/docs/monitor-training">monitoring jobs</a>.
+  ///
   /// [pageToken] - Optional. A page token to request the next page of results.
   ///
   /// You get the token from the `next_page_token` field of the response from
@@ -366,8 +382,6 @@
   ///
   /// The default value is 20, and the maximum page size is 100.
   ///
-  /// [filter] - Optional. Specifies the subset of jobs to retrieve.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -379,9 +393,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<GoogleCloudMlV1ListJobsResponse> list(core.String parent,
-      {core.String pageToken,
+      {core.String filter,
+      core.String pageToken,
       core.int pageSize,
-      core.String filter,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -393,15 +407,15 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -611,6 +625,124 @@
   }
 }
 
+class ProjectsLocationsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ProjectsLocationsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Get the complete list of CMLE capabilities in a location, along with their
+  /// location-specific properties.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Required. The name of the location.
+  /// Value must have pattern "^projects/[^/]+/locations/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [GoogleCloudMlV1Location].
+  ///
+  /// Completes with a [commons.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<GoogleCloudMlV1Location> get(core.String name,
+      {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (name == null) {
+      throw new core.ArgumentError("Parameter name is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$name');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new GoogleCloudMlV1Location.fromJson(data));
+  }
+
+  /// List all locations that provides at least one type of CMLE capability.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Required. The name of the project for which available locations
+  /// are to be
+  /// listed (since some locations might be whitelisted for specific projects).
+  /// Value must have pattern "^projects/[^/]+$".
+  ///
+  /// [pageToken] - Optional. A page token to request the next page of results.
+  ///
+  /// You get the token from the `next_page_token` field of the response from
+  /// the previous call.
+  ///
+  /// [pageSize] - Optional. The number of locations to retrieve per "page" of
+  /// results. If there
+  /// are more remaining results than this number, the response message will
+  /// contain a valid value in the `next_page_token` field.
+  ///
+  /// The default value is 20, and the maximum page size is 100.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [GoogleCloudMlV1ListLocationsResponse].
+  ///
+  /// Completes with a [commons.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<GoogleCloudMlV1ListLocationsResponse> list(core.String parent,
+      {core.String pageToken, core.int pageSize, core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (parent == null) {
+      throw new core.ArgumentError("Parameter parent is required.");
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url =
+        'v1/' + commons.Escaper.ecapeVariableReserved('$parent') + '/locations';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then(
+        (data) => new GoogleCloudMlV1ListLocationsResponse.fromJson(data));
+  }
+}
+
 class ProjectsModelsResourceApi {
   final commons.ApiRequester _requester;
 
@@ -823,6 +955,9 @@
   /// Each project can contain multiple models, and each model can have multiple
   /// versions.
   ///
+  /// If there are no models that match the request parameters, the list request
+  /// returns an empty response body: {}.
+  ///
   /// Request parameters:
   ///
   /// [parent] - Required. The name of the project whose models are to be
@@ -1258,9 +1393,12 @@
 
   /// Gets basic information about all the versions of a model.
   ///
-  /// If you expect that a model has a lot of versions, or if you need to handle
+  /// If you expect that a model has many versions, or if you need to handle
   /// only a limited number of results at a time, you can request that the list
-  /// be retrieved in batches (called pages):
+  /// be retrieved in batches (called pages).
+  ///
+  /// If there are no versions that match the request parameters, the list
+  /// request returns an empty response body: {}.
   ///
   /// Request parameters:
   ///
@@ -1360,7 +1498,7 @@
   /// `etag` value in your version resource.
   ///
   /// Currently the only supported update masks are `description`, `labels`, and
-  /// `etag`.
+  /// `etag`, and `expire_time`.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1873,6 +2011,42 @@
   }
 }
 
+class GoogleCloudMlV1Capability {
+  /// Available accelerators for the capability.
+  core.List<core.String> availableAccelerators;
+
+  ///
+  /// Possible string values are:
+  /// - "TYPE_UNSPECIFIED"
+  /// - "TRAINING"
+  /// - "BATCH_PREDICTION"
+  /// - "ONLINE_PREDICTION"
+  core.String type;
+
+  GoogleCloudMlV1Capability();
+
+  GoogleCloudMlV1Capability.fromJson(core.Map _json) {
+    if (_json.containsKey("availableAccelerators")) {
+      availableAccelerators = _json["availableAccelerators"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (availableAccelerators != null) {
+      _json["availableAccelerators"] = availableAccelerators;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
 /// Returns service account information associated with a project.
 class GoogleCloudMlV1GetConfigResponse {
   /// The service account Cloud ML uses to access resources in the project.
@@ -2244,6 +2418,40 @@
   }
 }
 
+class GoogleCloudMlV1ListLocationsResponse {
+  /// Locations where at least one type of CMLE capability is available.
+  core.List<GoogleCloudMlV1Location> locations;
+
+  /// Optional. Pass this token as the `page_token` field of the request for a
+  /// subsequent call.
+  core.String nextPageToken;
+
+  GoogleCloudMlV1ListLocationsResponse();
+
+  GoogleCloudMlV1ListLocationsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("locations")) {
+      locations = _json["locations"]
+          .map((value) => new GoogleCloudMlV1Location.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (locations != null) {
+      _json["locations"] = locations.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
 /// Response message for the ListModels method.
 class GoogleCloudMlV1ListModelsResponse {
   /// The list of models.
@@ -2314,6 +2522,38 @@
   }
 }
 
+class GoogleCloudMlV1Location {
+  /// Capabilities available in the location.
+  core.List<GoogleCloudMlV1Capability> capabilities;
+  core.String name;
+
+  GoogleCloudMlV1Location();
+
+  GoogleCloudMlV1Location.fromJson(core.Map _json) {
+    if (_json.containsKey("capabilities")) {
+      capabilities = _json["capabilities"]
+          .map((value) => new GoogleCloudMlV1Capability.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (capabilities != null) {
+      _json["capabilities"] =
+          capabilities.map((value) => (value).toJson()).toList();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
 /// Options for manually scaling a model.
 class GoogleCloudMlV1ManualScaling {
   /// The number of nodes to allocate for this model. These nodes are always up,
@@ -2393,6 +2633,8 @@
   /// Optional. The list of regions where the model is going to be deployed.
   /// Currently only one region per model is supported.
   /// Defaults to 'us-central1' if nothing is set.
+  /// See the <a href="/ml-engine/docs/regions">available regions</a> for
+  /// ML Engine services.
   /// Note:
   /// *   No matter where a model is deployed, it can always be accessed by
   ///     users from anywhere, both for online and batch prediction.
@@ -2709,10 +2951,12 @@
   /// Required. The format of the input data files.
   /// Possible string values are:
   /// - "DATA_FORMAT_UNSPECIFIED" : Unspecified format.
-  /// - "TEXT" : The source file is a text file with instances separated by the
-  /// new-line character.
-  /// - "TF_RECORD" : The source file is a TFRecord file.
-  /// - "TF_RECORD_GZIP" : The source file is a GZIP-compressed TFRecord file.
+  /// - "JSON" : Each line of the file is a JSON dictionary representing one
+  /// record.
+  /// - "TEXT" : Deprecated. Use JSON instead.
+  /// - "TF_RECORD" : INPUT ONLY. The source file is a TFRecord file.
+  /// - "TF_RECORD_GZIP" : INPUT ONLY. The source file is a GZIP-compressed
+  /// TFRecord file.
   core.String dataFormat;
 
   /// Required. The Google Cloud Storage location of the input data files.
@@ -2734,6 +2978,8 @@
   core.String outputPath;
 
   /// Required. The Google Compute Engine region to run the prediction job in.
+  /// See the <a href="/ml-engine/docs/regions">available regions</a> for
+  /// ML Engine services.
   core.String region;
 
   /// Optional. The Google Cloud ML runtime version to use for this batch
@@ -2906,7 +3152,13 @@
   }
 }
 
-/// Represents input parameters for a training job.
+/// Represents input parameters for a training job. When using the
+/// gcloud command to submit your training job, you can specify
+/// the input parameters as command-line arguments and/or in a YAML
+/// configuration
+/// file referenced from the --config command-line argument. For
+/// details, see the guide to
+/// <a href="/ml-engine/docs/training-jobs">submitting a training job</a>.
 class GoogleCloudMlV1TrainingInput {
   /// Optional. Command line arguments to pass to the program.
   core.List<core.String> args;
@@ -2976,14 +3228,14 @@
   ///   <dd>
   /// A machine equivalent to <code suppresswarning="true">standard</code> that
   ///   also includes a single NVIDIA Tesla P100 GPU. The availability of these
-  ///   GPUs is in the Alpha launch stage.
+  ///   GPUs is in the Beta launch stage.
   ///   </dd>
   ///   <dt>complex_model_m_p100</dt>
   ///   <dd>
   ///   A machine equivalent to
   ///   <code suppresswarning="true">complex_model_m</code> that also includes
   ///   four NVIDIA Tesla P100 GPUs. The availability of these GPUs is in
-  ///   the Alpha launch stage.
+  ///   the Beta launch stage.
   ///   </dd>
   /// </dl>
   ///
@@ -3017,10 +3269,14 @@
   core.String pythonModule;
 
   /// Optional. The version of Python used in training. If not set, the default
-  /// version is '2.7'.
+  /// version is '2.7'. Python '3.5' is available when `runtime_version` is set
+  /// to '1.4' and above. Python '2.7' works with all supported runtime
+  /// versions.
   core.String pythonVersion;
 
   /// Required. The Google Compute Engine region to run the training job in.
+  /// See the <a href="/ml-engine/docs/regions">available regions</a> for
+  /// ML Engine services.
   core.String region;
 
   /// Optional. The Google Cloud ML runtime version to use for training.  If not
diff --git a/generated/googleapis/lib/monitoring/v3.dart b/generated/googleapis/lib/monitoring/v3.dart
index 7f6ab00..1d285ed 100644
--- a/generated/googleapis/lib/monitoring/v3.dart
+++ b/generated/googleapis/lib/monitoring/v3.dart
@@ -290,6 +290,11 @@
   /// "projects/{project_id_or_number}".
   /// Value must have pattern "^projects/[^/]+$".
   ///
+  /// [childrenOfGroup] - A group name:
+  /// "projects/{project_id_or_number}/groups/{group_id}". Returns groups whose
+  /// parentName field contains the group name. If no groups have this parent,
+  /// the results are empty.
+  ///
   /// [descendantsOfGroup] - A group name:
   /// "projects/{project_id_or_number}/groups/{group_id}". Returns the
   /// descendants of the specified group. This is a superset of the results
@@ -311,11 +316,6 @@
   /// ancestor. If the specified group has no immediate parent, the results are
   /// empty.
   ///
-  /// [childrenOfGroup] - A group name:
-  /// "projects/{project_id_or_number}/groups/{group_id}". Returns groups whose
-  /// parentName field contains the group name. If no groups have this parent,
-  /// the results are empty.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -327,11 +327,11 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListGroupsResponse> list(core.String name,
-      {core.String descendantsOfGroup,
+      {core.String childrenOfGroup,
+      core.String descendantsOfGroup,
       core.String pageToken,
       core.int pageSize,
       core.String ancestorsOfGroup,
-      core.String childrenOfGroup,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -343,6 +343,9 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
+    if (childrenOfGroup != null) {
+      _queryParams["childrenOfGroup"] = [childrenOfGroup];
+    }
     if (descendantsOfGroup != null) {
       _queryParams["descendantsOfGroup"] = [descendantsOfGroup];
     }
@@ -355,9 +358,6 @@
     if (ancestorsOfGroup != null) {
       _queryParams["ancestorsOfGroup"] = [ancestorsOfGroup];
     }
-    if (childrenOfGroup != null) {
-      _queryParams["childrenOfGroup"] = [childrenOfGroup];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -448,6 +448,13 @@
   /// "projects/{project_id_or_number}/groups/{group_id}".
   /// Value must have pattern "^projects/[^/]+/groups/[^/]+$".
   ///
+  /// [pageSize] - A positive number that is the maximum number of results to
+  /// return.
+  ///
+  /// [interval_startTime] - Optional. The beginning of the time interval. The
+  /// default value for the start time is the end time. The start time must not
+  /// be later than the end time.
+  ///
   /// [interval_endTime] - Required. The end of the time interval.
   ///
   /// [filter] - An optional list filter describing the members to be returned.
@@ -461,13 +468,6 @@
   /// field causes the method to return additional results from the previous
   /// method call.
   ///
-  /// [interval_startTime] - Optional. The beginning of the time interval. The
-  /// default value for the start time is the end time. The start time must not
-  /// be later than the end time.
-  ///
-  /// [pageSize] - A positive number that is the maximum number of results to
-  /// return.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -479,11 +479,11 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListGroupMembersResponse> list(core.String name,
-      {core.String interval_endTime,
+      {core.int pageSize,
+      core.String interval_startTime,
+      core.String interval_endTime,
       core.String filter,
       core.String pageToken,
-      core.String interval_startTime,
-      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -495,6 +495,12 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (interval_startTime != null) {
+      _queryParams["interval.startTime"] = [interval_startTime];
+    }
     if (interval_endTime != null) {
       _queryParams["interval.endTime"] = [interval_endTime];
     }
@@ -504,12 +510,6 @@
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
-    if (interval_startTime != null) {
-      _queryParams["interval.startTime"] = [interval_startTime];
-    }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -820,11 +820,6 @@
   /// "projects/{project_id_or_number}".
   /// Value must have pattern "^projects/[^/]+$".
   ///
-  /// [pageToken] - If this field is not empty then it must contain the
-  /// nextPageToken value returned by a previous call to this method. Using this
-  /// field causes the method to return additional results from the previous
-  /// method call.
-  ///
   /// [pageSize] - A positive number that is the maximum number of results to
   /// return.
   ///
@@ -834,6 +829,11 @@
   /// have an id label:
   /// resource.type = starts_with("gce_") AND resource.label:id
   ///
+  /// [pageToken] - If this field is not empty then it must contain the
+  /// nextPageToken value returned by a previous call to this method. Using this
+  /// field causes the method to return additional results from the previous
+  /// method call.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -845,9 +845,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListMonitoredResourceDescriptorsResponse> list(core.String name,
-      {core.String pageToken,
-      core.int pageSize,
+      {core.int pageSize,
       core.String filter,
+      core.String pageToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -859,15 +859,15 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
     if (filter != null) {
       _queryParams["filter"] = [filter];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -956,6 +956,25 @@
   /// "projects/{project_id_or_number}".
   /// Value must have pattern "^projects/[^/]+$".
   ///
+  /// [interval_endTime] - Required. The end of the time interval.
+  ///
+  /// [aggregation_alignmentPeriod] - The alignment period for per-time series
+  /// alignment. If present, alignmentPeriod must be at least 60 seconds. After
+  /// per-time series alignment, each time series will contain data points only
+  /// on the period boundaries. If perSeriesAligner is not specified or equals
+  /// ALIGN_NONE, then this field is ignored. If perSeriesAligner is specified
+  /// and does not equal ALIGN_NONE, then this field must be defined; otherwise
+  /// an error is returned.
+  ///
+  /// [pageSize] - A positive number that is the maximum number of results to
+  /// return. When view field sets to FULL, it limits the number of Points
+  /// server will return; if view field is HEADERS, it limits the number of
+  /// TimeSeries server will return.
+  ///
+  /// [orderBy] - Specifies the order in which the points of the time series
+  /// should be returned. By default, results are not ordered. Currently, this
+  /// field must be left blank.
+  ///
   /// [aggregation_crossSeriesReducer] - The approach to be used to combine time
   /// series. Not all reducer functions may be applied to all time series,
   /// depending on the metric type and the value type of the original time
@@ -1039,25 +1058,6 @@
   /// aggregated into a single output time series. If crossSeriesReducer is not
   /// defined, this field is ignored.
   ///
-  /// [interval_endTime] - Required. The end of the time interval.
-  ///
-  /// [aggregation_alignmentPeriod] - The alignment period for per-time series
-  /// alignment. If present, alignmentPeriod must be at least 60 seconds. After
-  /// per-time series alignment, each time series will contain data points only
-  /// on the period boundaries. If perSeriesAligner is not specified or equals
-  /// ALIGN_NONE, then this field is ignored. If perSeriesAligner is specified
-  /// and does not equal ALIGN_NONE, then this field must be defined; otherwise
-  /// an error is returned.
-  ///
-  /// [pageSize] - A positive number that is the maximum number of results to
-  /// return. When view field sets to FULL, it limits the number of Points
-  /// server will return; if view field is HEADERS, it limits the number of
-  /// TimeSeries server will return.
-  ///
-  /// [orderBy] - Specifies the order in which the points of the time series
-  /// should be returned. By default, results are not ordered. Currently, this
-  /// field must be left blank.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1069,17 +1069,17 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListTimeSeriesResponse> list(core.String name,
-      {core.String aggregation_crossSeriesReducer,
+      {core.String interval_endTime,
+      core.String aggregation_alignmentPeriod,
+      core.int pageSize,
+      core.String orderBy,
+      core.String aggregation_crossSeriesReducer,
       core.String filter,
       core.String aggregation_perSeriesAligner,
       core.String pageToken,
       core.String interval_startTime,
       core.String view,
       core.List<core.String> aggregation_groupByFields,
-      core.String interval_endTime,
-      core.String aggregation_alignmentPeriod,
-      core.int pageSize,
-      core.String orderBy,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1091,6 +1091,20 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
+    if (interval_endTime != null) {
+      _queryParams["interval.endTime"] = [interval_endTime];
+    }
+    if (aggregation_alignmentPeriod != null) {
+      _queryParams["aggregation.alignmentPeriod"] = [
+        aggregation_alignmentPeriod
+      ];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (orderBy != null) {
+      _queryParams["orderBy"] = [orderBy];
+    }
     if (aggregation_crossSeriesReducer != null) {
       _queryParams["aggregation.crossSeriesReducer"] = [
         aggregation_crossSeriesReducer
@@ -1116,20 +1130,6 @@
     if (aggregation_groupByFields != null) {
       _queryParams["aggregation.groupByFields"] = aggregation_groupByFields;
     }
-    if (interval_endTime != null) {
-      _queryParams["interval.endTime"] = [interval_endTime];
-    }
-    if (aggregation_alignmentPeriod != null) {
-      _queryParams["aggregation.alignmentPeriod"] = [
-        aggregation_alignmentPeriod
-      ];
-    }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
-    if (orderBy != null) {
-      _queryParams["orderBy"] = [orderBy];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -3136,6 +3136,54 @@
   }
 }
 
+/// Auxiliary metadata for a MonitoredResource object. MonitoredResource objects
+/// contain the minimum set of information to uniquely identify a monitored
+/// resource instance. There is some other useful auxiliary metadata. Google
+/// Stackdriver Monitoring & Logging uses an ingestion pipeline to extract
+/// metadata for cloud resources of all types , and stores the metadata in this
+/// message.
+class MonitoredResourceMetadata {
+  /// Output only. Values for predefined system metadata labels. System labels
+  /// are a kind of metadata extracted by Google Stackdriver. Stackdriver
+  /// determines what system labels are useful and how to obtain their values.
+  /// Some examples: "machine_image", "vpc", "subnet_id", "security_group",
+  /// "name", etc. System label values can be only strings, Boolean values, or a
+  /// list of strings. For example:
+  /// { "name": "my-test-instance",
+  ///   "security_group": ["a", "b", "c"],
+  ///   "spot_instance": false }
+  ///
+  /// The values for Object must be JSON objects. It can consist of `num`,
+  /// `String`, `bool` and `null` as well as `Map` and `List` values.
+  core.Map<core.String, core.Object> systemLabels;
+
+  /// Output only. A map of user-defined metadata labels.
+  core.Map<core.String, core.String> userLabels;
+
+  MonitoredResourceMetadata();
+
+  MonitoredResourceMetadata.fromJson(core.Map _json) {
+    if (_json.containsKey("systemLabels")) {
+      systemLabels = _json["systemLabels"];
+    }
+    if (_json.containsKey("userLabels")) {
+      userLabels = _json["userLabels"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (systemLabels != null) {
+      _json["systemLabels"] = systemLabels;
+    }
+    if (userLabels != null) {
+      _json["userLabels"] = userLabels;
+    }
+    return _json;
+  }
+}
+
 /// A protocol buffer option, which can be attached to a message, field,
 /// enumeration, etc.
 class Option {
@@ -3259,7 +3307,8 @@
   /// The resource type of the group members.
   /// Possible string values are:
   /// - "RESOURCE_TYPE_UNSPECIFIED" : Default value (not valid).
-  /// - "INSTANCE" : A group of instances (could be either GCE or AWS_EC2).
+  /// - "INSTANCE" : A group of instances from Google Cloud Platform (GCP) or
+  /// Amazon Web Services (AWS).
   /// - "AWS_ELB_LOAD_BALANCER" : A group of AWS load balancers.
   core.String resourceType;
 
@@ -3459,6 +3508,11 @@
 /// monitored resource and a fully-specified metric. This type is used for both
 /// listing and creating time series.
 class TimeSeries {
+  /// Output only. The associated monitored resource metadata. When reading a a
+  /// timeseries, this field will include metadata labels that are explicitly
+  /// named in the reduction. When creating a timeseries, this field is ignored.
+  MonitoredResourceMetadata metadata;
+
   /// The associated metric. A fully-specified metric used to identify the time
   /// series.
   Metric metric;
@@ -3514,6 +3568,9 @@
   TimeSeries();
 
   TimeSeries.fromJson(core.Map _json) {
+    if (_json.containsKey("metadata")) {
+      metadata = new MonitoredResourceMetadata.fromJson(_json["metadata"]);
+    }
     if (_json.containsKey("metric")) {
       metric = new Metric.fromJson(_json["metric"]);
     }
@@ -3535,6 +3592,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (metadata != null) {
+      _json["metadata"] = (metadata).toJson();
+    }
     if (metric != null) {
       _json["metric"] = (metric).toJson();
     }
@@ -3711,7 +3771,7 @@
   /// InternalCheckers configured for the project that owns this CheckConfig.
   core.List<InternalChecker> internalCheckers;
 
-  /// Denotes whether this check is a check that egresses from InternalCheckers.
+  /// Denotes whether this is a check that egresses from InternalCheckers.
   core.bool isInternal;
 
   /// The monitored resource associated with the configuration.
diff --git a/generated/googleapis/lib/partners/v2.dart b/generated/googleapis/lib/partners/v2.dart
index 3c0af78..5d17c66 100644
--- a/generated/googleapis/lib/partners/v2.dart
+++ b/generated/googleapis/lib/partners/v2.dart
@@ -48,24 +48,6 @@
   ///
   /// Request parameters:
   ///
-  /// [requestMetadata_trafficSource_trafficSourceId] - Identifier to indicate
-  /// where the traffic comes from.
-  /// An identifier has multiple letters created by a team which redirected the
-  /// traffic to us.
-  ///
-  /// [requestMetadata_locale] - Locale to use for the current request.
-  ///
-  /// [requestMetadata_userOverrides_ipAddress] - IP address to use instead of
-  /// the user's geo-located IP address.
-  ///
-  /// [requestMetadata_experimentIds] - Experiment IDs the current request
-  /// belongs to.
-  ///
-  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
-  /// indicate where the traffic comes from.
-  /// An identifier has multiple letters created by a team which redirected the
-  /// traffic to us.
-  ///
   /// [requestMetadata_partnersSessionId] - Google Partners session ID.
   ///
   /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
@@ -89,6 +71,24 @@
   /// of days BEFORE the end date.
   /// Must be a non-negative integer.
   ///
+  /// [requestMetadata_trafficSource_trafficSourceId] - Identifier to indicate
+  /// where the traffic comes from.
+  /// An identifier has multiple letters created by a team which redirected the
+  /// traffic to us.
+  ///
+  /// [requestMetadata_locale] - Locale to use for the current request.
+  ///
+  /// [requestMetadata_userOverrides_ipAddress] - IP address to use instead of
+  /// the user's geo-located IP address.
+  ///
+  /// [requestMetadata_experimentIds] - Experiment IDs the current request
+  /// belongs to.
+  ///
+  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
+  /// indicate where the traffic comes from.
+  /// An identifier has multiple letters created by a team which redirected the
+  /// traffic to us.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -100,15 +100,15 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListAnalyticsResponse> list(
-      {core.String requestMetadata_trafficSource_trafficSourceId,
+      {core.String requestMetadata_partnersSessionId,
+      core.String requestMetadata_userOverrides_userId,
+      core.String pageToken,
+      core.int pageSize,
+      core.String requestMetadata_trafficSource_trafficSourceId,
       core.String requestMetadata_locale,
       core.String requestMetadata_userOverrides_ipAddress,
       core.List<core.String> requestMetadata_experimentIds,
       core.String requestMetadata_trafficSource_trafficSubId,
-      core.String requestMetadata_partnersSessionId,
-      core.String requestMetadata_userOverrides_userId,
-      core.String pageToken,
-      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -117,6 +117,22 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
+    if (requestMetadata_partnersSessionId != null) {
+      _queryParams["requestMetadata.partnersSessionId"] = [
+        requestMetadata_partnersSessionId
+      ];
+    }
+    if (requestMetadata_userOverrides_userId != null) {
+      _queryParams["requestMetadata.userOverrides.userId"] = [
+        requestMetadata_userOverrides_userId
+      ];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if (requestMetadata_trafficSource_trafficSourceId != null) {
       _queryParams["requestMetadata.trafficSource.trafficSourceId"] = [
         requestMetadata_trafficSource_trafficSourceId
@@ -139,22 +155,6 @@
         requestMetadata_trafficSource_trafficSubId
       ];
     }
-    if (requestMetadata_partnersSessionId != null) {
-      _queryParams["requestMetadata.partnersSessionId"] = [
-        requestMetadata_partnersSessionId
-      ];
-    }
-    if (requestMetadata_userOverrides_userId != null) {
-      _queryParams["requestMetadata.userOverrides.userId"] = [
-        requestMetadata_userOverrides_userId
-      ];
-    }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -236,6 +236,17 @@
   ///
   /// [companyId] - The ID of the company to retrieve.
   ///
+  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
+  /// indicate where the traffic comes from.
+  /// An identifier has multiple letters created by a team which redirected the
+  /// traffic to us.
+  ///
+  /// [orderBy] - How to order addresses within the returned company. Currently,
+  /// only
+  /// `address` and `address desc` is supported which will sorted by closest to
+  /// farthest in distance from given address and farthest to closest distance
+  /// from given address respectively.
+  ///
   /// [requestMetadata_partnersSessionId] - Google Partners session ID.
   ///
   /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
@@ -269,17 +280,6 @@
   /// [requestMetadata_experimentIds] - Experiment IDs the current request
   /// belongs to.
   ///
-  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
-  /// indicate where the traffic comes from.
-  /// An identifier has multiple letters created by a team which redirected the
-  /// traffic to us.
-  ///
-  /// [orderBy] - How to order addresses within the returned company. Currently,
-  /// only
-  /// `address` and `address desc` is supported which will sorted by closest to
-  /// farthest in distance from given address and farthest to closest distance
-  /// from given address respectively.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -291,7 +291,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<GetCompanyResponse> get(core.String companyId,
-      {core.String requestMetadata_partnersSessionId,
+      {core.String requestMetadata_trafficSource_trafficSubId,
+      core.String orderBy,
+      core.String requestMetadata_partnersSessionId,
       core.String requestMetadata_userOverrides_userId,
       core.String view,
       core.String requestMetadata_locale,
@@ -300,8 +302,6 @@
       core.String requestMetadata_userOverrides_ipAddress,
       core.String currencyCode,
       core.List<core.String> requestMetadata_experimentIds,
-      core.String requestMetadata_trafficSource_trafficSubId,
-      core.String orderBy,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -313,6 +313,14 @@
     if (companyId == null) {
       throw new core.ArgumentError("Parameter companyId is required.");
     }
+    if (requestMetadata_trafficSource_trafficSubId != null) {
+      _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
+        requestMetadata_trafficSource_trafficSubId
+      ];
+    }
+    if (orderBy != null) {
+      _queryParams["orderBy"] = [orderBy];
+    }
     if (requestMetadata_partnersSessionId != null) {
       _queryParams["requestMetadata.partnersSessionId"] = [
         requestMetadata_partnersSessionId
@@ -349,14 +357,6 @@
       _queryParams["requestMetadata.experimentIds"] =
           requestMetadata_experimentIds;
     }
-    if (requestMetadata_trafficSource_trafficSubId != null) {
-      _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
-        requestMetadata_trafficSource_trafficSubId
-      ];
-    }
-    if (orderBy != null) {
-      _queryParams["orderBy"] = [orderBy];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -376,16 +376,6 @@
   ///
   /// Request parameters:
   ///
-  /// [languageCodes] - List of language codes that company can support. Only
-  /// primary language
-  /// subtags are accepted as defined by
-  /// <a href="https://tools.ietf.org/html/bcp47">BCP 47</a>
-  /// (IETF BCP 47, "Tags for Identifying Languages").
-  ///
-  /// [pageSize] - Requested page size. Server may return fewer companies than
-  /// requested.
-  /// If unspecified, server picks an appropriate default.
-  ///
   /// [requestMetadata_userOverrides_ipAddress] - IP address to use instead of
   /// the user's geo-located IP address.
   ///
@@ -406,12 +396,12 @@
   /// [maxMonthlyBudget_currencyCode] - The 3-letter currency code defined in
   /// ISO 4217.
   ///
-  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
-  /// instead of the user's ID.
-  ///
   /// [minMonthlyBudget_currencyCode] - The 3-letter currency code defined in
   /// ISO 4217.
   ///
+  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
+  /// instead of the user's ID.
+  ///
   /// [view] - The view of the `Company` resource to be returned. This must not
   /// be
   /// `COMPANY_VIEW_UNSPECIFIED`.
@@ -419,11 +409,11 @@
   /// - "COMPANY_VIEW_UNSPECIFIED" : A COMPANY_VIEW_UNSPECIFIED.
   /// - "CV_GOOGLE_PARTNER_SEARCH" : A CV_GOOGLE_PARTNER_SEARCH.
   ///
-  /// [requestMetadata_locale] - Locale to use for the current request.
-  ///
   /// [address] - The address to use when searching for companies.
   /// If not given, the geo-located address of the request is used.
   ///
+  /// [requestMetadata_locale] - Locale to use for the current request.
+  ///
   /// [minMonthlyBudget_units] - The whole units of the amount.
   /// For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
   ///
@@ -447,6 +437,11 @@
   /// [maxMonthlyBudget_units] - The whole units of the amount.
   /// For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
   ///
+  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
+  /// indicate where the traffic comes from.
+  /// An identifier has multiple letters created by a team which redirected the
+  /// traffic to us.
+  ///
   /// [minMonthlyBudget_nanos] - Number of nano (10^-9) units of the amount.
   /// The value must be between -999,999,999 and +999,999,999 inclusive.
   /// If `units` is positive, `nanos` must be positive or zero.
@@ -454,11 +449,6 @@
   /// If `units` is negative, `nanos` must be negative or zero.
   /// For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
   ///
-  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
-  /// indicate where the traffic comes from.
-  /// An identifier has multiple letters created by a team which redirected the
-  /// traffic to us.
-  ///
   /// [requestMetadata_partnersSessionId] - Google Partners session ID.
   ///
   /// [companyName] - Company name to search for.
@@ -478,6 +468,16 @@
   /// [gpsMotivations] - List of reasons for using Google Partner Search to get
   /// companies.
   ///
+  /// [languageCodes] - List of language codes that company can support. Only
+  /// primary language
+  /// subtags are accepted as defined by
+  /// <a href="https://tools.ietf.org/html/bcp47">BCP 47</a>
+  /// (IETF BCP 47, "Tags for Identifying Languages").
+  ///
+  /// [pageSize] - Requested page size. Server may return fewer companies than
+  /// requested.
+  /// If unspecified, server picks an appropriate default.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -489,31 +489,31 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListCompaniesResponse> list(
-      {core.List<core.String> languageCodes,
-      core.int pageSize,
-      core.String requestMetadata_userOverrides_ipAddress,
+      {core.String requestMetadata_userOverrides_ipAddress,
       core.List<core.String> requestMetadata_experimentIds,
       core.String orderBy,
       core.List<core.String> specializations,
       core.String maxMonthlyBudget_currencyCode,
-      core.String requestMetadata_userOverrides_userId,
       core.String minMonthlyBudget_currencyCode,
+      core.String requestMetadata_userOverrides_userId,
       core.String view,
-      core.String requestMetadata_locale,
       core.String address,
+      core.String requestMetadata_locale,
       core.String minMonthlyBudget_units,
       core.int maxMonthlyBudget_nanos,
       core.List<core.String> services,
       core.String requestMetadata_trafficSource_trafficSourceId,
       core.String maxMonthlyBudget_units,
-      core.int minMonthlyBudget_nanos,
       core.String requestMetadata_trafficSource_trafficSubId,
+      core.int minMonthlyBudget_nanos,
       core.String requestMetadata_partnersSessionId,
       core.String companyName,
       core.String pageToken,
       core.List<core.String> industries,
       core.String websiteUrl,
       core.List<core.String> gpsMotivations,
+      core.List<core.String> languageCodes,
+      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -522,12 +522,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (languageCodes != null) {
-      _queryParams["languageCodes"] = languageCodes;
-    }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (requestMetadata_userOverrides_ipAddress != null) {
       _queryParams["requestMetadata.userOverrides.ipAddress"] = [
         requestMetadata_userOverrides_ipAddress
@@ -548,25 +542,25 @@
         maxMonthlyBudget_currencyCode
       ];
     }
-    if (requestMetadata_userOverrides_userId != null) {
-      _queryParams["requestMetadata.userOverrides.userId"] = [
-        requestMetadata_userOverrides_userId
-      ];
-    }
     if (minMonthlyBudget_currencyCode != null) {
       _queryParams["minMonthlyBudget.currencyCode"] = [
         minMonthlyBudget_currencyCode
       ];
     }
+    if (requestMetadata_userOverrides_userId != null) {
+      _queryParams["requestMetadata.userOverrides.userId"] = [
+        requestMetadata_userOverrides_userId
+      ];
+    }
     if (view != null) {
       _queryParams["view"] = [view];
     }
-    if (requestMetadata_locale != null) {
-      _queryParams["requestMetadata.locale"] = [requestMetadata_locale];
-    }
     if (address != null) {
       _queryParams["address"] = [address];
     }
+    if (requestMetadata_locale != null) {
+      _queryParams["requestMetadata.locale"] = [requestMetadata_locale];
+    }
     if (minMonthlyBudget_units != null) {
       _queryParams["minMonthlyBudget.units"] = [minMonthlyBudget_units];
     }
@@ -584,14 +578,14 @@
     if (maxMonthlyBudget_units != null) {
       _queryParams["maxMonthlyBudget.units"] = [maxMonthlyBudget_units];
     }
-    if (minMonthlyBudget_nanos != null) {
-      _queryParams["minMonthlyBudget.nanos"] = ["${minMonthlyBudget_nanos}"];
-    }
     if (requestMetadata_trafficSource_trafficSubId != null) {
       _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
         requestMetadata_trafficSource_trafficSubId
       ];
     }
+    if (minMonthlyBudget_nanos != null) {
+      _queryParams["minMonthlyBudget.nanos"] = ["${minMonthlyBudget_nanos}"];
+    }
     if (requestMetadata_partnersSessionId != null) {
       _queryParams["requestMetadata.partnersSessionId"] = [
         requestMetadata_partnersSessionId
@@ -612,6 +606,12 @@
     if (gpsMotivations != null) {
       _queryParams["gpsMotivations"] = gpsMotivations;
     }
+    if (languageCodes != null) {
+      _queryParams["languageCodes"] = languageCodes;
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -710,16 +710,6 @@
   /// - "CET_DIGITAL_SALES" : A CET_DIGITAL_SALES.
   /// - "CET_MOBILE_SITES" : A CET_MOBILE_SITES.
   ///
-  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
-  /// indicate where the traffic comes from.
-  /// An identifier has multiple letters created by a team which redirected the
-  /// traffic to us.
-  ///
-  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
-  /// instead of the user's ID.
-  ///
-  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
-  ///
   /// [requestMetadata_trafficSource_trafficSourceId] - Identifier to indicate
   /// where the traffic comes from.
   /// An identifier has multiple letters created by a team which redirected the
@@ -733,6 +723,16 @@
   /// [requestMetadata_experimentIds] - Experiment IDs the current request
   /// belongs to.
   ///
+  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
+  /// indicate where the traffic comes from.
+  /// An identifier has multiple letters created by a team which redirected the
+  /// traffic to us.
+  ///
+  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
+  /// instead of the user's ID.
+  ///
+  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -744,13 +744,13 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ExamToken> getToken(core.String examType,
-      {core.String requestMetadata_trafficSource_trafficSubId,
-      core.String requestMetadata_userOverrides_userId,
-      core.String requestMetadata_partnersSessionId,
-      core.String requestMetadata_trafficSource_trafficSourceId,
+      {core.String requestMetadata_trafficSource_trafficSourceId,
       core.String requestMetadata_locale,
       core.String requestMetadata_userOverrides_ipAddress,
       core.List<core.String> requestMetadata_experimentIds,
+      core.String requestMetadata_trafficSource_trafficSubId,
+      core.String requestMetadata_userOverrides_userId,
+      core.String requestMetadata_partnersSessionId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -762,21 +762,6 @@
     if (examType == null) {
       throw new core.ArgumentError("Parameter examType is required.");
     }
-    if (requestMetadata_trafficSource_trafficSubId != null) {
-      _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
-        requestMetadata_trafficSource_trafficSubId
-      ];
-    }
-    if (requestMetadata_userOverrides_userId != null) {
-      _queryParams["requestMetadata.userOverrides.userId"] = [
-        requestMetadata_userOverrides_userId
-      ];
-    }
-    if (requestMetadata_partnersSessionId != null) {
-      _queryParams["requestMetadata.partnersSessionId"] = [
-        requestMetadata_partnersSessionId
-      ];
-    }
     if (requestMetadata_trafficSource_trafficSourceId != null) {
       _queryParams["requestMetadata.trafficSource.trafficSourceId"] = [
         requestMetadata_trafficSource_trafficSourceId
@@ -794,6 +779,21 @@
       _queryParams["requestMetadata.experimentIds"] =
           requestMetadata_experimentIds;
     }
+    if (requestMetadata_trafficSource_trafficSubId != null) {
+      _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
+        requestMetadata_trafficSource_trafficSubId
+      ];
+    }
+    if (requestMetadata_userOverrides_userId != null) {
+      _queryParams["requestMetadata.userOverrides.userId"] = [
+        requestMetadata_userOverrides_userId
+      ];
+    }
+    if (requestMetadata_partnersSessionId != null) {
+      _queryParams["requestMetadata.partnersSessionId"] = [
+        requestMetadata_partnersSessionId
+      ];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -820,6 +820,27 @@
   ///
   /// Request parameters:
   ///
+  /// [requestMetadata_locale] - Locale to use for the current request.
+  ///
+  /// [requestMetadata_userOverrides_ipAddress] - IP address to use instead of
+  /// the user's geo-located IP address.
+  ///
+  /// [requestMetadata_experimentIds] - Experiment IDs the current request
+  /// belongs to.
+  ///
+  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
+  /// indicate where the traffic comes from.
+  /// An identifier has multiple letters created by a team which redirected the
+  /// traffic to us.
+  ///
+  /// [orderBy] - How to order Leads. Currently, only `create_time`
+  /// and `create_time desc` are supported
+  ///
+  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
+  /// instead of the user's ID.
+  ///
+  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
+  ///
   /// [pageToken] - A token identifying a page of results that the server
   /// returns.
   /// Typically, this is the value of `ListLeadsResponse.next_page_token`
@@ -835,27 +856,6 @@
   /// An identifier has multiple letters created by a team which redirected the
   /// traffic to us.
   ///
-  /// [requestMetadata_locale] - Locale to use for the current request.
-  ///
-  /// [requestMetadata_userOverrides_ipAddress] - IP address to use instead of
-  /// the user's geo-located IP address.
-  ///
-  /// [requestMetadata_experimentIds] - Experiment IDs the current request
-  /// belongs to.
-  ///
-  /// [orderBy] - How to order Leads. Currently, only `create_time`
-  /// and `create_time desc` are supported
-  ///
-  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
-  /// indicate where the traffic comes from.
-  /// An identifier has multiple letters created by a team which redirected the
-  /// traffic to us.
-  ///
-  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
-  /// instead of the user's ID.
-  ///
-  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -867,16 +867,16 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListLeadsResponse> list(
-      {core.String pageToken,
-      core.int pageSize,
-      core.String requestMetadata_trafficSource_trafficSourceId,
-      core.String requestMetadata_locale,
+      {core.String requestMetadata_locale,
       core.String requestMetadata_userOverrides_ipAddress,
       core.List<core.String> requestMetadata_experimentIds,
-      core.String orderBy,
       core.String requestMetadata_trafficSource_trafficSubId,
+      core.String orderBy,
       core.String requestMetadata_userOverrides_userId,
       core.String requestMetadata_partnersSessionId,
+      core.String pageToken,
+      core.int pageSize,
+      core.String requestMetadata_trafficSource_trafficSourceId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -885,17 +885,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
-    if (requestMetadata_trafficSource_trafficSourceId != null) {
-      _queryParams["requestMetadata.trafficSource.trafficSourceId"] = [
-        requestMetadata_trafficSource_trafficSourceId
-      ];
-    }
     if (requestMetadata_locale != null) {
       _queryParams["requestMetadata.locale"] = [requestMetadata_locale];
     }
@@ -908,14 +897,14 @@
       _queryParams["requestMetadata.experimentIds"] =
           requestMetadata_experimentIds;
     }
-    if (orderBy != null) {
-      _queryParams["orderBy"] = [orderBy];
-    }
     if (requestMetadata_trafficSource_trafficSubId != null) {
       _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
         requestMetadata_trafficSource_trafficSubId
       ];
     }
+    if (orderBy != null) {
+      _queryParams["orderBy"] = [orderBy];
+    }
     if (requestMetadata_userOverrides_userId != null) {
       _queryParams["requestMetadata.userOverrides.userId"] = [
         requestMetadata_userOverrides_userId
@@ -926,6 +915,17 @@
         requestMetadata_partnersSessionId
       ];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (requestMetadata_trafficSource_trafficSourceId != null) {
+      _queryParams["requestMetadata.trafficSource.trafficSourceId"] = [
+        requestMetadata_trafficSource_trafficSourceId
+      ];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -954,18 +954,6 @@
   ///
   /// Request parameters:
   ///
-  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
-  ///
-  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
-  /// instead of the user's ID.
-  ///
-  /// [requestMetadata_trafficSource_trafficSourceId] - Identifier to indicate
-  /// where the traffic comes from.
-  /// An identifier has multiple letters created by a team which redirected the
-  /// traffic to us.
-  ///
-  /// [requestMetadata_locale] - Locale to use for the current request.
-  ///
   /// [requestMetadata_userOverrides_ipAddress] - IP address to use instead of
   /// the user's geo-located IP address.
   ///
@@ -977,6 +965,18 @@
   /// An identifier has multiple letters created by a team which redirected the
   /// traffic to us.
   ///
+  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
+  /// instead of the user's ID.
+  ///
+  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
+  ///
+  /// [requestMetadata_trafficSource_trafficSourceId] - Identifier to indicate
+  /// where the traffic comes from.
+  /// An identifier has multiple letters created by a team which redirected the
+  /// traffic to us.
+  ///
+  /// [requestMetadata_locale] - Locale to use for the current request.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -988,13 +988,13 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListOffersResponse> list(
-      {core.String requestMetadata_partnersSessionId,
-      core.String requestMetadata_userOverrides_userId,
-      core.String requestMetadata_trafficSource_trafficSourceId,
-      core.String requestMetadata_locale,
-      core.String requestMetadata_userOverrides_ipAddress,
+      {core.String requestMetadata_userOverrides_ipAddress,
       core.List<core.String> requestMetadata_experimentIds,
       core.String requestMetadata_trafficSource_trafficSubId,
+      core.String requestMetadata_userOverrides_userId,
+      core.String requestMetadata_partnersSessionId,
+      core.String requestMetadata_trafficSource_trafficSourceId,
+      core.String requestMetadata_locale,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1003,24 +1003,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (requestMetadata_partnersSessionId != null) {
-      _queryParams["requestMetadata.partnersSessionId"] = [
-        requestMetadata_partnersSessionId
-      ];
-    }
-    if (requestMetadata_userOverrides_userId != null) {
-      _queryParams["requestMetadata.userOverrides.userId"] = [
-        requestMetadata_userOverrides_userId
-      ];
-    }
-    if (requestMetadata_trafficSource_trafficSourceId != null) {
-      _queryParams["requestMetadata.trafficSource.trafficSourceId"] = [
-        requestMetadata_trafficSource_trafficSourceId
-      ];
-    }
-    if (requestMetadata_locale != null) {
-      _queryParams["requestMetadata.locale"] = [requestMetadata_locale];
-    }
     if (requestMetadata_userOverrides_ipAddress != null) {
       _queryParams["requestMetadata.userOverrides.ipAddress"] = [
         requestMetadata_userOverrides_ipAddress
@@ -1035,6 +1017,24 @@
         requestMetadata_trafficSource_trafficSubId
       ];
     }
+    if (requestMetadata_userOverrides_userId != null) {
+      _queryParams["requestMetadata.userOverrides.userId"] = [
+        requestMetadata_userOverrides_userId
+      ];
+    }
+    if (requestMetadata_partnersSessionId != null) {
+      _queryParams["requestMetadata.partnersSessionId"] = [
+        requestMetadata_partnersSessionId
+      ];
+    }
+    if (requestMetadata_trafficSource_trafficSourceId != null) {
+      _queryParams["requestMetadata.trafficSource.trafficSourceId"] = [
+        requestMetadata_trafficSource_trafficSourceId
+      ];
+    }
+    if (requestMetadata_locale != null) {
+      _queryParams["requestMetadata.locale"] = [requestMetadata_locale];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1061,24 +1061,6 @@
   ///
   /// Request parameters:
   ///
-  /// [requestMetadata_experimentIds] - Experiment IDs the current request
-  /// belongs to.
-  ///
-  /// [entireCompany] - if true, show history for the entire company.  Requires
-  /// user to be admin.
-  ///
-  /// [orderBy] - Comma-separated list of fields to order by, e.g.:
-  /// "foo,bar,baz".
-  /// Use "foo desc" to sort descending.
-  /// List of valid field names is: name, offer_code, expiration_time, status,
-  ///     last_modified_time, sender_name, creation_time, country_code,
-  ///     offer_type.
-  ///
-  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
-  /// indicate where the traffic comes from.
-  /// An identifier has multiple letters created by a team which redirected the
-  /// traffic to us.
-  ///
   /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
   /// instead of the user's ID.
   ///
@@ -1098,6 +1080,24 @@
   /// [requestMetadata_userOverrides_ipAddress] - IP address to use instead of
   /// the user's geo-located IP address.
   ///
+  /// [requestMetadata_experimentIds] - Experiment IDs the current request
+  /// belongs to.
+  ///
+  /// [entireCompany] - if true, show history for the entire company.  Requires
+  /// user to be admin.
+  ///
+  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
+  /// indicate where the traffic comes from.
+  /// An identifier has multiple letters created by a team which redirected the
+  /// traffic to us.
+  ///
+  /// [orderBy] - Comma-separated list of fields to order by, e.g.:
+  /// "foo,bar,baz".
+  /// Use "foo desc" to sort descending.
+  /// List of valid field names is: name, offer_code, expiration_time, status,
+  ///     last_modified_time, sender_name, creation_time, country_code,
+  ///     offer_type.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1109,17 +1109,17 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListOffersHistoryResponse> list(
-      {core.List<core.String> requestMetadata_experimentIds,
-      core.bool entireCompany,
-      core.String orderBy,
-      core.String requestMetadata_trafficSource_trafficSubId,
-      core.String requestMetadata_userOverrides_userId,
+      {core.String requestMetadata_userOverrides_userId,
       core.String requestMetadata_partnersSessionId,
       core.String pageToken,
       core.int pageSize,
       core.String requestMetadata_trafficSource_trafficSourceId,
       core.String requestMetadata_locale,
       core.String requestMetadata_userOverrides_ipAddress,
+      core.List<core.String> requestMetadata_experimentIds,
+      core.bool entireCompany,
+      core.String requestMetadata_trafficSource_trafficSubId,
+      core.String orderBy,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1128,21 +1128,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (requestMetadata_experimentIds != null) {
-      _queryParams["requestMetadata.experimentIds"] =
-          requestMetadata_experimentIds;
-    }
-    if (entireCompany != null) {
-      _queryParams["entireCompany"] = ["${entireCompany}"];
-    }
-    if (orderBy != null) {
-      _queryParams["orderBy"] = [orderBy];
-    }
-    if (requestMetadata_trafficSource_trafficSubId != null) {
-      _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
-        requestMetadata_trafficSource_trafficSubId
-      ];
-    }
     if (requestMetadata_userOverrides_userId != null) {
       _queryParams["requestMetadata.userOverrides.userId"] = [
         requestMetadata_userOverrides_userId
@@ -1172,6 +1157,21 @@
         requestMetadata_userOverrides_ipAddress
       ];
     }
+    if (requestMetadata_experimentIds != null) {
+      _queryParams["requestMetadata.experimentIds"] =
+          requestMetadata_experimentIds;
+    }
+    if (entireCompany != null) {
+      _queryParams["entireCompany"] = ["${entireCompany}"];
+    }
+    if (requestMetadata_trafficSource_trafficSubId != null) {
+      _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
+        requestMetadata_trafficSource_trafficSubId
+      ];
+    }
+    if (orderBy != null) {
+      _queryParams["orderBy"] = [orderBy];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1265,11 +1265,11 @@
   /// An identifier has multiple letters created by a team which redirected the
   /// traffic to us.
   ///
+  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
+  ///
   /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
   /// instead of the user's ID.
   ///
-  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1286,8 +1286,8 @@
       core.String requestMetadata_userOverrides_ipAddress,
       core.List<core.String> requestMetadata_experimentIds,
       core.String requestMetadata_trafficSource_trafficSubId,
-      core.String requestMetadata_userOverrides_userId,
       core.String requestMetadata_partnersSessionId,
+      core.String requestMetadata_userOverrides_userId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1318,16 +1318,16 @@
         requestMetadata_trafficSource_trafficSubId
       ];
     }
-    if (requestMetadata_userOverrides_userId != null) {
-      _queryParams["requestMetadata.userOverrides.userId"] = [
-        requestMetadata_userOverrides_userId
-      ];
-    }
     if (requestMetadata_partnersSessionId != null) {
       _queryParams["requestMetadata.partnersSessionId"] = [
         requestMetadata_partnersSessionId
       ];
     }
+    if (requestMetadata_userOverrides_userId != null) {
+      _queryParams["requestMetadata.userOverrides.userId"] = [
+        requestMetadata_userOverrides_userId
+      ];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1358,6 +1358,14 @@
   /// [userId] - The ID of the user. Can be set to <code>me</code> to mean
   /// the currently authenticated user.
   ///
+  /// [requestMetadata_experimentIds] - Experiment IDs the current request
+  /// belongs to.
+  ///
+  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
+  /// indicate where the traffic comes from.
+  /// An identifier has multiple letters created by a team which redirected the
+  /// traffic to us.
+  ///
   /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
   /// instead of the user's ID.
   ///
@@ -1373,14 +1381,6 @@
   /// [requestMetadata_userOverrides_ipAddress] - IP address to use instead of
   /// the user's geo-located IP address.
   ///
-  /// [requestMetadata_experimentIds] - Experiment IDs the current request
-  /// belongs to.
-  ///
-  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
-  /// indicate where the traffic comes from.
-  /// An identifier has multiple letters created by a team which redirected the
-  /// traffic to us.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1393,13 +1393,13 @@
   /// this method will complete with the same error.
   async.Future<CompanyRelation> createCompanyRelation(
       CompanyRelation request, core.String userId,
-      {core.String requestMetadata_userOverrides_userId,
+      {core.List<core.String> requestMetadata_experimentIds,
+      core.String requestMetadata_trafficSource_trafficSubId,
+      core.String requestMetadata_userOverrides_userId,
       core.String requestMetadata_partnersSessionId,
       core.String requestMetadata_trafficSource_trafficSourceId,
       core.String requestMetadata_locale,
       core.String requestMetadata_userOverrides_ipAddress,
-      core.List<core.String> requestMetadata_experimentIds,
-      core.String requestMetadata_trafficSource_trafficSubId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1414,6 +1414,15 @@
     if (userId == null) {
       throw new core.ArgumentError("Parameter userId is required.");
     }
+    if (requestMetadata_experimentIds != null) {
+      _queryParams["requestMetadata.experimentIds"] =
+          requestMetadata_experimentIds;
+    }
+    if (requestMetadata_trafficSource_trafficSubId != null) {
+      _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
+        requestMetadata_trafficSource_trafficSubId
+      ];
+    }
     if (requestMetadata_userOverrides_userId != null) {
       _queryParams["requestMetadata.userOverrides.userId"] = [
         requestMetadata_userOverrides_userId
@@ -1437,15 +1446,6 @@
         requestMetadata_userOverrides_ipAddress
       ];
     }
-    if (requestMetadata_experimentIds != null) {
-      _queryParams["requestMetadata.experimentIds"] =
-          requestMetadata_experimentIds;
-    }
-    if (requestMetadata_trafficSource_trafficSubId != null) {
-      _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
-        requestMetadata_trafficSource_trafficSubId
-      ];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1470,16 +1470,6 @@
   /// [userId] - The ID of the user. Can be set to <code>me</code> to mean
   /// the currently authenticated user.
   ///
-  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
-  ///
-  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
-  /// instead of the user's ID.
-  ///
-  /// [requestMetadata_trafficSource_trafficSourceId] - Identifier to indicate
-  /// where the traffic comes from.
-  /// An identifier has multiple letters created by a team which redirected the
-  /// traffic to us.
-  ///
   /// [requestMetadata_locale] - Locale to use for the current request.
   ///
   /// [requestMetadata_userOverrides_ipAddress] - IP address to use instead of
@@ -1493,6 +1483,16 @@
   /// An identifier has multiple letters created by a team which redirected the
   /// traffic to us.
   ///
+  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
+  /// instead of the user's ID.
+  ///
+  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
+  ///
+  /// [requestMetadata_trafficSource_trafficSourceId] - Identifier to indicate
+  /// where the traffic comes from.
+  /// An identifier has multiple letters created by a team which redirected the
+  /// traffic to us.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1504,13 +1504,13 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<Empty> deleteCompanyRelation(core.String userId,
-      {core.String requestMetadata_partnersSessionId,
-      core.String requestMetadata_userOverrides_userId,
-      core.String requestMetadata_trafficSource_trafficSourceId,
-      core.String requestMetadata_locale,
+      {core.String requestMetadata_locale,
       core.String requestMetadata_userOverrides_ipAddress,
       core.List<core.String> requestMetadata_experimentIds,
       core.String requestMetadata_trafficSource_trafficSubId,
+      core.String requestMetadata_userOverrides_userId,
+      core.String requestMetadata_partnersSessionId,
+      core.String requestMetadata_trafficSource_trafficSourceId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1522,21 +1522,6 @@
     if (userId == null) {
       throw new core.ArgumentError("Parameter userId is required.");
     }
-    if (requestMetadata_partnersSessionId != null) {
-      _queryParams["requestMetadata.partnersSessionId"] = [
-        requestMetadata_partnersSessionId
-      ];
-    }
-    if (requestMetadata_userOverrides_userId != null) {
-      _queryParams["requestMetadata.userOverrides.userId"] = [
-        requestMetadata_userOverrides_userId
-      ];
-    }
-    if (requestMetadata_trafficSource_trafficSourceId != null) {
-      _queryParams["requestMetadata.trafficSource.trafficSourceId"] = [
-        requestMetadata_trafficSource_trafficSourceId
-      ];
-    }
     if (requestMetadata_locale != null) {
       _queryParams["requestMetadata.locale"] = [requestMetadata_locale];
     }
@@ -1554,6 +1539,21 @@
         requestMetadata_trafficSource_trafficSubId
       ];
     }
+    if (requestMetadata_userOverrides_userId != null) {
+      _queryParams["requestMetadata.userOverrides.userId"] = [
+        requestMetadata_userOverrides_userId
+      ];
+    }
+    if (requestMetadata_partnersSessionId != null) {
+      _queryParams["requestMetadata.partnersSessionId"] = [
+        requestMetadata_partnersSessionId
+      ];
+    }
+    if (requestMetadata_trafficSource_trafficSourceId != null) {
+      _queryParams["requestMetadata.trafficSource.trafficSourceId"] = [
+        requestMetadata_trafficSource_trafficSourceId
+      ];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1579,17 +1579,6 @@
   /// the currently
   /// authenticated user.
   ///
-  /// [userView] - Specifies what parts of the user information to return.
-  /// Possible string values are:
-  /// - "BASIC" : A BASIC.
-  /// - "PROFILE" : A PROFILE.
-  /// - "PUBLIC_PROFILE" : A PUBLIC_PROFILE.
-  ///
-  /// [requestMetadata_trafficSource_trafficSourceId] - Identifier to indicate
-  /// where the traffic comes from.
-  /// An identifier has multiple letters created by a team which redirected the
-  /// traffic to us.
-  ///
   /// [requestMetadata_locale] - Locale to use for the current request.
   ///
   /// [requestMetadata_userOverrides_ipAddress] - IP address to use instead of
@@ -1603,10 +1592,21 @@
   /// An identifier has multiple letters created by a team which redirected the
   /// traffic to us.
   ///
+  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
+  ///
   /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
   /// instead of the user's ID.
   ///
-  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
+  /// [userView] - Specifies what parts of the user information to return.
+  /// Possible string values are:
+  /// - "BASIC" : A BASIC.
+  /// - "PROFILE" : A PROFILE.
+  /// - "PUBLIC_PROFILE" : A PUBLIC_PROFILE.
+  ///
+  /// [requestMetadata_trafficSource_trafficSourceId] - Identifier to indicate
+  /// where the traffic comes from.
+  /// An identifier has multiple letters created by a team which redirected the
+  /// traffic to us.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1619,14 +1619,14 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<User> get(core.String userId,
-      {core.String userView,
-      core.String requestMetadata_trafficSource_trafficSourceId,
-      core.String requestMetadata_locale,
+      {core.String requestMetadata_locale,
       core.String requestMetadata_userOverrides_ipAddress,
       core.List<core.String> requestMetadata_experimentIds,
       core.String requestMetadata_trafficSource_trafficSubId,
-      core.String requestMetadata_userOverrides_userId,
       core.String requestMetadata_partnersSessionId,
+      core.String requestMetadata_userOverrides_userId,
+      core.String userView,
+      core.String requestMetadata_trafficSource_trafficSourceId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1638,14 +1638,6 @@
     if (userId == null) {
       throw new core.ArgumentError("Parameter userId is required.");
     }
-    if (userView != null) {
-      _queryParams["userView"] = [userView];
-    }
-    if (requestMetadata_trafficSource_trafficSourceId != null) {
-      _queryParams["requestMetadata.trafficSource.trafficSourceId"] = [
-        requestMetadata_trafficSource_trafficSourceId
-      ];
-    }
     if (requestMetadata_locale != null) {
       _queryParams["requestMetadata.locale"] = [requestMetadata_locale];
     }
@@ -1663,14 +1655,22 @@
         requestMetadata_trafficSource_trafficSubId
       ];
     }
+    if (requestMetadata_partnersSessionId != null) {
+      _queryParams["requestMetadata.partnersSessionId"] = [
+        requestMetadata_partnersSessionId
+      ];
+    }
     if (requestMetadata_userOverrides_userId != null) {
       _queryParams["requestMetadata.userOverrides.userId"] = [
         requestMetadata_userOverrides_userId
       ];
     }
-    if (requestMetadata_partnersSessionId != null) {
-      _queryParams["requestMetadata.partnersSessionId"] = [
-        requestMetadata_partnersSessionId
+    if (userView != null) {
+      _queryParams["userView"] = [userView];
+    }
+    if (requestMetadata_trafficSource_trafficSourceId != null) {
+      _queryParams["requestMetadata.trafficSource.trafficSourceId"] = [
+        requestMetadata_trafficSource_trafficSourceId
       ];
     }
     if ($fields != null) {
@@ -1695,6 +1695,11 @@
   ///
   /// Request parameters:
   ///
+  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
+  /// instead of the user's ID.
+  ///
+  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
+  ///
   /// [requestMetadata_trafficSource_trafficSourceId] - Identifier to indicate
   /// where the traffic comes from.
   /// An identifier has multiple letters created by a team which redirected the
@@ -1713,11 +1718,6 @@
   /// An identifier has multiple letters created by a team which redirected the
   /// traffic to us.
   ///
-  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
-  ///
-  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
-  /// instead of the user's ID.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1729,13 +1729,13 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<UserProfile> updateProfile(UserProfile request,
-      {core.String requestMetadata_trafficSource_trafficSourceId,
+      {core.String requestMetadata_userOverrides_userId,
+      core.String requestMetadata_partnersSessionId,
+      core.String requestMetadata_trafficSource_trafficSourceId,
       core.String requestMetadata_locale,
       core.String requestMetadata_userOverrides_ipAddress,
       core.List<core.String> requestMetadata_experimentIds,
       core.String requestMetadata_trafficSource_trafficSubId,
-      core.String requestMetadata_partnersSessionId,
-      core.String requestMetadata_userOverrides_userId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1747,6 +1747,16 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
+    if (requestMetadata_userOverrides_userId != null) {
+      _queryParams["requestMetadata.userOverrides.userId"] = [
+        requestMetadata_userOverrides_userId
+      ];
+    }
+    if (requestMetadata_partnersSessionId != null) {
+      _queryParams["requestMetadata.partnersSessionId"] = [
+        requestMetadata_partnersSessionId
+      ];
+    }
     if (requestMetadata_trafficSource_trafficSourceId != null) {
       _queryParams["requestMetadata.trafficSource.trafficSourceId"] = [
         requestMetadata_trafficSource_trafficSourceId
@@ -1769,16 +1779,6 @@
         requestMetadata_trafficSource_trafficSubId
       ];
     }
-    if (requestMetadata_partnersSessionId != null) {
-      _queryParams["requestMetadata.partnersSessionId"] = [
-        requestMetadata_partnersSessionId
-      ];
-    }
-    if (requestMetadata_userOverrides_userId != null) {
-      _queryParams["requestMetadata.userOverrides.userId"] = [
-        requestMetadata_userOverrides_userId
-      ];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2021,6 +2021,14 @@
   ///
   /// Request parameters:
   ///
+  /// [requestMetadata_experimentIds] - Experiment IDs the current request
+  /// belongs to.
+  ///
+  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
+  /// indicate where the traffic comes from.
+  /// An identifier has multiple letters created by a team which redirected the
+  /// traffic to us.
+  ///
   /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
   /// instead of the user's ID.
   ///
@@ -2040,14 +2048,6 @@
   /// Required with at least 1 value in FieldMask's paths.
   /// Only `state` and `adwords_customer_id` are currently supported.
   ///
-  /// [requestMetadata_experimentIds] - Experiment IDs the current request
-  /// belongs to.
-  ///
-  /// [requestMetadata_trafficSource_trafficSubId] - Second level identifier to
-  /// indicate where the traffic comes from.
-  /// An identifier has multiple letters created by a team which redirected the
-  /// traffic to us.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2059,14 +2059,14 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<Lead> updateLeads(Lead request,
-      {core.String requestMetadata_userOverrides_userId,
+      {core.List<core.String> requestMetadata_experimentIds,
+      core.String requestMetadata_trafficSource_trafficSubId,
+      core.String requestMetadata_userOverrides_userId,
       core.String requestMetadata_partnersSessionId,
       core.String requestMetadata_trafficSource_trafficSourceId,
       core.String requestMetadata_locale,
       core.String requestMetadata_userOverrides_ipAddress,
       core.String updateMask,
-      core.List<core.String> requestMetadata_experimentIds,
-      core.String requestMetadata_trafficSource_trafficSubId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -2078,6 +2078,15 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
+    if (requestMetadata_experimentIds != null) {
+      _queryParams["requestMetadata.experimentIds"] =
+          requestMetadata_experimentIds;
+    }
+    if (requestMetadata_trafficSource_trafficSubId != null) {
+      _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
+        requestMetadata_trafficSource_trafficSubId
+      ];
+    }
     if (requestMetadata_userOverrides_userId != null) {
       _queryParams["requestMetadata.userOverrides.userId"] = [
         requestMetadata_userOverrides_userId
@@ -2104,15 +2113,6 @@
     if (updateMask != null) {
       _queryParams["updateMask"] = [updateMask];
     }
-    if (requestMetadata_experimentIds != null) {
-      _queryParams["requestMetadata.experimentIds"] =
-          requestMetadata_experimentIds;
-    }
-    if (requestMetadata_trafficSource_trafficSubId != null) {
-      _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
-        requestMetadata_trafficSource_trafficSubId
-      ];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/people/v1.dart b/generated/googleapis/lib/people/v1.dart
index 05a9032..41ac831 100644
--- a/generated/googleapis/lib/people/v1.dart
+++ b/generated/googleapis/lib/people/v1.dart
@@ -653,23 +653,6 @@
   ///
   /// Request parameters:
   ///
-  /// [requestMask_includeField] - **Required.** Comma-separated list of person
-  /// fields to be included in the
-  /// response. Each path should start with `person.`: for example,
-  /// `person.names` or `person.photos`.
-  ///
-  /// [resourceNames] - The resource names of the people to provide information
-  /// about.
-  ///
-  /// - To get information about the authenticated user, specify `people/me`.
-  /// - To get information about a google account, specify
-  ///   `people/`<var>account_id</var>.
-  /// - To get information about a contact, specify the resource name that
-  ///   identifies the contact as returned by
-  /// [`people.connections.list`](/people/api/rest/v1/people.connections/list).
-  ///
-  /// You can include up to 50 resource names in one request.
-  ///
   /// [personFields] - **Required.** A field mask to restrict which fields on
   /// each person are
   /// returned. Valid values are:
@@ -701,6 +684,23 @@
   /// * taglines
   /// * urls
   ///
+  /// [requestMask_includeField] - **Required.** Comma-separated list of person
+  /// fields to be included in the
+  /// response. Each path should start with `person.`: for example,
+  /// `person.names` or `person.photos`.
+  ///
+  /// [resourceNames] - The resource names of the people to provide information
+  /// about.
+  ///
+  /// - To get information about the authenticated user, specify `people/me`.
+  /// - To get information about a google account, specify
+  ///   `people/`<var>account_id</var>.
+  /// - To get information about a contact, specify the resource name that
+  ///   identifies the contact as returned by
+  /// [`people.connections.list`](/people/api/rest/v1/people.connections/list).
+  ///
+  /// You can include up to 50 resource names in one request.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -712,9 +712,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<GetPeopleResponse> getBatchGet(
-      {core.String requestMask_includeField,
+      {core.String personFields,
+      core.String requestMask_includeField,
       core.List<core.String> resourceNames,
-      core.String personFields,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -723,15 +723,15 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
+    if (personFields != null) {
+      _queryParams["personFields"] = [personFields];
+    }
     if (requestMask_includeField != null) {
       _queryParams["requestMask.includeField"] = [requestMask_includeField];
     }
     if (resourceNames != null) {
       _queryParams["resourceNames"] = resourceNames;
     }
-    if (personFields != null) {
-      _queryParams["personFields"] = [personFields];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/poly/v1.dart b/generated/googleapis/lib/poly/v1.dart
index 8361f9c..553ff83 100644
--- a/generated/googleapis/lib/poly/v1.dart
+++ b/generated/googleapis/lib/poly/v1.dart
@@ -87,6 +87,26 @@
   ///
   /// Request parameters:
   ///
+  /// [pageToken] - Specifies a continuation token from a previous search whose
+  /// results were
+  /// split into multiple pages. To get the next page, submit the same request
+  /// specifying the value from next_page_token.
+  ///
+  /// [maxComplexity] - Returns assets that are of the specified complexity or
+  /// less. Defaults to
+  /// COMPLEX. For example, a request for
+  /// MEDIUM assets also includes
+  /// SIMPLE assets.
+  /// Possible string values are:
+  /// - "COMPLEXITY_UNSPECIFIED" : A COMPLEXITY_UNSPECIFIED.
+  /// - "COMPLEX" : A COMPLEX.
+  /// - "MEDIUM" : A MEDIUM.
+  /// - "SIMPLE" : A SIMPLE.
+  ///
+  /// [pageSize] - The maximum number of assets to be returned. This value must
+  /// be between `1`
+  /// and `100`. Defaults to `20`.
+  ///
   /// [keywords] - One or more search terms to be matched against all text that
   /// Poly has
   /// indexed for assets, which includes display_name,
@@ -109,26 +129,6 @@
   /// `scenes`,
   /// `technology`, and `transport`.
   ///
-  /// [pageToken] - Specifies a continuation token from a previous search whose
-  /// results were
-  /// split into multiple pages. To get the next page, submit the same request
-  /// specifying the value from next_page_token.
-  ///
-  /// [maxComplexity] - Returns assets that are of the specified complexity or
-  /// less. Defaults to
-  /// COMPLEX. For example, a request for
-  /// MEDIUM assets also includes
-  /// SIMPLE assets.
-  /// Possible string values are:
-  /// - "COMPLEXITY_UNSPECIFIED" : A COMPLEXITY_UNSPECIFIED.
-  /// - "COMPLEX" : A COMPLEX.
-  /// - "MEDIUM" : A MEDIUM.
-  /// - "SIMPLE" : A SIMPLE.
-  ///
-  /// [pageSize] - The maximum number of assets to be returned. This value must
-  /// be between `1`
-  /// and `100`. Defaults to `20`.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -140,14 +140,14 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListAssetsResponse> list(
-      {core.String keywords,
+      {core.String pageToken,
+      core.String maxComplexity,
+      core.int pageSize,
+      core.String keywords,
       core.String orderBy,
       core.String format,
       core.bool curated,
       core.String category,
-      core.String pageToken,
-      core.String maxComplexity,
-      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -156,6 +156,15 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (maxComplexity != null) {
+      _queryParams["maxComplexity"] = [maxComplexity];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if (keywords != null) {
       _queryParams["keywords"] = [keywords];
     }
@@ -171,15 +180,6 @@
     if (category != null) {
       _queryParams["category"] = [category];
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
-    if (maxComplexity != null) {
-      _queryParams["maxComplexity"] = [maxComplexity];
-    }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -226,10 +226,6 @@
   /// an OAuth token with the request.
   /// Value must have pattern "^users/[^/]+$".
   ///
-  /// [pageSize] - The maximum number of assets to be returned. This value must
-  /// be between `1`
-  /// and `100`. Defaults to `20`.
-  ///
   /// [visibility] - The visibility of the assets to be returned.
   /// Defaults to VISIBILITY_UNSPECIFIED which returns all assets.
   /// Possible string values are:
@@ -251,6 +247,10 @@
   /// specifying the value from
   /// next_page_token.
   ///
+  /// [pageSize] - The maximum number of assets to be returned. This value must
+  /// be between `1`
+  /// and `100`. Defaults to `20`.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -262,11 +262,11 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListUserAssetsResponse> list(core.String name,
-      {core.int pageSize,
-      core.String visibility,
+      {core.String visibility,
       core.String orderBy,
       core.String format,
       core.String pageToken,
+      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -278,9 +278,6 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (visibility != null) {
       _queryParams["visibility"] = [visibility];
     }
@@ -293,6 +290,9 @@
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/pubsub/v1.dart b/generated/googleapis/lib/pubsub/v1.dart
index 26c4f9f..a563695 100644
--- a/generated/googleapis/lib/pubsub/v1.dart
+++ b/generated/googleapis/lib/pubsub/v1.dart
@@ -733,13 +733,13 @@
   /// Format is `projects/{project}`.
   /// Value must have pattern "^projects/[^/]+$".
   ///
+  /// [pageSize] - Maximum number of subscriptions to return.
+  ///
   /// [pageToken] - The value returned by the last `ListSubscriptionsResponse`;
   /// indicates that
   /// this is a continuation of a prior `ListSubscriptions` call, and that the
   /// system should return the next page of data.
   ///
-  /// [pageSize] - Maximum number of subscriptions to return.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -751,7 +751,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListSubscriptionsResponse> list(core.String project,
-      {core.String pageToken, core.int pageSize, core.String $fields}) {
+      {core.int pageSize, core.String pageToken, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -762,12 +762,12 @@
     if (project == null) {
       throw new core.ArgumentError("Parameter project is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1395,13 +1395,13 @@
   /// Format is `projects/{project}`.
   /// Value must have pattern "^projects/[^/]+$".
   ///
+  /// [pageSize] - Maximum number of topics to return.
+  ///
   /// [pageToken] - The value returned by the last `ListTopicsResponse`;
   /// indicates that this is
   /// a continuation of a prior `ListTopics` call, and that the system should
   /// return the next page of data.
   ///
-  /// [pageSize] - Maximum number of topics to return.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1413,7 +1413,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListTopicsResponse> list(core.String project,
-      {core.String pageToken, core.int pageSize, core.String $fields}) {
+      {core.int pageSize, core.String pageToken, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1424,12 +1424,12 @@
     if (project == null) {
       throw new core.ArgumentError("Parameter project is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1630,13 +1630,13 @@
   /// Format is `projects/{project}/topics/{topic}`.
   /// Value must have pattern "^projects/[^/]+/topics/[^/]+$".
   ///
+  /// [pageSize] - Maximum number of snapshot names to return.
+  ///
   /// [pageToken] - The value returned by the last `ListTopicSnapshotsResponse`;
   /// indicates
   /// that this is a continuation of a prior `ListTopicSnapshots` call, and
   /// that the system should return the next page of data.
   ///
-  /// [pageSize] - Maximum number of snapshot names to return.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1648,7 +1648,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListTopicSnapshotsResponse> list(core.String topic,
-      {core.String pageToken, core.int pageSize, core.String $fields}) {
+      {core.int pageSize, core.String pageToken, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1659,12 +1659,12 @@
     if (topic == null) {
       throw new core.ArgumentError("Parameter topic is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/safebrowsing/v4.dart b/generated/googleapis/lib/safebrowsing/v4.dart
index 0c540d7..eb058bf 100644
--- a/generated/googleapis/lib/safebrowsing/v4.dart
+++ b/generated/googleapis/lib/safebrowsing/v4.dart
@@ -24,6 +24,7 @@
   EncodedUpdatesResourceApi get encodedUpdates =>
       new EncodedUpdatesResourceApi(_requester);
   FullHashesResourceApi get fullHashes => new FullHashesResourceApi(_requester);
+  ThreatHitsResourceApi get threatHits => new ThreatHitsResourceApi(_requester);
   ThreatListUpdatesResourceApi get threatListUpdates =>
       new ThreatListUpdatesResourceApi(_requester);
   ThreatListsResourceApi get threatLists =>
@@ -48,12 +49,12 @@
   ///
   /// [encodedRequest] - A serialized FindFullHashesRequest proto.
   ///
-  /// [clientVersion] - The version of the client implementation.
-  ///
   /// [clientId] - A client ID that (hopefully) uniquely identifies the client
   /// implementation
   /// of the Safe Browsing API.
   ///
+  /// [clientVersion] - The version of the client implementation.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -65,7 +66,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<FindFullHashesResponse> get(core.String encodedRequest,
-      {core.String clientVersion, core.String clientId, core.String $fields}) {
+      {core.String clientId, core.String clientVersion, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -76,12 +77,12 @@
     if (encodedRequest == null) {
       throw new core.ArgumentError("Parameter encodedRequest is required.");
     }
-    if (clientVersion != null) {
-      _queryParams["clientVersion"] = [clientVersion];
-    }
     if (clientId != null) {
       _queryParams["clientId"] = [clientId];
     }
+    if (clientVersion != null) {
+      _queryParams["clientVersion"] = [clientVersion];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -209,6 +210,55 @@
   }
 }
 
+class ThreatHitsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ThreatHitsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Reports a Safe Browsing threat list hit to Google. Only projects with
+  /// TRUSTED_REPORTER visibility can use this method.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Empty].
+  ///
+  /// Completes with a [commons.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<Empty> create(ThreatHit request, {core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v4/threatHits';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Empty.fromJson(data));
+  }
+}
+
 class ThreatListUpdatesResourceApi {
   final commons.ApiRequester _requester;
 
@@ -476,6 +526,27 @@
   }
 }
 
+/// A generic empty message that you can re-use to avoid defining duplicated
+/// empty messages in your APIs. A typical example is to use it as the request
+/// or the response type of an API method. For instance:
+///
+///     service Foo {
+///       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
+///     }
+///
+/// The JSON representation for `Empty` is empty JSON object `{}`.
+class Empty {
+  Empty();
+
+  Empty.fromJson(core.Map _json) {}
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    return _json;
+  }
+}
+
 /// Describes a Safe Browsing API update request. Clients can request updates
 /// for
 /// multiple lists in a single request.
@@ -1330,6 +1401,108 @@
   }
 }
 
+class ThreatHit {
+  /// Client-reported identification.
+  ClientInfo clientInfo;
+
+  /// The threat entry responsible for the hit. Full hash should be reported for
+  /// hash-based hits.
+  ThreatEntry entry;
+
+  /// The platform type reported.
+  /// Possible string values are:
+  /// - "PLATFORM_TYPE_UNSPECIFIED" : Unknown platform.
+  /// - "WINDOWS" : Threat posed to Windows.
+  /// - "LINUX" : Threat posed to Linux.
+  /// - "ANDROID" : Threat posed to Android.
+  /// - "OSX" : Threat posed to OS X.
+  /// - "IOS" : Threat posed to iOS.
+  /// - "ANY_PLATFORM" : Threat posed to at least one of the defined platforms.
+  /// - "ALL_PLATFORMS" : Threat posed to all defined platforms.
+  /// - "CHROME" : Threat posed to Chrome.
+  core.String platformType;
+
+  /// The resources related to the threat hit.
+  core.List<ThreatSource> resources;
+
+  /// The threat type reported.
+  /// Possible string values are:
+  /// - "THREAT_TYPE_UNSPECIFIED" : Unknown.
+  /// - "MALWARE" : Malware threat type.
+  /// - "SOCIAL_ENGINEERING" : Social engineering threat type.
+  /// - "UNWANTED_SOFTWARE" : Unwanted software threat type.
+  /// - "POTENTIALLY_HARMFUL_APPLICATION" : Potentially harmful application
+  /// threat type.
+  /// - "SOCIAL_ENGINEERING_INTERNAL" : Social engineering threat type for
+  /// internal use.
+  /// - "API_ABUSE" : API abuse threat type.
+  /// - "MALICIOUS_BINARY" : Malicious binary threat type.
+  /// - "CSD_WHITELIST" : Client side detection whitelist threat type.
+  /// - "CSD_DOWNLOAD_WHITELIST" : Client side download detection whitelist
+  /// threat type.
+  /// - "CLIENT_INCIDENT" : Client incident threat type.
+  /// - "CLIENT_INCIDENT_WHITELIST" : Whitelist used when detecting client
+  /// incident threats.
+  /// This enum was never launched and should be re-used for the next list.
+  /// - "APK_MALWARE_OFFLINE" : List used for offline APK checks in PAM.
+  /// - "SUBRESOURCE_FILTER" : Patterns to be used for activating the
+  /// subresource filter. Interstitial
+  /// will not be shown for patterns from this list.
+  core.String threatType;
+
+  /// Details about the user that encountered the threat.
+  UserInfo userInfo;
+
+  ThreatHit();
+
+  ThreatHit.fromJson(core.Map _json) {
+    if (_json.containsKey("clientInfo")) {
+      clientInfo = new ClientInfo.fromJson(_json["clientInfo"]);
+    }
+    if (_json.containsKey("entry")) {
+      entry = new ThreatEntry.fromJson(_json["entry"]);
+    }
+    if (_json.containsKey("platformType")) {
+      platformType = _json["platformType"];
+    }
+    if (_json.containsKey("resources")) {
+      resources = _json["resources"]
+          .map((value) => new ThreatSource.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("threatType")) {
+      threatType = _json["threatType"];
+    }
+    if (_json.containsKey("userInfo")) {
+      userInfo = new UserInfo.fromJson(_json["userInfo"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (clientInfo != null) {
+      _json["clientInfo"] = (clientInfo).toJson();
+    }
+    if (entry != null) {
+      _json["entry"] = (entry).toJson();
+    }
+    if (platformType != null) {
+      _json["platformType"] = platformType;
+    }
+    if (resources != null) {
+      _json["resources"] = resources.map((value) => (value).toJson()).toList();
+    }
+    if (threatType != null) {
+      _json["threatType"] = threatType;
+    }
+    if (userInfo != null) {
+      _json["userInfo"] = (userInfo).toJson();
+    }
+    return _json;
+  }
+}
+
 /// The information regarding one or more threats that a client submits when
 /// checking for matches in threat lists.
 class ThreatInfo {
@@ -1576,3 +1749,104 @@
     return _json;
   }
 }
+
+/// A single resource related to a threat hit.
+class ThreatSource {
+  /// Referrer of the resource. Only set if the referrer is available.
+  core.String referrer;
+
+  /// The remote IP of the resource in ASCII format. Either IPv4 or IPv6.
+  core.String remoteIp;
+
+  /// The type of source reported.
+  /// Possible string values are:
+  /// - "THREAT_SOURCE_TYPE_UNSPECIFIED" : Unknown.
+  /// - "MATCHING_URL" : The URL that matched the threat list (for which
+  /// GetFullHash returned a
+  /// valid hash).
+  /// - "TAB_URL" : The final top-level URL of the tab that the client was
+  /// browsing when the
+  /// match occurred.
+  /// - "TAB_REDIRECT" : A redirect URL that was fetched before hitting the
+  /// final TAB_URL.
+  /// - "TAB_RESOURCE" : A resource loaded within the final TAB_URL.
+  core.String type;
+
+  /// The URL of the resource.
+  core.String url;
+
+  ThreatSource();
+
+  ThreatSource.fromJson(core.Map _json) {
+    if (_json.containsKey("referrer")) {
+      referrer = _json["referrer"];
+    }
+    if (_json.containsKey("remoteIp")) {
+      remoteIp = _json["remoteIp"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    if (_json.containsKey("url")) {
+      url = _json["url"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (referrer != null) {
+      _json["referrer"] = referrer;
+    }
+    if (remoteIp != null) {
+      _json["remoteIp"] = remoteIp;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (url != null) {
+      _json["url"] = url;
+    }
+    return _json;
+  }
+}
+
+/// Details about the user that encountered the threat.
+class UserInfo {
+  /// The UN M.49 region code associated with the user's location.
+  core.String regionCode;
+
+  /// Unique user identifier defined by the client.
+  core.String userId;
+  core.List<core.int> get userIdAsBytes {
+    return convert.BASE64.decode(userId);
+  }
+
+  void set userIdAsBytes(core.List<core.int> _bytes) {
+    userId =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  UserInfo();
+
+  UserInfo.fromJson(core.Map _json) {
+    if (_json.containsKey("regionCode")) {
+      regionCode = _json["regionCode"];
+    }
+    if (_json.containsKey("userId")) {
+      userId = _json["userId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (regionCode != null) {
+      _json["regionCode"] = regionCode;
+    }
+    if (userId != null) {
+      _json["userId"] = userId;
+    }
+    return _json;
+  }
+}
diff --git a/generated/googleapis/lib/serviceconsumermanagement/v1.dart b/generated/googleapis/lib/serviceconsumermanagement/v1.dart
index ee0f683..e0742b3 100644
--- a/generated/googleapis/lib/serviceconsumermanagement/v1.dart
+++ b/generated/googleapis/lib/serviceconsumermanagement/v1.dart
@@ -208,12 +208,12 @@
   /// [name] - The name of the operation's parent resource.
   /// Value must have pattern "^operations$".
   ///
-  /// [filter] - The standard list filter.
-  ///
   /// [pageToken] - The standard list page token.
   ///
   /// [pageSize] - The standard list page size.
   ///
+  /// [filter] - The standard list filter.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -225,9 +225,9 @@
   /// If the used [http_1.Client] completes with an error when making a REST
   /// call, this method will complete with the same error.
   async.Future<ListOperationsResponse> list(core.String name,
-      {core.String filter,
-      core.String pageToken,
+      {core.String pageToken,
       core.int pageSize,
+      core.String filter,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -239,15 +239,15 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -5397,7 +5397,8 @@
 ///       - selector: "google.example.library.v1.LibraryService.CreateBook"
 ///         allow_unregistered_calls: true
 class UsageRule {
-  /// True, if the method allows unregistered calls; false otherwise.
+  /// If true, the selected method allows unregistered calls, e.g. calls
+  /// that don't identify any user or application.
   core.bool allowUnregisteredCalls;
 
   /// Selects the methods to which this rule applies. Use '*' to indicate all
@@ -5406,10 +5407,10 @@
   /// Refer to selector for syntax details.
   core.String selector;
 
-  /// True, if the method should skip service control. If so, no control plane
-  /// feature (like quota and billing) will be enabled.
-  /// This flag is used by ESP to allow some Endpoints customers to bypass
-  /// Google internal checks.
+  /// If true, the selected method should skip service control and the control
+  /// plane features, such as quota and billing, will not be available.
+  /// This flag is used by Google Cloud Endpoints to bypass checks for internal
+  /// methods, such as service health check methods.
   core.bool skipServiceControl;
 
   UsageRule();
diff --git a/generated/googleapis/lib/servicecontrol/v1.dart b/generated/googleapis/lib/servicecontrol/v1.dart
index 90aeb31..e0102b7 100644
--- a/generated/googleapis/lib/servicecontrol/v1.dart
+++ b/generated/googleapis/lib/servicecontrol/v1.dart
@@ -920,6 +920,13 @@
   /// Free-form text providing details on the error cause of the error.
   core.String detail;
 
+  /// Subject to whom this error applies. See the specific code enum for more
+  /// details on this field. For example:
+  ///     - “project:<project-id or project-number>”
+  ///     - “folder:<folder-id>”
+  ///     - “organization:<organization-id>”
+  core.String subject;
+
   CheckError();
 
   CheckError.fromJson(core.Map _json) {
@@ -929,6 +936,9 @@
     if (_json.containsKey("detail")) {
       detail = _json["detail"];
     }
+    if (_json.containsKey("subject")) {
+      subject = _json["subject"];
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -940,6 +950,9 @@
     if (detail != null) {
       _json["detail"] = detail;
     }
+    if (subject != null) {
+      _json["subject"] = subject;
+    }
     return _json;
   }
 }
diff --git a/generated/googleapis/lib/servicemanagement/v1.dart b/generated/googleapis/lib/servicemanagement/v1.dart
index 256673c..ff33286 100644
--- a/generated/googleapis/lib/servicemanagement/v1.dart
+++ b/generated/googleapis/lib/servicemanagement/v1.dart
@@ -636,10 +636,6 @@
   ///
   /// Request parameters:
   ///
-  /// [pageSize] - Requested size of the next page of data.
-  ///
-  /// [producerProjectId] - Include services produced by the specified project.
-  ///
   /// [consumerId] - Include services consumed by the specified consumer.
   ///
   /// The Google Service Management implementation accepts the following
@@ -650,6 +646,10 @@
   /// previous list
   /// call.
   ///
+  /// [pageSize] - Requested size of the next page of data.
+  ///
+  /// [producerProjectId] - Include services produced by the specified project.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -661,10 +661,10 @@
   /// If the used [http_1.Client] completes with an error when making a REST
   /// call, this method will complete with the same error.
   async.Future<ListServicesResponse> list(
-      {core.int pageSize,
-      core.String producerProjectId,
-      core.String consumerId,
+      {core.String consumerId,
       core.String pageToken,
+      core.int pageSize,
+      core.String producerProjectId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -673,18 +673,18 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
-    if (producerProjectId != null) {
-      _queryParams["producerProjectId"] = [producerProjectId];
-    }
     if (consumerId != null) {
       _queryParams["consumerId"] = [consumerId];
     }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (producerProjectId != null) {
+      _queryParams["producerProjectId"] = [producerProjectId];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1422,6 +1422,8 @@
   /// [overview](/service-management/overview)
   /// for naming requirements.  For example: `example.googleapis.com`.
   ///
+  /// [pageSize] - The max number of items to include in the response list.
+  ///
   /// [filter] - Use `filter` to return subset of rollouts.
   /// The following filters are supported:
   ///   -- To limit the results to only those in
@@ -1433,8 +1435,6 @@
   ///
   /// [pageToken] - The token of the page to retrieve.
   ///
-  /// [pageSize] - The max number of items to include in the response list.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1446,9 +1446,9 @@
   /// If the used [http_1.Client] completes with an error when making a REST
   /// call, this method will complete with the same error.
   async.Future<ListServiceRolloutsResponse> list(core.String serviceName,
-      {core.String filter,
+      {core.int pageSize,
+      core.String filter,
       core.String pageToken,
-      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1460,15 +1460,15 @@
     if (serviceName == null) {
       throw new core.ArgumentError("Parameter serviceName is required.");
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if (filter != null) {
       _queryParams["filter"] = [filter];
     }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -7156,7 +7156,8 @@
 ///       - selector: "google.example.library.v1.LibraryService.CreateBook"
 ///         allow_unregistered_calls: true
 class UsageRule {
-  /// True, if the method allows unregistered calls; false otherwise.
+  /// If true, the selected method allows unregistered calls, e.g. calls
+  /// that don't identify any user or application.
   core.bool allowUnregisteredCalls;
 
   /// Selects the methods to which this rule applies. Use '*' to indicate all
@@ -7165,10 +7166,10 @@
   /// Refer to selector for syntax details.
   core.String selector;
 
-  /// True, if the method should skip service control. If so, no control plane
-  /// feature (like quota and billing) will be enabled.
-  /// This flag is used by ESP to allow some Endpoints customers to bypass
-  /// Google internal checks.
+  /// If true, the selected method should skip service control and the control
+  /// plane features, such as quota and billing, will not be available.
+  /// This flag is used by Google Cloud Endpoints to bypass checks for internal
+  /// methods, such as service health check methods.
   core.bool skipServiceControl;
 
   UsageRule();
diff --git a/generated/googleapis/lib/serviceuser/v1.dart b/generated/googleapis/lib/serviceuser/v1.dart
index e262f19..20caab8 100644
--- a/generated/googleapis/lib/serviceuser/v1.dart
+++ b/generated/googleapis/lib/serviceuser/v1.dart
@@ -250,12 +250,12 @@
   ///
   /// Request parameters:
   ///
-  /// [pageSize] - Requested size of the next page of data.
-  ///
   /// [pageToken] - Token identifying which result to start with; returned by a
   /// previous list
   /// call.
   ///
+  /// [pageSize] - Requested size of the next page of data.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -267,7 +267,7 @@
   /// If the used [http_1.Client] completes with an error when making a REST
   /// call, this method will complete with the same error.
   async.Future<SearchServicesResponse> search(
-      {core.int pageSize, core.String pageToken, core.String $fields}) {
+      {core.String pageToken, core.int pageSize, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -275,12 +275,12 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -4581,7 +4581,8 @@
 ///       - selector: "google.example.library.v1.LibraryService.CreateBook"
 ///         allow_unregistered_calls: true
 class UsageRule {
-  /// True, if the method allows unregistered calls; false otherwise.
+  /// If true, the selected method allows unregistered calls, e.g. calls
+  /// that don't identify any user or application.
   core.bool allowUnregisteredCalls;
 
   /// Selects the methods to which this rule applies. Use '*' to indicate all
@@ -4590,10 +4591,10 @@
   /// Refer to selector for syntax details.
   core.String selector;
 
-  /// True, if the method should skip service control. If so, no control plane
-  /// feature (like quota and billing) will be enabled.
-  /// This flag is used by ESP to allow some Endpoints customers to bypass
-  /// Google internal checks.
+  /// If true, the selected method should skip service control and the control
+  /// plane features, such as quota and billing, will not be available.
+  /// This flag is used by Google Cloud Endpoints to bypass checks for internal
+  /// methods, such as service health check methods.
   core.bool skipServiceControl;
 
   UsageRule();
diff --git a/generated/googleapis/lib/sheets/v4.dart b/generated/googleapis/lib/sheets/v4.dart
index 81e9158..802fcc7 100644
--- a/generated/googleapis/lib/sheets/v4.dart
+++ b/generated/googleapis/lib/sheets/v4.dart
@@ -536,6 +536,19 @@
   /// data.
   /// Values will be appended after the last row of the table.
   ///
+  /// [includeValuesInResponse] - Determines if the update response should
+  /// include the values
+  /// of the cells that were appended. By default, responses
+  /// do not include the updated values.
+  ///
+  /// [responseValueRenderOption] - Determines how values in the response should
+  /// be rendered.
+  /// The default render option is ValueRenderOption.FORMATTED_VALUE.
+  /// Possible string values are:
+  /// - "FORMATTED_VALUE" : A FORMATTED_VALUE.
+  /// - "UNFORMATTED_VALUE" : A UNFORMATTED_VALUE.
+  /// - "FORMULA" : A FORMULA.
+  ///
   /// [insertDataOption] - How the input data should be inserted.
   /// Possible string values are:
   /// - "OVERWRITE" : A OVERWRITE.
@@ -557,19 +570,6 @@
   /// - "SERIAL_NUMBER" : A SERIAL_NUMBER.
   /// - "FORMATTED_STRING" : A FORMATTED_STRING.
   ///
-  /// [includeValuesInResponse] - Determines if the update response should
-  /// include the values
-  /// of the cells that were appended. By default, responses
-  /// do not include the updated values.
-  ///
-  /// [responseValueRenderOption] - Determines how values in the response should
-  /// be rendered.
-  /// The default render option is ValueRenderOption.FORMATTED_VALUE.
-  /// Possible string values are:
-  /// - "FORMATTED_VALUE" : A FORMATTED_VALUE.
-  /// - "UNFORMATTED_VALUE" : A UNFORMATTED_VALUE.
-  /// - "FORMULA" : A FORMULA.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -582,11 +582,11 @@
   /// this method will complete with the same error.
   async.Future<AppendValuesResponse> append(
       ValueRange request, core.String spreadsheetId, core.String range,
-      {core.String insertDataOption,
+      {core.bool includeValuesInResponse,
+      core.String responseValueRenderOption,
+      core.String insertDataOption,
       core.String valueInputOption,
       core.String responseDateTimeRenderOption,
-      core.bool includeValuesInResponse,
-      core.String responseValueRenderOption,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -604,6 +604,12 @@
     if (range == null) {
       throw new core.ArgumentError("Parameter range is required.");
     }
+    if (includeValuesInResponse != null) {
+      _queryParams["includeValuesInResponse"] = ["${includeValuesInResponse}"];
+    }
+    if (responseValueRenderOption != null) {
+      _queryParams["responseValueRenderOption"] = [responseValueRenderOption];
+    }
     if (insertDataOption != null) {
       _queryParams["insertDataOption"] = [insertDataOption];
     }
@@ -615,12 +621,6 @@
         responseDateTimeRenderOption
       ];
     }
-    if (includeValuesInResponse != null) {
-      _queryParams["includeValuesInResponse"] = ["${includeValuesInResponse}"];
-    }
-    if (responseValueRenderOption != null) {
-      _queryParams["responseValueRenderOption"] = [responseValueRenderOption];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1176,6 +1176,14 @@
   ///
   /// [range] - The A1 notation of the values to update.
   ///
+  /// [includeValuesInResponse] - Determines if the update response should
+  /// include the values
+  /// of the cells that were updated. By default, responses
+  /// do not include the updated values.
+  /// If the range to write was larger than than the range actually written,
+  /// the response will include all values in the requested range (excluding
+  /// trailing empty rows and columns).
+  ///
   /// [responseValueRenderOption] - Determines how values in the response should
   /// be rendered.
   /// The default render option is ValueRenderOption.FORMATTED_VALUE.
@@ -1200,14 +1208,6 @@
   /// - "SERIAL_NUMBER" : A SERIAL_NUMBER.
   /// - "FORMATTED_STRING" : A FORMATTED_STRING.
   ///
-  /// [includeValuesInResponse] - Determines if the update response should
-  /// include the values
-  /// of the cells that were updated. By default, responses
-  /// do not include the updated values.
-  /// If the range to write was larger than than the range actually written,
-  /// the response will include all values in the requested range (excluding
-  /// trailing empty rows and columns).
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1220,10 +1220,10 @@
   /// this method will complete with the same error.
   async.Future<UpdateValuesResponse> update(
       ValueRange request, core.String spreadsheetId, core.String range,
-      {core.String responseValueRenderOption,
+      {core.bool includeValuesInResponse,
+      core.String responseValueRenderOption,
       core.String valueInputOption,
       core.String responseDateTimeRenderOption,
-      core.bool includeValuesInResponse,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1241,6 +1241,9 @@
     if (range == null) {
       throw new core.ArgumentError("Parameter range is required.");
     }
+    if (includeValuesInResponse != null) {
+      _queryParams["includeValuesInResponse"] = ["${includeValuesInResponse}"];
+    }
     if (responseValueRenderOption != null) {
       _queryParams["responseValueRenderOption"] = [responseValueRenderOption];
     }
@@ -1252,9 +1255,6 @@
         responseDateTimeRenderOption
       ];
     }
-    if (includeValuesInResponse != null) {
-      _queryParams["includeValuesInResponse"] = ["${includeValuesInResponse}"];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2040,6 +2040,14 @@
 /// For example, if charting stock prices over time, multiple series may exist,
 /// one for the "Open Price", "High Price", "Low Price" and "Close Price".
 class BasicChartSeries {
+  /// The line style of this series. Valid only if the
+  /// chartType is AREA,
+  /// LINE, or SCATTER.
+  /// COMBO charts are also supported if the
+  /// series chart type is
+  /// AREA or LINE.
+  LineStyle lineStyle;
+
   /// The data being visualized in this chart series.
   ChartData series;
 
@@ -2091,6 +2099,9 @@
   BasicChartSeries();
 
   BasicChartSeries.fromJson(core.Map _json) {
+    if (_json.containsKey("lineStyle")) {
+      lineStyle = new LineStyle.fromJson(_json["lineStyle"]);
+    }
     if (_json.containsKey("series")) {
       series = new ChartData.fromJson(_json["series"]);
     }
@@ -2105,6 +2116,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (lineStyle != null) {
+      _json["lineStyle"] = (lineStyle).toJson();
+    }
     if (series != null) {
       _json["series"] = (series).toJson();
     }
@@ -4144,6 +4158,9 @@
   /// This field is optional.
   TextPosition titleTextPosition;
 
+  /// A waterfall chart specification.
+  WaterfallChartSpec waterfallChart;
+
   ChartSpec();
 
   ChartSpec.fromJson(core.Map _json) {
@@ -4200,6 +4217,9 @@
     if (_json.containsKey("titleTextPosition")) {
       titleTextPosition = new TextPosition.fromJson(_json["titleTextPosition"]);
     }
+    if (_json.containsKey("waterfallChart")) {
+      waterfallChart = new WaterfallChartSpec.fromJson(_json["waterfallChart"]);
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -4256,6 +4276,9 @@
     if (titleTextPosition != null) {
       _json["titleTextPosition"] = (titleTextPosition).toJson();
     }
+    if (waterfallChart != null) {
+      _json["waterfallChart"] = (waterfallChart).toJson();
+    }
     return _json;
   }
 }
@@ -6921,6 +6944,52 @@
   }
 }
 
+/// Properties that describe the style of a line.
+class LineStyle {
+  /// The dash type of the line.
+  /// Possible string values are:
+  /// - "LINE_DASH_TYPE_UNSPECIFIED" : Default value, do not use.
+  /// - "INVISIBLE" : No dash type, which is equivalent to a non-visible line.
+  /// - "CUSTOM" : A custom dash for a line. Modifying the exact custom dash
+  /// style is
+  /// currently unsupported.
+  /// - "SOLID" : A solid line.
+  /// - "DOTTED" : A dotted line.
+  /// - "MEDIUM_DASHED" : A dashed line where the dashes have "medium" length.
+  /// - "MEDIUM_DASHED_DOTTED" : A line that alternates between a "medium" dash
+  /// and a dot.
+  /// - "LONG_DASHED" : A dashed line where the dashes have "long" length.
+  /// - "LONG_DASHED_DOTTED" : A line that alternates between a "long" dash and
+  /// a dot.
+  core.String type;
+
+  /// The thickness of the line, in px.
+  core.int width;
+
+  LineStyle();
+
+  LineStyle.fromJson(core.Map _json) {
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    if (_json.containsKey("width")) {
+      width = _json["width"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (width != null) {
+      _json["width"] = width;
+    }
+    return _json;
+  }
+}
+
 /// A developer metadata entry and the data filters specified in the original
 /// request that matched it.
 class MatchedDeveloperMetadata {
@@ -10553,3 +10622,207 @@
     return _json;
   }
 }
+
+/// Styles for a waterfall chart column.
+class WaterfallChartColumnStyle {
+  /// The color of the column.
+  Color color;
+
+  /// The label of the column's legend.
+  core.String label;
+
+  WaterfallChartColumnStyle();
+
+  WaterfallChartColumnStyle.fromJson(core.Map _json) {
+    if (_json.containsKey("color")) {
+      color = new Color.fromJson(_json["color"]);
+    }
+    if (_json.containsKey("label")) {
+      label = _json["label"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (color != null) {
+      _json["color"] = (color).toJson();
+    }
+    if (label != null) {
+      _json["label"] = label;
+    }
+    return _json;
+  }
+}
+
+/// The domain of a waterfall chart.
+class WaterfallChartDomain {
+  /// The data of the WaterfallChartDomain.
+  ChartData data;
+
+  /// True to reverse the order of the domain values (horizontal axis).
+  core.bool reversed;
+
+  WaterfallChartDomain();
+
+  WaterfallChartDomain.fromJson(core.Map _json) {
+    if (_json.containsKey("data")) {
+      data = new ChartData.fromJson(_json["data"]);
+    }
+    if (_json.containsKey("reversed")) {
+      reversed = _json["reversed"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (data != null) {
+      _json["data"] = (data).toJson();
+    }
+    if (reversed != null) {
+      _json["reversed"] = reversed;
+    }
+    return _json;
+  }
+}
+
+/// A single series of data for a waterfall chart.
+class WaterfallChartSeries {
+  /// The data being visualized in this series.
+  ChartData data;
+
+  /// True to hide the subtotal column from the end of the series. By default,
+  /// a subtotal column will appear at the end of each series. Setting this
+  /// field to true will hide that subtotal column for this series.
+  core.bool hideTrailingSubtotal;
+
+  /// Styles for all columns in this series with negative values.
+  WaterfallChartColumnStyle negativeColumnsStyle;
+
+  /// Styles for all columns in this series with positive values.
+  WaterfallChartColumnStyle positiveColumnsStyle;
+
+  /// Styles for all subtotal columns in this series.
+  WaterfallChartColumnStyle subtotalColumnsStyle;
+
+  WaterfallChartSeries();
+
+  WaterfallChartSeries.fromJson(core.Map _json) {
+    if (_json.containsKey("data")) {
+      data = new ChartData.fromJson(_json["data"]);
+    }
+    if (_json.containsKey("hideTrailingSubtotal")) {
+      hideTrailingSubtotal = _json["hideTrailingSubtotal"];
+    }
+    if (_json.containsKey("negativeColumnsStyle")) {
+      negativeColumnsStyle =
+          new WaterfallChartColumnStyle.fromJson(_json["negativeColumnsStyle"]);
+    }
+    if (_json.containsKey("positiveColumnsStyle")) {
+      positiveColumnsStyle =
+          new WaterfallChartColumnStyle.fromJson(_json["positiveColumnsStyle"]);
+    }
+    if (_json.containsKey("subtotalColumnsStyle")) {
+      subtotalColumnsStyle =
+          new WaterfallChartColumnStyle.fromJson(_json["subtotalColumnsStyle"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (data != null) {
+      _json["data"] = (data).toJson();
+    }
+    if (hideTrailingSubtotal != null) {
+      _json["hideTrailingSubtotal"] = hideTrailingSubtotal;
+    }
+    if (negativeColumnsStyle != null) {
+      _json["negativeColumnsStyle"] = (negativeColumnsStyle).toJson();
+    }
+    if (positiveColumnsStyle != null) {
+      _json["positiveColumnsStyle"] = (positiveColumnsStyle).toJson();
+    }
+    if (subtotalColumnsStyle != null) {
+      _json["subtotalColumnsStyle"] = (subtotalColumnsStyle).toJson();
+    }
+    return _json;
+  }
+}
+
+/// A waterfall chart.
+class WaterfallChartSpec {
+  /// The line style for the connector lines.
+  LineStyle connectorLineStyle;
+
+  /// The domain data (horizontal axis) for the waterfall chart.
+  WaterfallChartDomain domain;
+
+  /// True to interpret the first value as a total.
+  core.bool firstValueIsTotal;
+
+  /// True to hide connector lines between columns.
+  core.bool hideConnectorLines;
+
+  /// The data this waterfall chart is visualizing.
+  core.List<WaterfallChartSeries> series;
+
+  /// The stacked type.
+  /// Possible string values are:
+  /// - "WATERFALL_STACKED_TYPE_UNSPECIFIED" : Default value, do not use.
+  /// - "STACKED" : Values corresponding to the same domain (horizontal axis)
+  /// value will be
+  /// stacked vertically.
+  /// - "SEQUENTIAL" : Series will spread out along the horizontal axis.
+  core.String stackedType;
+
+  WaterfallChartSpec();
+
+  WaterfallChartSpec.fromJson(core.Map _json) {
+    if (_json.containsKey("connectorLineStyle")) {
+      connectorLineStyle = new LineStyle.fromJson(_json["connectorLineStyle"]);
+    }
+    if (_json.containsKey("domain")) {
+      domain = new WaterfallChartDomain.fromJson(_json["domain"]);
+    }
+    if (_json.containsKey("firstValueIsTotal")) {
+      firstValueIsTotal = _json["firstValueIsTotal"];
+    }
+    if (_json.containsKey("hideConnectorLines")) {
+      hideConnectorLines = _json["hideConnectorLines"];
+    }
+    if (_json.containsKey("series")) {
+      series = _json["series"]
+          .map((value) => new WaterfallChartSeries.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("stackedType")) {
+      stackedType = _json["stackedType"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (connectorLineStyle != null) {
+      _json["connectorLineStyle"] = (connectorLineStyle).toJson();
+    }
+    if (domain != null) {
+      _json["domain"] = (domain).toJson();
+    }
+    if (firstValueIsTotal != null) {
+      _json["firstValueIsTotal"] = firstValueIsTotal;
+    }
+    if (hideConnectorLines != null) {
+      _json["hideConnectorLines"] = hideConnectorLines;
+    }
+    if (series != null) {
+      _json["series"] = series.map((value) => (value).toJson()).toList();
+    }
+    if (stackedType != null) {
+      _json["stackedType"] = stackedType;
+    }
+    return _json;
+  }
+}
diff --git a/generated/googleapis/lib/slides/v1.dart b/generated/googleapis/lib/slides/v1.dart
index 5786a36..c325f04 100644
--- a/generated/googleapis/lib/slides/v1.dart
+++ b/generated/googleapis/lib/slides/v1.dart
@@ -19,6 +19,10 @@
   /// View and manage the files in your Google Drive
   static const DriveScope = "https://www.googleapis.com/auth/drive";
 
+  /// View and manage Google Drive files and folders that you have opened or
+  /// created with this app
+  static const DriveFileScope = "https://www.googleapis.com/auth/drive.file";
+
   /// View the files in your Google Drive
   static const DriveReadonlyScope =
       "https://www.googleapis.com/auth/drive.readonly";
@@ -696,6 +700,15 @@
   /// ratio, the image is scaled and centered with respect to the size in order
   /// to maintain aspect ratio. The provided transform is applied after this
   /// operation.
+  ///
+  /// The PageElementProperties.size property is
+  /// optional. If you don't specify the size, the default size of the image is
+  /// used.
+  ///
+  /// The PageElementProperties.transform property is
+  /// optional. If you don't specify a transform, the image will be placed at
+  /// the
+  /// top left corner of the page.
   PageElementProperties elementProperties;
 
   /// A user-supplied object ID.
@@ -1663,6 +1676,15 @@
 /// Creates a video.
 class CreateVideoRequest {
   /// The element properties for the video.
+  ///
+  /// The PageElementProperties.size property is
+  /// optional. If you don't specify a size, a default size is chosen by the
+  /// server.
+  ///
+  /// The PageElementProperties.transform property is
+  /// optional. The transform must not have shear components.
+  /// If you don't specify a transform, the video will be placed at the top left
+  /// corner of the page.
   PageElementProperties elementProperties;
 
   /// The video source's unique identifier for this video.
diff --git a/generated/googleapis/lib/spanner/v1.dart b/generated/googleapis/lib/spanner/v1.dart
index 95d779b..d01694e 100644
--- a/generated/googleapis/lib/spanner/v1.dart
+++ b/generated/googleapis/lib/spanner/v1.dart
@@ -432,14 +432,6 @@
   /// requested. Values are of the form `projects/<project>`.
   /// Value must have pattern "^projects/[^/]+$".
   ///
-  /// [pageToken] - If non-empty, `page_token` should contain a
-  /// next_page_token from a
-  /// previous ListInstancesResponse.
-  ///
-  /// [pageSize] - Number of instances to be returned in the response. If 0 or
-  /// less, defaults
-  /// to the server's maximum allowed page size.
-  ///
   /// [filter] - An expression for filtering the results of the request. Filter
   /// rules are
   /// case insensitive. The fields eligible for filtering are:
@@ -461,6 +453,14 @@
   ///                                  it has the label "env" with its value
   ///                                  containing "dev".
   ///
+  /// [pageToken] - If non-empty, `page_token` should contain a
+  /// next_page_token from a
+  /// previous ListInstancesResponse.
+  ///
+  /// [pageSize] - Number of instances to be returned in the response. If 0 or
+  /// less, defaults
+  /// to the server's maximum allowed page size.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -472,9 +472,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListInstancesResponse> list(core.String parent,
-      {core.String pageToken,
+      {core.String filter,
+      core.String pageToken,
       core.int pageSize,
-      core.String filter,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -486,15 +486,15 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1407,12 +1407,12 @@
   /// Value must have pattern
   /// "^projects/[^/]+/instances/[^/]+/databases/[^/]+/operations$".
   ///
-  /// [pageToken] - The standard list page token.
-  ///
   /// [pageSize] - The standard list page size.
   ///
   /// [filter] - The standard list filter.
   ///
+  /// [pageToken] - The standard list page token.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1424,9 +1424,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListOperationsResponse> list(core.String name,
-      {core.String pageToken,
-      core.int pageSize,
+      {core.int pageSize,
       core.String filter,
+      core.String pageToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1438,15 +1438,15 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
     if (filter != null) {
       _queryParams["filter"] = [filter];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1877,10 +1877,6 @@
   /// Value must have pattern
   /// "^projects/[^/]+/instances/[^/]+/databases/[^/]+$".
   ///
-  /// [pageToken] - If non-empty, `page_token` should contain a
-  /// next_page_token from a previous
-  /// ListSessionsResponse.
-  ///
   /// [pageSize] - Number of sessions to be returned in the response. If 0 or
   /// less, defaults
   /// to the server's maximum allowed page size.
@@ -1897,6 +1893,10 @@
   ///   * `labels.env:dev` --> The session has the label "env" and the value of
   ///                        the label contains the string "dev".
   ///
+  /// [pageToken] - If non-empty, `page_token` should contain a
+  /// next_page_token from a previous
+  /// ListSessionsResponse.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1908,9 +1908,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListSessionsResponse> list(core.String database,
-      {core.String pageToken,
-      core.int pageSize,
+      {core.int pageSize,
       core.String filter,
+      core.String pageToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1922,15 +1922,15 @@
     if (database == null) {
       throw new core.ArgumentError("Parameter database is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
     if (filter != null) {
       _queryParams["filter"] = [filter];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/speech/v1.dart b/generated/googleapis/lib/speech/v1.dart
index d87effc..87a6d79 100644
--- a/generated/googleapis/lib/speech/v1.dart
+++ b/generated/googleapis/lib/speech/v1.dart
@@ -20,10 +20,6 @@
   static const CloudPlatformScope =
       "https://www.googleapis.com/auth/cloud-platform";
 
-  /// Convert speech to text using Google speech recognition technology
-  static const CloudSpeechScope =
-      "https://www.googleapis.com/auth/cloud-speech";
-
   final commons.ApiRequester _requester;
 
   OperationsResourceApi get operations => new OperationsResourceApi(_requester);
@@ -206,14 +202,14 @@
   ///
   /// Request parameters:
   ///
-  /// [pageSize] - The standard list page size.
-  ///
-  /// [filter] - The standard list filter.
-  ///
   /// [name] - The name of the operation's parent resource.
   ///
   /// [pageToken] - The standard list page token.
   ///
+  /// [pageSize] - The standard list page size.
+  ///
+  /// [filter] - The standard list filter.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -225,10 +221,10 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListOperationsResponse> list(
-      {core.int pageSize,
-      core.String filter,
-      core.String name,
+      {core.String name,
       core.String pageToken,
+      core.int pageSize,
+      core.String filter,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -237,18 +233,18 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
     if (name != null) {
       _queryParams["name"] = [name];
     }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/storage/v1.dart b/generated/googleapis/lib/storage/v1.dart
index 768acde..daad0f6 100644
--- a/generated/googleapis/lib/storage/v1.dart
+++ b/generated/googleapis/lib/storage/v1.dart
@@ -801,6 +801,66 @@
     return _response.then((data) => new Buckets.fromJson(data));
   }
 
+  /// Locks retention policy on a bucket.
+  ///
+  /// Request parameters:
+  ///
+  /// [bucket] - Name of a bucket.
+  ///
+  /// [ifMetagenerationMatch] - Makes the operation conditional on whether
+  /// bucket's current metageneration matches the given value.
+  ///
+  /// [userProject] - The project to be billed for this request. Required for
+  /// Requester Pays buckets.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Bucket].
+  ///
+  /// Completes with a [commons.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<Bucket> lockRetentionPolicy(
+      core.String bucket, core.String ifMetagenerationMatch,
+      {core.String userProject, core.String $fields}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = commons.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (bucket == null) {
+      throw new core.ArgumentError("Parameter bucket is required.");
+    }
+    if (ifMetagenerationMatch == null) {
+      throw new core.ArgumentError(
+          "Parameter ifMetagenerationMatch is required.");
+    }
+    _queryParams["ifMetagenerationMatch"] = [ifMetagenerationMatch];
+    if (userProject != null) {
+      _queryParams["userProject"] = [userProject];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'b/' +
+        commons.Escaper.ecapeVariable('$bucket') +
+        '/lockRetentionPolicy';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Bucket.fromJson(data));
+  }
+
   /// Updates a bucket. Changes to the bucket will be readable immediately after
   /// writing, but configuration changes may take time to propagate. This method
   /// supports patch semantics.
@@ -2882,7 +2942,8 @@
   /// [kmsKeyName] - Resource name of the Cloud KMS key, of the form
   /// projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key,
   /// that will be used to encrypt the object. Overrides the object metadata's
-  /// kms_key_name value, if any.
+  /// kms_key_name value, if any. Limited availability; usable only by enabled
+  /// projects.
   ///
   /// [name] - Name of the object. Required when the object metadata is not
   /// otherwise provided. Overrides the object metadata's name value, if any.
@@ -3916,7 +3977,7 @@
 
 /// The bucket's billing configuration.
 class BucketBilling {
-  /// When set to true, bucket is requester pays.
+  /// When set to true, Requester Pays is enabled for this bucket.
   core.bool requesterPays;
 
   BucketBilling();
@@ -3994,6 +4055,9 @@
 /// Encryption configuration used by default for newly inserted objects, when no
 /// encryption config is specified.
 class BucketEncryption {
+  /// A Cloud KMS key that will be used to encrypt objects inserted into this
+  /// bucket, if no encryption method is specified. Limited availability; usable
+  /// only by enabled projects.
   core.String defaultKmsKeyName;
 
   BucketEncryption();
@@ -4239,6 +4303,58 @@
   }
 }
 
+/// Defines the retention policy for a bucket. The Retention policy enforces a
+/// minimum retention time for all objects contained in the bucket, based on
+/// their creation time. Any attempt to overwrite or delete objects younger than
+/// the retention period will result in a PERMISSION_DENIED error. An unlocked
+/// retention policy can be modified or removed from the bucket via the
+/// UpdateBucketMetadata RPC. A locked retention policy cannot be removed or
+/// shortened in duration for the lifetime of the bucket. Attempting to remove
+/// or decrease period of a locked retention policy will result in a
+/// PERMISSION_DENIED error.
+class BucketRetentionPolicy {
+  /// The time from which policy was enforced and effective. RFC 3339 format.
+  core.DateTime effectiveTime;
+
+  /// Once locked, an object retention policy cannot be modified.
+  core.bool isLocked;
+
+  /// Specifies the duration that objects need to be retained. Retention
+  /// duration must be greater than zero and less than 100 years. Note that
+  /// enforcement of retention periods less than a day is not guaranteed. Such
+  /// periods should only be used for testing purposes.
+  core.String retentionPeriod;
+
+  BucketRetentionPolicy();
+
+  BucketRetentionPolicy.fromJson(core.Map _json) {
+    if (_json.containsKey("effectiveTime")) {
+      effectiveTime = core.DateTime.parse(_json["effectiveTime"]);
+    }
+    if (_json.containsKey("isLocked")) {
+      isLocked = _json["isLocked"];
+    }
+    if (_json.containsKey("retentionPeriod")) {
+      retentionPeriod = _json["retentionPeriod"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (effectiveTime != null) {
+      _json["effectiveTime"] = (effectiveTime).toIso8601String();
+    }
+    if (isLocked != null) {
+      _json["isLocked"] = isLocked;
+    }
+    if (retentionPeriod != null) {
+      _json["retentionPeriod"] = retentionPeriod;
+    }
+    return _json;
+  }
+}
+
 /// The bucket's versioning configuration.
 class BucketVersioning {
   /// While set to true, versioning is fully enabled for this bucket.
@@ -4312,6 +4428,19 @@
   /// The bucket's Cross-Origin Resource Sharing (CORS) configuration.
   core.List<BucketCors> cors;
 
+  /// Defines the default value for Event-Based hold on newly created objects in
+  /// this bucket. Event-Based hold is a way to retain objects indefinitely
+  /// until an event occurs, signified by the hold's release. After being
+  /// released, such objects will be subject to bucket-level retention (if any).
+  /// One sample use case of this flag is for banks to hold loan documents for
+  /// at least 3 years after loan is paid in full. Here bucket-level retention
+  /// is 3 years and the event is loan being paid in full. In this example these
+  /// objects will be held intact for any number of years until the event has
+  /// occurred (hold is released) and then 3 more years after that. Objects
+  /// under Event-Based hold cannot be deleted, overwritten or archived until
+  /// the hold is removed.
+  core.bool defaultEventBasedHold;
+
   /// Default access controls to apply to new objects when no ACL is provided.
   core.List<ObjectAccessControl> defaultObjectAcl;
 
@@ -4322,7 +4451,7 @@
   /// HTTP 1.1 Entity tag for the bucket.
   core.String etag;
 
-  /// The ID of the bucket. For buckets, the id and name properities are the
+  /// The ID of the bucket. For buckets, the id and name properties are the
   /// same.
   core.String id;
 
@@ -4357,6 +4486,17 @@
   /// The project number of the project the bucket belongs to.
   core.String projectNumber;
 
+  /// Defines the retention policy for a bucket. The Retention policy enforces a
+  /// minimum retention time for all objects contained in the bucket, based on
+  /// their creation time. Any attempt to overwrite or delete objects younger
+  /// than the retention period will result in a PERMISSION_DENIED error. An
+  /// unlocked retention policy can be modified or removed from the bucket via
+  /// the UpdateBucketMetadata RPC. A locked retention policy cannot be removed
+  /// or shortened in duration for the lifetime of the bucket. Attempting to
+  /// remove or decrease period of a locked retention policy will result in a
+  /// PERMISSION_DENIED error.
+  BucketRetentionPolicy retentionPolicy;
+
   /// The URI of this bucket.
   core.String selfLink;
 
@@ -4398,6 +4538,9 @@
       cors =
           _json["cors"].map((value) => new BucketCors.fromJson(value)).toList();
     }
+    if (_json.containsKey("defaultEventBasedHold")) {
+      defaultEventBasedHold = _json["defaultEventBasedHold"];
+    }
     if (_json.containsKey("defaultObjectAcl")) {
       defaultObjectAcl = _json["defaultObjectAcl"]
           .map((value) => new ObjectAccessControl.fromJson(value))
@@ -4439,6 +4582,10 @@
     if (_json.containsKey("projectNumber")) {
       projectNumber = _json["projectNumber"];
     }
+    if (_json.containsKey("retentionPolicy")) {
+      retentionPolicy =
+          new BucketRetentionPolicy.fromJson(_json["retentionPolicy"]);
+    }
     if (_json.containsKey("selfLink")) {
       selfLink = _json["selfLink"];
     }
@@ -4471,6 +4618,9 @@
     if (cors != null) {
       _json["cors"] = cors.map((value) => (value).toJson()).toList();
     }
+    if (defaultEventBasedHold != null) {
+      _json["defaultEventBasedHold"] = defaultEventBasedHold;
+    }
     if (defaultObjectAcl != null) {
       _json["defaultObjectAcl"] =
           defaultObjectAcl.map((value) => (value).toJson()).toList();
@@ -4511,6 +4661,9 @@
     if (projectNumber != null) {
       _json["projectNumber"] = projectNumber;
     }
+    if (retentionPolicy != null) {
+      _json["retentionPolicy"] = (retentionPolicy).toJson();
+    }
     if (selfLink != null) {
       _json["selfLink"] = selfLink;
     }
@@ -5234,6 +5387,17 @@
   /// HTTP 1.1 Entity tag for the object.
   core.String etag;
 
+  /// Defines the Event-Based hold for an object. Event-Based hold is a way to
+  /// retain objects indefinitely until an event occurs, signified by the hold's
+  /// release. After being released, such objects will be subject to
+  /// bucket-level retention (if any). One sample use case of this flag is for
+  /// banks to hold loan documents for at least 3 years after loan is paid in
+  /// full. Here bucket-level retention is 3 years and the event is loan being
+  /// paid in full. In this example these objects will be held intact for any
+  /// number of years until the event has occurred (hold is released) and then 3
+  /// more years after that.
+  core.bool eventBasedHold;
+
   /// The content generation of this object. Used for object versioning.
   core.String generation;
 
@@ -5245,7 +5409,7 @@
   core.String kind;
 
   /// Cloud KMS Key used to encrypt this object, if the object is encrypted by
-  /// such a key.
+  /// such a key. Limited availability; usable only by enabled projects.
   core.String kmsKeyName;
 
   /// MD5 hash of the data; encoded using base64. For more information about
@@ -5270,6 +5434,14 @@
   /// The owner of the object. This will always be the uploader of the object.
   ObjectOwner owner;
 
+  /// Specifies the earliest time that the object's retention period expires.
+  /// This value is server-determined and is in RFC 3339 format. Note 1: This
+  /// field is not provided for objects with an active Event-Based hold, since
+  /// retention expiration is unknown until the hold is removed. Note 2: This
+  /// value can be provided even when TemporaryHold is set (so that the user can
+  /// reason about policy without having to first unset the TemporaryHold).
+  core.DateTime retentionExpirationTime;
+
   /// The link to this object.
   core.String selfLink;
 
@@ -5279,6 +5451,13 @@
   /// Storage class of the object.
   core.String storageClass;
 
+  /// Defines the temporary hold for an object. This flag is used to enforce a
+  /// temporary hold on an object. While it is set to true, the object is
+  /// protected against deletion and overwrites. A common use case of this flag
+  /// is regulatory investigations where objects need to be retained while the
+  /// investigation is ongoing.
+  core.bool temporaryHold;
+
   /// The creation time of the object in RFC 3339 format.
   core.DateTime timeCreated;
 
@@ -5332,6 +5511,9 @@
     if (_json.containsKey("etag")) {
       etag = _json["etag"];
     }
+    if (_json.containsKey("eventBasedHold")) {
+      eventBasedHold = _json["eventBasedHold"];
+    }
     if (_json.containsKey("generation")) {
       generation = _json["generation"];
     }
@@ -5362,6 +5544,10 @@
     if (_json.containsKey("owner")) {
       owner = new ObjectOwner.fromJson(_json["owner"]);
     }
+    if (_json.containsKey("retentionExpirationTime")) {
+      retentionExpirationTime =
+          core.DateTime.parse(_json["retentionExpirationTime"]);
+    }
     if (_json.containsKey("selfLink")) {
       selfLink = _json["selfLink"];
     }
@@ -5371,6 +5557,9 @@
     if (_json.containsKey("storageClass")) {
       storageClass = _json["storageClass"];
     }
+    if (_json.containsKey("temporaryHold")) {
+      temporaryHold = _json["temporaryHold"];
+    }
     if (_json.containsKey("timeCreated")) {
       timeCreated = core.DateTime.parse(_json["timeCreated"]);
     }
@@ -5422,6 +5611,9 @@
     if (etag != null) {
       _json["etag"] = etag;
     }
+    if (eventBasedHold != null) {
+      _json["eventBasedHold"] = eventBasedHold;
+    }
     if (generation != null) {
       _json["generation"] = generation;
     }
@@ -5452,6 +5644,10 @@
     if (owner != null) {
       _json["owner"] = (owner).toJson();
     }
+    if (retentionExpirationTime != null) {
+      _json["retentionExpirationTime"] =
+          (retentionExpirationTime).toIso8601String();
+    }
     if (selfLink != null) {
       _json["selfLink"] = selfLink;
     }
@@ -5461,6 +5657,9 @@
     if (storageClass != null) {
       _json["storageClass"] = storageClass;
     }
+    if (temporaryHold != null) {
+      _json["temporaryHold"] = temporaryHold;
+    }
     if (timeCreated != null) {
       _json["timeCreated"] = (timeCreated).toIso8601String();
     }
diff --git a/generated/googleapis/lib/storagetransfer/v1.dart b/generated/googleapis/lib/storagetransfer/v1.dart
index cb1437d..9acdf87 100644
--- a/generated/googleapis/lib/storagetransfer/v1.dart
+++ b/generated/googleapis/lib/storagetransfer/v1.dart
@@ -201,8 +201,6 @@
   ///
   /// Request parameters:
   ///
-  /// [pageSize] - The list page size. The max allowed value is 256.
-  ///
   /// [filter] - A list of query parameters specified as JSON text in the form
   /// of
   /// {"project_id":"my_project_id",
@@ -216,6 +214,8 @@
   ///
   /// [pageToken] - The list page token.
   ///
+  /// [pageSize] - The list page size. The max allowed value is 256.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -227,9 +227,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListTransferJobsResponse> list(
-      {core.int pageSize,
-      core.String filter,
+      {core.String filter,
       core.String pageToken,
+      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -238,15 +238,15 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (filter != null) {
       _queryParams["filter"] = [filter];
     }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -472,8 +472,6 @@
   /// [name] - The value `transferOperations`.
   /// Value must have pattern "^transferOperations$".
   ///
-  /// [pageToken] - The list page token.
-  ///
   /// [pageSize] - The list page size. The max allowed value is 256.
   ///
   /// [filter] - A list of query parameters specified as JSON text in the form
@@ -484,6 +482,8 @@
   /// must be specified with array notation. `job_names`, `operation_names`, and
   /// `transfer_statuses` are optional.
   ///
+  /// [pageToken] - The list page token.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -495,9 +495,9 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListOperationsResponse> list(core.String name,
-      {core.String pageToken,
-      core.int pageSize,
+      {core.int pageSize,
       core.String filter,
+      core.String pageToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -509,15 +509,15 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
     if (filter != null) {
       _queryParams["filter"] = [filter];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/streetviewpublish/v1.dart b/generated/googleapis/lib/streetviewpublish/v1.dart
index 860878b..1f68f63 100644
--- a/generated/googleapis/lib/streetviewpublish/v1.dart
+++ b/generated/googleapis/lib/streetviewpublish/v1.dart
@@ -157,6 +157,8 @@
   /// create the requested Photo.
   /// * google.rpc.Code.NOT_FOUND if the requested
   /// Photo does not exist.
+  /// * google.rpc.Code.UNAVAILABLE if the requested
+  /// Photo is still being indexed.
   ///
   /// Request parameters:
   ///
@@ -291,6 +293,8 @@
   /// create the requested photo.
   /// * google.rpc.Code.INVALID_ARGUMENT if the request is malformed.
   /// * google.rpc.Code.NOT_FOUND if the requested photo does not exist.
+  /// * google.rpc.Code.UNAVAILABLE if the requested
+  /// Photo is still being indexed.
   ///
   /// [request] - The metadata request object.
   ///
@@ -583,6 +587,9 @@
   /// Lists all the Photos that belong to
   /// the user.
   ///
+  /// <aside class="note"><b>Note:</b> Recently created photos that are still
+  /// being indexed are not returned in the response.</aside>
+  ///
   /// Request parameters:
   ///
   /// [filter] - The filter expression. For example:
diff --git a/generated/googleapis/lib/testing/v1.dart b/generated/googleapis/lib/testing/v1.dart
index f7a12ac..c854641 100644
--- a/generated/googleapis/lib/testing/v1.dart
+++ b/generated/googleapis/lib/testing/v1.dart
@@ -833,6 +833,12 @@
   /// Optional
   core.List<RoboDirective> roboDirectives;
 
+  /// The intents used to launch the app for the crawl.
+  /// If none are provided, then the main launcher activity is launched.
+  /// If some are provided, then only those provided are launched (the main
+  /// launcher activity must be provided explicitly).
+  core.List<RoboStartingIntent> startingIntents;
+
   AndroidRoboTest();
 
   AndroidRoboTest.fromJson(core.Map _json) {
@@ -856,6 +862,11 @@
           .map((value) => new RoboDirective.fromJson(value))
           .toList();
     }
+    if (_json.containsKey("startingIntents")) {
+      startingIntents = _json["startingIntents"]
+          .map((value) => new RoboStartingIntent.fromJson(value))
+          .toList();
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -880,6 +891,10 @@
       _json["roboDirectives"] =
           roboDirectives.map((value) => (value).toJson()).toList();
     }
+    if (startingIntents != null) {
+      _json["startingIntents"] =
+          startingIntents.map((value) => (value).toJson()).toList();
+    }
     return _json;
   }
 }
@@ -1482,6 +1497,19 @@
   }
 }
 
+/// Specifies an intent that starts the main launcher activity.
+class LauncherActivityIntent {
+  LauncherActivityIntent();
+
+  LauncherActivityIntent.fromJson(core.Map _json) {}
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    return _json;
+  }
+}
+
 /// A location/region designation for language.
 class Locale {
   /// The id for this locale.
@@ -1799,6 +1827,80 @@
   }
 }
 
+/// Message for specifying the start activities to crawl
+class RoboStartingIntent {
+  LauncherActivityIntent launcherActivity;
+  StartActivityIntent startActivity;
+
+  RoboStartingIntent();
+
+  RoboStartingIntent.fromJson(core.Map _json) {
+    if (_json.containsKey("launcherActivity")) {
+      launcherActivity =
+          new LauncherActivityIntent.fromJson(_json["launcherActivity"]);
+    }
+    if (_json.containsKey("startActivity")) {
+      startActivity = new StartActivityIntent.fromJson(_json["startActivity"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (launcherActivity != null) {
+      _json["launcherActivity"] = (launcherActivity).toJson();
+    }
+    if (startActivity != null) {
+      _json["startActivity"] = (startActivity).toJson();
+    }
+    return _json;
+  }
+}
+
+/// A starting intent specified by an action, uri, and categories.
+class StartActivityIntent {
+  /// Action name.
+  /// Required for START_ACTIVITY.
+  core.String action;
+
+  /// Intent categories to set on the intent.
+  /// Optional.
+  core.List<core.String> categories;
+
+  /// URI for the action.
+  /// Optional.
+  core.String uri;
+
+  StartActivityIntent();
+
+  StartActivityIntent.fromJson(core.Map _json) {
+    if (_json.containsKey("action")) {
+      action = _json["action"];
+    }
+    if (_json.containsKey("categories")) {
+      categories = _json["categories"];
+    }
+    if (_json.containsKey("uri")) {
+      uri = _json["uri"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (action != null) {
+      _json["action"] = action;
+    }
+    if (categories != null) {
+      _json["categories"] = categories;
+    }
+    if (uri != null) {
+      _json["uri"] = uri;
+    }
+    return _json;
+  }
+}
+
 /// Additional details about the progress of the running test.
 class TestDetails {
   /// If the TestState is ERROR, then this string will contain human-readable
diff --git a/generated/googleapis/lib/translate/v2.dart b/generated/googleapis/lib/translate/v2.dart
index d4a17e0..f9ff36f 100644
--- a/generated/googleapis/lib/translate/v2.dart
+++ b/generated/googleapis/lib/translate/v2.dart
@@ -143,12 +143,12 @@
   ///
   /// Request parameters:
   ///
+  /// [model] - The model type for which supported languages should be returned.
+  ///
   /// [target] - The language to use to return localized, human readable names
   /// of supported
   /// languages.
   ///
-  /// [model] - The model type for which supported languages should be returned.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -160,7 +160,7 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<LanguagesListResponse> list(
-      {core.String target, core.String model, core.String $fields}) {
+      {core.String model, core.String target, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -168,12 +168,12 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (target != null) {
-      _queryParams["target"] = [target];
-    }
     if (model != null) {
       _queryParams["model"] = [model];
     }
+    if (target != null) {
+      _queryParams["target"] = [target];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -207,6 +207,10 @@
   /// one of the
   /// language codes listed in Language Support.
   ///
+  /// [model] - The `model` type requested for this translation. Valid values
+  /// are
+  /// listed in public documentation.
+  ///
   /// [source] - The language of the source text, set to one of the language
   /// codes listed in
   /// Language Support. If the source language is not specified, the API will
@@ -222,10 +226,6 @@
   /// - "html" : Specifies the input is in HTML
   /// - "text" : Specifies the input is in plain textual format
   ///
-  /// [model] - The `model` type requested for this translation. Valid values
-  /// are
-  /// listed in public documentation.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -238,10 +238,10 @@
   /// this method will complete with the same error.
   async.Future<TranslationsListResponse> list(
       core.List<core.String> q, core.String target,
-      {core.String source,
+      {core.String model,
+      core.String source,
       core.List<core.String> cid,
       core.String format,
-      core.String model,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -258,6 +258,9 @@
       throw new core.ArgumentError("Parameter target is required.");
     }
     _queryParams["target"] = [target];
+    if (model != null) {
+      _queryParams["model"] = [model];
+    }
     if (source != null) {
       _queryParams["source"] = [source];
     }
@@ -267,9 +270,6 @@
     if (format != null) {
       _queryParams["format"] = [format];
     }
-    if (model != null) {
-      _queryParams["model"] = [model];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/generated/googleapis/lib/youtube/v3.dart b/generated/googleapis/lib/youtube/v3.dart
index 8218112..7de8c45 100644
--- a/generated/googleapis/lib/youtube/v3.dart
+++ b/generated/googleapis/lib/youtube/v3.dart
@@ -16771,9 +16771,6 @@
 
 /// A video resource represents a YouTube video.
 class Video {
-  /// The access token to uniquely identify a revocable unlisted video.
-  core.String accessToken;
-
   /// Age restriction details related to a video. This data can only be
   /// retrieved by the video owner.
   VideoAgeGating ageGating;
@@ -16857,9 +16854,6 @@
   Video();
 
   Video.fromJson(core.Map _json) {
-    if (_json.containsKey("accessToken")) {
-      accessToken = _json["accessToken"];
-    }
     if (_json.containsKey("ageGating")) {
       ageGating = new VideoAgeGating.fromJson(_json["ageGating"]);
     }
@@ -16929,9 +16923,6 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
-    if (accessToken != null) {
-      _json["accessToken"] = accessToken;
-    }
     if (ageGating != null) {
       _json["ageGating"] = (ageGating).toJson();
     }
diff --git a/generated/googleapis/lib/youtubereporting/v1.dart b/generated/googleapis/lib/youtubereporting/v1.dart
index 6e96bfa..4c44441 100644
--- a/generated/googleapis/lib/youtubereporting/v1.dart
+++ b/generated/googleapis/lib/youtubereporting/v1.dart
@@ -209,14 +209,6 @@
   ///
   /// Request parameters:
   ///
-  /// [pageSize] - Requested page size. Server may return fewer jobs than
-  /// requested.
-  /// If unspecified, server will pick an appropriate default.
-  ///
-  /// [onBehalfOfContentOwner] - The content owner's external ID on which behalf
-  /// the user is acting on. If
-  /// not set, the user is acting for himself (his own channel).
-  ///
   /// [pageToken] - A token identifying a page of results the server should
   /// return. Typically,
   /// this is the value of
@@ -228,6 +220,14 @@
   /// user-created jobs will be returned. System-managed jobs can neither be
   /// modified nor deleted.
   ///
+  /// [pageSize] - Requested page size. Server may return fewer jobs than
+  /// requested.
+  /// If unspecified, server will pick an appropriate default.
+  ///
+  /// [onBehalfOfContentOwner] - The content owner's external ID on which behalf
+  /// the user is acting on. If
+  /// not set, the user is acting for himself (his own channel).
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -239,10 +239,10 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListJobsResponse> list(
-      {core.int pageSize,
-      core.String onBehalfOfContentOwner,
-      core.String pageToken,
+      {core.String pageToken,
       core.bool includeSystemManaged,
+      core.int pageSize,
+      core.String onBehalfOfContentOwner,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -251,18 +251,18 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
-    if (onBehalfOfContentOwner != null) {
-      _queryParams["onBehalfOfContentOwner"] = [onBehalfOfContentOwner];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (includeSystemManaged != null) {
       _queryParams["includeSystemManaged"] = ["${includeSystemManaged}"];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (onBehalfOfContentOwner != null) {
+      _queryParams["onBehalfOfContentOwner"] = [onBehalfOfContentOwner];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -349,10 +349,6 @@
   ///
   /// [jobId] - The ID of the job.
   ///
-  /// [pageSize] - Requested page size. Server may return fewer report types
-  /// than requested.
-  /// If unspecified, server will pick an appropriate default.
-  ///
   /// [onBehalfOfContentOwner] - The content owner's external ID on which behalf
   /// the user is acting on. If
   /// not set, the user is acting for himself (his own channel).
@@ -364,16 +360,20 @@
   /// [createdAfter] - If set, only reports created after the specified
   /// date/time are returned.
   ///
-  /// [startTimeAtOrAfter] - If set, only reports whose start time is greater
-  /// than or equal the
-  /// specified date/time are returned.
-  ///
   /// [pageToken] - A token identifying a page of results the server should
   /// return. Typically,
   /// this is the value of
   /// ListReportsResponse.next_page_token
   /// returned in response to the previous call to the `ListReports` method.
   ///
+  /// [startTimeAtOrAfter] - If set, only reports whose start time is greater
+  /// than or equal the
+  /// specified date/time are returned.
+  ///
+  /// [pageSize] - Requested page size. Server may return fewer report types
+  /// than requested.
+  /// If unspecified, server will pick an appropriate default.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -385,12 +385,12 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListReportsResponse> list(core.String jobId,
-      {core.int pageSize,
-      core.String onBehalfOfContentOwner,
+      {core.String onBehalfOfContentOwner,
       core.String startTimeBefore,
       core.String createdAfter,
-      core.String startTimeAtOrAfter,
       core.String pageToken,
+      core.String startTimeAtOrAfter,
+      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -402,9 +402,6 @@
     if (jobId == null) {
       throw new core.ArgumentError("Parameter jobId is required.");
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (onBehalfOfContentOwner != null) {
       _queryParams["onBehalfOfContentOwner"] = [onBehalfOfContentOwner];
     }
@@ -414,11 +411,14 @@
     if (createdAfter != null) {
       _queryParams["createdAfter"] = [createdAfter];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if (startTimeAtOrAfter != null) {
       _queryParams["startTimeAtOrAfter"] = [startTimeAtOrAfter];
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
     }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
@@ -459,7 +459,7 @@
   ///
   /// Completes with a
   ///
-  /// - [Media] for Metadata downloads (see [downloadOptions]).
+  /// - [GdataMedia] for Metadata downloads (see [downloadOptions]).
   ///
   /// - [commons.Media] for Media downloads (see [downloadOptions]).
   ///
@@ -498,7 +498,7 @@
         downloadOptions: _downloadOptions);
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => new Media.fromJson(data));
+      return _response.then((data) => new GdataMedia.fromJson(data));
     } else {
       return _response;
     }
@@ -514,14 +514,6 @@
   ///
   /// Request parameters:
   ///
-  /// [pageSize] - Requested page size. Server may return fewer report types
-  /// than requested.
-  /// If unspecified, server will pick an appropriate default.
-  ///
-  /// [onBehalfOfContentOwner] - The content owner's external ID on which behalf
-  /// the user is acting on. If
-  /// not set, the user is acting for himself (his own channel).
-  ///
   /// [pageToken] - A token identifying a page of results the server should
   /// return. Typically,
   /// this is the value of
@@ -533,6 +525,14 @@
   /// otherwise only the report types that can be used to create new reporting
   /// jobs will be returned.
   ///
+  /// [pageSize] - Requested page size. Server may return fewer report types
+  /// than requested.
+  /// If unspecified, server will pick an appropriate default.
+  ///
+  /// [onBehalfOfContentOwner] - The content owner's external ID on which behalf
+  /// the user is acting on. If
+  /// not set, the user is acting for himself (his own channel).
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -544,10 +544,10 @@
   /// If the used [http.Client] completes with an error when making a REST call,
   /// this method will complete with the same error.
   async.Future<ListReportTypesResponse> list(
-      {core.int pageSize,
-      core.String onBehalfOfContentOwner,
-      core.String pageToken,
+      {core.String pageToken,
       core.bool includeSystemManaged,
+      core.int pageSize,
+      core.String onBehalfOfContentOwner,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -556,18 +556,18 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
-    if (onBehalfOfContentOwner != null) {
-      _queryParams["onBehalfOfContentOwner"] = [onBehalfOfContentOwner];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (includeSystemManaged != null) {
       _queryParams["includeSystemManaged"] = ["${includeSystemManaged}"];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (onBehalfOfContentOwner != null) {
+      _queryParams["onBehalfOfContentOwner"] = [onBehalfOfContentOwner];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -605,6 +605,937 @@
   }
 }
 
+/// gdata
+class GdataBlobstore2Info {
+  /// gdata
+  core.String blobGeneration;
+
+  /// gdata
+  core.String blobId;
+
+  /// gdata
+  core.String downloadReadHandle;
+  core.List<core.int> get downloadReadHandleAsBytes {
+    return convert.BASE64.decode(downloadReadHandle);
+  }
+
+  void set downloadReadHandleAsBytes(core.List<core.int> _bytes) {
+    downloadReadHandle =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// gdata
+  core.String readToken;
+
+  /// gdata
+  core.String uploadMetadataContainer;
+  core.List<core.int> get uploadMetadataContainerAsBytes {
+    return convert.BASE64.decode(uploadMetadataContainer);
+  }
+
+  void set uploadMetadataContainerAsBytes(core.List<core.int> _bytes) {
+    uploadMetadataContainer =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  GdataBlobstore2Info();
+
+  GdataBlobstore2Info.fromJson(core.Map _json) {
+    if (_json.containsKey("blobGeneration")) {
+      blobGeneration = _json["blobGeneration"];
+    }
+    if (_json.containsKey("blobId")) {
+      blobId = _json["blobId"];
+    }
+    if (_json.containsKey("downloadReadHandle")) {
+      downloadReadHandle = _json["downloadReadHandle"];
+    }
+    if (_json.containsKey("readToken")) {
+      readToken = _json["readToken"];
+    }
+    if (_json.containsKey("uploadMetadataContainer")) {
+      uploadMetadataContainer = _json["uploadMetadataContainer"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (blobGeneration != null) {
+      _json["blobGeneration"] = blobGeneration;
+    }
+    if (blobId != null) {
+      _json["blobId"] = blobId;
+    }
+    if (downloadReadHandle != null) {
+      _json["downloadReadHandle"] = downloadReadHandle;
+    }
+    if (readToken != null) {
+      _json["readToken"] = readToken;
+    }
+    if (uploadMetadataContainer != null) {
+      _json["uploadMetadataContainer"] = uploadMetadataContainer;
+    }
+    return _json;
+  }
+}
+
+/// gdata
+class GdataCompositeMedia {
+  /// gdata
+  core.String blobRef;
+  core.List<core.int> get blobRefAsBytes {
+    return convert.BASE64.decode(blobRef);
+  }
+
+  void set blobRefAsBytes(core.List<core.int> _bytes) {
+    blobRef =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// gdata
+  GdataBlobstore2Info blobstore2Info;
+
+  /// gdata
+  core.String cosmoBinaryReference;
+  core.List<core.int> get cosmoBinaryReferenceAsBytes {
+    return convert.BASE64.decode(cosmoBinaryReference);
+  }
+
+  void set cosmoBinaryReferenceAsBytes(core.List<core.int> _bytes) {
+    cosmoBinaryReference =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// gdata
+  core.int crc32cHash;
+
+  /// gdata
+  core.String inline;
+  core.List<core.int> get inlineAsBytes {
+    return convert.BASE64.decode(inline);
+  }
+
+  void set inlineAsBytes(core.List<core.int> _bytes) {
+    inline =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// gdata
+  core.String length;
+
+  /// gdata
+  core.String md5Hash;
+  core.List<core.int> get md5HashAsBytes {
+    return convert.BASE64.decode(md5Hash);
+  }
+
+  void set md5HashAsBytes(core.List<core.int> _bytes) {
+    md5Hash =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// gdata
+  GdataObjectId objectId;
+
+  /// gdata
+  core.String path;
+
+  /// gdata
+  /// Possible string values are:
+  /// - "PATH" : gdata
+  /// - "BLOB_REF" : gdata
+  /// - "INLINE" : gdata
+  /// - "BIGSTORE_REF" : gdata
+  /// - "COSMO_BINARY_REFERENCE" : gdata
+  core.String referenceType;
+
+  /// gdata
+  core.String sha1Hash;
+  core.List<core.int> get sha1HashAsBytes {
+    return convert.BASE64.decode(sha1Hash);
+  }
+
+  void set sha1HashAsBytes(core.List<core.int> _bytes) {
+    sha1Hash =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  GdataCompositeMedia();
+
+  GdataCompositeMedia.fromJson(core.Map _json) {
+    if (_json.containsKey("blobRef")) {
+      blobRef = _json["blobRef"];
+    }
+    if (_json.containsKey("blobstore2Info")) {
+      blobstore2Info =
+          new GdataBlobstore2Info.fromJson(_json["blobstore2Info"]);
+    }
+    if (_json.containsKey("cosmoBinaryReference")) {
+      cosmoBinaryReference = _json["cosmoBinaryReference"];
+    }
+    if (_json.containsKey("crc32cHash")) {
+      crc32cHash = _json["crc32cHash"];
+    }
+    if (_json.containsKey("inline")) {
+      inline = _json["inline"];
+    }
+    if (_json.containsKey("length")) {
+      length = _json["length"];
+    }
+    if (_json.containsKey("md5Hash")) {
+      md5Hash = _json["md5Hash"];
+    }
+    if (_json.containsKey("objectId")) {
+      objectId = new GdataObjectId.fromJson(_json["objectId"]);
+    }
+    if (_json.containsKey("path")) {
+      path = _json["path"];
+    }
+    if (_json.containsKey("referenceType")) {
+      referenceType = _json["referenceType"];
+    }
+    if (_json.containsKey("sha1Hash")) {
+      sha1Hash = _json["sha1Hash"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (blobRef != null) {
+      _json["blobRef"] = blobRef;
+    }
+    if (blobstore2Info != null) {
+      _json["blobstore2Info"] = (blobstore2Info).toJson();
+    }
+    if (cosmoBinaryReference != null) {
+      _json["cosmoBinaryReference"] = cosmoBinaryReference;
+    }
+    if (crc32cHash != null) {
+      _json["crc32cHash"] = crc32cHash;
+    }
+    if (inline != null) {
+      _json["inline"] = inline;
+    }
+    if (length != null) {
+      _json["length"] = length;
+    }
+    if (md5Hash != null) {
+      _json["md5Hash"] = md5Hash;
+    }
+    if (objectId != null) {
+      _json["objectId"] = (objectId).toJson();
+    }
+    if (path != null) {
+      _json["path"] = path;
+    }
+    if (referenceType != null) {
+      _json["referenceType"] = referenceType;
+    }
+    if (sha1Hash != null) {
+      _json["sha1Hash"] = sha1Hash;
+    }
+    return _json;
+  }
+}
+
+/// gdata
+class GdataContentTypeInfo {
+  /// gdata
+  core.String bestGuess;
+
+  /// gdata
+  core.String fromBytes;
+
+  /// gdata
+  core.String fromFileName;
+
+  /// gdata
+  core.String fromHeader;
+
+  /// gdata
+  core.String fromUrlPath;
+
+  GdataContentTypeInfo();
+
+  GdataContentTypeInfo.fromJson(core.Map _json) {
+    if (_json.containsKey("bestGuess")) {
+      bestGuess = _json["bestGuess"];
+    }
+    if (_json.containsKey("fromBytes")) {
+      fromBytes = _json["fromBytes"];
+    }
+    if (_json.containsKey("fromFileName")) {
+      fromFileName = _json["fromFileName"];
+    }
+    if (_json.containsKey("fromHeader")) {
+      fromHeader = _json["fromHeader"];
+    }
+    if (_json.containsKey("fromUrlPath")) {
+      fromUrlPath = _json["fromUrlPath"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (bestGuess != null) {
+      _json["bestGuess"] = bestGuess;
+    }
+    if (fromBytes != null) {
+      _json["fromBytes"] = fromBytes;
+    }
+    if (fromFileName != null) {
+      _json["fromFileName"] = fromFileName;
+    }
+    if (fromHeader != null) {
+      _json["fromHeader"] = fromHeader;
+    }
+    if (fromUrlPath != null) {
+      _json["fromUrlPath"] = fromUrlPath;
+    }
+    return _json;
+  }
+}
+
+/// gdata
+class GdataDiffChecksumsResponse {
+  /// gdata
+  GdataCompositeMedia checksumsLocation;
+
+  /// gdata
+  core.String chunkSizeBytes;
+
+  /// gdata
+  GdataCompositeMedia objectLocation;
+
+  /// gdata
+  core.String objectSizeBytes;
+
+  /// gdata
+  core.String objectVersion;
+
+  GdataDiffChecksumsResponse();
+
+  GdataDiffChecksumsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("checksumsLocation")) {
+      checksumsLocation =
+          new GdataCompositeMedia.fromJson(_json["checksumsLocation"]);
+    }
+    if (_json.containsKey("chunkSizeBytes")) {
+      chunkSizeBytes = _json["chunkSizeBytes"];
+    }
+    if (_json.containsKey("objectLocation")) {
+      objectLocation =
+          new GdataCompositeMedia.fromJson(_json["objectLocation"]);
+    }
+    if (_json.containsKey("objectSizeBytes")) {
+      objectSizeBytes = _json["objectSizeBytes"];
+    }
+    if (_json.containsKey("objectVersion")) {
+      objectVersion = _json["objectVersion"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (checksumsLocation != null) {
+      _json["checksumsLocation"] = (checksumsLocation).toJson();
+    }
+    if (chunkSizeBytes != null) {
+      _json["chunkSizeBytes"] = chunkSizeBytes;
+    }
+    if (objectLocation != null) {
+      _json["objectLocation"] = (objectLocation).toJson();
+    }
+    if (objectSizeBytes != null) {
+      _json["objectSizeBytes"] = objectSizeBytes;
+    }
+    if (objectVersion != null) {
+      _json["objectVersion"] = objectVersion;
+    }
+    return _json;
+  }
+}
+
+/// gdata
+class GdataDiffDownloadResponse {
+  /// gdata
+  GdataCompositeMedia objectLocation;
+
+  GdataDiffDownloadResponse();
+
+  GdataDiffDownloadResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("objectLocation")) {
+      objectLocation =
+          new GdataCompositeMedia.fromJson(_json["objectLocation"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (objectLocation != null) {
+      _json["objectLocation"] = (objectLocation).toJson();
+    }
+    return _json;
+  }
+}
+
+/// gdata
+class GdataDiffUploadRequest {
+  /// gdata
+  GdataCompositeMedia checksumsInfo;
+
+  /// gdata
+  GdataCompositeMedia objectInfo;
+
+  /// gdata
+  core.String objectVersion;
+
+  GdataDiffUploadRequest();
+
+  GdataDiffUploadRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("checksumsInfo")) {
+      checksumsInfo = new GdataCompositeMedia.fromJson(_json["checksumsInfo"]);
+    }
+    if (_json.containsKey("objectInfo")) {
+      objectInfo = new GdataCompositeMedia.fromJson(_json["objectInfo"]);
+    }
+    if (_json.containsKey("objectVersion")) {
+      objectVersion = _json["objectVersion"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (checksumsInfo != null) {
+      _json["checksumsInfo"] = (checksumsInfo).toJson();
+    }
+    if (objectInfo != null) {
+      _json["objectInfo"] = (objectInfo).toJson();
+    }
+    if (objectVersion != null) {
+      _json["objectVersion"] = objectVersion;
+    }
+    return _json;
+  }
+}
+
+/// gdata
+class GdataDiffUploadResponse {
+  /// gdata
+  core.String objectVersion;
+
+  /// gdata
+  GdataCompositeMedia originalObject;
+
+  GdataDiffUploadResponse();
+
+  GdataDiffUploadResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("objectVersion")) {
+      objectVersion = _json["objectVersion"];
+    }
+    if (_json.containsKey("originalObject")) {
+      originalObject =
+          new GdataCompositeMedia.fromJson(_json["originalObject"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (objectVersion != null) {
+      _json["objectVersion"] = objectVersion;
+    }
+    if (originalObject != null) {
+      _json["originalObject"] = (originalObject).toJson();
+    }
+    return _json;
+  }
+}
+
+/// gdata
+class GdataDiffVersionResponse {
+  /// gdata
+  core.String objectSizeBytes;
+
+  /// gdata
+  core.String objectVersion;
+
+  GdataDiffVersionResponse();
+
+  GdataDiffVersionResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("objectSizeBytes")) {
+      objectSizeBytes = _json["objectSizeBytes"];
+    }
+    if (_json.containsKey("objectVersion")) {
+      objectVersion = _json["objectVersion"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (objectSizeBytes != null) {
+      _json["objectSizeBytes"] = objectSizeBytes;
+    }
+    if (objectVersion != null) {
+      _json["objectVersion"] = objectVersion;
+    }
+    return _json;
+  }
+}
+
+/// gdata
+class GdataDownloadParameters {
+  /// gdata
+  core.bool allowGzipCompression;
+
+  /// gdata
+  core.bool ignoreRange;
+
+  GdataDownloadParameters();
+
+  GdataDownloadParameters.fromJson(core.Map _json) {
+    if (_json.containsKey("allowGzipCompression")) {
+      allowGzipCompression = _json["allowGzipCompression"];
+    }
+    if (_json.containsKey("ignoreRange")) {
+      ignoreRange = _json["ignoreRange"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (allowGzipCompression != null) {
+      _json["allowGzipCompression"] = allowGzipCompression;
+    }
+    if (ignoreRange != null) {
+      _json["ignoreRange"] = ignoreRange;
+    }
+    return _json;
+  }
+}
+
+/// gdata
+class GdataMedia {
+  /// gdata
+  core.String algorithm;
+
+  /// gdata
+  core.String bigstoreObjectRef;
+  core.List<core.int> get bigstoreObjectRefAsBytes {
+    return convert.BASE64.decode(bigstoreObjectRef);
+  }
+
+  void set bigstoreObjectRefAsBytes(core.List<core.int> _bytes) {
+    bigstoreObjectRef =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// gdata
+  core.String blobRef;
+  core.List<core.int> get blobRefAsBytes {
+    return convert.BASE64.decode(blobRef);
+  }
+
+  void set blobRefAsBytes(core.List<core.int> _bytes) {
+    blobRef =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// gdata
+  GdataBlobstore2Info blobstore2Info;
+
+  /// gdata
+  core.List<GdataCompositeMedia> compositeMedia;
+
+  /// gdata
+  core.String contentType;
+
+  /// gdata
+  GdataContentTypeInfo contentTypeInfo;
+
+  /// gdata
+  core.String cosmoBinaryReference;
+  core.List<core.int> get cosmoBinaryReferenceAsBytes {
+    return convert.BASE64.decode(cosmoBinaryReference);
+  }
+
+  void set cosmoBinaryReferenceAsBytes(core.List<core.int> _bytes) {
+    cosmoBinaryReference =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// gdata
+  core.int crc32cHash;
+
+  /// gdata
+  GdataDiffChecksumsResponse diffChecksumsResponse;
+
+  /// gdata
+  GdataDiffDownloadResponse diffDownloadResponse;
+
+  /// gdata
+  GdataDiffUploadRequest diffUploadRequest;
+
+  /// gdata
+  GdataDiffUploadResponse diffUploadResponse;
+
+  /// gdata
+  GdataDiffVersionResponse diffVersionResponse;
+
+  /// gdata
+  GdataDownloadParameters downloadParameters;
+
+  /// gdata
+  core.String filename;
+
+  /// gdata
+  core.String hash;
+
+  /// gdata
+  core.bool hashVerified;
+
+  /// gdata
+  core.String inline;
+  core.List<core.int> get inlineAsBytes {
+    return convert.BASE64.decode(inline);
+  }
+
+  void set inlineAsBytes(core.List<core.int> _bytes) {
+    inline =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// gdata
+  core.bool isPotentialRetry;
+
+  /// gdata
+  core.String length;
+
+  /// gdata
+  core.String md5Hash;
+  core.List<core.int> get md5HashAsBytes {
+    return convert.BASE64.decode(md5Hash);
+  }
+
+  void set md5HashAsBytes(core.List<core.int> _bytes) {
+    md5Hash =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// gdata
+  core.String mediaId;
+  core.List<core.int> get mediaIdAsBytes {
+    return convert.BASE64.decode(mediaId);
+  }
+
+  void set mediaIdAsBytes(core.List<core.int> _bytes) {
+    mediaId =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// gdata
+  GdataObjectId objectId;
+
+  /// gdata
+  core.String path;
+
+  /// gdata
+  /// Possible string values are:
+  /// - "PATH" : gdata
+  /// - "BLOB_REF" : gdata
+  /// - "INLINE" : gdata
+  /// - "GET_MEDIA" : gdata
+  /// - "COMPOSITE_MEDIA" : gdata
+  /// - "BIGSTORE_REF" : gdata
+  /// - "DIFF_VERSION_RESPONSE" : gdata
+  /// - "DIFF_CHECKSUMS_RESPONSE" : gdata
+  /// - "DIFF_DOWNLOAD_RESPONSE" : gdata
+  /// - "DIFF_UPLOAD_REQUEST" : gdata
+  /// - "DIFF_UPLOAD_RESPONSE" : gdata
+  /// - "COSMO_BINARY_REFERENCE" : gdata
+  /// - "ARBITRARY_BYTES" : gdata
+  core.String referenceType;
+
+  /// gdata
+  core.String sha1Hash;
+  core.List<core.int> get sha1HashAsBytes {
+    return convert.BASE64.decode(sha1Hash);
+  }
+
+  void set sha1HashAsBytes(core.List<core.int> _bytes) {
+    sha1Hash =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// gdata
+  core.String sha256Hash;
+  core.List<core.int> get sha256HashAsBytes {
+    return convert.BASE64.decode(sha256Hash);
+  }
+
+  void set sha256HashAsBytes(core.List<core.int> _bytes) {
+    sha256Hash =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  /// gdata
+  core.String timestamp;
+
+  /// gdata
+  core.String token;
+
+  GdataMedia();
+
+  GdataMedia.fromJson(core.Map _json) {
+    if (_json.containsKey("algorithm")) {
+      algorithm = _json["algorithm"];
+    }
+    if (_json.containsKey("bigstoreObjectRef")) {
+      bigstoreObjectRef = _json["bigstoreObjectRef"];
+    }
+    if (_json.containsKey("blobRef")) {
+      blobRef = _json["blobRef"];
+    }
+    if (_json.containsKey("blobstore2Info")) {
+      blobstore2Info =
+          new GdataBlobstore2Info.fromJson(_json["blobstore2Info"]);
+    }
+    if (_json.containsKey("compositeMedia")) {
+      compositeMedia = _json["compositeMedia"]
+          .map((value) => new GdataCompositeMedia.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("contentType")) {
+      contentType = _json["contentType"];
+    }
+    if (_json.containsKey("contentTypeInfo")) {
+      contentTypeInfo =
+          new GdataContentTypeInfo.fromJson(_json["contentTypeInfo"]);
+    }
+    if (_json.containsKey("cosmoBinaryReference")) {
+      cosmoBinaryReference = _json["cosmoBinaryReference"];
+    }
+    if (_json.containsKey("crc32cHash")) {
+      crc32cHash = _json["crc32cHash"];
+    }
+    if (_json.containsKey("diffChecksumsResponse")) {
+      diffChecksumsResponse = new GdataDiffChecksumsResponse.fromJson(
+          _json["diffChecksumsResponse"]);
+    }
+    if (_json.containsKey("diffDownloadResponse")) {
+      diffDownloadResponse =
+          new GdataDiffDownloadResponse.fromJson(_json["diffDownloadResponse"]);
+    }
+    if (_json.containsKey("diffUploadRequest")) {
+      diffUploadRequest =
+          new GdataDiffUploadRequest.fromJson(_json["diffUploadRequest"]);
+    }
+    if (_json.containsKey("diffUploadResponse")) {
+      diffUploadResponse =
+          new GdataDiffUploadResponse.fromJson(_json["diffUploadResponse"]);
+    }
+    if (_json.containsKey("diffVersionResponse")) {
+      diffVersionResponse =
+          new GdataDiffVersionResponse.fromJson(_json["diffVersionResponse"]);
+    }
+    if (_json.containsKey("downloadParameters")) {
+      downloadParameters =
+          new GdataDownloadParameters.fromJson(_json["downloadParameters"]);
+    }
+    if (_json.containsKey("filename")) {
+      filename = _json["filename"];
+    }
+    if (_json.containsKey("hash")) {
+      hash = _json["hash"];
+    }
+    if (_json.containsKey("hashVerified")) {
+      hashVerified = _json["hashVerified"];
+    }
+    if (_json.containsKey("inline")) {
+      inline = _json["inline"];
+    }
+    if (_json.containsKey("isPotentialRetry")) {
+      isPotentialRetry = _json["isPotentialRetry"];
+    }
+    if (_json.containsKey("length")) {
+      length = _json["length"];
+    }
+    if (_json.containsKey("md5Hash")) {
+      md5Hash = _json["md5Hash"];
+    }
+    if (_json.containsKey("mediaId")) {
+      mediaId = _json["mediaId"];
+    }
+    if (_json.containsKey("objectId")) {
+      objectId = new GdataObjectId.fromJson(_json["objectId"]);
+    }
+    if (_json.containsKey("path")) {
+      path = _json["path"];
+    }
+    if (_json.containsKey("referenceType")) {
+      referenceType = _json["referenceType"];
+    }
+    if (_json.containsKey("sha1Hash")) {
+      sha1Hash = _json["sha1Hash"];
+    }
+    if (_json.containsKey("sha256Hash")) {
+      sha256Hash = _json["sha256Hash"];
+    }
+    if (_json.containsKey("timestamp")) {
+      timestamp = _json["timestamp"];
+    }
+    if (_json.containsKey("token")) {
+      token = _json["token"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (algorithm != null) {
+      _json["algorithm"] = algorithm;
+    }
+    if (bigstoreObjectRef != null) {
+      _json["bigstoreObjectRef"] = bigstoreObjectRef;
+    }
+    if (blobRef != null) {
+      _json["blobRef"] = blobRef;
+    }
+    if (blobstore2Info != null) {
+      _json["blobstore2Info"] = (blobstore2Info).toJson();
+    }
+    if (compositeMedia != null) {
+      _json["compositeMedia"] =
+          compositeMedia.map((value) => (value).toJson()).toList();
+    }
+    if (contentType != null) {
+      _json["contentType"] = contentType;
+    }
+    if (contentTypeInfo != null) {
+      _json["contentTypeInfo"] = (contentTypeInfo).toJson();
+    }
+    if (cosmoBinaryReference != null) {
+      _json["cosmoBinaryReference"] = cosmoBinaryReference;
+    }
+    if (crc32cHash != null) {
+      _json["crc32cHash"] = crc32cHash;
+    }
+    if (diffChecksumsResponse != null) {
+      _json["diffChecksumsResponse"] = (diffChecksumsResponse).toJson();
+    }
+    if (diffDownloadResponse != null) {
+      _json["diffDownloadResponse"] = (diffDownloadResponse).toJson();
+    }
+    if (diffUploadRequest != null) {
+      _json["diffUploadRequest"] = (diffUploadRequest).toJson();
+    }
+    if (diffUploadResponse != null) {
+      _json["diffUploadResponse"] = (diffUploadResponse).toJson();
+    }
+    if (diffVersionResponse != null) {
+      _json["diffVersionResponse"] = (diffVersionResponse).toJson();
+    }
+    if (downloadParameters != null) {
+      _json["downloadParameters"] = (downloadParameters).toJson();
+    }
+    if (filename != null) {
+      _json["filename"] = filename;
+    }
+    if (hash != null) {
+      _json["hash"] = hash;
+    }
+    if (hashVerified != null) {
+      _json["hashVerified"] = hashVerified;
+    }
+    if (inline != null) {
+      _json["inline"] = inline;
+    }
+    if (isPotentialRetry != null) {
+      _json["isPotentialRetry"] = isPotentialRetry;
+    }
+    if (length != null) {
+      _json["length"] = length;
+    }
+    if (md5Hash != null) {
+      _json["md5Hash"] = md5Hash;
+    }
+    if (mediaId != null) {
+      _json["mediaId"] = mediaId;
+    }
+    if (objectId != null) {
+      _json["objectId"] = (objectId).toJson();
+    }
+    if (path != null) {
+      _json["path"] = path;
+    }
+    if (referenceType != null) {
+      _json["referenceType"] = referenceType;
+    }
+    if (sha1Hash != null) {
+      _json["sha1Hash"] = sha1Hash;
+    }
+    if (sha256Hash != null) {
+      _json["sha256Hash"] = sha256Hash;
+    }
+    if (timestamp != null) {
+      _json["timestamp"] = timestamp;
+    }
+    if (token != null) {
+      _json["token"] = token;
+    }
+    return _json;
+  }
+}
+
+/// gdata
+class GdataObjectId {
+  /// gdata
+  core.String bucketName;
+
+  /// gdata
+  core.String generation;
+
+  /// gdata
+  core.String objectName;
+
+  GdataObjectId();
+
+  GdataObjectId.fromJson(core.Map _json) {
+    if (_json.containsKey("bucketName")) {
+      bucketName = _json["bucketName"];
+    }
+    if (_json.containsKey("generation")) {
+      generation = _json["generation"];
+    }
+    if (_json.containsKey("objectName")) {
+      objectName = _json["objectName"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (bucketName != null) {
+      _json["bucketName"] = bucketName;
+    }
+    if (generation != null) {
+      _json["generation"] = generation;
+    }
+    if (objectName != null) {
+      _json["objectName"] = objectName;
+    }
+    return _json;
+  }
+}
+
 /// A job creating reports of a specific type.
 class Job {
   /// The creation date/time of the job.
@@ -789,29 +1720,6 @@
   }
 }
 
-/// Media resource.
-class Media {
-  /// Name of the media resource.
-  core.String resourceName;
-
-  Media();
-
-  Media.fromJson(core.Map _json) {
-    if (_json.containsKey("resourceName")) {
-      resourceName = _json["resourceName"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (resourceName != null) {
-      _json["resourceName"] = resourceName;
-    }
-    return _json;
-  }
-}
-
 /// A report's metadata including the URL from which the report itself can be
 /// downloaded.
 class Report {
diff --git a/generated/googleapis/pubspec.yaml b/generated/googleapis/pubspec.yaml
index e29688c..78b9e62 100644
--- a/generated/googleapis/pubspec.yaml
+++ b/generated/googleapis/pubspec.yaml
@@ -1,7 +1,7 @@
 name: googleapis
-version: 0.47.1
+version: 0.48.0
 author: Dart Team <misc@dartlang.org>
-description: "Auto-generated client libraries for accessing the following APIs:acceleratedmobilepageurl:v1, adexchangebuyer:v1.3, adexchangebuyer:v1.4, adexchangeseller:v1.1, adexchangeseller:v2.0, adexperiencereport:v1, admin:datatransfer_v1, admin:directory_v1, admin:reports_v1, adsense:v1.4, adsensehost:v4.1, analytics:v3, analyticsreporting:v4, androiddeviceprovisioning:v1, androidenterprise:v1, androidmanagement:v1, androidpublisher:v2, appengine:v1, appsactivity:v1, appstate:v1, bigquery:v2, bigquerydatatransfer:v1, blogger:v3, books:v1, calendar:v3, civicinfo:v2, classroom:v1, cloudbilling:v1, cloudbuild:v1, clouddebugger:v2, cloudfunctions:v1, cloudiot:v1, cloudkms:v1, cloudresourcemanager:v1, cloudresourcemanager:v2beta1, cloudtrace:v1, cloudtrace:v2, compute:v1, consumersurveys:v2, container:v1, content:v2, content:v2sandbox, customsearch:v1, dataproc:v1, datastore:v1, deploymentmanager:v2, dfareporting:v2.8, dfareporting:v3.0, discovery:v1, dns:v1, doubleclickbidmanager:v1, doubleclicksearch:v2, drive:v2, drive:v3, firebasedynamiclinks:v1, firebaseremoteconfig:v1, firebaserules:v1, fitness:v1, fusiontables:v1, fusiontables:v2, games:v1, gamesConfiguration:v1configuration, gamesManagement:v1management, genomics:v1, gmail:v1, groupsmigration:v1, groupssettings:v1, iam:v1, identitytoolkit:v3, kgsearch:v1, language:v1, licensing:v1, logging:v2, manufacturers:v1, mirror:v1, ml:v1, monitoring:v3, oauth2:v2, oslogin:v1, pagespeedonline:v1, pagespeedonline:v2, partners:v2, people:v1, playcustomapp:v1, plus:v1, plusDomains:v1, poly:v1, prediction:v1.6, pubsub:v1, reseller:v1, runtimeconfig:v1, safebrowsing:v4, script:v1, searchconsole:v1, serviceconsumermanagement:v1, servicecontrol:v1, servicemanagement:v1, serviceuser:v1, sheets:v4, siteVerification:v1, slides:v1, sourcerepo:v1, spanner:v1, speech:v1, storage:v1, storagetransfer:v1, streetviewpublish:v1, surveys:v2, tagmanager:v1, tagmanager:v2, tasks:v1, testing:v1, translate:v2, urlshortener:v1, vault:v1, vision:v1, webfonts:v1, webmasters:v3, youtube:v3, youtubeAnalytics:v1, youtubereporting:v1"
+description: "Auto-generated client libraries for accessing the following APIs:abusiveexperiencereport:v1, acceleratedmobilepageurl:v1, adexchangebuyer:v1.3, adexchangebuyer:v1.4, adexchangeseller:v1.1, adexchangeseller:v2.0, adexperiencereport:v1, admin:datatransfer_v1, admin:directory_v1, admin:reports_v1, adsense:v1.4, adsensehost:v4.1, analytics:v3, analyticsreporting:v4, androiddeviceprovisioning:v1, androidenterprise:v1, androidmanagement:v1, androidpublisher:v2, appengine:v1, appsactivity:v1, appstate:v1, bigquery:v2, bigquerydatatransfer:v1, blogger:v3, books:v1, calendar:v3, civicinfo:v2, classroom:v1, cloudbilling:v1, cloudbuild:v1, clouddebugger:v2, cloudfunctions:v1, cloudiot:v1, cloudkms:v1, cloudresourcemanager:v1, cloudresourcemanager:v2beta1, cloudshell:v1, cloudtrace:v1, cloudtrace:v2, compute:v1, container:v1, content:v2, content:v2sandbox, customsearch:v1, dataproc:v1, datastore:v1, deploymentmanager:v2, dfareporting:v2.8, dfareporting:v3.0, digitalassetlinks:v1, discovery:v1, dns:v1, doubleclickbidmanager:v1, doubleclicksearch:v2, drive:v2, drive:v3, firebasedynamiclinks:v1, firebaseremoteconfig:v1, firebaserules:v1, fitness:v1, fusiontables:v1, fusiontables:v2, games:v1, gamesConfiguration:v1configuration, gamesManagement:v1management, genomics:v1, gmail:v1, groupsmigration:v1, groupssettings:v1, iam:v1, identitytoolkit:v3, kgsearch:v1, language:v1, licensing:v1, logging:v2, manufacturers:v1, mirror:v1, ml:v1, monitoring:v3, oauth2:v2, oslogin:v1, pagespeedonline:v1, pagespeedonline:v2, partners:v2, people:v1, playcustomapp:v1, plus:v1, plusDomains:v1, poly:v1, prediction:v1.6, pubsub:v1, reseller:v1, runtimeconfig:v1, safebrowsing:v4, script:v1, searchconsole:v1, serviceconsumermanagement:v1, servicecontrol:v1, servicemanagement:v1, serviceuser:v1, sheets:v4, siteVerification:v1, slides:v1, sourcerepo:v1, spanner:v1, speech:v1, storage:v1, storagetransfer:v1, streetviewpublish:v1, surveys:v2, tagmanager:v1, tagmanager:v2, tasks:v1, testing:v1, translate:v2, urlshortener:v1, vault:v1, vision:v1, webfonts:v1, webmasters:v3, youtube:v3, youtubeAnalytics:v1, youtubereporting:v1"
 homepage: http://www.dartlang.org/googleapis/
 environment:
   sdk: '>=1.22.0 <2.0.0'
diff --git a/generated/googleapis/test/abusiveexperiencereport/v1_test.dart b/generated/googleapis/test/abusiveexperiencereport/v1_test.dart
new file mode 100644
index 0000000..1f46677
--- /dev/null
+++ b/generated/googleapis/test/abusiveexperiencereport/v1_test.dart
@@ -0,0 +1,237 @@
+library googleapis.abusiveexperiencereport.v1.test;
+
+import "dart:core" as core;
+import "dart:async" as async;
+import "dart:convert" as convert;
+
+import 'package:http/http.dart' as http;
+import 'package:test/test.dart' as unittest;
+
+import 'package:googleapis/abusiveexperiencereport/v1.dart' as api;
+
+class HttpServerMock extends http.BaseClient {
+  core.Function _callback;
+  core.bool _expectJson;
+
+  void register(core.Function callback, core.bool expectJson) {
+    _callback = callback;
+    _expectJson = expectJson;
+  }
+
+  async.Future<http.StreamedResponse> send(http.BaseRequest request) {
+    if (_expectJson) {
+      return request
+          .finalize()
+          .transform(convert.UTF8.decoder)
+          .join('')
+          .then((core.String jsonString) {
+        if (jsonString.isEmpty) {
+          return _callback(request, null);
+        } else {
+          return _callback(request, convert.JSON.decode(jsonString));
+        }
+      });
+    } else {
+      var stream = request.finalize();
+      if (stream == null) {
+        return _callback(request, []);
+      } else {
+        return stream.toBytes().then((data) {
+          return _callback(request, data);
+        });
+      }
+    }
+  }
+}
+
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
+  var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
+  return new http.StreamedResponse(stream, status, headers: headers);
+}
+
+core.int buildCounterSiteSummaryResponse = 0;
+buildSiteSummaryResponse() {
+  var o = new api.SiteSummaryResponse();
+  buildCounterSiteSummaryResponse++;
+  if (buildCounterSiteSummaryResponse < 3) {
+    o.abusiveStatus = "foo";
+    o.enforcementTime = "foo";
+    o.filterStatus = "foo";
+    o.lastChangeTime = "foo";
+    o.reportUrl = "foo";
+    o.reviewedSite = "foo";
+    o.underReview = true;
+  }
+  buildCounterSiteSummaryResponse--;
+  return o;
+}
+
+checkSiteSummaryResponse(api.SiteSummaryResponse o) {
+  buildCounterSiteSummaryResponse++;
+  if (buildCounterSiteSummaryResponse < 3) {
+    unittest.expect(o.abusiveStatus, unittest.equals('foo'));
+    unittest.expect(o.enforcementTime, unittest.equals('foo'));
+    unittest.expect(o.filterStatus, unittest.equals('foo'));
+    unittest.expect(o.lastChangeTime, unittest.equals('foo'));
+    unittest.expect(o.reportUrl, unittest.equals('foo'));
+    unittest.expect(o.reviewedSite, unittest.equals('foo'));
+    unittest.expect(o.underReview, unittest.isTrue);
+  }
+  buildCounterSiteSummaryResponse--;
+}
+
+buildUnnamed2985() {
+  var o = new core.List<api.SiteSummaryResponse>();
+  o.add(buildSiteSummaryResponse());
+  o.add(buildSiteSummaryResponse());
+  return o;
+}
+
+checkUnnamed2985(core.List<api.SiteSummaryResponse> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkSiteSummaryResponse(o[0]);
+  checkSiteSummaryResponse(o[1]);
+}
+
+core.int buildCounterViolatingSitesResponse = 0;
+buildViolatingSitesResponse() {
+  var o = new api.ViolatingSitesResponse();
+  buildCounterViolatingSitesResponse++;
+  if (buildCounterViolatingSitesResponse < 3) {
+    o.violatingSites = buildUnnamed2985();
+  }
+  buildCounterViolatingSitesResponse--;
+  return o;
+}
+
+checkViolatingSitesResponse(api.ViolatingSitesResponse o) {
+  buildCounterViolatingSitesResponse++;
+  if (buildCounterViolatingSitesResponse < 3) {
+    checkUnnamed2985(o.violatingSites);
+  }
+  buildCounterViolatingSitesResponse--;
+}
+
+main() {
+  unittest.group("obj-schema-SiteSummaryResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSiteSummaryResponse();
+      var od = new api.SiteSummaryResponse.fromJson(o.toJson());
+      checkSiteSummaryResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-ViolatingSitesResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildViolatingSitesResponse();
+      var od = new api.ViolatingSitesResponse.fromJson(o.toJson());
+      checkViolatingSitesResponse(od);
+    });
+  });
+
+  unittest.group("resource-SitesResourceApi", () {
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.SitesResourceApi res = new api.AbusiveexperiencereportApi(mock).sites;
+      var arg_name = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildSiteSummaryResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_name, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.SiteSummaryResponse response) {
+        checkSiteSummaryResponse(response);
+      })));
+    });
+  });
+
+  unittest.group("resource-ViolatingSitesResourceApi", () {
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.ViolatingSitesResourceApi res =
+          new api.AbusiveexperiencereportApi(mock).violatingSites;
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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("v1/violatingSites"));
+        pathOffset += 17;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildViolatingSitesResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list($fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.ViolatingSitesResponse response) {
+        checkViolatingSitesResponse(response);
+      })));
+    });
+  });
+}
diff --git a/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart b/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
index 9c2e443..05665db 100644
--- a/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
+++ b/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
@@ -96,14 +96,14 @@
   buildCounterAmpUrlError--;
 }
 
-buildUnnamed1298() {
+buildUnnamed1314() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1298(core.List<core.String> o) {
+checkUnnamed1314(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -115,7 +115,7 @@
   buildCounterBatchGetAmpUrlsRequest++;
   if (buildCounterBatchGetAmpUrlsRequest < 3) {
     o.lookupStrategy = "foo";
-    o.urls = buildUnnamed1298();
+    o.urls = buildUnnamed1314();
   }
   buildCounterBatchGetAmpUrlsRequest--;
   return o;
@@ -125,32 +125,32 @@
   buildCounterBatchGetAmpUrlsRequest++;
   if (buildCounterBatchGetAmpUrlsRequest < 3) {
     unittest.expect(o.lookupStrategy, unittest.equals('foo'));
-    checkUnnamed1298(o.urls);
+    checkUnnamed1314(o.urls);
   }
   buildCounterBatchGetAmpUrlsRequest--;
 }
 
-buildUnnamed1299() {
+buildUnnamed1315() {
   var o = new core.List<api.AmpUrl>();
   o.add(buildAmpUrl());
   o.add(buildAmpUrl());
   return o;
 }
 
-checkUnnamed1299(core.List<api.AmpUrl> o) {
+checkUnnamed1315(core.List<api.AmpUrl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAmpUrl(o[0]);
   checkAmpUrl(o[1]);
 }
 
-buildUnnamed1300() {
+buildUnnamed1316() {
   var o = new core.List<api.AmpUrlError>();
   o.add(buildAmpUrlError());
   o.add(buildAmpUrlError());
   return o;
 }
 
-checkUnnamed1300(core.List<api.AmpUrlError> o) {
+checkUnnamed1316(core.List<api.AmpUrlError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAmpUrlError(o[0]);
   checkAmpUrlError(o[1]);
@@ -161,8 +161,8 @@
   var o = new api.BatchGetAmpUrlsResponse();
   buildCounterBatchGetAmpUrlsResponse++;
   if (buildCounterBatchGetAmpUrlsResponse < 3) {
-    o.ampUrls = buildUnnamed1299();
-    o.urlErrors = buildUnnamed1300();
+    o.ampUrls = buildUnnamed1315();
+    o.urlErrors = buildUnnamed1316();
   }
   buildCounterBatchGetAmpUrlsResponse--;
   return o;
@@ -171,8 +171,8 @@
 checkBatchGetAmpUrlsResponse(api.BatchGetAmpUrlsResponse o) {
   buildCounterBatchGetAmpUrlsResponse++;
   if (buildCounterBatchGetAmpUrlsResponse < 3) {
-    checkUnnamed1299(o.ampUrls);
-    checkUnnamed1300(o.urlErrors);
+    checkUnnamed1315(o.ampUrls);
+    checkUnnamed1316(o.urlErrors);
   }
   buildCounterBatchGetAmpUrlsResponse--;
 }
diff --git a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
index 179585a..bb0d456 100644
--- a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
+++ b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
@@ -73,14 +73,14 @@
   buildCounterAccountBidderLocation--;
 }
 
-buildUnnamed997() {
+buildUnnamed1006() {
   var o = new core.List<api.AccountBidderLocation>();
   o.add(buildAccountBidderLocation());
   o.add(buildAccountBidderLocation());
   return o;
 }
 
-checkUnnamed997(core.List<api.AccountBidderLocation> o) {
+checkUnnamed1006(core.List<api.AccountBidderLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountBidderLocation(o[0]);
   checkAccountBidderLocation(o[1]);
@@ -91,7 +91,7 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.bidderLocation = buildUnnamed997();
+    o.bidderLocation = buildUnnamed1006();
     o.cookieMatchingNid = "foo";
     o.cookieMatchingUrl = "foo";
     o.id = 42;
@@ -107,7 +107,7 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed997(o.bidderLocation);
+    checkUnnamed1006(o.bidderLocation);
     unittest.expect(o.cookieMatchingNid, unittest.equals('foo'));
     unittest.expect(o.cookieMatchingUrl, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals(42));
@@ -119,14 +119,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed998() {
+buildUnnamed1007() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed998(core.List<api.Account> o) {
+checkUnnamed1007(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -137,7 +137,7 @@
   var o = new api.AccountsList();
   buildCounterAccountsList++;
   if (buildCounterAccountsList < 3) {
-    o.items = buildUnnamed998();
+    o.items = buildUnnamed1007();
     o.kind = "foo";
   }
   buildCounterAccountsList--;
@@ -147,20 +147,20 @@
 checkAccountsList(api.AccountsList o) {
   buildCounterAccountsList++;
   if (buildCounterAccountsList < 3) {
-    checkUnnamed998(o.items);
+    checkUnnamed1007(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountsList--;
 }
 
-buildUnnamed999() {
+buildUnnamed1008() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed999(core.List<core.String> o) {
+checkUnnamed1008(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -173,7 +173,7 @@
   if (buildCounterBillingInfo < 3) {
     o.accountId = 42;
     o.accountName = "foo";
-    o.billingId = buildUnnamed999();
+    o.billingId = buildUnnamed1008();
     o.kind = "foo";
   }
   buildCounterBillingInfo--;
@@ -185,20 +185,20 @@
   if (buildCounterBillingInfo < 3) {
     unittest.expect(o.accountId, unittest.equals(42));
     unittest.expect(o.accountName, unittest.equals('foo'));
-    checkUnnamed999(o.billingId);
+    checkUnnamed1008(o.billingId);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBillingInfo--;
 }
 
-buildUnnamed1000() {
+buildUnnamed1009() {
   var o = new core.List<api.BillingInfo>();
   o.add(buildBillingInfo());
   o.add(buildBillingInfo());
   return o;
 }
 
-checkUnnamed1000(core.List<api.BillingInfo> o) {
+checkUnnamed1009(core.List<api.BillingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBillingInfo(o[0]);
   checkBillingInfo(o[1]);
@@ -209,7 +209,7 @@
   var o = new api.BillingInfoList();
   buildCounterBillingInfoList++;
   if (buildCounterBillingInfoList < 3) {
-    o.items = buildUnnamed1000();
+    o.items = buildUnnamed1009();
     o.kind = "foo";
   }
   buildCounterBillingInfoList--;
@@ -219,7 +219,7 @@
 checkBillingInfoList(api.BillingInfoList o) {
   buildCounterBillingInfoList++;
   if (buildCounterBillingInfoList < 3) {
-    checkUnnamed1000(o.items);
+    checkUnnamed1009(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBillingInfoList--;
@@ -254,53 +254,53 @@
   buildCounterBudget--;
 }
 
-buildUnnamed1001() {
+buildUnnamed1010() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1001(core.List<core.String> o) {
+checkUnnamed1010(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1002() {
+buildUnnamed1011() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1002(core.List<core.int> o) {
+checkUnnamed1011(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));
 }
 
-buildUnnamed1003() {
+buildUnnamed1012() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1003(core.List<core.String> o) {
+checkUnnamed1012(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1004() {
+buildUnnamed1013() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1004(core.List<core.String> o) {
+checkUnnamed1013(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -311,7 +311,7 @@
   var o = new api.CreativeCorrections();
   buildCounterCreativeCorrections++;
   if (buildCounterCreativeCorrections < 3) {
-    o.details = buildUnnamed1004();
+    o.details = buildUnnamed1013();
     o.reason = "foo";
   }
   buildCounterCreativeCorrections--;
@@ -321,33 +321,33 @@
 checkCreativeCorrections(api.CreativeCorrections o) {
   buildCounterCreativeCorrections++;
   if (buildCounterCreativeCorrections < 3) {
-    checkUnnamed1004(o.details);
+    checkUnnamed1013(o.details);
     unittest.expect(o.reason, unittest.equals('foo'));
   }
   buildCounterCreativeCorrections--;
 }
 
-buildUnnamed1005() {
+buildUnnamed1014() {
   var o = new core.List<api.CreativeCorrections>();
   o.add(buildCreativeCorrections());
   o.add(buildCreativeCorrections());
   return o;
 }
 
-checkUnnamed1005(core.List<api.CreativeCorrections> o) {
+checkUnnamed1014(core.List<api.CreativeCorrections> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeCorrections(o[0]);
   checkCreativeCorrections(o[1]);
 }
 
-buildUnnamed1006() {
+buildUnnamed1015() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1006(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'));
@@ -358,7 +358,7 @@
   var o = new api.CreativeDisapprovalReasons();
   buildCounterCreativeDisapprovalReasons++;
   if (buildCounterCreativeDisapprovalReasons < 3) {
-    o.details = buildUnnamed1006();
+    o.details = buildUnnamed1015();
     o.reason = "foo";
   }
   buildCounterCreativeDisapprovalReasons--;
@@ -368,20 +368,20 @@
 checkCreativeDisapprovalReasons(api.CreativeDisapprovalReasons o) {
   buildCounterCreativeDisapprovalReasons++;
   if (buildCounterCreativeDisapprovalReasons < 3) {
-    checkUnnamed1006(o.details);
+    checkUnnamed1015(o.details);
     unittest.expect(o.reason, unittest.equals('foo'));
   }
   buildCounterCreativeDisapprovalReasons--;
 }
 
-buildUnnamed1007() {
+buildUnnamed1016() {
   var o = new core.List<api.CreativeDisapprovalReasons>();
   o.add(buildCreativeDisapprovalReasons());
   o.add(buildCreativeDisapprovalReasons());
   return o;
 }
 
-checkUnnamed1007(core.List<api.CreativeDisapprovalReasons> o) {
+checkUnnamed1016(core.List<api.CreativeDisapprovalReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeDisapprovalReasons(o[0]);
   checkCreativeDisapprovalReasons(o[1]);
@@ -408,14 +408,14 @@
   buildCounterCreativeFilteringReasonsReasons--;
 }
 
-buildUnnamed1008() {
+buildUnnamed1017() {
   var o = new core.List<api.CreativeFilteringReasonsReasons>();
   o.add(buildCreativeFilteringReasonsReasons());
   o.add(buildCreativeFilteringReasonsReasons());
   return o;
 }
 
-checkUnnamed1008(core.List<api.CreativeFilteringReasonsReasons> o) {
+checkUnnamed1017(core.List<api.CreativeFilteringReasonsReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeFilteringReasonsReasons(o[0]);
   checkCreativeFilteringReasonsReasons(o[1]);
@@ -427,7 +427,7 @@
   buildCounterCreativeFilteringReasons++;
   if (buildCounterCreativeFilteringReasons < 3) {
     o.date = "foo";
-    o.reasons = buildUnnamed1008();
+    o.reasons = buildUnnamed1017();
   }
   buildCounterCreativeFilteringReasons--;
   return o;
@@ -437,19 +437,19 @@
   buildCounterCreativeFilteringReasons++;
   if (buildCounterCreativeFilteringReasons < 3) {
     unittest.expect(o.date, unittest.equals('foo'));
-    checkUnnamed1008(o.reasons);
+    checkUnnamed1017(o.reasons);
   }
   buildCounterCreativeFilteringReasons--;
 }
 
-buildUnnamed1009() {
+buildUnnamed1018() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1009(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'));
@@ -501,14 +501,14 @@
   buildCounterCreativeNativeAdImage--;
 }
 
-buildUnnamed1010() {
+buildUnnamed1019() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1010(core.List<core.String> o) {
+checkUnnamed1019(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -549,7 +549,7 @@
     o.clickTrackingUrl = "foo";
     o.headline = "foo";
     o.image = buildCreativeNativeAdImage();
-    o.impressionTrackingUrl = buildUnnamed1010();
+    o.impressionTrackingUrl = buildUnnamed1019();
     o.logo = buildCreativeNativeAdLogo();
     o.price = "foo";
     o.starRating = 42.0;
@@ -569,7 +569,7 @@
     unittest.expect(o.clickTrackingUrl, unittest.equals('foo'));
     unittest.expect(o.headline, unittest.equals('foo'));
     checkCreativeNativeAdImage(o.image);
-    checkUnnamed1010(o.impressionTrackingUrl);
+    checkUnnamed1019(o.impressionTrackingUrl);
     checkCreativeNativeAdLogo(o.logo);
     unittest.expect(o.price, unittest.equals('foo'));
     unittest.expect(o.starRating, unittest.equals(42.0));
@@ -578,53 +578,53 @@
   buildCounterCreativeNativeAd--;
 }
 
-buildUnnamed1011() {
+buildUnnamed1020() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1011(core.List<core.int> o) {
+checkUnnamed1020(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));
 }
 
-buildUnnamed1012() {
+buildUnnamed1021() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1012(core.List<core.int> o) {
+checkUnnamed1021(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));
 }
 
-buildUnnamed1013() {
+buildUnnamed1022() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1013(core.List<core.int> o) {
+checkUnnamed1022(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));
 }
 
-buildUnnamed1014() {
+buildUnnamed1023() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1014(core.List<core.int> o) {
+checkUnnamed1023(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));
@@ -637,25 +637,25 @@
   if (buildCounterCreative < 3) {
     o.HTMLSnippet = "foo";
     o.accountId = 42;
-    o.advertiserId = buildUnnamed1001();
+    o.advertiserId = buildUnnamed1010();
     o.advertiserName = "foo";
     o.agencyId = "foo";
     o.apiUploadTimestamp = core.DateTime.parse("2002-02-27T14:01:02");
-    o.attribute = buildUnnamed1002();
+    o.attribute = buildUnnamed1011();
     o.buyerCreativeId = "foo";
-    o.clickThroughUrl = buildUnnamed1003();
-    o.corrections = buildUnnamed1005();
-    o.disapprovalReasons = buildUnnamed1007();
+    o.clickThroughUrl = buildUnnamed1012();
+    o.corrections = buildUnnamed1014();
+    o.disapprovalReasons = buildUnnamed1016();
     o.filteringReasons = buildCreativeFilteringReasons();
     o.height = 42;
-    o.impressionTrackingUrl = buildUnnamed1009();
+    o.impressionTrackingUrl = buildUnnamed1018();
     o.kind = "foo";
     o.nativeAd = buildCreativeNativeAd();
-    o.productCategories = buildUnnamed1011();
-    o.restrictedCategories = buildUnnamed1012();
-    o.sensitiveCategories = buildUnnamed1013();
+    o.productCategories = buildUnnamed1020();
+    o.restrictedCategories = buildUnnamed1021();
+    o.sensitiveCategories = buildUnnamed1022();
     o.status = "foo";
-    o.vendorType = buildUnnamed1014();
+    o.vendorType = buildUnnamed1023();
     o.version = 42;
     o.videoURL = "foo";
     o.width = 42;
@@ -669,26 +669,26 @@
   if (buildCounterCreative < 3) {
     unittest.expect(o.HTMLSnippet, unittest.equals('foo'));
     unittest.expect(o.accountId, unittest.equals(42));
-    checkUnnamed1001(o.advertiserId);
+    checkUnnamed1010(o.advertiserId);
     unittest.expect(o.advertiserName, unittest.equals('foo'));
     unittest.expect(o.agencyId, unittest.equals('foo'));
     unittest.expect(o.apiUploadTimestamp,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1002(o.attribute);
+    checkUnnamed1011(o.attribute);
     unittest.expect(o.buyerCreativeId, unittest.equals('foo'));
-    checkUnnamed1003(o.clickThroughUrl);
-    checkUnnamed1005(o.corrections);
-    checkUnnamed1007(o.disapprovalReasons);
+    checkUnnamed1012(o.clickThroughUrl);
+    checkUnnamed1014(o.corrections);
+    checkUnnamed1016(o.disapprovalReasons);
     checkCreativeFilteringReasons(o.filteringReasons);
     unittest.expect(o.height, unittest.equals(42));
-    checkUnnamed1009(o.impressionTrackingUrl);
+    checkUnnamed1018(o.impressionTrackingUrl);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkCreativeNativeAd(o.nativeAd);
-    checkUnnamed1011(o.productCategories);
-    checkUnnamed1012(o.restrictedCategories);
-    checkUnnamed1013(o.sensitiveCategories);
+    checkUnnamed1020(o.productCategories);
+    checkUnnamed1021(o.restrictedCategories);
+    checkUnnamed1022(o.sensitiveCategories);
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed1014(o.vendorType);
+    checkUnnamed1023(o.vendorType);
     unittest.expect(o.version, unittest.equals(42));
     unittest.expect(o.videoURL, unittest.equals('foo'));
     unittest.expect(o.width, unittest.equals(42));
@@ -696,14 +696,14 @@
   buildCounterCreative--;
 }
 
-buildUnnamed1015() {
+buildUnnamed1024() {
   var o = new core.List<api.Creative>();
   o.add(buildCreative());
   o.add(buildCreative());
   return o;
 }
 
-checkUnnamed1015(core.List<api.Creative> o) {
+checkUnnamed1024(core.List<api.Creative> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreative(o[0]);
   checkCreative(o[1]);
@@ -714,7 +714,7 @@
   var o = new api.CreativesList();
   buildCounterCreativesList++;
   if (buildCounterCreativesList < 3) {
-    o.items = buildUnnamed1015();
+    o.items = buildUnnamed1024();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -725,7 +725,7 @@
 checkCreativesList(api.CreativesList o) {
   buildCounterCreativesList++;
   if (buildCounterCreativesList < 3) {
-    checkUnnamed1015(o.items);
+    checkUnnamed1024(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -779,14 +779,14 @@
   buildCounterDirectDeal--;
 }
 
-buildUnnamed1016() {
+buildUnnamed1025() {
   var o = new core.List<api.DirectDeal>();
   o.add(buildDirectDeal());
   o.add(buildDirectDeal());
   return o;
 }
 
-checkUnnamed1016(core.List<api.DirectDeal> o) {
+checkUnnamed1025(core.List<api.DirectDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectDeal(o[0]);
   checkDirectDeal(o[1]);
@@ -797,7 +797,7 @@
   var o = new api.DirectDealsList();
   buildCounterDirectDealsList++;
   if (buildCounterDirectDealsList < 3) {
-    o.directDeals = buildUnnamed1016();
+    o.directDeals = buildUnnamed1025();
     o.kind = "foo";
   }
   buildCounterDirectDealsList--;
@@ -807,13 +807,13 @@
 checkDirectDealsList(api.DirectDealsList o) {
   buildCounterDirectDealsList++;
   if (buildCounterDirectDealsList < 3) {
-    checkUnnamed1016(o.directDeals);
+    checkUnnamed1025(o.directDeals);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDirectDealsList--;
 }
 
-buildUnnamed1017() {
+buildUnnamed1026() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -828,7 +828,7 @@
   return o;
 }
 
-checkUnnamed1017(core.List<core.Object> o) {
+checkUnnamed1026(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map;
   unittest.expect(casted1, unittest.hasLength(3));
@@ -842,7 +842,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1018() {
+buildUnnamed1027() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -857,7 +857,7 @@
   return o;
 }
 
-checkUnnamed1018(core.List<core.Object> o) {
+checkUnnamed1027(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o[0]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -871,7 +871,7 @@
   unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1019() {
+buildUnnamed1028() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -886,7 +886,7 @@
   return o;
 }
 
-checkUnnamed1019(core.List<core.Object> o) {
+checkUnnamed1028(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o[0]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -900,7 +900,7 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1020() {
+buildUnnamed1029() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -915,7 +915,7 @@
   return o;
 }
 
-checkUnnamed1020(core.List<core.Object> o) {
+checkUnnamed1029(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o[0]) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -936,11 +936,11 @@
   if (buildCounterPerformanceReport < 3) {
     o.bidRate = 42.0;
     o.bidRequestRate = 42.0;
-    o.calloutStatusRate = buildUnnamed1017();
-    o.cookieMatcherStatusRate = buildUnnamed1018();
-    o.creativeStatusRate = buildUnnamed1019();
+    o.calloutStatusRate = buildUnnamed1026();
+    o.cookieMatcherStatusRate = buildUnnamed1027();
+    o.creativeStatusRate = buildUnnamed1028();
     o.filteredBidRate = 42.0;
-    o.hostedMatchStatusRate = buildUnnamed1020();
+    o.hostedMatchStatusRate = buildUnnamed1029();
     o.inventoryMatchRate = 42.0;
     o.kind = "foo";
     o.latency50thPercentile = 42.0;
@@ -966,11 +966,11 @@
   if (buildCounterPerformanceReport < 3) {
     unittest.expect(o.bidRate, unittest.equals(42.0));
     unittest.expect(o.bidRequestRate, unittest.equals(42.0));
-    checkUnnamed1017(o.calloutStatusRate);
-    checkUnnamed1018(o.cookieMatcherStatusRate);
-    checkUnnamed1019(o.creativeStatusRate);
+    checkUnnamed1026(o.calloutStatusRate);
+    checkUnnamed1027(o.cookieMatcherStatusRate);
+    checkUnnamed1028(o.creativeStatusRate);
     unittest.expect(o.filteredBidRate, unittest.equals(42.0));
-    checkUnnamed1020(o.hostedMatchStatusRate);
+    checkUnnamed1029(o.hostedMatchStatusRate);
     unittest.expect(o.inventoryMatchRate, unittest.equals(42.0));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.latency50thPercentile, unittest.equals(42.0));
@@ -990,14 +990,14 @@
   buildCounterPerformanceReport--;
 }
 
-buildUnnamed1021() {
+buildUnnamed1030() {
   var o = new core.List<api.PerformanceReport>();
   o.add(buildPerformanceReport());
   o.add(buildPerformanceReport());
   return o;
 }
 
-checkUnnamed1021(core.List<api.PerformanceReport> o) {
+checkUnnamed1030(core.List<api.PerformanceReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerformanceReport(o[0]);
   checkPerformanceReport(o[1]);
@@ -1009,7 +1009,7 @@
   buildCounterPerformanceReportList++;
   if (buildCounterPerformanceReportList < 3) {
     o.kind = "foo";
-    o.performanceReport = buildUnnamed1021();
+    o.performanceReport = buildUnnamed1030();
   }
   buildCounterPerformanceReportList--;
   return o;
@@ -1019,19 +1019,19 @@
   buildCounterPerformanceReportList++;
   if (buildCounterPerformanceReportList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1021(o.performanceReport);
+    checkUnnamed1030(o.performanceReport);
   }
   buildCounterPerformanceReportList--;
 }
 
-buildUnnamed1022() {
+buildUnnamed1031() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1022(core.List<core.String> o) {
+checkUnnamed1031(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1058,40 +1058,40 @@
   buildCounterPretargetingConfigDimensions--;
 }
 
-buildUnnamed1023() {
+buildUnnamed1032() {
   var o = new core.List<api.PretargetingConfigDimensions>();
   o.add(buildPretargetingConfigDimensions());
   o.add(buildPretargetingConfigDimensions());
   return o;
 }
 
-checkUnnamed1023(core.List<api.PretargetingConfigDimensions> o) {
+checkUnnamed1032(core.List<api.PretargetingConfigDimensions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigDimensions(o[0]);
   checkPretargetingConfigDimensions(o[1]);
 }
 
-buildUnnamed1024() {
+buildUnnamed1033() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1024(core.List<core.String> o) {
+checkUnnamed1033(core.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() {
+buildUnnamed1034() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1025(core.List<core.String> o) {
+checkUnnamed1034(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1119,157 +1119,19 @@
   buildCounterPretargetingConfigExcludedPlacements--;
 }
 
-buildUnnamed1026() {
+buildUnnamed1035() {
   var o = new core.List<api.PretargetingConfigExcludedPlacements>();
   o.add(buildPretargetingConfigExcludedPlacements());
   o.add(buildPretargetingConfigExcludedPlacements());
   return o;
 }
 
-checkUnnamed1026(core.List<api.PretargetingConfigExcludedPlacements> o) {
+checkUnnamed1035(core.List<api.PretargetingConfigExcludedPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigExcludedPlacements(o[0]);
   checkPretargetingConfigExcludedPlacements(o[1]);
 }
 
-buildUnnamed1027() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return 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'));
-}
-
-buildUnnamed1028() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return 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'));
-}
-
-buildUnnamed1029() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1029(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1030() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1030(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1031() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1031(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1032() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1032(core.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() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1033(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterPretargetingConfigPlacements = 0;
-buildPretargetingConfigPlacements() {
-  var o = new api.PretargetingConfigPlacements();
-  buildCounterPretargetingConfigPlacements++;
-  if (buildCounterPretargetingConfigPlacements < 3) {
-    o.token = "foo";
-    o.type = "foo";
-  }
-  buildCounterPretargetingConfigPlacements--;
-  return o;
-}
-
-checkPretargetingConfigPlacements(api.PretargetingConfigPlacements o) {
-  buildCounterPretargetingConfigPlacements++;
-  if (buildCounterPretargetingConfigPlacements < 3) {
-    unittest.expect(o.token, unittest.equals('foo'));
-    unittest.expect(o.type, unittest.equals('foo'));
-  }
-  buildCounterPretargetingConfigPlacements--;
-}
-
-buildUnnamed1034() {
-  var o = new core.List<api.PretargetingConfigPlacements>();
-  o.add(buildPretargetingConfigPlacements());
-  o.add(buildPretargetingConfigPlacements());
-  return o;
-}
-
-checkUnnamed1034(core.List<api.PretargetingConfigPlacements> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkPretargetingConfigPlacements(o[0]);
-  checkPretargetingConfigPlacements(o[1]);
-}
-
-buildUnnamed1035() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1035(core.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() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1322,6 +1184,144 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed1040() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+buildUnnamed1041() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1041(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1042() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1042(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterPretargetingConfigPlacements = 0;
+buildPretargetingConfigPlacements() {
+  var o = new api.PretargetingConfigPlacements();
+  buildCounterPretargetingConfigPlacements++;
+  if (buildCounterPretargetingConfigPlacements < 3) {
+    o.token = "foo";
+    o.type = "foo";
+  }
+  buildCounterPretargetingConfigPlacements--;
+  return o;
+}
+
+checkPretargetingConfigPlacements(api.PretargetingConfigPlacements o) {
+  buildCounterPretargetingConfigPlacements++;
+  if (buildCounterPretargetingConfigPlacements < 3) {
+    unittest.expect(o.token, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+  }
+  buildCounterPretargetingConfigPlacements--;
+}
+
+buildUnnamed1043() {
+  var o = new core.List<api.PretargetingConfigPlacements>();
+  o.add(buildPretargetingConfigPlacements());
+  o.add(buildPretargetingConfigPlacements());
+  return o;
+}
+
+checkUnnamed1043(core.List<api.PretargetingConfigPlacements> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkPretargetingConfigPlacements(o[0]);
+  checkPretargetingConfigPlacements(o[1]);
+}
+
+buildUnnamed1044() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1044(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1045() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1045(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1046() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+buildUnnamed1047() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1047(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1048() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
 core.int buildCounterPretargetingConfig = 0;
 buildPretargetingConfig() {
   var o = new api.PretargetingConfig();
@@ -1330,26 +1330,26 @@
     o.billingId = "foo";
     o.configId = "foo";
     o.configName = "foo";
-    o.creativeType = buildUnnamed1022();
-    o.dimensions = buildUnnamed1023();
-    o.excludedContentLabels = buildUnnamed1024();
-    o.excludedGeoCriteriaIds = buildUnnamed1025();
-    o.excludedPlacements = buildUnnamed1026();
-    o.excludedUserLists = buildUnnamed1027();
-    o.excludedVerticals = buildUnnamed1028();
-    o.geoCriteriaIds = buildUnnamed1029();
+    o.creativeType = buildUnnamed1031();
+    o.dimensions = buildUnnamed1032();
+    o.excludedContentLabels = buildUnnamed1033();
+    o.excludedGeoCriteriaIds = buildUnnamed1034();
+    o.excludedPlacements = buildUnnamed1035();
+    o.excludedUserLists = buildUnnamed1036();
+    o.excludedVerticals = buildUnnamed1037();
+    o.geoCriteriaIds = buildUnnamed1038();
     o.isActive = true;
     o.kind = "foo";
-    o.languages = buildUnnamed1030();
-    o.mobileCarriers = buildUnnamed1031();
-    o.mobileDevices = buildUnnamed1032();
-    o.mobileOperatingSystemVersions = buildUnnamed1033();
-    o.placements = buildUnnamed1034();
-    o.platforms = buildUnnamed1035();
-    o.supportedCreativeAttributes = buildUnnamed1036();
-    o.userLists = buildUnnamed1037();
-    o.vendorTypes = buildUnnamed1038();
-    o.verticals = buildUnnamed1039();
+    o.languages = buildUnnamed1039();
+    o.mobileCarriers = buildUnnamed1040();
+    o.mobileDevices = buildUnnamed1041();
+    o.mobileOperatingSystemVersions = buildUnnamed1042();
+    o.placements = buildUnnamed1043();
+    o.platforms = buildUnnamed1044();
+    o.supportedCreativeAttributes = buildUnnamed1045();
+    o.userLists = buildUnnamed1046();
+    o.vendorTypes = buildUnnamed1047();
+    o.verticals = buildUnnamed1048();
   }
   buildCounterPretargetingConfig--;
   return o;
@@ -1361,38 +1361,38 @@
     unittest.expect(o.billingId, unittest.equals('foo'));
     unittest.expect(o.configId, unittest.equals('foo'));
     unittest.expect(o.configName, unittest.equals('foo'));
-    checkUnnamed1022(o.creativeType);
-    checkUnnamed1023(o.dimensions);
-    checkUnnamed1024(o.excludedContentLabels);
-    checkUnnamed1025(o.excludedGeoCriteriaIds);
-    checkUnnamed1026(o.excludedPlacements);
-    checkUnnamed1027(o.excludedUserLists);
-    checkUnnamed1028(o.excludedVerticals);
-    checkUnnamed1029(o.geoCriteriaIds);
+    checkUnnamed1031(o.creativeType);
+    checkUnnamed1032(o.dimensions);
+    checkUnnamed1033(o.excludedContentLabels);
+    checkUnnamed1034(o.excludedGeoCriteriaIds);
+    checkUnnamed1035(o.excludedPlacements);
+    checkUnnamed1036(o.excludedUserLists);
+    checkUnnamed1037(o.excludedVerticals);
+    checkUnnamed1038(o.geoCriteriaIds);
     unittest.expect(o.isActive, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1030(o.languages);
-    checkUnnamed1031(o.mobileCarriers);
-    checkUnnamed1032(o.mobileDevices);
-    checkUnnamed1033(o.mobileOperatingSystemVersions);
-    checkUnnamed1034(o.placements);
-    checkUnnamed1035(o.platforms);
-    checkUnnamed1036(o.supportedCreativeAttributes);
-    checkUnnamed1037(o.userLists);
-    checkUnnamed1038(o.vendorTypes);
-    checkUnnamed1039(o.verticals);
+    checkUnnamed1039(o.languages);
+    checkUnnamed1040(o.mobileCarriers);
+    checkUnnamed1041(o.mobileDevices);
+    checkUnnamed1042(o.mobileOperatingSystemVersions);
+    checkUnnamed1043(o.placements);
+    checkUnnamed1044(o.platforms);
+    checkUnnamed1045(o.supportedCreativeAttributes);
+    checkUnnamed1046(o.userLists);
+    checkUnnamed1047(o.vendorTypes);
+    checkUnnamed1048(o.verticals);
   }
   buildCounterPretargetingConfig--;
 }
 
-buildUnnamed1040() {
+buildUnnamed1049() {
   var o = new core.List<api.PretargetingConfig>();
   o.add(buildPretargetingConfig());
   o.add(buildPretargetingConfig());
   return o;
 }
 
-checkUnnamed1040(core.List<api.PretargetingConfig> o) {
+checkUnnamed1049(core.List<api.PretargetingConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfig(o[0]);
   checkPretargetingConfig(o[1]);
@@ -1403,7 +1403,7 @@
   var o = new api.PretargetingConfigList();
   buildCounterPretargetingConfigList++;
   if (buildCounterPretargetingConfigList < 3) {
-    o.items = buildUnnamed1040();
+    o.items = buildUnnamed1049();
     o.kind = "foo";
   }
   buildCounterPretargetingConfigList--;
@@ -1413,33 +1413,33 @@
 checkPretargetingConfigList(api.PretargetingConfigList o) {
   buildCounterPretargetingConfigList++;
   if (buildCounterPretargetingConfigList < 3) {
-    checkUnnamed1040(o.items);
+    checkUnnamed1049(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPretargetingConfigList--;
 }
 
-buildUnnamed1041() {
+buildUnnamed1050() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1041(core.List<core.int> o) {
+checkUnnamed1050(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));
 }
 
-buildUnnamed1042() {
+buildUnnamed1051() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1042(core.List<core.String> o) {
+checkUnnamed1051(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2325,8 +2325,8 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.CreativesResourceApi res = new api.AdexchangebuyerApi(mock).creatives;
-      var arg_accountId = buildUnnamed1041();
-      var arg_buyerCreativeId = buildUnnamed1042();
+      var arg_accountId = buildUnnamed1050();
+      var arg_buyerCreativeId = buildUnnamed1051();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_statusFilter = "foo";
diff --git a/generated/googleapis/test/adexchangebuyer/v1_4_test.dart b/generated/googleapis/test/adexchangebuyer/v1_4_test.dart
index 6680ef3..ad7ff51 100644
--- a/generated/googleapis/test/adexchangebuyer/v1_4_test.dart
+++ b/generated/googleapis/test/adexchangebuyer/v1_4_test.dart
@@ -75,14 +75,14 @@
   buildCounterAccountBidderLocation--;
 }
 
-buildUnnamed2082() {
+buildUnnamed2104() {
   var o = new core.List<api.AccountBidderLocation>();
   o.add(buildAccountBidderLocation());
   o.add(buildAccountBidderLocation());
   return o;
 }
 
-checkUnnamed2082(core.List<api.AccountBidderLocation> o) {
+checkUnnamed2104(core.List<api.AccountBidderLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountBidderLocation(o[0]);
   checkAccountBidderLocation(o[1]);
@@ -93,7 +93,7 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.bidderLocation = buildUnnamed2082();
+    o.bidderLocation = buildUnnamed2104();
     o.cookieMatchingNid = "foo";
     o.cookieMatchingUrl = "foo";
     o.id = 42;
@@ -109,7 +109,7 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed2082(o.bidderLocation);
+    checkUnnamed2104(o.bidderLocation);
     unittest.expect(o.cookieMatchingNid, unittest.equals('foo'));
     unittest.expect(o.cookieMatchingUrl, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals(42));
@@ -121,14 +121,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed2083() {
+buildUnnamed2105() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed2083(core.List<api.Account> o) {
+checkUnnamed2105(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -139,7 +139,7 @@
   var o = new api.AccountsList();
   buildCounterAccountsList++;
   if (buildCounterAccountsList < 3) {
-    o.items = buildUnnamed2083();
+    o.items = buildUnnamed2105();
     o.kind = "foo";
   }
   buildCounterAccountsList--;
@@ -149,20 +149,20 @@
 checkAccountsList(api.AccountsList o) {
   buildCounterAccountsList++;
   if (buildCounterAccountsList < 3) {
-    checkUnnamed2083(o.items);
+    checkUnnamed2105(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountsList--;
 }
 
-buildUnnamed2084() {
+buildUnnamed2106() {
   var o = new core.List<api.MarketplaceDeal>();
   o.add(buildMarketplaceDeal());
   o.add(buildMarketplaceDeal());
   return o;
 }
 
-checkUnnamed2084(core.List<api.MarketplaceDeal> o) {
+checkUnnamed2106(core.List<api.MarketplaceDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMarketplaceDeal(o[0]);
   checkMarketplaceDeal(o[1]);
@@ -173,7 +173,7 @@
   var o = new api.AddOrderDealsRequest();
   buildCounterAddOrderDealsRequest++;
   if (buildCounterAddOrderDealsRequest < 3) {
-    o.deals = buildUnnamed2084();
+    o.deals = buildUnnamed2106();
     o.proposalRevisionNumber = "foo";
     o.updateAction = "foo";
   }
@@ -184,21 +184,21 @@
 checkAddOrderDealsRequest(api.AddOrderDealsRequest o) {
   buildCounterAddOrderDealsRequest++;
   if (buildCounterAddOrderDealsRequest < 3) {
-    checkUnnamed2084(o.deals);
+    checkUnnamed2106(o.deals);
     unittest.expect(o.proposalRevisionNumber, unittest.equals('foo'));
     unittest.expect(o.updateAction, unittest.equals('foo'));
   }
   buildCounterAddOrderDealsRequest--;
 }
 
-buildUnnamed2085() {
+buildUnnamed2107() {
   var o = new core.List<api.MarketplaceDeal>();
   o.add(buildMarketplaceDeal());
   o.add(buildMarketplaceDeal());
   return o;
 }
 
-checkUnnamed2085(core.List<api.MarketplaceDeal> o) {
+checkUnnamed2107(core.List<api.MarketplaceDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMarketplaceDeal(o[0]);
   checkMarketplaceDeal(o[1]);
@@ -209,7 +209,7 @@
   var o = new api.AddOrderDealsResponse();
   buildCounterAddOrderDealsResponse++;
   if (buildCounterAddOrderDealsResponse < 3) {
-    o.deals = buildUnnamed2085();
+    o.deals = buildUnnamed2107();
     o.proposalRevisionNumber = "foo";
   }
   buildCounterAddOrderDealsResponse--;
@@ -219,20 +219,20 @@
 checkAddOrderDealsResponse(api.AddOrderDealsResponse o) {
   buildCounterAddOrderDealsResponse++;
   if (buildCounterAddOrderDealsResponse < 3) {
-    checkUnnamed2085(o.deals);
+    checkUnnamed2107(o.deals);
     unittest.expect(o.proposalRevisionNumber, unittest.equals('foo'));
   }
   buildCounterAddOrderDealsResponse--;
 }
 
-buildUnnamed2086() {
+buildUnnamed2108() {
   var o = new core.List<api.MarketplaceNote>();
   o.add(buildMarketplaceNote());
   o.add(buildMarketplaceNote());
   return o;
 }
 
-checkUnnamed2086(core.List<api.MarketplaceNote> o) {
+checkUnnamed2108(core.List<api.MarketplaceNote> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMarketplaceNote(o[0]);
   checkMarketplaceNote(o[1]);
@@ -243,7 +243,7 @@
   var o = new api.AddOrderNotesRequest();
   buildCounterAddOrderNotesRequest++;
   if (buildCounterAddOrderNotesRequest < 3) {
-    o.notes = buildUnnamed2086();
+    o.notes = buildUnnamed2108();
   }
   buildCounterAddOrderNotesRequest--;
   return o;
@@ -252,19 +252,19 @@
 checkAddOrderNotesRequest(api.AddOrderNotesRequest o) {
   buildCounterAddOrderNotesRequest++;
   if (buildCounterAddOrderNotesRequest < 3) {
-    checkUnnamed2086(o.notes);
+    checkUnnamed2108(o.notes);
   }
   buildCounterAddOrderNotesRequest--;
 }
 
-buildUnnamed2087() {
+buildUnnamed2109() {
   var o = new core.List<api.MarketplaceNote>();
   o.add(buildMarketplaceNote());
   o.add(buildMarketplaceNote());
   return o;
 }
 
-checkUnnamed2087(core.List<api.MarketplaceNote> o) {
+checkUnnamed2109(core.List<api.MarketplaceNote> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMarketplaceNote(o[0]);
   checkMarketplaceNote(o[1]);
@@ -275,7 +275,7 @@
   var o = new api.AddOrderNotesResponse();
   buildCounterAddOrderNotesResponse++;
   if (buildCounterAddOrderNotesResponse < 3) {
-    o.notes = buildUnnamed2087();
+    o.notes = buildUnnamed2109();
   }
   buildCounterAddOrderNotesResponse--;
   return o;
@@ -284,19 +284,19 @@
 checkAddOrderNotesResponse(api.AddOrderNotesResponse o) {
   buildCounterAddOrderNotesResponse++;
   if (buildCounterAddOrderNotesResponse < 3) {
-    checkUnnamed2087(o.notes);
+    checkUnnamed2109(o.notes);
   }
   buildCounterAddOrderNotesResponse--;
 }
 
-buildUnnamed2088() {
+buildUnnamed2110() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2088(core.List<core.String> o) {
+checkUnnamed2110(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -309,7 +309,7 @@
   if (buildCounterBillingInfo < 3) {
     o.accountId = 42;
     o.accountName = "foo";
-    o.billingId = buildUnnamed2088();
+    o.billingId = buildUnnamed2110();
     o.kind = "foo";
   }
   buildCounterBillingInfo--;
@@ -321,20 +321,20 @@
   if (buildCounterBillingInfo < 3) {
     unittest.expect(o.accountId, unittest.equals(42));
     unittest.expect(o.accountName, unittest.equals('foo'));
-    checkUnnamed2088(o.billingId);
+    checkUnnamed2110(o.billingId);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBillingInfo--;
 }
 
-buildUnnamed2089() {
+buildUnnamed2111() {
   var o = new core.List<api.BillingInfo>();
   o.add(buildBillingInfo());
   o.add(buildBillingInfo());
   return o;
 }
 
-checkUnnamed2089(core.List<api.BillingInfo> o) {
+checkUnnamed2111(core.List<api.BillingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBillingInfo(o[0]);
   checkBillingInfo(o[1]);
@@ -345,7 +345,7 @@
   var o = new api.BillingInfoList();
   buildCounterBillingInfoList++;
   if (buildCounterBillingInfoList < 3) {
-    o.items = buildUnnamed2089();
+    o.items = buildUnnamed2111();
     o.kind = "foo";
   }
   buildCounterBillingInfoList--;
@@ -355,7 +355,7 @@
 checkBillingInfoList(api.BillingInfoList o) {
   buildCounterBillingInfoList++;
   if (buildCounterBillingInfoList < 3) {
-    checkUnnamed2089(o.items);
+    checkUnnamed2111(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBillingInfoList--;
@@ -430,14 +430,14 @@
   buildCounterContactInformation--;
 }
 
-buildUnnamed2090() {
+buildUnnamed2112() {
   var o = new core.List<api.Proposal>();
   o.add(buildProposal());
   o.add(buildProposal());
   return o;
 }
 
-checkUnnamed2090(core.List<api.Proposal> o) {
+checkUnnamed2112(core.List<api.Proposal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProposal(o[0]);
   checkProposal(o[1]);
@@ -448,7 +448,7 @@
   var o = new api.CreateOrdersRequest();
   buildCounterCreateOrdersRequest++;
   if (buildCounterCreateOrdersRequest < 3) {
-    o.proposals = buildUnnamed2090();
+    o.proposals = buildUnnamed2112();
     o.webPropertyCode = "foo";
   }
   buildCounterCreateOrdersRequest--;
@@ -458,20 +458,20 @@
 checkCreateOrdersRequest(api.CreateOrdersRequest o) {
   buildCounterCreateOrdersRequest++;
   if (buildCounterCreateOrdersRequest < 3) {
-    checkUnnamed2090(o.proposals);
+    checkUnnamed2112(o.proposals);
     unittest.expect(o.webPropertyCode, unittest.equals('foo'));
   }
   buildCounterCreateOrdersRequest--;
 }
 
-buildUnnamed2091() {
+buildUnnamed2113() {
   var o = new core.List<api.Proposal>();
   o.add(buildProposal());
   o.add(buildProposal());
   return o;
 }
 
-checkUnnamed2091(core.List<api.Proposal> o) {
+checkUnnamed2113(core.List<api.Proposal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProposal(o[0]);
   checkProposal(o[1]);
@@ -482,7 +482,7 @@
   var o = new api.CreateOrdersResponse();
   buildCounterCreateOrdersResponse++;
   if (buildCounterCreateOrdersResponse < 3) {
-    o.proposals = buildUnnamed2091();
+    o.proposals = buildUnnamed2113();
   }
   buildCounterCreateOrdersResponse--;
   return o;
@@ -491,84 +491,84 @@
 checkCreateOrdersResponse(api.CreateOrdersResponse o) {
   buildCounterCreateOrdersResponse++;
   if (buildCounterCreateOrdersResponse < 3) {
-    checkUnnamed2091(o.proposals);
+    checkUnnamed2113(o.proposals);
   }
   buildCounterCreateOrdersResponse--;
 }
 
-buildUnnamed2092() {
+buildUnnamed2114() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2092(core.List<core.String> o) {
+checkUnnamed2114(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2093() {
+buildUnnamed2115() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2093(core.List<core.int> o) {
+checkUnnamed2115(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));
 }
 
-buildUnnamed2094() {
+buildUnnamed2116() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2094(core.List<core.String> o) {
+checkUnnamed2116(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2095() {
+buildUnnamed2117() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2095(core.List<core.String> o) {
+checkUnnamed2117(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2096() {
+buildUnnamed2118() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2096(core.List<core.int> o) {
+checkUnnamed2118(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));
 }
 
-buildUnnamed2097() {
+buildUnnamed2119() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2097(core.List<core.String> o) {
+checkUnnamed2119(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -579,10 +579,10 @@
   var o = new api.CreativeCorrectionsContexts();
   buildCounterCreativeCorrectionsContexts++;
   if (buildCounterCreativeCorrectionsContexts < 3) {
-    o.auctionType = buildUnnamed2095();
+    o.auctionType = buildUnnamed2117();
     o.contextType = "foo";
-    o.geoCriteriaId = buildUnnamed2096();
-    o.platform = buildUnnamed2097();
+    o.geoCriteriaId = buildUnnamed2118();
+    o.platform = buildUnnamed2119();
   }
   buildCounterCreativeCorrectionsContexts--;
   return o;
@@ -591,35 +591,35 @@
 checkCreativeCorrectionsContexts(api.CreativeCorrectionsContexts o) {
   buildCounterCreativeCorrectionsContexts++;
   if (buildCounterCreativeCorrectionsContexts < 3) {
-    checkUnnamed2095(o.auctionType);
+    checkUnnamed2117(o.auctionType);
     unittest.expect(o.contextType, unittest.equals('foo'));
-    checkUnnamed2096(o.geoCriteriaId);
-    checkUnnamed2097(o.platform);
+    checkUnnamed2118(o.geoCriteriaId);
+    checkUnnamed2119(o.platform);
   }
   buildCounterCreativeCorrectionsContexts--;
 }
 
-buildUnnamed2098() {
+buildUnnamed2120() {
   var o = new core.List<api.CreativeCorrectionsContexts>();
   o.add(buildCreativeCorrectionsContexts());
   o.add(buildCreativeCorrectionsContexts());
   return o;
 }
 
-checkUnnamed2098(core.List<api.CreativeCorrectionsContexts> o) {
+checkUnnamed2120(core.List<api.CreativeCorrectionsContexts> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeCorrectionsContexts(o[0]);
   checkCreativeCorrectionsContexts(o[1]);
 }
 
-buildUnnamed2099() {
+buildUnnamed2121() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2099(core.List<core.String> o) {
+checkUnnamed2121(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -630,8 +630,8 @@
   var o = new api.CreativeCorrections();
   buildCounterCreativeCorrections++;
   if (buildCounterCreativeCorrections < 3) {
-    o.contexts = buildUnnamed2098();
-    o.details = buildUnnamed2099();
+    o.contexts = buildUnnamed2120();
+    o.details = buildUnnamed2121();
     o.reason = "foo";
   }
   buildCounterCreativeCorrections--;
@@ -641,34 +641,34 @@
 checkCreativeCorrections(api.CreativeCorrections o) {
   buildCounterCreativeCorrections++;
   if (buildCounterCreativeCorrections < 3) {
-    checkUnnamed2098(o.contexts);
-    checkUnnamed2099(o.details);
+    checkUnnamed2120(o.contexts);
+    checkUnnamed2121(o.details);
     unittest.expect(o.reason, unittest.equals('foo'));
   }
   buildCounterCreativeCorrections--;
 }
 
-buildUnnamed2100() {
+buildUnnamed2122() {
   var o = new core.List<api.CreativeCorrections>();
   o.add(buildCreativeCorrections());
   o.add(buildCreativeCorrections());
   return o;
 }
 
-checkUnnamed2100(core.List<api.CreativeCorrections> o) {
+checkUnnamed2122(core.List<api.CreativeCorrections> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeCorrections(o[0]);
   checkCreativeCorrections(o[1]);
 }
 
-buildUnnamed2101() {
+buildUnnamed2123() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2101(core.List<core.String> o) {
+checkUnnamed2123(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -695,14 +695,14 @@
   buildCounterCreativeFilteringReasonsReasons--;
 }
 
-buildUnnamed2102() {
+buildUnnamed2124() {
   var o = new core.List<api.CreativeFilteringReasonsReasons>();
   o.add(buildCreativeFilteringReasonsReasons());
   o.add(buildCreativeFilteringReasonsReasons());
   return o;
 }
 
-checkUnnamed2102(core.List<api.CreativeFilteringReasonsReasons> o) {
+checkUnnamed2124(core.List<api.CreativeFilteringReasonsReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeFilteringReasonsReasons(o[0]);
   checkCreativeFilteringReasonsReasons(o[1]);
@@ -714,7 +714,7 @@
   buildCounterCreativeFilteringReasons++;
   if (buildCounterCreativeFilteringReasons < 3) {
     o.date = "foo";
-    o.reasons = buildUnnamed2102();
+    o.reasons = buildUnnamed2124();
   }
   buildCounterCreativeFilteringReasons--;
   return o;
@@ -724,32 +724,32 @@
   buildCounterCreativeFilteringReasons++;
   if (buildCounterCreativeFilteringReasons < 3) {
     unittest.expect(o.date, unittest.equals('foo'));
-    checkUnnamed2102(o.reasons);
+    checkUnnamed2124(o.reasons);
   }
   buildCounterCreativeFilteringReasons--;
 }
 
-buildUnnamed2103() {
+buildUnnamed2125() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2103(core.List<core.String> o) {
+checkUnnamed2125(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2104() {
+buildUnnamed2126() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2104(core.List<core.String> o) {
+checkUnnamed2126(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -801,14 +801,14 @@
   buildCounterCreativeNativeAdImage--;
 }
 
-buildUnnamed2105() {
+buildUnnamed2127() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2105(core.List<core.String> o) {
+checkUnnamed2127(core.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,7 +850,7 @@
     o.clickTrackingUrl = "foo";
     o.headline = "foo";
     o.image = buildCreativeNativeAdImage();
-    o.impressionTrackingUrl = buildUnnamed2105();
+    o.impressionTrackingUrl = buildUnnamed2127();
     o.logo = buildCreativeNativeAdLogo();
     o.price = "foo";
     o.starRating = 42.0;
@@ -872,7 +872,7 @@
     unittest.expect(o.clickTrackingUrl, unittest.equals('foo'));
     unittest.expect(o.headline, unittest.equals('foo'));
     checkCreativeNativeAdImage(o.image);
-    checkUnnamed2105(o.impressionTrackingUrl);
+    checkUnnamed2127(o.impressionTrackingUrl);
     checkCreativeNativeAdLogo(o.logo);
     unittest.expect(o.price, unittest.equals('foo'));
     unittest.expect(o.starRating, unittest.equals(42.0));
@@ -882,79 +882,79 @@
   buildCounterCreativeNativeAd--;
 }
 
-buildUnnamed2106() {
+buildUnnamed2128() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2106(core.List<core.int> o) {
+checkUnnamed2128(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));
 }
 
-buildUnnamed2107() {
+buildUnnamed2129() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2107(core.List<core.int> o) {
+checkUnnamed2129(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));
 }
 
-buildUnnamed2108() {
+buildUnnamed2130() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2108(core.List<core.int> o) {
+checkUnnamed2130(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));
 }
 
-buildUnnamed2109() {
+buildUnnamed2131() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2109(core.List<core.String> o) {
+checkUnnamed2131(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2110() {
+buildUnnamed2132() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2110(core.List<core.int> o) {
+checkUnnamed2132(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));
 }
 
-buildUnnamed2111() {
+buildUnnamed2133() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2111(core.List<core.String> o) {
+checkUnnamed2133(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -965,10 +965,10 @@
   var o = new api.CreativeServingRestrictionsContexts();
   buildCounterCreativeServingRestrictionsContexts++;
   if (buildCounterCreativeServingRestrictionsContexts < 3) {
-    o.auctionType = buildUnnamed2109();
+    o.auctionType = buildUnnamed2131();
     o.contextType = "foo";
-    o.geoCriteriaId = buildUnnamed2110();
-    o.platform = buildUnnamed2111();
+    o.geoCriteriaId = buildUnnamed2132();
+    o.platform = buildUnnamed2133();
   }
   buildCounterCreativeServingRestrictionsContexts--;
   return o;
@@ -978,35 +978,35 @@
     api.CreativeServingRestrictionsContexts o) {
   buildCounterCreativeServingRestrictionsContexts++;
   if (buildCounterCreativeServingRestrictionsContexts < 3) {
-    checkUnnamed2109(o.auctionType);
+    checkUnnamed2131(o.auctionType);
     unittest.expect(o.contextType, unittest.equals('foo'));
-    checkUnnamed2110(o.geoCriteriaId);
-    checkUnnamed2111(o.platform);
+    checkUnnamed2132(o.geoCriteriaId);
+    checkUnnamed2133(o.platform);
   }
   buildCounterCreativeServingRestrictionsContexts--;
 }
 
-buildUnnamed2112() {
+buildUnnamed2134() {
   var o = new core.List<api.CreativeServingRestrictionsContexts>();
   o.add(buildCreativeServingRestrictionsContexts());
   o.add(buildCreativeServingRestrictionsContexts());
   return o;
 }
 
-checkUnnamed2112(core.List<api.CreativeServingRestrictionsContexts> o) {
+checkUnnamed2134(core.List<api.CreativeServingRestrictionsContexts> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeServingRestrictionsContexts(o[0]);
   checkCreativeServingRestrictionsContexts(o[1]);
 }
 
-buildUnnamed2113() {
+buildUnnamed2135() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2113(core.List<core.String> o) {
+checkUnnamed2135(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1017,7 +1017,7 @@
   var o = new api.CreativeServingRestrictionsDisapprovalReasons();
   buildCounterCreativeServingRestrictionsDisapprovalReasons++;
   if (buildCounterCreativeServingRestrictionsDisapprovalReasons < 3) {
-    o.details = buildUnnamed2113();
+    o.details = buildUnnamed2135();
     o.reason = "foo";
   }
   buildCounterCreativeServingRestrictionsDisapprovalReasons--;
@@ -1028,20 +1028,20 @@
     api.CreativeServingRestrictionsDisapprovalReasons o) {
   buildCounterCreativeServingRestrictionsDisapprovalReasons++;
   if (buildCounterCreativeServingRestrictionsDisapprovalReasons < 3) {
-    checkUnnamed2113(o.details);
+    checkUnnamed2135(o.details);
     unittest.expect(o.reason, unittest.equals('foo'));
   }
   buildCounterCreativeServingRestrictionsDisapprovalReasons--;
 }
 
-buildUnnamed2114() {
+buildUnnamed2136() {
   var o = new core.List<api.CreativeServingRestrictionsDisapprovalReasons>();
   o.add(buildCreativeServingRestrictionsDisapprovalReasons());
   o.add(buildCreativeServingRestrictionsDisapprovalReasons());
   return o;
 }
 
-checkUnnamed2114(
+checkUnnamed2136(
     core.List<api.CreativeServingRestrictionsDisapprovalReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeServingRestrictionsDisapprovalReasons(o[0]);
@@ -1053,8 +1053,8 @@
   var o = new api.CreativeServingRestrictions();
   buildCounterCreativeServingRestrictions++;
   if (buildCounterCreativeServingRestrictions < 3) {
-    o.contexts = buildUnnamed2112();
-    o.disapprovalReasons = buildUnnamed2114();
+    o.contexts = buildUnnamed2134();
+    o.disapprovalReasons = buildUnnamed2136();
     o.reason = "foo";
   }
   buildCounterCreativeServingRestrictions--;
@@ -1064,34 +1064,34 @@
 checkCreativeServingRestrictions(api.CreativeServingRestrictions o) {
   buildCounterCreativeServingRestrictions++;
   if (buildCounterCreativeServingRestrictions < 3) {
-    checkUnnamed2112(o.contexts);
-    checkUnnamed2114(o.disapprovalReasons);
+    checkUnnamed2134(o.contexts);
+    checkUnnamed2136(o.disapprovalReasons);
     unittest.expect(o.reason, unittest.equals('foo'));
   }
   buildCounterCreativeServingRestrictions--;
 }
 
-buildUnnamed2115() {
+buildUnnamed2137() {
   var o = new core.List<api.CreativeServingRestrictions>();
   o.add(buildCreativeServingRestrictions());
   o.add(buildCreativeServingRestrictions());
   return o;
 }
 
-checkUnnamed2115(core.List<api.CreativeServingRestrictions> o) {
+checkUnnamed2137(core.List<api.CreativeServingRestrictions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeServingRestrictions(o[0]);
   checkCreativeServingRestrictions(o[1]);
 }
 
-buildUnnamed2116() {
+buildUnnamed2138() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2116(core.List<core.int> o) {
+checkUnnamed2138(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));
@@ -1105,28 +1105,28 @@
     o.HTMLSnippet = "foo";
     o.accountId = 42;
     o.adChoicesDestinationUrl = "foo";
-    o.advertiserId = buildUnnamed2092();
+    o.advertiserId = buildUnnamed2114();
     o.advertiserName = "foo";
     o.agencyId = "foo";
     o.apiUploadTimestamp = core.DateTime.parse("2002-02-27T14:01:02");
-    o.attribute = buildUnnamed2093();
+    o.attribute = buildUnnamed2115();
     o.buyerCreativeId = "foo";
-    o.clickThroughUrl = buildUnnamed2094();
-    o.corrections = buildUnnamed2100();
+    o.clickThroughUrl = buildUnnamed2116();
+    o.corrections = buildUnnamed2122();
     o.dealsStatus = "foo";
-    o.detectedDomains = buildUnnamed2101();
+    o.detectedDomains = buildUnnamed2123();
     o.filteringReasons = buildCreativeFilteringReasons();
     o.height = 42;
-    o.impressionTrackingUrl = buildUnnamed2103();
+    o.impressionTrackingUrl = buildUnnamed2125();
     o.kind = "foo";
-    o.languages = buildUnnamed2104();
+    o.languages = buildUnnamed2126();
     o.nativeAd = buildCreativeNativeAd();
     o.openAuctionStatus = "foo";
-    o.productCategories = buildUnnamed2106();
-    o.restrictedCategories = buildUnnamed2107();
-    o.sensitiveCategories = buildUnnamed2108();
-    o.servingRestrictions = buildUnnamed2115();
-    o.vendorType = buildUnnamed2116();
+    o.productCategories = buildUnnamed2128();
+    o.restrictedCategories = buildUnnamed2129();
+    o.sensitiveCategories = buildUnnamed2130();
+    o.servingRestrictions = buildUnnamed2137();
+    o.vendorType = buildUnnamed2138();
     o.version = 42;
     o.videoURL = "foo";
     o.width = 42;
@@ -1141,29 +1141,29 @@
     unittest.expect(o.HTMLSnippet, unittest.equals('foo'));
     unittest.expect(o.accountId, unittest.equals(42));
     unittest.expect(o.adChoicesDestinationUrl, unittest.equals('foo'));
-    checkUnnamed2092(o.advertiserId);
+    checkUnnamed2114(o.advertiserId);
     unittest.expect(o.advertiserName, unittest.equals('foo'));
     unittest.expect(o.agencyId, unittest.equals('foo'));
     unittest.expect(o.apiUploadTimestamp,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed2093(o.attribute);
+    checkUnnamed2115(o.attribute);
     unittest.expect(o.buyerCreativeId, unittest.equals('foo'));
-    checkUnnamed2094(o.clickThroughUrl);
-    checkUnnamed2100(o.corrections);
+    checkUnnamed2116(o.clickThroughUrl);
+    checkUnnamed2122(o.corrections);
     unittest.expect(o.dealsStatus, unittest.equals('foo'));
-    checkUnnamed2101(o.detectedDomains);
+    checkUnnamed2123(o.detectedDomains);
     checkCreativeFilteringReasons(o.filteringReasons);
     unittest.expect(o.height, unittest.equals(42));
-    checkUnnamed2103(o.impressionTrackingUrl);
+    checkUnnamed2125(o.impressionTrackingUrl);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2104(o.languages);
+    checkUnnamed2126(o.languages);
     checkCreativeNativeAd(o.nativeAd);
     unittest.expect(o.openAuctionStatus, unittest.equals('foo'));
-    checkUnnamed2106(o.productCategories);
-    checkUnnamed2107(o.restrictedCategories);
-    checkUnnamed2108(o.sensitiveCategories);
-    checkUnnamed2115(o.servingRestrictions);
-    checkUnnamed2116(o.vendorType);
+    checkUnnamed2128(o.productCategories);
+    checkUnnamed2129(o.restrictedCategories);
+    checkUnnamed2130(o.sensitiveCategories);
+    checkUnnamed2137(o.servingRestrictions);
+    checkUnnamed2138(o.vendorType);
     unittest.expect(o.version, unittest.equals(42));
     unittest.expect(o.videoURL, unittest.equals('foo'));
     unittest.expect(o.width, unittest.equals(42));
@@ -1194,14 +1194,14 @@
   buildCounterCreativeDealIdsDealStatuses--;
 }
 
-buildUnnamed2117() {
+buildUnnamed2139() {
   var o = new core.List<api.CreativeDealIdsDealStatuses>();
   o.add(buildCreativeDealIdsDealStatuses());
   o.add(buildCreativeDealIdsDealStatuses());
   return o;
 }
 
-checkUnnamed2117(core.List<api.CreativeDealIdsDealStatuses> o) {
+checkUnnamed2139(core.List<api.CreativeDealIdsDealStatuses> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeDealIdsDealStatuses(o[0]);
   checkCreativeDealIdsDealStatuses(o[1]);
@@ -1212,7 +1212,7 @@
   var o = new api.CreativeDealIds();
   buildCounterCreativeDealIds++;
   if (buildCounterCreativeDealIds < 3) {
-    o.dealStatuses = buildUnnamed2117();
+    o.dealStatuses = buildUnnamed2139();
     o.kind = "foo";
   }
   buildCounterCreativeDealIds--;
@@ -1222,20 +1222,20 @@
 checkCreativeDealIds(api.CreativeDealIds o) {
   buildCounterCreativeDealIds++;
   if (buildCounterCreativeDealIds < 3) {
-    checkUnnamed2117(o.dealStatuses);
+    checkUnnamed2139(o.dealStatuses);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCreativeDealIds--;
 }
 
-buildUnnamed2118() {
+buildUnnamed2140() {
   var o = new core.List<api.Creative>();
   o.add(buildCreative());
   o.add(buildCreative());
   return o;
 }
 
-checkUnnamed2118(core.List<api.Creative> o) {
+checkUnnamed2140(core.List<api.Creative> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreative(o[0]);
   checkCreative(o[1]);
@@ -1246,7 +1246,7 @@
   var o = new api.CreativesList();
   buildCounterCreativesList++;
   if (buildCounterCreativesList < 3) {
-    o.items = buildUnnamed2118();
+    o.items = buildUnnamed2140();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1257,7 +1257,7 @@
 checkCreativesList(api.CreativesList o) {
   buildCounterCreativesList++;
   if (buildCounterCreativesList < 3) {
-    checkUnnamed2118(o.items);
+    checkUnnamed2140(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1351,14 +1351,14 @@
   buildCounterDealTerms--;
 }
 
-buildUnnamed2119() {
+buildUnnamed2141() {
   var o = new core.List<api.PricePerBuyer>();
   o.add(buildPricePerBuyer());
   o.add(buildPricePerBuyer());
   return o;
 }
 
-checkUnnamed2119(core.List<api.PricePerBuyer> o) {
+checkUnnamed2141(core.List<api.PricePerBuyer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPricePerBuyer(o[0]);
   checkPricePerBuyer(o[1]);
@@ -1370,7 +1370,7 @@
   buildCounterDealTermsGuaranteedFixedPriceTerms++;
   if (buildCounterDealTermsGuaranteedFixedPriceTerms < 3) {
     o.billingInfo = buildDealTermsGuaranteedFixedPriceTermsBillingInfo();
-    o.fixedPrices = buildUnnamed2119();
+    o.fixedPrices = buildUnnamed2141();
     o.guaranteedImpressions = "foo";
     o.guaranteedLooks = "foo";
     o.minimumDailyLooks = "foo";
@@ -1384,7 +1384,7 @@
   buildCounterDealTermsGuaranteedFixedPriceTerms++;
   if (buildCounterDealTermsGuaranteedFixedPriceTerms < 3) {
     checkDealTermsGuaranteedFixedPriceTermsBillingInfo(o.billingInfo);
-    checkUnnamed2119(o.fixedPrices);
+    checkUnnamed2141(o.fixedPrices);
     unittest.expect(o.guaranteedImpressions, unittest.equals('foo'));
     unittest.expect(o.guaranteedLooks, unittest.equals('foo'));
     unittest.expect(o.minimumDailyLooks, unittest.equals('foo'));
@@ -1418,14 +1418,14 @@
   buildCounterDealTermsGuaranteedFixedPriceTermsBillingInfo--;
 }
 
-buildUnnamed2120() {
+buildUnnamed2142() {
   var o = new core.List<api.PricePerBuyer>();
   o.add(buildPricePerBuyer());
   o.add(buildPricePerBuyer());
   return o;
 }
 
-checkUnnamed2120(core.List<api.PricePerBuyer> o) {
+checkUnnamed2142(core.List<api.PricePerBuyer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPricePerBuyer(o[0]);
   checkPricePerBuyer(o[1]);
@@ -1437,7 +1437,7 @@
   buildCounterDealTermsNonGuaranteedAuctionTerms++;
   if (buildCounterDealTermsNonGuaranteedAuctionTerms < 3) {
     o.autoOptimizePrivateAuction = true;
-    o.reservePricePerBuyers = buildUnnamed2120();
+    o.reservePricePerBuyers = buildUnnamed2142();
   }
   buildCounterDealTermsNonGuaranteedAuctionTerms--;
   return o;
@@ -1448,19 +1448,19 @@
   buildCounterDealTermsNonGuaranteedAuctionTerms++;
   if (buildCounterDealTermsNonGuaranteedAuctionTerms < 3) {
     unittest.expect(o.autoOptimizePrivateAuction, unittest.isTrue);
-    checkUnnamed2120(o.reservePricePerBuyers);
+    checkUnnamed2142(o.reservePricePerBuyers);
   }
   buildCounterDealTermsNonGuaranteedAuctionTerms--;
 }
 
-buildUnnamed2121() {
+buildUnnamed2143() {
   var o = new core.List<api.PricePerBuyer>();
   o.add(buildPricePerBuyer());
   o.add(buildPricePerBuyer());
   return o;
 }
 
-checkUnnamed2121(core.List<api.PricePerBuyer> o) {
+checkUnnamed2143(core.List<api.PricePerBuyer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPricePerBuyer(o[0]);
   checkPricePerBuyer(o[1]);
@@ -1471,7 +1471,7 @@
   var o = new api.DealTermsNonGuaranteedFixedPriceTerms();
   buildCounterDealTermsNonGuaranteedFixedPriceTerms++;
   if (buildCounterDealTermsNonGuaranteedFixedPriceTerms < 3) {
-    o.fixedPrices = buildUnnamed2121();
+    o.fixedPrices = buildUnnamed2143();
   }
   buildCounterDealTermsNonGuaranteedFixedPriceTerms--;
   return o;
@@ -1481,7 +1481,7 @@
     api.DealTermsNonGuaranteedFixedPriceTerms o) {
   buildCounterDealTermsNonGuaranteedFixedPriceTerms++;
   if (buildCounterDealTermsNonGuaranteedFixedPriceTerms < 3) {
-    checkUnnamed2121(o.fixedPrices);
+    checkUnnamed2143(o.fixedPrices);
   }
   buildCounterDealTermsNonGuaranteedFixedPriceTerms--;
 }
@@ -1508,14 +1508,14 @@
   buildCounterDealTermsRubiconNonGuaranteedTerms--;
 }
 
-buildUnnamed2122() {
+buildUnnamed2144() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2122(core.List<core.String> o) {
+checkUnnamed2144(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1526,7 +1526,7 @@
   var o = new api.DeleteOrderDealsRequest();
   buildCounterDeleteOrderDealsRequest++;
   if (buildCounterDeleteOrderDealsRequest < 3) {
-    o.dealIds = buildUnnamed2122();
+    o.dealIds = buildUnnamed2144();
     o.proposalRevisionNumber = "foo";
     o.updateAction = "foo";
   }
@@ -1537,21 +1537,21 @@
 checkDeleteOrderDealsRequest(api.DeleteOrderDealsRequest o) {
   buildCounterDeleteOrderDealsRequest++;
   if (buildCounterDeleteOrderDealsRequest < 3) {
-    checkUnnamed2122(o.dealIds);
+    checkUnnamed2144(o.dealIds);
     unittest.expect(o.proposalRevisionNumber, unittest.equals('foo'));
     unittest.expect(o.updateAction, unittest.equals('foo'));
   }
   buildCounterDeleteOrderDealsRequest--;
 }
 
-buildUnnamed2123() {
+buildUnnamed2145() {
   var o = new core.List<api.MarketplaceDeal>();
   o.add(buildMarketplaceDeal());
   o.add(buildMarketplaceDeal());
   return o;
 }
 
-checkUnnamed2123(core.List<api.MarketplaceDeal> o) {
+checkUnnamed2145(core.List<api.MarketplaceDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMarketplaceDeal(o[0]);
   checkMarketplaceDeal(o[1]);
@@ -1562,7 +1562,7 @@
   var o = new api.DeleteOrderDealsResponse();
   buildCounterDeleteOrderDealsResponse++;
   if (buildCounterDeleteOrderDealsResponse < 3) {
-    o.deals = buildUnnamed2123();
+    o.deals = buildUnnamed2145();
     o.proposalRevisionNumber = "foo";
   }
   buildCounterDeleteOrderDealsResponse--;
@@ -1572,20 +1572,20 @@
 checkDeleteOrderDealsResponse(api.DeleteOrderDealsResponse o) {
   buildCounterDeleteOrderDealsResponse++;
   if (buildCounterDeleteOrderDealsResponse < 3) {
-    checkUnnamed2123(o.deals);
+    checkUnnamed2145(o.deals);
     unittest.expect(o.proposalRevisionNumber, unittest.equals('foo'));
   }
   buildCounterDeleteOrderDealsResponse--;
 }
 
-buildUnnamed2124() {
+buildUnnamed2146() {
   var o = new core.List<api.DeliveryControlFrequencyCap>();
   o.add(buildDeliveryControlFrequencyCap());
   o.add(buildDeliveryControlFrequencyCap());
   return o;
 }
 
-checkUnnamed2124(core.List<api.DeliveryControlFrequencyCap> o) {
+checkUnnamed2146(core.List<api.DeliveryControlFrequencyCap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeliveryControlFrequencyCap(o[0]);
   checkDeliveryControlFrequencyCap(o[1]);
@@ -1598,7 +1598,7 @@
   if (buildCounterDeliveryControl < 3) {
     o.creativeBlockingLevel = "foo";
     o.deliveryRateType = "foo";
-    o.frequencyCaps = buildUnnamed2124();
+    o.frequencyCaps = buildUnnamed2146();
   }
   buildCounterDeliveryControl--;
   return o;
@@ -1609,7 +1609,7 @@
   if (buildCounterDeliveryControl < 3) {
     unittest.expect(o.creativeBlockingLevel, unittest.equals('foo'));
     unittest.expect(o.deliveryRateType, unittest.equals('foo'));
-    checkUnnamed2124(o.frequencyCaps);
+    checkUnnamed2146(o.frequencyCaps);
   }
   buildCounterDeliveryControl--;
 }
@@ -1637,14 +1637,14 @@
   buildCounterDeliveryControlFrequencyCap--;
 }
 
-buildUnnamed2125() {
+buildUnnamed2147() {
   var o = new core.List<api.DimensionDimensionValue>();
   o.add(buildDimensionDimensionValue());
   o.add(buildDimensionDimensionValue());
   return o;
 }
 
-checkUnnamed2125(core.List<api.DimensionDimensionValue> o) {
+checkUnnamed2147(core.List<api.DimensionDimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionDimensionValue(o[0]);
   checkDimensionDimensionValue(o[1]);
@@ -1656,7 +1656,7 @@
   buildCounterDimension++;
   if (buildCounterDimension < 3) {
     o.dimensionType = "foo";
-    o.dimensionValues = buildUnnamed2125();
+    o.dimensionValues = buildUnnamed2147();
   }
   buildCounterDimension--;
   return o;
@@ -1666,7 +1666,7 @@
   buildCounterDimension++;
   if (buildCounterDimension < 3) {
     unittest.expect(o.dimensionType, unittest.equals('foo'));
-    checkUnnamed2125(o.dimensionValues);
+    checkUnnamed2147(o.dimensionValues);
   }
   buildCounterDimension--;
 }
@@ -1694,14 +1694,14 @@
   buildCounterDimensionDimensionValue--;
 }
 
-buildUnnamed2126() {
+buildUnnamed2148() {
   var o = new core.List<api.MarketplaceDeal>();
   o.add(buildMarketplaceDeal());
   o.add(buildMarketplaceDeal());
   return o;
 }
 
-checkUnnamed2126(core.List<api.MarketplaceDeal> o) {
+checkUnnamed2148(core.List<api.MarketplaceDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMarketplaceDeal(o[0]);
   checkMarketplaceDeal(o[1]);
@@ -1712,7 +1712,7 @@
   var o = new api.EditAllOrderDealsRequest();
   buildCounterEditAllOrderDealsRequest++;
   if (buildCounterEditAllOrderDealsRequest < 3) {
-    o.deals = buildUnnamed2126();
+    o.deals = buildUnnamed2148();
     o.proposal = buildProposal();
     o.proposalRevisionNumber = "foo";
     o.updateAction = "foo";
@@ -1724,7 +1724,7 @@
 checkEditAllOrderDealsRequest(api.EditAllOrderDealsRequest o) {
   buildCounterEditAllOrderDealsRequest++;
   if (buildCounterEditAllOrderDealsRequest < 3) {
-    checkUnnamed2126(o.deals);
+    checkUnnamed2148(o.deals);
     checkProposal(o.proposal);
     unittest.expect(o.proposalRevisionNumber, unittest.equals('foo'));
     unittest.expect(o.updateAction, unittest.equals('foo'));
@@ -1732,14 +1732,14 @@
   buildCounterEditAllOrderDealsRequest--;
 }
 
-buildUnnamed2127() {
+buildUnnamed2149() {
   var o = new core.List<api.MarketplaceDeal>();
   o.add(buildMarketplaceDeal());
   o.add(buildMarketplaceDeal());
   return o;
 }
 
-checkUnnamed2127(core.List<api.MarketplaceDeal> o) {
+checkUnnamed2149(core.List<api.MarketplaceDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMarketplaceDeal(o[0]);
   checkMarketplaceDeal(o[1]);
@@ -1750,7 +1750,7 @@
   var o = new api.EditAllOrderDealsResponse();
   buildCounterEditAllOrderDealsResponse++;
   if (buildCounterEditAllOrderDealsResponse < 3) {
-    o.deals = buildUnnamed2127();
+    o.deals = buildUnnamed2149();
     o.orderRevisionNumber = "foo";
   }
   buildCounterEditAllOrderDealsResponse--;
@@ -1760,20 +1760,20 @@
 checkEditAllOrderDealsResponse(api.EditAllOrderDealsResponse o) {
   buildCounterEditAllOrderDealsResponse++;
   if (buildCounterEditAllOrderDealsResponse < 3) {
-    checkUnnamed2127(o.deals);
+    checkUnnamed2149(o.deals);
     unittest.expect(o.orderRevisionNumber, unittest.equals('foo'));
   }
   buildCounterEditAllOrderDealsResponse--;
 }
 
-buildUnnamed2128() {
+buildUnnamed2150() {
   var o = new core.List<api.Product>();
   o.add(buildProduct());
   o.add(buildProduct());
   return o;
 }
 
-checkUnnamed2128(core.List<api.Product> o) {
+checkUnnamed2150(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProduct(o[0]);
   checkProduct(o[1]);
@@ -1784,7 +1784,7 @@
   var o = new api.GetOffersResponse();
   buildCounterGetOffersResponse++;
   if (buildCounterGetOffersResponse < 3) {
-    o.products = buildUnnamed2128();
+    o.products = buildUnnamed2150();
   }
   buildCounterGetOffersResponse--;
   return o;
@@ -1793,19 +1793,19 @@
 checkGetOffersResponse(api.GetOffersResponse o) {
   buildCounterGetOffersResponse++;
   if (buildCounterGetOffersResponse < 3) {
-    checkUnnamed2128(o.products);
+    checkUnnamed2150(o.products);
   }
   buildCounterGetOffersResponse--;
 }
 
-buildUnnamed2129() {
+buildUnnamed2151() {
   var o = new core.List<api.MarketplaceDeal>();
   o.add(buildMarketplaceDeal());
   o.add(buildMarketplaceDeal());
   return o;
 }
 
-checkUnnamed2129(core.List<api.MarketplaceDeal> o) {
+checkUnnamed2151(core.List<api.MarketplaceDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMarketplaceDeal(o[0]);
   checkMarketplaceDeal(o[1]);
@@ -1816,7 +1816,7 @@
   var o = new api.GetOrderDealsResponse();
   buildCounterGetOrderDealsResponse++;
   if (buildCounterGetOrderDealsResponse < 3) {
-    o.deals = buildUnnamed2129();
+    o.deals = buildUnnamed2151();
   }
   buildCounterGetOrderDealsResponse--;
   return o;
@@ -1825,19 +1825,19 @@
 checkGetOrderDealsResponse(api.GetOrderDealsResponse o) {
   buildCounterGetOrderDealsResponse++;
   if (buildCounterGetOrderDealsResponse < 3) {
-    checkUnnamed2129(o.deals);
+    checkUnnamed2151(o.deals);
   }
   buildCounterGetOrderDealsResponse--;
 }
 
-buildUnnamed2130() {
+buildUnnamed2152() {
   var o = new core.List<api.MarketplaceNote>();
   o.add(buildMarketplaceNote());
   o.add(buildMarketplaceNote());
   return o;
 }
 
-checkUnnamed2130(core.List<api.MarketplaceNote> o) {
+checkUnnamed2152(core.List<api.MarketplaceNote> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMarketplaceNote(o[0]);
   checkMarketplaceNote(o[1]);
@@ -1848,7 +1848,7 @@
   var o = new api.GetOrderNotesResponse();
   buildCounterGetOrderNotesResponse++;
   if (buildCounterGetOrderNotesResponse < 3) {
-    o.notes = buildUnnamed2130();
+    o.notes = buildUnnamed2152();
   }
   buildCounterGetOrderNotesResponse--;
   return o;
@@ -1857,19 +1857,19 @@
 checkGetOrderNotesResponse(api.GetOrderNotesResponse o) {
   buildCounterGetOrderNotesResponse++;
   if (buildCounterGetOrderNotesResponse < 3) {
-    checkUnnamed2130(o.notes);
+    checkUnnamed2152(o.notes);
   }
   buildCounterGetOrderNotesResponse--;
 }
 
-buildUnnamed2131() {
+buildUnnamed2153() {
   var o = new core.List<api.Proposal>();
   o.add(buildProposal());
   o.add(buildProposal());
   return o;
 }
 
-checkUnnamed2131(core.List<api.Proposal> o) {
+checkUnnamed2153(core.List<api.Proposal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProposal(o[0]);
   checkProposal(o[1]);
@@ -1880,7 +1880,7 @@
   var o = new api.GetOrdersResponse();
   buildCounterGetOrdersResponse++;
   if (buildCounterGetOrdersResponse < 3) {
-    o.proposals = buildUnnamed2131();
+    o.proposals = buildUnnamed2153();
   }
   buildCounterGetOrdersResponse--;
   return o;
@@ -1889,19 +1889,19 @@
 checkGetOrdersResponse(api.GetOrdersResponse o) {
   buildCounterGetOrdersResponse++;
   if (buildCounterGetOrdersResponse < 3) {
-    checkUnnamed2131(o.proposals);
+    checkUnnamed2153(o.proposals);
   }
   buildCounterGetOrdersResponse--;
 }
 
-buildUnnamed2132() {
+buildUnnamed2154() {
   var o = new core.List<api.PublisherProfileApiProto>();
   o.add(buildPublisherProfileApiProto());
   o.add(buildPublisherProfileApiProto());
   return o;
 }
 
-checkUnnamed2132(core.List<api.PublisherProfileApiProto> o) {
+checkUnnamed2154(core.List<api.PublisherProfileApiProto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPublisherProfileApiProto(o[0]);
   checkPublisherProfileApiProto(o[1]);
@@ -1912,7 +1912,7 @@
   var o = new api.GetPublisherProfilesByAccountIdResponse();
   buildCounterGetPublisherProfilesByAccountIdResponse++;
   if (buildCounterGetPublisherProfilesByAccountIdResponse < 3) {
-    o.profiles = buildUnnamed2132();
+    o.profiles = buildUnnamed2154();
   }
   buildCounterGetPublisherProfilesByAccountIdResponse--;
   return o;
@@ -1922,32 +1922,32 @@
     api.GetPublisherProfilesByAccountIdResponse o) {
   buildCounterGetPublisherProfilesByAccountIdResponse++;
   if (buildCounterGetPublisherProfilesByAccountIdResponse < 3) {
-    checkUnnamed2132(o.profiles);
+    checkUnnamed2154(o.profiles);
   }
   buildCounterGetPublisherProfilesByAccountIdResponse--;
 }
 
-buildUnnamed2133() {
+buildUnnamed2155() {
   var o = new core.List<api.ContactInformation>();
   o.add(buildContactInformation());
   o.add(buildContactInformation());
   return o;
 }
 
-checkUnnamed2133(core.List<api.ContactInformation> o) {
+checkUnnamed2155(core.List<api.ContactInformation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContactInformation(o[0]);
   checkContactInformation(o[1]);
 }
 
-buildUnnamed2134() {
+buildUnnamed2156() {
   var o = new core.List<api.SharedTargeting>();
   o.add(buildSharedTargeting());
   o.add(buildSharedTargeting());
   return o;
 }
 
-checkUnnamed2134(core.List<api.SharedTargeting> o) {
+checkUnnamed2156(core.List<api.SharedTargeting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSharedTargeting(o[0]);
   checkSharedTargeting(o[1]);
@@ -1978,8 +1978,8 @@
     o.productRevisionNumber = "foo";
     o.programmaticCreativeSource = "foo";
     o.proposalId = "foo";
-    o.sellerContacts = buildUnnamed2133();
-    o.sharedTargetings = buildUnnamed2134();
+    o.sellerContacts = buildUnnamed2155();
+    o.sharedTargetings = buildUnnamed2156();
     o.syndicationProduct = "foo";
     o.terms = buildDealTerms();
     o.webPropertyCode = "foo";
@@ -2011,8 +2011,8 @@
     unittest.expect(o.productRevisionNumber, unittest.equals('foo'));
     unittest.expect(o.programmaticCreativeSource, unittest.equals('foo'));
     unittest.expect(o.proposalId, unittest.equals('foo'));
-    checkUnnamed2133(o.sellerContacts);
-    checkUnnamed2134(o.sharedTargetings);
+    checkUnnamed2155(o.sellerContacts);
+    checkUnnamed2156(o.sharedTargetings);
     unittest.expect(o.syndicationProduct, unittest.equals('foo'));
     checkDealTerms(o.terms);
     unittest.expect(o.webPropertyCode, unittest.equals('foo'));
@@ -2099,7 +2099,7 @@
   buildCounterMarketplaceNote--;
 }
 
-buildUnnamed2135() {
+buildUnnamed2157() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -2114,7 +2114,7 @@
   return o;
 }
 
-checkUnnamed2135(core.List<core.Object> o) {
+checkUnnamed2157(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map;
   unittest.expect(casted1, unittest.hasLength(3));
@@ -2128,7 +2128,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2136() {
+buildUnnamed2158() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -2143,7 +2143,7 @@
   return o;
 }
 
-checkUnnamed2136(core.List<core.Object> o) {
+checkUnnamed2158(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o[0]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -2157,7 +2157,7 @@
   unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2137() {
+buildUnnamed2159() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -2172,7 +2172,7 @@
   return o;
 }
 
-checkUnnamed2137(core.List<core.Object> o) {
+checkUnnamed2159(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o[0]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -2186,7 +2186,7 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2138() {
+buildUnnamed2160() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -2201,7 +2201,7 @@
   return o;
 }
 
-checkUnnamed2138(core.List<core.Object> o) {
+checkUnnamed2160(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o[0]) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -2222,11 +2222,11 @@
   if (buildCounterPerformanceReport < 3) {
     o.bidRate = 42.0;
     o.bidRequestRate = 42.0;
-    o.calloutStatusRate = buildUnnamed2135();
-    o.cookieMatcherStatusRate = buildUnnamed2136();
-    o.creativeStatusRate = buildUnnamed2137();
+    o.calloutStatusRate = buildUnnamed2157();
+    o.cookieMatcherStatusRate = buildUnnamed2158();
+    o.creativeStatusRate = buildUnnamed2159();
     o.filteredBidRate = 42.0;
-    o.hostedMatchStatusRate = buildUnnamed2138();
+    o.hostedMatchStatusRate = buildUnnamed2160();
     o.inventoryMatchRate = 42.0;
     o.kind = "foo";
     o.latency50thPercentile = 42.0;
@@ -2252,11 +2252,11 @@
   if (buildCounterPerformanceReport < 3) {
     unittest.expect(o.bidRate, unittest.equals(42.0));
     unittest.expect(o.bidRequestRate, unittest.equals(42.0));
-    checkUnnamed2135(o.calloutStatusRate);
-    checkUnnamed2136(o.cookieMatcherStatusRate);
-    checkUnnamed2137(o.creativeStatusRate);
+    checkUnnamed2157(o.calloutStatusRate);
+    checkUnnamed2158(o.cookieMatcherStatusRate);
+    checkUnnamed2159(o.creativeStatusRate);
     unittest.expect(o.filteredBidRate, unittest.equals(42.0));
-    checkUnnamed2138(o.hostedMatchStatusRate);
+    checkUnnamed2160(o.hostedMatchStatusRate);
     unittest.expect(o.inventoryMatchRate, unittest.equals(42.0));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.latency50thPercentile, unittest.equals(42.0));
@@ -2276,14 +2276,14 @@
   buildCounterPerformanceReport--;
 }
 
-buildUnnamed2139() {
+buildUnnamed2161() {
   var o = new core.List<api.PerformanceReport>();
   o.add(buildPerformanceReport());
   o.add(buildPerformanceReport());
   return o;
 }
 
-checkUnnamed2139(core.List<api.PerformanceReport> o) {
+checkUnnamed2161(core.List<api.PerformanceReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerformanceReport(o[0]);
   checkPerformanceReport(o[1]);
@@ -2295,7 +2295,7 @@
   buildCounterPerformanceReportList++;
   if (buildCounterPerformanceReportList < 3) {
     o.kind = "foo";
-    o.performanceReport = buildUnnamed2139();
+    o.performanceReport = buildUnnamed2161();
   }
   buildCounterPerformanceReportList--;
   return o;
@@ -2305,19 +2305,19 @@
   buildCounterPerformanceReportList++;
   if (buildCounterPerformanceReportList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2139(o.performanceReport);
+    checkUnnamed2161(o.performanceReport);
   }
   buildCounterPerformanceReportList--;
 }
 
-buildUnnamed2140() {
+buildUnnamed2162() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2140(core.List<core.String> o) {
+checkUnnamed2162(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2344,40 +2344,40 @@
   buildCounterPretargetingConfigDimensions--;
 }
 
-buildUnnamed2141() {
+buildUnnamed2163() {
   var o = new core.List<api.PretargetingConfigDimensions>();
   o.add(buildPretargetingConfigDimensions());
   o.add(buildPretargetingConfigDimensions());
   return o;
 }
 
-checkUnnamed2141(core.List<api.PretargetingConfigDimensions> o) {
+checkUnnamed2163(core.List<api.PretargetingConfigDimensions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigDimensions(o[0]);
   checkPretargetingConfigDimensions(o[1]);
 }
 
-buildUnnamed2142() {
+buildUnnamed2164() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2142(core.List<core.String> o) {
+checkUnnamed2164(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2143() {
+buildUnnamed2165() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2143(core.List<core.String> o) {
+checkUnnamed2165(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2405,105 +2405,105 @@
   buildCounterPretargetingConfigExcludedPlacements--;
 }
 
-buildUnnamed2144() {
+buildUnnamed2166() {
   var o = new core.List<api.PretargetingConfigExcludedPlacements>();
   o.add(buildPretargetingConfigExcludedPlacements());
   o.add(buildPretargetingConfigExcludedPlacements());
   return o;
 }
 
-checkUnnamed2144(core.List<api.PretargetingConfigExcludedPlacements> o) {
+checkUnnamed2166(core.List<api.PretargetingConfigExcludedPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigExcludedPlacements(o[0]);
   checkPretargetingConfigExcludedPlacements(o[1]);
 }
 
-buildUnnamed2145() {
+buildUnnamed2167() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2145(core.List<core.String> o) {
+checkUnnamed2167(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2146() {
+buildUnnamed2168() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2146(core.List<core.String> o) {
+checkUnnamed2168(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2147() {
+buildUnnamed2169() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2147(core.List<core.String> o) {
+checkUnnamed2169(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2148() {
+buildUnnamed2170() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2148(core.List<core.String> o) {
+checkUnnamed2170(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2149() {
+buildUnnamed2171() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2149(core.List<core.String> o) {
+checkUnnamed2171(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2150() {
+buildUnnamed2172() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2150(core.List<core.String> o) {
+checkUnnamed2172(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2151() {
+buildUnnamed2173() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2151(core.List<core.String> o) {
+checkUnnamed2173(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2530,92 +2530,92 @@
   buildCounterPretargetingConfigPlacements--;
 }
 
-buildUnnamed2152() {
+buildUnnamed2174() {
   var o = new core.List<api.PretargetingConfigPlacements>();
   o.add(buildPretargetingConfigPlacements());
   o.add(buildPretargetingConfigPlacements());
   return o;
 }
 
-checkUnnamed2152(core.List<api.PretargetingConfigPlacements> o) {
+checkUnnamed2174(core.List<api.PretargetingConfigPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigPlacements(o[0]);
   checkPretargetingConfigPlacements(o[1]);
 }
 
-buildUnnamed2153() {
+buildUnnamed2175() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2153(core.List<core.String> o) {
+checkUnnamed2175(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2154() {
+buildUnnamed2176() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2154(core.List<core.String> o) {
+checkUnnamed2176(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2155() {
+buildUnnamed2177() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2155(core.List<core.String> o) {
+checkUnnamed2177(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2156() {
+buildUnnamed2178() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2156(core.List<core.String> o) {
+checkUnnamed2178(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2157() {
+buildUnnamed2179() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2157(core.List<core.String> o) {
+checkUnnamed2179(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2158() {
+buildUnnamed2180() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2158(core.List<core.String> o) {
+checkUnnamed2180(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2645,14 +2645,14 @@
   buildCounterPretargetingConfigVideoPlayerSizes--;
 }
 
-buildUnnamed2159() {
+buildUnnamed2181() {
   var o = new core.List<api.PretargetingConfigVideoPlayerSizes>();
   o.add(buildPretargetingConfigVideoPlayerSizes());
   o.add(buildPretargetingConfigVideoPlayerSizes());
   return o;
 }
 
-checkUnnamed2159(core.List<api.PretargetingConfigVideoPlayerSizes> o) {
+checkUnnamed2181(core.List<api.PretargetingConfigVideoPlayerSizes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigVideoPlayerSizes(o[0]);
   checkPretargetingConfigVideoPlayerSizes(o[1]);
@@ -2666,29 +2666,29 @@
     o.billingId = "foo";
     o.configId = "foo";
     o.configName = "foo";
-    o.creativeType = buildUnnamed2140();
-    o.dimensions = buildUnnamed2141();
-    o.excludedContentLabels = buildUnnamed2142();
-    o.excludedGeoCriteriaIds = buildUnnamed2143();
-    o.excludedPlacements = buildUnnamed2144();
-    o.excludedUserLists = buildUnnamed2145();
-    o.excludedVerticals = buildUnnamed2146();
-    o.geoCriteriaIds = buildUnnamed2147();
+    o.creativeType = buildUnnamed2162();
+    o.dimensions = buildUnnamed2163();
+    o.excludedContentLabels = buildUnnamed2164();
+    o.excludedGeoCriteriaIds = buildUnnamed2165();
+    o.excludedPlacements = buildUnnamed2166();
+    o.excludedUserLists = buildUnnamed2167();
+    o.excludedVerticals = buildUnnamed2168();
+    o.geoCriteriaIds = buildUnnamed2169();
     o.isActive = true;
     o.kind = "foo";
-    o.languages = buildUnnamed2148();
+    o.languages = buildUnnamed2170();
     o.minimumViewabilityDecile = 42;
-    o.mobileCarriers = buildUnnamed2149();
-    o.mobileDevices = buildUnnamed2150();
-    o.mobileOperatingSystemVersions = buildUnnamed2151();
-    o.placements = buildUnnamed2152();
-    o.platforms = buildUnnamed2153();
-    o.supportedCreativeAttributes = buildUnnamed2154();
-    o.userIdentifierDataRequired = buildUnnamed2155();
-    o.userLists = buildUnnamed2156();
-    o.vendorTypes = buildUnnamed2157();
-    o.verticals = buildUnnamed2158();
-    o.videoPlayerSizes = buildUnnamed2159();
+    o.mobileCarriers = buildUnnamed2171();
+    o.mobileDevices = buildUnnamed2172();
+    o.mobileOperatingSystemVersions = buildUnnamed2173();
+    o.placements = buildUnnamed2174();
+    o.platforms = buildUnnamed2175();
+    o.supportedCreativeAttributes = buildUnnamed2176();
+    o.userIdentifierDataRequired = buildUnnamed2177();
+    o.userLists = buildUnnamed2178();
+    o.vendorTypes = buildUnnamed2179();
+    o.verticals = buildUnnamed2180();
+    o.videoPlayerSizes = buildUnnamed2181();
   }
   buildCounterPretargetingConfig--;
   return o;
@@ -2700,41 +2700,41 @@
     unittest.expect(o.billingId, unittest.equals('foo'));
     unittest.expect(o.configId, unittest.equals('foo'));
     unittest.expect(o.configName, unittest.equals('foo'));
-    checkUnnamed2140(o.creativeType);
-    checkUnnamed2141(o.dimensions);
-    checkUnnamed2142(o.excludedContentLabels);
-    checkUnnamed2143(o.excludedGeoCriteriaIds);
-    checkUnnamed2144(o.excludedPlacements);
-    checkUnnamed2145(o.excludedUserLists);
-    checkUnnamed2146(o.excludedVerticals);
-    checkUnnamed2147(o.geoCriteriaIds);
+    checkUnnamed2162(o.creativeType);
+    checkUnnamed2163(o.dimensions);
+    checkUnnamed2164(o.excludedContentLabels);
+    checkUnnamed2165(o.excludedGeoCriteriaIds);
+    checkUnnamed2166(o.excludedPlacements);
+    checkUnnamed2167(o.excludedUserLists);
+    checkUnnamed2168(o.excludedVerticals);
+    checkUnnamed2169(o.geoCriteriaIds);
     unittest.expect(o.isActive, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2148(o.languages);
+    checkUnnamed2170(o.languages);
     unittest.expect(o.minimumViewabilityDecile, unittest.equals(42));
-    checkUnnamed2149(o.mobileCarriers);
-    checkUnnamed2150(o.mobileDevices);
-    checkUnnamed2151(o.mobileOperatingSystemVersions);
-    checkUnnamed2152(o.placements);
-    checkUnnamed2153(o.platforms);
-    checkUnnamed2154(o.supportedCreativeAttributes);
-    checkUnnamed2155(o.userIdentifierDataRequired);
-    checkUnnamed2156(o.userLists);
-    checkUnnamed2157(o.vendorTypes);
-    checkUnnamed2158(o.verticals);
-    checkUnnamed2159(o.videoPlayerSizes);
+    checkUnnamed2171(o.mobileCarriers);
+    checkUnnamed2172(o.mobileDevices);
+    checkUnnamed2173(o.mobileOperatingSystemVersions);
+    checkUnnamed2174(o.placements);
+    checkUnnamed2175(o.platforms);
+    checkUnnamed2176(o.supportedCreativeAttributes);
+    checkUnnamed2177(o.userIdentifierDataRequired);
+    checkUnnamed2178(o.userLists);
+    checkUnnamed2179(o.vendorTypes);
+    checkUnnamed2180(o.verticals);
+    checkUnnamed2181(o.videoPlayerSizes);
   }
   buildCounterPretargetingConfig--;
 }
 
-buildUnnamed2160() {
+buildUnnamed2182() {
   var o = new core.List<api.PretargetingConfig>();
   o.add(buildPretargetingConfig());
   o.add(buildPretargetingConfig());
   return o;
 }
 
-checkUnnamed2160(core.List<api.PretargetingConfig> o) {
+checkUnnamed2182(core.List<api.PretargetingConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfig(o[0]);
   checkPretargetingConfig(o[1]);
@@ -2745,7 +2745,7 @@
   var o = new api.PretargetingConfigList();
   buildCounterPretargetingConfigList++;
   if (buildCounterPretargetingConfigList < 3) {
-    o.items = buildUnnamed2160();
+    o.items = buildUnnamed2182();
     o.kind = "foo";
   }
   buildCounterPretargetingConfigList--;
@@ -2755,7 +2755,7 @@
 checkPretargetingConfigList(api.PretargetingConfigList o) {
   buildCounterPretargetingConfigList++;
   if (buildCounterPretargetingConfigList < 3) {
-    checkUnnamed2160(o.items);
+    checkUnnamed2182(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPretargetingConfigList--;
@@ -2832,40 +2832,40 @@
   buildCounterPrivateData--;
 }
 
-buildUnnamed2161() {
+buildUnnamed2183() {
   var o = new core.List<api.ContactInformation>();
   o.add(buildContactInformation());
   o.add(buildContactInformation());
   return o;
 }
 
-checkUnnamed2161(core.List<api.ContactInformation> o) {
+checkUnnamed2183(core.List<api.ContactInformation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContactInformation(o[0]);
   checkContactInformation(o[1]);
 }
 
-buildUnnamed2162() {
+buildUnnamed2184() {
   var o = new core.List<api.MarketplaceLabel>();
   o.add(buildMarketplaceLabel());
   o.add(buildMarketplaceLabel());
   return o;
 }
 
-checkUnnamed2162(core.List<api.MarketplaceLabel> o) {
+checkUnnamed2184(core.List<api.MarketplaceLabel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMarketplaceLabel(o[0]);
   checkMarketplaceLabel(o[1]);
 }
 
-buildUnnamed2163() {
+buildUnnamed2185() {
   var o = new core.List<api.SharedTargeting>();
   o.add(buildSharedTargeting());
   o.add(buildSharedTargeting());
   return o;
 }
 
-checkUnnamed2163(core.List<api.SharedTargeting> o) {
+checkUnnamed2185(core.List<api.SharedTargeting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSharedTargeting(o[0]);
   checkSharedTargeting(o[1]);
@@ -2879,7 +2879,7 @@
     o.billedBuyer = buildBuyer();
     o.buyer = buildBuyer();
     o.creationTimeMs = "foo";
-    o.creatorContacts = buildUnnamed2161();
+    o.creatorContacts = buildUnnamed2183();
     o.creatorRole = "foo";
     o.deliveryControl = buildDeliveryControl();
     o.flightEndTimeMs = "foo";
@@ -2887,7 +2887,7 @@
     o.hasCreatorSignedOff = true;
     o.inventorySource = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed2162();
+    o.labels = buildUnnamed2184();
     o.lastUpdateTimeMs = "foo";
     o.legacyOfferId = "foo";
     o.marketplacePublisherProfileId = "foo";
@@ -2898,7 +2898,7 @@
     o.publisherProvidedForecast = buildPublisherProvidedForecast();
     o.revisionNumber = "foo";
     o.seller = buildSeller();
-    o.sharedTargetings = buildUnnamed2163();
+    o.sharedTargetings = buildUnnamed2185();
     o.state = "foo";
     o.syndicationProduct = "foo";
     o.terms = buildDealTerms();
@@ -2914,7 +2914,7 @@
     checkBuyer(o.billedBuyer);
     checkBuyer(o.buyer);
     unittest.expect(o.creationTimeMs, unittest.equals('foo'));
-    checkUnnamed2161(o.creatorContacts);
+    checkUnnamed2183(o.creatorContacts);
     unittest.expect(o.creatorRole, unittest.equals('foo'));
     checkDeliveryControl(o.deliveryControl);
     unittest.expect(o.flightEndTimeMs, unittest.equals('foo'));
@@ -2922,7 +2922,7 @@
     unittest.expect(o.hasCreatorSignedOff, unittest.isTrue);
     unittest.expect(o.inventorySource, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2162(o.labels);
+    checkUnnamed2184(o.labels);
     unittest.expect(o.lastUpdateTimeMs, unittest.equals('foo'));
     unittest.expect(o.legacyOfferId, unittest.equals('foo'));
     unittest.expect(o.marketplacePublisherProfileId, unittest.equals('foo'));
@@ -2933,7 +2933,7 @@
     checkPublisherProvidedForecast(o.publisherProvidedForecast);
     unittest.expect(o.revisionNumber, unittest.equals('foo'));
     checkSeller(o.seller);
-    checkUnnamed2163(o.sharedTargetings);
+    checkUnnamed2185(o.sharedTargetings);
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.syndicationProduct, unittest.equals('foo'));
     checkDealTerms(o.terms);
@@ -2942,53 +2942,53 @@
   buildCounterProduct--;
 }
 
-buildUnnamed2164() {
+buildUnnamed2186() {
   var o = new core.List<api.ContactInformation>();
   o.add(buildContactInformation());
   o.add(buildContactInformation());
   return o;
 }
 
-checkUnnamed2164(core.List<api.ContactInformation> o) {
+checkUnnamed2186(core.List<api.ContactInformation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContactInformation(o[0]);
   checkContactInformation(o[1]);
 }
 
-buildUnnamed2165() {
+buildUnnamed2187() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2165(core.List<core.String> o) {
+checkUnnamed2187(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2166() {
+buildUnnamed2188() {
   var o = new core.List<api.MarketplaceLabel>();
   o.add(buildMarketplaceLabel());
   o.add(buildMarketplaceLabel());
   return o;
 }
 
-checkUnnamed2166(core.List<api.MarketplaceLabel> o) {
+checkUnnamed2188(core.List<api.MarketplaceLabel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMarketplaceLabel(o[0]);
   checkMarketplaceLabel(o[1]);
 }
 
-buildUnnamed2167() {
+buildUnnamed2189() {
   var o = new core.List<api.ContactInformation>();
   o.add(buildContactInformation());
   o.add(buildContactInformation());
   return o;
 }
 
-checkUnnamed2167(core.List<api.ContactInformation> o) {
+checkUnnamed2189(core.List<api.ContactInformation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContactInformation(o[0]);
   checkContactInformation(o[1]);
@@ -3001,16 +3001,16 @@
   if (buildCounterProposal < 3) {
     o.billedBuyer = buildBuyer();
     o.buyer = buildBuyer();
-    o.buyerContacts = buildUnnamed2164();
+    o.buyerContacts = buildUnnamed2186();
     o.buyerPrivateData = buildPrivateData();
-    o.dbmAdvertiserIds = buildUnnamed2165();
+    o.dbmAdvertiserIds = buildUnnamed2187();
     o.hasBuyerSignedOff = true;
     o.hasSellerSignedOff = true;
     o.inventorySource = "foo";
     o.isRenegotiating = true;
     o.isSetupComplete = true;
     o.kind = "foo";
-    o.labels = buildUnnamed2166();
+    o.labels = buildUnnamed2188();
     o.lastUpdaterOrCommentorRole = "foo";
     o.name = "foo";
     o.negotiationId = "foo";
@@ -3021,7 +3021,7 @@
     o.revisionNumber = "foo";
     o.revisionTimeMs = "foo";
     o.seller = buildSeller();
-    o.sellerContacts = buildUnnamed2167();
+    o.sellerContacts = buildUnnamed2189();
   }
   buildCounterProposal--;
   return o;
@@ -3032,16 +3032,16 @@
   if (buildCounterProposal < 3) {
     checkBuyer(o.billedBuyer);
     checkBuyer(o.buyer);
-    checkUnnamed2164(o.buyerContacts);
+    checkUnnamed2186(o.buyerContacts);
     checkPrivateData(o.buyerPrivateData);
-    checkUnnamed2165(o.dbmAdvertiserIds);
+    checkUnnamed2187(o.dbmAdvertiserIds);
     unittest.expect(o.hasBuyerSignedOff, unittest.isTrue);
     unittest.expect(o.hasSellerSignedOff, unittest.isTrue);
     unittest.expect(o.inventorySource, unittest.equals('foo'));
     unittest.expect(o.isRenegotiating, unittest.isTrue);
     unittest.expect(o.isSetupComplete, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2166(o.labels);
+    checkUnnamed2188(o.labels);
     unittest.expect(o.lastUpdaterOrCommentorRole, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.negotiationId, unittest.equals('foo'));
@@ -3052,32 +3052,32 @@
     unittest.expect(o.revisionNumber, unittest.equals('foo'));
     unittest.expect(o.revisionTimeMs, unittest.equals('foo'));
     checkSeller(o.seller);
-    checkUnnamed2167(o.sellerContacts);
+    checkUnnamed2189(o.sellerContacts);
   }
   buildCounterProposal--;
 }
 
-buildUnnamed2168() {
+buildUnnamed2190() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2168(core.List<core.String> o) {
+checkUnnamed2190(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2169() {
+buildUnnamed2191() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2169(core.List<core.String> o) {
+checkUnnamed2191(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3103,14 +3103,14 @@
     o.overview = "foo";
     o.profileId = 42;
     o.programmaticContact = "foo";
-    o.publisherDomains = buildUnnamed2168();
+    o.publisherDomains = buildUnnamed2190();
     o.publisherProfileId = "foo";
     o.publisherProvidedForecast = buildPublisherProvidedForecast();
     o.rateCardInfoLink = "foo";
     o.samplePageLink = "foo";
     o.seller = buildSeller();
     o.state = "foo";
-    o.topHeadlines = buildUnnamed2169();
+    o.topHeadlines = buildUnnamed2191();
   }
   buildCounterPublisherProfileApiProto--;
   return o;
@@ -3134,26 +3134,26 @@
     unittest.expect(o.overview, unittest.equals('foo'));
     unittest.expect(o.profileId, unittest.equals(42));
     unittest.expect(o.programmaticContact, unittest.equals('foo'));
-    checkUnnamed2168(o.publisherDomains);
+    checkUnnamed2190(o.publisherDomains);
     unittest.expect(o.publisherProfileId, unittest.equals('foo'));
     checkPublisherProvidedForecast(o.publisherProvidedForecast);
     unittest.expect(o.rateCardInfoLink, unittest.equals('foo'));
     unittest.expect(o.samplePageLink, unittest.equals('foo'));
     checkSeller(o.seller);
     unittest.expect(o.state, unittest.equals('foo'));
-    checkUnnamed2169(o.topHeadlines);
+    checkUnnamed2191(o.topHeadlines);
   }
   buildCounterPublisherProfileApiProto--;
 }
 
-buildUnnamed2170() {
+buildUnnamed2192() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed2170(core.List<api.Dimension> o) {
+checkUnnamed2192(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
@@ -3164,7 +3164,7 @@
   var o = new api.PublisherProvidedForecast();
   buildCounterPublisherProvidedForecast++;
   if (buildCounterPublisherProvidedForecast < 3) {
-    o.dimensions = buildUnnamed2170();
+    o.dimensions = buildUnnamed2192();
     o.weeklyImpressions = "foo";
     o.weeklyUniques = "foo";
   }
@@ -3175,7 +3175,7 @@
 checkPublisherProvidedForecast(api.PublisherProvidedForecast o) {
   buildCounterPublisherProvidedForecast++;
   if (buildCounterPublisherProvidedForecast < 3) {
-    checkUnnamed2170(o.dimensions);
+    checkUnnamed2192(o.dimensions);
     unittest.expect(o.weeklyImpressions, unittest.equals('foo'));
     unittest.expect(o.weeklyUniques, unittest.equals('foo'));
   }
@@ -3203,27 +3203,27 @@
   buildCounterSeller--;
 }
 
-buildUnnamed2171() {
+buildUnnamed2193() {
   var o = new core.List<api.TargetingValue>();
   o.add(buildTargetingValue());
   o.add(buildTargetingValue());
   return o;
 }
 
-checkUnnamed2171(core.List<api.TargetingValue> o) {
+checkUnnamed2193(core.List<api.TargetingValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetingValue(o[0]);
   checkTargetingValue(o[1]);
 }
 
-buildUnnamed2172() {
+buildUnnamed2194() {
   var o = new core.List<api.TargetingValue>();
   o.add(buildTargetingValue());
   o.add(buildTargetingValue());
   return o;
 }
 
-checkUnnamed2172(core.List<api.TargetingValue> o) {
+checkUnnamed2194(core.List<api.TargetingValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetingValue(o[0]);
   checkTargetingValue(o[1]);
@@ -3234,8 +3234,8 @@
   var o = new api.SharedTargeting();
   buildCounterSharedTargeting++;
   if (buildCounterSharedTargeting < 3) {
-    o.exclusions = buildUnnamed2171();
-    o.inclusions = buildUnnamed2172();
+    o.exclusions = buildUnnamed2193();
+    o.inclusions = buildUnnamed2194();
     o.key = "foo";
   }
   buildCounterSharedTargeting--;
@@ -3245,8 +3245,8 @@
 checkSharedTargeting(api.SharedTargeting o) {
   buildCounterSharedTargeting++;
   if (buildCounterSharedTargeting < 3) {
-    checkUnnamed2171(o.exclusions);
-    checkUnnamed2172(o.inclusions);
+    checkUnnamed2193(o.exclusions);
+    checkUnnamed2194(o.inclusions);
     unittest.expect(o.key, unittest.equals('foo'));
   }
   buildCounterSharedTargeting--;
@@ -3277,14 +3277,14 @@
   buildCounterTargetingValue--;
 }
 
-buildUnnamed2173() {
+buildUnnamed2195() {
   var o = new core.List<api.TargetingValueSize>();
   o.add(buildTargetingValueSize());
   o.add(buildTargetingValueSize());
   return o;
 }
 
-checkUnnamed2173(core.List<api.TargetingValueSize> o) {
+checkUnnamed2195(core.List<api.TargetingValueSize> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetingValueSize(o[0]);
   checkTargetingValueSize(o[1]);
@@ -3295,7 +3295,7 @@
   var o = new api.TargetingValueCreativeSize();
   buildCounterTargetingValueCreativeSize++;
   if (buildCounterTargetingValueCreativeSize < 3) {
-    o.companionSizes = buildUnnamed2173();
+    o.companionSizes = buildUnnamed2195();
     o.creativeSizeType = "foo";
     o.nativeTemplate = "foo";
     o.size = buildTargetingValueSize();
@@ -3308,7 +3308,7 @@
 checkTargetingValueCreativeSize(api.TargetingValueCreativeSize o) {
   buildCounterTargetingValueCreativeSize++;
   if (buildCounterTargetingValueCreativeSize < 3) {
-    checkUnnamed2173(o.companionSizes);
+    checkUnnamed2195(o.companionSizes);
     unittest.expect(o.creativeSizeType, unittest.equals('foo'));
     unittest.expect(o.nativeTemplate, unittest.equals('foo'));
     checkTargetingValueSize(o.size);
@@ -3317,14 +3317,14 @@
   buildCounterTargetingValueCreativeSize--;
 }
 
-buildUnnamed2174() {
+buildUnnamed2196() {
   var o = new core.List<api.TargetingValueDayPartTargetingDayPart>();
   o.add(buildTargetingValueDayPartTargetingDayPart());
   o.add(buildTargetingValueDayPartTargetingDayPart());
   return o;
 }
 
-checkUnnamed2174(core.List<api.TargetingValueDayPartTargetingDayPart> o) {
+checkUnnamed2196(core.List<api.TargetingValueDayPartTargetingDayPart> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetingValueDayPartTargetingDayPart(o[0]);
   checkTargetingValueDayPartTargetingDayPart(o[1]);
@@ -3335,7 +3335,7 @@
   var o = new api.TargetingValueDayPartTargeting();
   buildCounterTargetingValueDayPartTargeting++;
   if (buildCounterTargetingValueDayPartTargeting < 3) {
-    o.dayParts = buildUnnamed2174();
+    o.dayParts = buildUnnamed2196();
     o.timeZoneType = "foo";
   }
   buildCounterTargetingValueDayPartTargeting--;
@@ -3345,7 +3345,7 @@
 checkTargetingValueDayPartTargeting(api.TargetingValueDayPartTargeting o) {
   buildCounterTargetingValueDayPartTargeting++;
   if (buildCounterTargetingValueDayPartTargeting < 3) {
-    checkUnnamed2174(o.dayParts);
+    checkUnnamed2196(o.dayParts);
     unittest.expect(o.timeZoneType, unittest.equals('foo'));
   }
   buildCounterTargetingValueDayPartTargeting--;
@@ -3426,27 +3426,27 @@
   buildCounterUpdatePrivateAuctionProposalRequest--;
 }
 
-buildUnnamed2175() {
+buildUnnamed2197() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2175(core.List<core.int> o) {
+checkUnnamed2197(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));
 }
 
-buildUnnamed2176() {
+buildUnnamed2198() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2176(core.List<core.String> o) {
+checkUnnamed2198(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -4840,8 +4840,8 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.CreativesResourceApi res = new api.AdexchangebuyerApi(mock).creatives;
-      var arg_accountId = buildUnnamed2175();
-      var arg_buyerCreativeId = buildUnnamed2176();
+      var arg_accountId = buildUnnamed2197();
+      var arg_buyerCreativeId = buildUnnamed2198();
       var arg_dealsStatusFilter = "foo";
       var arg_maxResults = 42;
       var arg_openAuctionStatusFilter = "foo";
diff --git a/generated/googleapis/test/adexchangeseller/v1_1_test.dart b/generated/googleapis/test/adexchangeseller/v1_1_test.dart
index 5d9517c..1a4da1c 100644
--- a/generated/googleapis/test/adexchangeseller/v1_1_test.dart
+++ b/generated/googleapis/test/adexchangeseller/v1_1_test.dart
@@ -100,14 +100,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed283() {
+buildUnnamed277() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed283(core.List<api.AdClient> o) {
+checkUnnamed277(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -119,7 +119,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed283();
+    o.items = buildUnnamed277();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -131,7 +131,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed283(o.items);
+    checkUnnamed277(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -165,14 +165,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed284() {
+buildUnnamed278() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed284(core.List<api.AdUnit> o) {
+checkUnnamed278(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -184,7 +184,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed284();
+    o.items = buildUnnamed278();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -196,7 +196,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed284(o.items);
+    checkUnnamed278(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -230,14 +230,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed285() {
+buildUnnamed279() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed285(core.List<api.Alert> o) {
+checkUnnamed279(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -248,7 +248,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed285();
+    o.items = buildUnnamed279();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -258,7 +258,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed285(o.items);
+    checkUnnamed279(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -316,14 +316,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed286() {
+buildUnnamed280() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed286(core.List<api.CustomChannel> o) {
+checkUnnamed280(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -335,7 +335,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed286();
+    o.items = buildUnnamed280();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -347,21 +347,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed286(o.items);
+    checkUnnamed280(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed287() {
+buildUnnamed281() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed287(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed281(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -372,7 +372,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed287();
+    o.items = buildUnnamed281();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -382,7 +382,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed287(o.items);
+    checkUnnamed281(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -421,14 +421,14 @@
   buildCounterPreferredDeal--;
 }
 
-buildUnnamed288() {
+buildUnnamed282() {
   var o = new core.List<api.PreferredDeal>();
   o.add(buildPreferredDeal());
   o.add(buildPreferredDeal());
   return o;
 }
 
-checkUnnamed288(core.List<api.PreferredDeal> o) {
+checkUnnamed282(core.List<api.PreferredDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPreferredDeal(o[0]);
   checkPreferredDeal(o[1]);
@@ -439,7 +439,7 @@
   var o = new api.PreferredDeals();
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    o.items = buildUnnamed288();
+    o.items = buildUnnamed282();
     o.kind = "foo";
   }
   buildCounterPreferredDeals--;
@@ -449,20 +449,20 @@
 checkPreferredDeals(api.PreferredDeals o) {
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    checkUnnamed288(o.items);
+    checkUnnamed282(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPreferredDeals--;
 }
 
-buildUnnamed289() {
+buildUnnamed283() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed289(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'));
@@ -491,19 +491,128 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed290() {
+buildUnnamed284() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed290(core.List<api.ReportHeaders> o) {
+checkUnnamed284(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
+buildUnnamed285() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed285(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed286() {
+  var o = new core.List<core.List<core.String>>();
+  o.add(buildUnnamed285());
+  o.add(buildUnnamed285());
+  return o;
+}
+
+checkUnnamed286(core.List<core.List<core.String>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed285(o[0]);
+  checkUnnamed285(o[1]);
+}
+
+buildUnnamed287() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed287(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed288() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed288(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterReport = 0;
+buildReport() {
+  var o = new api.Report();
+  buildCounterReport++;
+  if (buildCounterReport < 3) {
+    o.averages = buildUnnamed283();
+    o.headers = buildUnnamed284();
+    o.kind = "foo";
+    o.rows = buildUnnamed286();
+    o.totalMatchedRows = "foo";
+    o.totals = buildUnnamed287();
+    o.warnings = buildUnnamed288();
+  }
+  buildCounterReport--;
+  return o;
+}
+
+checkReport(api.Report o) {
+  buildCounterReport++;
+  if (buildCounterReport < 3) {
+    checkUnnamed283(o.averages);
+    checkUnnamed284(o.headers);
+    unittest.expect(o.kind, unittest.equals('foo'));
+    checkUnnamed286(o.rows);
+    unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
+    checkUnnamed287(o.totals);
+    checkUnnamed288(o.warnings);
+  }
+  buildCounterReport--;
+}
+
+buildUnnamed289() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+buildUnnamed290() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
 buildUnnamed291() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -518,16 +627,16 @@
 }
 
 buildUnnamed292() {
-  var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed291());
-  o.add(buildUnnamed291());
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
   return o;
 }
 
-checkUnnamed292(core.List<core.List<core.String>> o) {
+checkUnnamed292(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed291(o[0]);
-  checkUnnamed291(o[1]);
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
 }
 
 buildUnnamed293() {
@@ -543,61 +652,157 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed294() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed294(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterReport = 0;
-buildReport() {
-  var o = new api.Report();
-  buildCounterReport++;
-  if (buildCounterReport < 3) {
-    o.averages = buildUnnamed289();
-    o.headers = buildUnnamed290();
+core.int buildCounterReportingMetadataEntry = 0;
+buildReportingMetadataEntry() {
+  var o = new api.ReportingMetadataEntry();
+  buildCounterReportingMetadataEntry++;
+  if (buildCounterReportingMetadataEntry < 3) {
+    o.compatibleDimensions = buildUnnamed289();
+    o.compatibleMetrics = buildUnnamed290();
+    o.id = "foo";
     o.kind = "foo";
-    o.rows = buildUnnamed292();
-    o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed293();
-    o.warnings = buildUnnamed294();
+    o.requiredDimensions = buildUnnamed291();
+    o.requiredMetrics = buildUnnamed292();
+    o.supportedProducts = buildUnnamed293();
   }
-  buildCounterReport--;
+  buildCounterReportingMetadataEntry--;
   return o;
 }
 
-checkReport(api.Report o) {
-  buildCounterReport++;
-  if (buildCounterReport < 3) {
-    checkUnnamed289(o.averages);
-    checkUnnamed290(o.headers);
+checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
+  buildCounterReportingMetadataEntry++;
+  if (buildCounterReportingMetadataEntry < 3) {
+    checkUnnamed289(o.compatibleDimensions);
+    checkUnnamed290(o.compatibleMetrics);
+    unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed292(o.rows);
-    unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed293(o.totals);
-    checkUnnamed294(o.warnings);
+    checkUnnamed291(o.requiredDimensions);
+    checkUnnamed292(o.requiredMetrics);
+    checkUnnamed293(o.supportedProducts);
   }
-  buildCounterReport--;
+  buildCounterReportingMetadataEntry--;
+}
+
+core.int buildCounterSavedReport = 0;
+buildSavedReport() {
+  var o = new api.SavedReport();
+  buildCounterSavedReport++;
+  if (buildCounterSavedReport < 3) {
+    o.id = "foo";
+    o.kind = "foo";
+    o.name = "foo";
+  }
+  buildCounterSavedReport--;
+  return o;
+}
+
+checkSavedReport(api.SavedReport o) {
+  buildCounterSavedReport++;
+  if (buildCounterSavedReport < 3) {
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+  }
+  buildCounterSavedReport--;
+}
+
+buildUnnamed294() {
+  var o = new core.List<api.SavedReport>();
+  o.add(buildSavedReport());
+  o.add(buildSavedReport());
+  return o;
+}
+
+checkUnnamed294(core.List<api.SavedReport> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkSavedReport(o[0]);
+  checkSavedReport(o[1]);
+}
+
+core.int buildCounterSavedReports = 0;
+buildSavedReports() {
+  var o = new api.SavedReports();
+  buildCounterSavedReports++;
+  if (buildCounterSavedReports < 3) {
+    o.etag = "foo";
+    o.items = buildUnnamed294();
+    o.kind = "foo";
+    o.nextPageToken = "foo";
+  }
+  buildCounterSavedReports--;
+  return o;
+}
+
+checkSavedReports(api.SavedReports o) {
+  buildCounterSavedReports++;
+  if (buildCounterSavedReports < 3) {
+    unittest.expect(o.etag, unittest.equals('foo'));
+    checkUnnamed294(o.items);
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterSavedReports--;
+}
+
+core.int buildCounterUrlChannel = 0;
+buildUrlChannel() {
+  var o = new api.UrlChannel();
+  buildCounterUrlChannel++;
+  if (buildCounterUrlChannel < 3) {
+    o.id = "foo";
+    o.kind = "foo";
+    o.urlPattern = "foo";
+  }
+  buildCounterUrlChannel--;
+  return o;
+}
+
+checkUrlChannel(api.UrlChannel o) {
+  buildCounterUrlChannel++;
+  if (buildCounterUrlChannel < 3) {
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.urlPattern, unittest.equals('foo'));
+  }
+  buildCounterUrlChannel--;
 }
 
 buildUnnamed295() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
+  var o = new core.List<api.UrlChannel>();
+  o.add(buildUrlChannel());
+  o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed295(core.List<core.String> o) {
+checkUnnamed295(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
+  checkUrlChannel(o[0]);
+  checkUrlChannel(o[1]);
+}
+
+core.int buildCounterUrlChannels = 0;
+buildUrlChannels() {
+  var o = new api.UrlChannels();
+  buildCounterUrlChannels++;
+  if (buildCounterUrlChannels < 3) {
+    o.etag = "foo";
+    o.items = buildUnnamed295();
+    o.kind = "foo";
+    o.nextPageToken = "foo";
+  }
+  buildCounterUrlChannels--;
+  return o;
+}
+
+checkUrlChannels(api.UrlChannels o) {
+  buildCounterUrlChannels++;
+  if (buildCounterUrlChannels < 3) {
+    unittest.expect(o.etag, unittest.equals('foo'));
+    checkUnnamed295(o.items);
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterUrlChannels--;
 }
 
 buildUnnamed296() {
@@ -652,211 +857,6 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterReportingMetadataEntry = 0;
-buildReportingMetadataEntry() {
-  var o = new api.ReportingMetadataEntry();
-  buildCounterReportingMetadataEntry++;
-  if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed295();
-    o.compatibleMetrics = buildUnnamed296();
-    o.id = "foo";
-    o.kind = "foo";
-    o.requiredDimensions = buildUnnamed297();
-    o.requiredMetrics = buildUnnamed298();
-    o.supportedProducts = buildUnnamed299();
-  }
-  buildCounterReportingMetadataEntry--;
-  return o;
-}
-
-checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
-  buildCounterReportingMetadataEntry++;
-  if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed295(o.compatibleDimensions);
-    checkUnnamed296(o.compatibleMetrics);
-    unittest.expect(o.id, unittest.equals('foo'));
-    unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed297(o.requiredDimensions);
-    checkUnnamed298(o.requiredMetrics);
-    checkUnnamed299(o.supportedProducts);
-  }
-  buildCounterReportingMetadataEntry--;
-}
-
-core.int buildCounterSavedReport = 0;
-buildSavedReport() {
-  var o = new api.SavedReport();
-  buildCounterSavedReport++;
-  if (buildCounterSavedReport < 3) {
-    o.id = "foo";
-    o.kind = "foo";
-    o.name = "foo";
-  }
-  buildCounterSavedReport--;
-  return o;
-}
-
-checkSavedReport(api.SavedReport o) {
-  buildCounterSavedReport++;
-  if (buildCounterSavedReport < 3) {
-    unittest.expect(o.id, unittest.equals('foo'));
-    unittest.expect(o.kind, unittest.equals('foo'));
-    unittest.expect(o.name, unittest.equals('foo'));
-  }
-  buildCounterSavedReport--;
-}
-
-buildUnnamed300() {
-  var o = new core.List<api.SavedReport>();
-  o.add(buildSavedReport());
-  o.add(buildSavedReport());
-  return o;
-}
-
-checkUnnamed300(core.List<api.SavedReport> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkSavedReport(o[0]);
-  checkSavedReport(o[1]);
-}
-
-core.int buildCounterSavedReports = 0;
-buildSavedReports() {
-  var o = new api.SavedReports();
-  buildCounterSavedReports++;
-  if (buildCounterSavedReports < 3) {
-    o.etag = "foo";
-    o.items = buildUnnamed300();
-    o.kind = "foo";
-    o.nextPageToken = "foo";
-  }
-  buildCounterSavedReports--;
-  return o;
-}
-
-checkSavedReports(api.SavedReports o) {
-  buildCounterSavedReports++;
-  if (buildCounterSavedReports < 3) {
-    unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed300(o.items);
-    unittest.expect(o.kind, unittest.equals('foo'));
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-  }
-  buildCounterSavedReports--;
-}
-
-core.int buildCounterUrlChannel = 0;
-buildUrlChannel() {
-  var o = new api.UrlChannel();
-  buildCounterUrlChannel++;
-  if (buildCounterUrlChannel < 3) {
-    o.id = "foo";
-    o.kind = "foo";
-    o.urlPattern = "foo";
-  }
-  buildCounterUrlChannel--;
-  return o;
-}
-
-checkUrlChannel(api.UrlChannel o) {
-  buildCounterUrlChannel++;
-  if (buildCounterUrlChannel < 3) {
-    unittest.expect(o.id, unittest.equals('foo'));
-    unittest.expect(o.kind, unittest.equals('foo'));
-    unittest.expect(o.urlPattern, unittest.equals('foo'));
-  }
-  buildCounterUrlChannel--;
-}
-
-buildUnnamed301() {
-  var o = new core.List<api.UrlChannel>();
-  o.add(buildUrlChannel());
-  o.add(buildUrlChannel());
-  return o;
-}
-
-checkUnnamed301(core.List<api.UrlChannel> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkUrlChannel(o[0]);
-  checkUrlChannel(o[1]);
-}
-
-core.int buildCounterUrlChannels = 0;
-buildUrlChannels() {
-  var o = new api.UrlChannels();
-  buildCounterUrlChannels++;
-  if (buildCounterUrlChannels < 3) {
-    o.etag = "foo";
-    o.items = buildUnnamed301();
-    o.kind = "foo";
-    o.nextPageToken = "foo";
-  }
-  buildCounterUrlChannels--;
-  return o;
-}
-
-checkUrlChannels(api.UrlChannels o) {
-  buildCounterUrlChannels++;
-  if (buildCounterUrlChannels < 3) {
-    unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed301(o.items);
-    unittest.expect(o.kind, unittest.equals('foo'));
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-  }
-  buildCounterUrlChannels--;
-}
-
-buildUnnamed302() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed302(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed303() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed303(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed304() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed304(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed305() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return 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'));
-}
-
 main() {
   unittest.group("obj-schema-Account", () {
     unittest.test("to-json--from-json", () {
@@ -1883,12 +1883,12 @@
       api.ReportsResourceApi res = new api.AdexchangesellerApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed302();
-      var arg_filter = buildUnnamed303();
+      var arg_dimension = buildUnnamed296();
+      var arg_filter = buildUnnamed297();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed304();
-      var arg_sort = buildUnnamed305();
+      var arg_metric = buildUnnamed298();
+      var arg_sort = buildUnnamed299();
       var arg_startIndex = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
diff --git a/generated/googleapis/test/adexchangeseller/v2_0_test.dart b/generated/googleapis/test/adexchangeseller/v2_0_test.dart
index 7c4e375..5f94342 100644
--- a/generated/googleapis/test/adexchangeseller/v2_0_test.dart
+++ b/generated/googleapis/test/adexchangeseller/v2_0_test.dart
@@ -73,14 +73,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed1822() {
+buildUnnamed1844() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed1822(core.List<api.Account> o) {
+checkUnnamed1844(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -92,7 +92,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1822();
+    o.items = buildUnnamed1844();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -104,7 +104,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1822(o.items);
+    checkUnnamed1844(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -138,14 +138,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed1823() {
+buildUnnamed1845() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed1823(core.List<api.AdClient> o) {
+checkUnnamed1845(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -157,7 +157,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1823();
+    o.items = buildUnnamed1845();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -169,7 +169,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1823(o.items);
+    checkUnnamed1845(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -203,14 +203,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed1824() {
+buildUnnamed1846() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed1824(core.List<api.Alert> o) {
+checkUnnamed1846(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -221,7 +221,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed1824();
+    o.items = buildUnnamed1846();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -231,7 +231,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed1824(o.items);
+    checkUnnamed1846(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -289,14 +289,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed1825() {
+buildUnnamed1847() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed1825(core.List<api.CustomChannel> o) {
+checkUnnamed1847(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -308,7 +308,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1825();
+    o.items = buildUnnamed1847();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -320,21 +320,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1825(o.items);
+    checkUnnamed1847(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed1826() {
+buildUnnamed1848() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed1826(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed1848(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -345,7 +345,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed1826();
+    o.items = buildUnnamed1848();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -355,7 +355,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed1826(o.items);
+    checkUnnamed1848(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -394,14 +394,14 @@
   buildCounterPreferredDeal--;
 }
 
-buildUnnamed1827() {
+buildUnnamed1849() {
   var o = new core.List<api.PreferredDeal>();
   o.add(buildPreferredDeal());
   o.add(buildPreferredDeal());
   return o;
 }
 
-checkUnnamed1827(core.List<api.PreferredDeal> o) {
+checkUnnamed1849(core.List<api.PreferredDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPreferredDeal(o[0]);
   checkPreferredDeal(o[1]);
@@ -412,7 +412,7 @@
   var o = new api.PreferredDeals();
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    o.items = buildUnnamed1827();
+    o.items = buildUnnamed1849();
     o.kind = "foo";
   }
   buildCounterPreferredDeals--;
@@ -422,20 +422,20 @@
 checkPreferredDeals(api.PreferredDeals o) {
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    checkUnnamed1827(o.items);
+    checkUnnamed1849(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPreferredDeals--;
 }
 
-buildUnnamed1828() {
+buildUnnamed1850() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1828(core.List<core.String> o) {
+checkUnnamed1850(core.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 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed1829() {
+buildUnnamed1851() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed1829(core.List<api.ReportHeaders> o) {
+checkUnnamed1851(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
-buildUnnamed1830() {
+buildUnnamed1852() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1830(core.List<core.String> o) {
+checkUnnamed1852(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1831() {
+buildUnnamed1853() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed1830());
-  o.add(buildUnnamed1830());
+  o.add(buildUnnamed1852());
+  o.add(buildUnnamed1852());
   return o;
 }
 
-checkUnnamed1831(core.List<core.List<core.String>> o) {
+checkUnnamed1853(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1830(o[0]);
-  checkUnnamed1830(o[1]);
+  checkUnnamed1852(o[0]);
+  checkUnnamed1852(o[1]);
 }
 
-buildUnnamed1832() {
+buildUnnamed1854() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1832(core.List<core.String> o) {
+checkUnnamed1854(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1833() {
+buildUnnamed1855() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1833(core.List<core.String> o) {
+checkUnnamed1855(core.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,13 +534,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.averages = buildUnnamed1828();
-    o.headers = buildUnnamed1829();
+    o.averages = buildUnnamed1850();
+    o.headers = buildUnnamed1851();
     o.kind = "foo";
-    o.rows = buildUnnamed1831();
+    o.rows = buildUnnamed1853();
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed1832();
-    o.warnings = buildUnnamed1833();
+    o.totals = buildUnnamed1854();
+    o.warnings = buildUnnamed1855();
   }
   buildCounterReport--;
   return o;
@@ -549,77 +549,77 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed1828(o.averages);
-    checkUnnamed1829(o.headers);
+    checkUnnamed1850(o.averages);
+    checkUnnamed1851(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1831(o.rows);
+    checkUnnamed1853(o.rows);
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed1832(o.totals);
-    checkUnnamed1833(o.warnings);
+    checkUnnamed1854(o.totals);
+    checkUnnamed1855(o.warnings);
   }
   buildCounterReport--;
 }
 
-buildUnnamed1834() {
+buildUnnamed1856() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1834(core.List<core.String> o) {
+checkUnnamed1856(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1835() {
+buildUnnamed1857() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1835(core.List<core.String> o) {
+checkUnnamed1857(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1836() {
+buildUnnamed1858() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1836(core.List<core.String> o) {
+checkUnnamed1858(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1837() {
+buildUnnamed1859() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1837(core.List<core.String> o) {
+checkUnnamed1859(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1838() {
+buildUnnamed1860() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1838(core.List<core.String> o) {
+checkUnnamed1860(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -630,13 +630,13 @@
   var o = new api.ReportingMetadataEntry();
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed1834();
-    o.compatibleMetrics = buildUnnamed1835();
+    o.compatibleDimensions = buildUnnamed1856();
+    o.compatibleMetrics = buildUnnamed1857();
     o.id = "foo";
     o.kind = "foo";
-    o.requiredDimensions = buildUnnamed1836();
-    o.requiredMetrics = buildUnnamed1837();
-    o.supportedProducts = buildUnnamed1838();
+    o.requiredDimensions = buildUnnamed1858();
+    o.requiredMetrics = buildUnnamed1859();
+    o.supportedProducts = buildUnnamed1860();
   }
   buildCounterReportingMetadataEntry--;
   return o;
@@ -645,13 +645,13 @@
 checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed1834(o.compatibleDimensions);
-    checkUnnamed1835(o.compatibleMetrics);
+    checkUnnamed1856(o.compatibleDimensions);
+    checkUnnamed1857(o.compatibleMetrics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1836(o.requiredDimensions);
-    checkUnnamed1837(o.requiredMetrics);
-    checkUnnamed1838(o.supportedProducts);
+    checkUnnamed1858(o.requiredDimensions);
+    checkUnnamed1859(o.requiredMetrics);
+    checkUnnamed1860(o.supportedProducts);
   }
   buildCounterReportingMetadataEntry--;
 }
@@ -679,14 +679,14 @@
   buildCounterSavedReport--;
 }
 
-buildUnnamed1839() {
+buildUnnamed1861() {
   var o = new core.List<api.SavedReport>();
   o.add(buildSavedReport());
   o.add(buildSavedReport());
   return o;
 }
 
-checkUnnamed1839(core.List<api.SavedReport> o) {
+checkUnnamed1861(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedReport(o[0]);
   checkSavedReport(o[1]);
@@ -698,7 +698,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1839();
+    o.items = buildUnnamed1861();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -710,7 +710,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1839(o.items);
+    checkUnnamed1861(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -740,14 +740,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed1840() {
+buildUnnamed1862() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed1840(core.List<api.UrlChannel> o) {
+checkUnnamed1862(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -759,7 +759,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1840();
+    o.items = buildUnnamed1862();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -771,60 +771,60 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1840(o.items);
+    checkUnnamed1862(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed1841() {
+buildUnnamed1863() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1841(core.List<core.String> o) {
+checkUnnamed1863(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1842() {
+buildUnnamed1864() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1842(core.List<core.String> o) {
+checkUnnamed1864(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1843() {
+buildUnnamed1865() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1843(core.List<core.String> o) {
+checkUnnamed1865(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1844() {
+buildUnnamed1866() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1844(core.List<core.String> o) {
+checkUnnamed1866(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1678,12 +1678,12 @@
       var arg_accountId = "foo";
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed1841();
-      var arg_filter = buildUnnamed1842();
+      var arg_dimension = buildUnnamed1863();
+      var arg_filter = buildUnnamed1864();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed1843();
-      var arg_sort = buildUnnamed1844();
+      var arg_metric = buildUnnamed1865();
+      var arg_sort = buildUnnamed1866();
       var arg_startIndex = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
diff --git a/generated/googleapis/test/adexperiencereport/v1_test.dart b/generated/googleapis/test/adexperiencereport/v1_test.dart
index 44bf04d..2ce8ef7 100644
--- a/generated/googleapis/test/adexperiencereport/v1_test.dart
+++ b/generated/googleapis/test/adexperiencereport/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1845() {
+buildUnnamed1867() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1845(core.List<core.String> o) {
+checkUnnamed1867(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -72,7 +72,7 @@
     o.enforcementTime = "foo";
     o.filterStatus = "foo";
     o.lastChangeTime = "foo";
-    o.region = buildUnnamed1845();
+    o.region = buildUnnamed1867();
     o.reportUrl = "foo";
     o.underReview = true;
   }
@@ -87,7 +87,7 @@
     unittest.expect(o.enforcementTime, unittest.equals('foo'));
     unittest.expect(o.filterStatus, unittest.equals('foo'));
     unittest.expect(o.lastChangeTime, unittest.equals('foo'));
-    checkUnnamed1845(o.region);
+    checkUnnamed1867(o.region);
     unittest.expect(o.reportUrl, unittest.equals('foo'));
     unittest.expect(o.underReview, unittest.isTrue);
   }
@@ -117,14 +117,14 @@
   buildCounterSiteSummaryResponse--;
 }
 
-buildUnnamed1846() {
+buildUnnamed1868() {
   var o = new core.List<api.SiteSummaryResponse>();
   o.add(buildSiteSummaryResponse());
   o.add(buildSiteSummaryResponse());
   return o;
 }
 
-checkUnnamed1846(core.List<api.SiteSummaryResponse> o) {
+checkUnnamed1868(core.List<api.SiteSummaryResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSiteSummaryResponse(o[0]);
   checkSiteSummaryResponse(o[1]);
@@ -135,7 +135,7 @@
   var o = new api.ViolatingSitesResponse();
   buildCounterViolatingSitesResponse++;
   if (buildCounterViolatingSitesResponse < 3) {
-    o.violatingSites = buildUnnamed1846();
+    o.violatingSites = buildUnnamed1868();
   }
   buildCounterViolatingSitesResponse--;
   return o;
@@ -144,7 +144,7 @@
 checkViolatingSitesResponse(api.ViolatingSitesResponse o) {
   buildCounterViolatingSitesResponse++;
   if (buildCounterViolatingSitesResponse < 3) {
-    checkUnnamed1846(o.violatingSites);
+    checkUnnamed1868(o.violatingSites);
   }
   buildCounterViolatingSitesResponse--;
 }
diff --git a/generated/googleapis/test/admin/datatransfer_v1_test.dart b/generated/googleapis/test/admin/datatransfer_v1_test.dart
index dd1c2d6..8e1c855 100644
--- a/generated/googleapis/test/admin/datatransfer_v1_test.dart
+++ b/generated/googleapis/test/admin/datatransfer_v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed151() {
+buildUnnamed145() {
   var o = new core.List<api.ApplicationTransferParam>();
   o.add(buildApplicationTransferParam());
   o.add(buildApplicationTransferParam());
   return o;
 }
 
-checkUnnamed151(core.List<api.ApplicationTransferParam> o) {
+checkUnnamed145(core.List<api.ApplicationTransferParam> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApplicationTransferParam(o[0]);
   checkApplicationTransferParam(o[1]);
@@ -72,7 +72,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.transferParams = buildUnnamed151();
+    o.transferParams = buildUnnamed145();
   }
   buildCounterApplication--;
   return o;
@@ -85,19 +85,19 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed151(o.transferParams);
+    checkUnnamed145(o.transferParams);
   }
   buildCounterApplication--;
 }
 
-buildUnnamed152() {
+buildUnnamed146() {
   var o = new core.List<api.ApplicationTransferParam>();
   o.add(buildApplicationTransferParam());
   o.add(buildApplicationTransferParam());
   return o;
 }
 
-checkUnnamed152(core.List<api.ApplicationTransferParam> o) {
+checkUnnamed146(core.List<api.ApplicationTransferParam> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApplicationTransferParam(o[0]);
   checkApplicationTransferParam(o[1]);
@@ -109,7 +109,7 @@
   buildCounterApplicationDataTransfer++;
   if (buildCounterApplicationDataTransfer < 3) {
     o.applicationId = "foo";
-    o.applicationTransferParams = buildUnnamed152();
+    o.applicationTransferParams = buildUnnamed146();
     o.applicationTransferStatus = "foo";
   }
   buildCounterApplicationDataTransfer--;
@@ -120,20 +120,20 @@
   buildCounterApplicationDataTransfer++;
   if (buildCounterApplicationDataTransfer < 3) {
     unittest.expect(o.applicationId, unittest.equals('foo'));
-    checkUnnamed152(o.applicationTransferParams);
+    checkUnnamed146(o.applicationTransferParams);
     unittest.expect(o.applicationTransferStatus, unittest.equals('foo'));
   }
   buildCounterApplicationDataTransfer--;
 }
 
-buildUnnamed153() {
+buildUnnamed147() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed153(core.List<core.String> o) {
+checkUnnamed147(core.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 @@
   buildCounterApplicationTransferParam++;
   if (buildCounterApplicationTransferParam < 3) {
     o.key = "foo";
-    o.value = buildUnnamed153();
+    o.value = buildUnnamed147();
   }
   buildCounterApplicationTransferParam--;
   return o;
@@ -155,19 +155,19 @@
   buildCounterApplicationTransferParam++;
   if (buildCounterApplicationTransferParam < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkUnnamed153(o.value);
+    checkUnnamed147(o.value);
   }
   buildCounterApplicationTransferParam--;
 }
 
-buildUnnamed154() {
+buildUnnamed148() {
   var o = new core.List<api.Application>();
   o.add(buildApplication());
   o.add(buildApplication());
   return o;
 }
 
-checkUnnamed154(core.List<api.Application> o) {
+checkUnnamed148(core.List<api.Application> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApplication(o[0]);
   checkApplication(o[1]);
@@ -178,7 +178,7 @@
   var o = new api.ApplicationsListResponse();
   buildCounterApplicationsListResponse++;
   if (buildCounterApplicationsListResponse < 3) {
-    o.applications = buildUnnamed154();
+    o.applications = buildUnnamed148();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -190,7 +190,7 @@
 checkApplicationsListResponse(api.ApplicationsListResponse o) {
   buildCounterApplicationsListResponse++;
   if (buildCounterApplicationsListResponse < 3) {
-    checkUnnamed154(o.applications);
+    checkUnnamed148(o.applications);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -198,14 +198,14 @@
   buildCounterApplicationsListResponse--;
 }
 
-buildUnnamed155() {
+buildUnnamed149() {
   var o = new core.List<api.ApplicationDataTransfer>();
   o.add(buildApplicationDataTransfer());
   o.add(buildApplicationDataTransfer());
   return o;
 }
 
-checkUnnamed155(core.List<api.ApplicationDataTransfer> o) {
+checkUnnamed149(core.List<api.ApplicationDataTransfer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApplicationDataTransfer(o[0]);
   checkApplicationDataTransfer(o[1]);
@@ -216,7 +216,7 @@
   var o = new api.DataTransfer();
   buildCounterDataTransfer++;
   if (buildCounterDataTransfer < 3) {
-    o.applicationDataTransfers = buildUnnamed155();
+    o.applicationDataTransfers = buildUnnamed149();
     o.etag = "foo";
     o.id = "foo";
     o.kind = "foo";
@@ -232,7 +232,7 @@
 checkDataTransfer(api.DataTransfer o) {
   buildCounterDataTransfer++;
   if (buildCounterDataTransfer < 3) {
-    checkUnnamed155(o.applicationDataTransfers);
+    checkUnnamed149(o.applicationDataTransfers);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -245,14 +245,14 @@
   buildCounterDataTransfer--;
 }
 
-buildUnnamed156() {
+buildUnnamed150() {
   var o = new core.List<api.DataTransfer>();
   o.add(buildDataTransfer());
   o.add(buildDataTransfer());
   return o;
 }
 
-checkUnnamed156(core.List<api.DataTransfer> o) {
+checkUnnamed150(core.List<api.DataTransfer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataTransfer(o[0]);
   checkDataTransfer(o[1]);
@@ -263,7 +263,7 @@
   var o = new api.DataTransfersListResponse();
   buildCounterDataTransfersListResponse++;
   if (buildCounterDataTransfersListResponse < 3) {
-    o.dataTransfers = buildUnnamed156();
+    o.dataTransfers = buildUnnamed150();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -275,7 +275,7 @@
 checkDataTransfersListResponse(api.DataTransfersListResponse o) {
   buildCounterDataTransfersListResponse++;
   if (buildCounterDataTransfersListResponse < 3) {
-    checkUnnamed156(o.dataTransfers);
+    checkUnnamed150(o.dataTransfers);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
diff --git a/generated/googleapis/test/admin/directory_v1_test.dart b/generated/googleapis/test/admin/directory_v1_test.dart
index ee4d698..e1f11b7 100644
--- a/generated/googleapis/test/admin/directory_v1_test.dart
+++ b/generated/googleapis/test/admin/directory_v1_test.dart
@@ -77,7 +77,7 @@
   buildCounterAlias--;
 }
 
-buildUnnamed848() {
+buildUnnamed853() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -92,7 +92,7 @@
   return o;
 }
 
-checkUnnamed848(core.List<core.Object> o) {
+checkUnnamed853(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map;
   unittest.expect(casted1, unittest.hasLength(3));
@@ -111,7 +111,7 @@
   var o = new api.Aliases();
   buildCounterAliases++;
   if (buildCounterAliases < 3) {
-    o.aliases = buildUnnamed848();
+    o.aliases = buildUnnamed853();
     o.etag = "foo";
     o.kind = "foo";
   }
@@ -122,21 +122,21 @@
 checkAliases(api.Aliases o) {
   buildCounterAliases++;
   if (buildCounterAliases < 3) {
-    checkUnnamed848(o.aliases);
+    checkUnnamed853(o.aliases);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAliases--;
 }
 
-buildUnnamed849() {
+buildUnnamed854() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed849(core.List<core.String> o) {
+checkUnnamed854(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -147,7 +147,7 @@
   var o = new api.AppAccessCollections();
   buildCounterAppAccessCollections++;
   if (buildCounterAppAccessCollections < 3) {
-    o.blockedApiAccessBuckets = buildUnnamed849();
+    o.blockedApiAccessBuckets = buildUnnamed854();
     o.enforceSettingsForAndroidDrive = true;
     o.errorMessage = "foo";
     o.etag = "foo";
@@ -163,7 +163,7 @@
 checkAppAccessCollections(api.AppAccessCollections o) {
   buildCounterAppAccessCollections++;
   if (buildCounterAppAccessCollections < 3) {
-    checkUnnamed849(o.blockedApiAccessBuckets);
+    checkUnnamed854(o.blockedApiAccessBuckets);
     unittest.expect(o.enforceSettingsForAndroidDrive, unittest.isTrue);
     unittest.expect(o.errorMessage, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
@@ -206,14 +206,14 @@
   buildCounterAsp--;
 }
 
-buildUnnamed850() {
+buildUnnamed855() {
   var o = new core.List<api.Asp>();
   o.add(buildAsp());
   o.add(buildAsp());
   return o;
 }
 
-checkUnnamed850(core.List<api.Asp> o) {
+checkUnnamed855(core.List<api.Asp> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAsp(o[0]);
   checkAsp(o[1]);
@@ -225,7 +225,7 @@
   buildCounterAsps++;
   if (buildCounterAsps < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed850();
+    o.items = buildUnnamed855();
     o.kind = "foo";
   }
   buildCounterAsps--;
@@ -236,25 +236,139 @@
   buildCounterAsps++;
   if (buildCounterAsps < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed850(o.items);
+    checkUnnamed855(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAsps--;
 }
 
+buildUnnamed856() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+core.int buildCounterBuilding = 0;
+buildBuilding() {
+  var o = new api.Building();
+  buildCounterBuilding++;
+  if (buildCounterBuilding < 3) {
+    o.buildingId = "foo";
+    o.buildingName = "foo";
+    o.coordinates = buildBuildingCoordinates();
+    o.description = "foo";
+    o.etags = "foo";
+    o.floorNames = buildUnnamed856();
+    o.kind = "foo";
+  }
+  buildCounterBuilding--;
+  return o;
+}
+
+checkBuilding(api.Building o) {
+  buildCounterBuilding++;
+  if (buildCounterBuilding < 3) {
+    unittest.expect(o.buildingId, unittest.equals('foo'));
+    unittest.expect(o.buildingName, unittest.equals('foo'));
+    checkBuildingCoordinates(o.coordinates);
+    unittest.expect(o.description, unittest.equals('foo'));
+    unittest.expect(o.etags, unittest.equals('foo'));
+    checkUnnamed856(o.floorNames);
+    unittest.expect(o.kind, unittest.equals('foo'));
+  }
+  buildCounterBuilding--;
+}
+
+core.int buildCounterBuildingCoordinates = 0;
+buildBuildingCoordinates() {
+  var o = new api.BuildingCoordinates();
+  buildCounterBuildingCoordinates++;
+  if (buildCounterBuildingCoordinates < 3) {
+    o.latitude = 42.0;
+    o.longitude = 42.0;
+  }
+  buildCounterBuildingCoordinates--;
+  return o;
+}
+
+checkBuildingCoordinates(api.BuildingCoordinates o) {
+  buildCounterBuildingCoordinates++;
+  if (buildCounterBuildingCoordinates < 3) {
+    unittest.expect(o.latitude, unittest.equals(42.0));
+    unittest.expect(o.longitude, unittest.equals(42.0));
+  }
+  buildCounterBuildingCoordinates--;
+}
+
+buildUnnamed857() {
+  var o = new core.List<api.Building>();
+  o.add(buildBuilding());
+  o.add(buildBuilding());
+  return o;
+}
+
+checkUnnamed857(core.List<api.Building> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkBuilding(o[0]);
+  checkBuilding(o[1]);
+}
+
+core.int buildCounterBuildings = 0;
+buildBuildings() {
+  var o = new api.Buildings();
+  buildCounterBuildings++;
+  if (buildCounterBuildings < 3) {
+    o.buildings = buildUnnamed857();
+    o.etag = "foo";
+    o.kind = "foo";
+    o.nextPageToken = "foo";
+  }
+  buildCounterBuildings--;
+  return o;
+}
+
+checkBuildings(api.Buildings o) {
+  buildCounterBuildings++;
+  if (buildCounterBuildings < 3) {
+    checkUnnamed857(o.buildings);
+    unittest.expect(o.etag, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterBuildings--;
+}
+
 core.int buildCounterCalendarResource = 0;
 buildCalendarResource() {
   var o = new api.CalendarResource();
   buildCounterCalendarResource++;
   if (buildCounterCalendarResource < 3) {
+    o.buildingId = "foo";
+    o.capacity = 42;
     o.etags = "foo";
+    o.featureInstances = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
+    o.floorName = "foo";
+    o.floorSection = "foo";
     o.generatedResourceName = "foo";
     o.kind = "foo";
+    o.resourceCategory = "foo";
     o.resourceDescription = "foo";
     o.resourceEmail = "foo";
     o.resourceId = "foo";
     o.resourceName = "foo";
     o.resourceType = "foo";
+    o.userVisibleDescription = "foo";
   }
   buildCounterCalendarResource--;
   return o;
@@ -263,26 +377,37 @@
 checkCalendarResource(api.CalendarResource o) {
   buildCounterCalendarResource++;
   if (buildCounterCalendarResource < 3) {
+    unittest.expect(o.buildingId, unittest.equals('foo'));
+    unittest.expect(o.capacity, unittest.equals(42));
     unittest.expect(o.etags, unittest.equals('foo'));
+    var casted3 = (o.featureInstances) 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.floorName, unittest.equals('foo'));
+    unittest.expect(o.floorSection, unittest.equals('foo'));
     unittest.expect(o.generatedResourceName, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.resourceCategory, unittest.equals('foo'));
     unittest.expect(o.resourceDescription, unittest.equals('foo'));
     unittest.expect(o.resourceEmail, unittest.equals('foo'));
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceName, unittest.equals('foo'));
     unittest.expect(o.resourceType, unittest.equals('foo'));
+    unittest.expect(o.userVisibleDescription, unittest.equals('foo'));
   }
   buildCounterCalendarResource--;
 }
 
-buildUnnamed851() {
+buildUnnamed858() {
   var o = new core.List<api.CalendarResource>();
   o.add(buildCalendarResource());
   o.add(buildCalendarResource());
   return o;
 }
 
-checkUnnamed851(core.List<api.CalendarResource> o) {
+checkUnnamed858(core.List<api.CalendarResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCalendarResource(o[0]);
   checkCalendarResource(o[1]);
@@ -294,7 +419,7 @@
   buildCounterCalendarResources++;
   if (buildCounterCalendarResources < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed851();
+    o.items = buildUnnamed858();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -306,21 +431,21 @@
   buildCounterCalendarResources++;
   if (buildCounterCalendarResources < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed851(o.items);
+    checkUnnamed858(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCalendarResources--;
 }
 
-buildUnnamed852() {
+buildUnnamed859() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed852(core.Map<core.String, core.String> o) {
+checkUnnamed859(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'));
@@ -335,7 +460,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed852();
+    o.params = buildUnnamed859();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -353,7 +478,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed852(o.params);
+    checkUnnamed859(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -385,19 +510,58 @@
   buildCounterChromeOsDeviceActiveTimeRanges--;
 }
 
-buildUnnamed853() {
+buildUnnamed860() {
   var o = new core.List<api.ChromeOsDeviceActiveTimeRanges>();
   o.add(buildChromeOsDeviceActiveTimeRanges());
   o.add(buildChromeOsDeviceActiveTimeRanges());
   return o;
 }
 
-checkUnnamed853(core.List<api.ChromeOsDeviceActiveTimeRanges> o) {
+checkUnnamed860(core.List<api.ChromeOsDeviceActiveTimeRanges> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDeviceActiveTimeRanges(o[0]);
   checkChromeOsDeviceActiveTimeRanges(o[1]);
 }
 
+core.int buildCounterChromeOsDeviceDeviceFiles = 0;
+buildChromeOsDeviceDeviceFiles() {
+  var o = new api.ChromeOsDeviceDeviceFiles();
+  buildCounterChromeOsDeviceDeviceFiles++;
+  if (buildCounterChromeOsDeviceDeviceFiles < 3) {
+    o.createTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.downloadUrl = "foo";
+    o.name = "foo";
+    o.type = "foo";
+  }
+  buildCounterChromeOsDeviceDeviceFiles--;
+  return o;
+}
+
+checkChromeOsDeviceDeviceFiles(api.ChromeOsDeviceDeviceFiles o) {
+  buildCounterChromeOsDeviceDeviceFiles++;
+  if (buildCounterChromeOsDeviceDeviceFiles < 3) {
+    unittest.expect(o.createTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.downloadUrl, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+  }
+  buildCounterChromeOsDeviceDeviceFiles--;
+}
+
+buildUnnamed861() {
+  var o = new core.List<api.ChromeOsDeviceDeviceFiles>();
+  o.add(buildChromeOsDeviceDeviceFiles());
+  o.add(buildChromeOsDeviceDeviceFiles());
+  return o;
+}
+
+checkUnnamed861(core.List<api.ChromeOsDeviceDeviceFiles> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkChromeOsDeviceDeviceFiles(o[0]);
+  checkChromeOsDeviceDeviceFiles(o[1]);
+}
+
 core.int buildCounterChromeOsDeviceRecentUsers = 0;
 buildChromeOsDeviceRecentUsers() {
   var o = new api.ChromeOsDeviceRecentUsers();
@@ -419,29 +583,59 @@
   buildCounterChromeOsDeviceRecentUsers--;
 }
 
-buildUnnamed854() {
+buildUnnamed862() {
   var o = new core.List<api.ChromeOsDeviceRecentUsers>();
   o.add(buildChromeOsDeviceRecentUsers());
   o.add(buildChromeOsDeviceRecentUsers());
   return o;
 }
 
-checkUnnamed854(core.List<api.ChromeOsDeviceRecentUsers> o) {
+checkUnnamed862(core.List<api.ChromeOsDeviceRecentUsers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDeviceRecentUsers(o[0]);
   checkChromeOsDeviceRecentUsers(o[1]);
 }
 
+core.int buildCounterChromeOsDeviceTpmVersionInfo = 0;
+buildChromeOsDeviceTpmVersionInfo() {
+  var o = new api.ChromeOsDeviceTpmVersionInfo();
+  buildCounterChromeOsDeviceTpmVersionInfo++;
+  if (buildCounterChromeOsDeviceTpmVersionInfo < 3) {
+    o.family = "foo";
+    o.firmwareVersion = "foo";
+    o.manufacturer = "foo";
+    o.specLevel = "foo";
+    o.tpmModel = "foo";
+    o.vendorSpecific = "foo";
+  }
+  buildCounterChromeOsDeviceTpmVersionInfo--;
+  return o;
+}
+
+checkChromeOsDeviceTpmVersionInfo(api.ChromeOsDeviceTpmVersionInfo o) {
+  buildCounterChromeOsDeviceTpmVersionInfo++;
+  if (buildCounterChromeOsDeviceTpmVersionInfo < 3) {
+    unittest.expect(o.family, unittest.equals('foo'));
+    unittest.expect(o.firmwareVersion, unittest.equals('foo'));
+    unittest.expect(o.manufacturer, unittest.equals('foo'));
+    unittest.expect(o.specLevel, unittest.equals('foo'));
+    unittest.expect(o.tpmModel, unittest.equals('foo'));
+    unittest.expect(o.vendorSpecific, unittest.equals('foo'));
+  }
+  buildCounterChromeOsDeviceTpmVersionInfo--;
+}
+
 core.int buildCounterChromeOsDevice = 0;
 buildChromeOsDevice() {
   var o = new api.ChromeOsDevice();
   buildCounterChromeOsDevice++;
   if (buildCounterChromeOsDevice < 3) {
-    o.activeTimeRanges = buildUnnamed853();
+    o.activeTimeRanges = buildUnnamed860();
     o.annotatedAssetId = "foo";
     o.annotatedLocation = "foo";
     o.annotatedUser = "foo";
     o.bootMode = "foo";
+    o.deviceFiles = buildUnnamed861();
     o.deviceId = "foo";
     o.etag = "foo";
     o.ethernetMacAddress = "foo";
@@ -457,10 +651,11 @@
     o.orgUnitPath = "foo";
     o.osVersion = "foo";
     o.platformVersion = "foo";
-    o.recentUsers = buildUnnamed854();
+    o.recentUsers = buildUnnamed862();
     o.serialNumber = "foo";
     o.status = "foo";
     o.supportEndDate = core.DateTime.parse("2002-02-27T14:01:02");
+    o.tpmVersionInfo = buildChromeOsDeviceTpmVersionInfo();
     o.willAutoRenew = true;
   }
   buildCounterChromeOsDevice--;
@@ -470,11 +665,12 @@
 checkChromeOsDevice(api.ChromeOsDevice o) {
   buildCounterChromeOsDevice++;
   if (buildCounterChromeOsDevice < 3) {
-    checkUnnamed853(o.activeTimeRanges);
+    checkUnnamed860(o.activeTimeRanges);
     unittest.expect(o.annotatedAssetId, unittest.equals('foo'));
     unittest.expect(o.annotatedLocation, unittest.equals('foo'));
     unittest.expect(o.annotatedUser, unittest.equals('foo'));
     unittest.expect(o.bootMode, unittest.equals('foo'));
+    checkUnnamed861(o.deviceFiles);
     unittest.expect(o.deviceId, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.ethernetMacAddress, unittest.equals('foo'));
@@ -492,11 +688,12 @@
     unittest.expect(o.orgUnitPath, unittest.equals('foo'));
     unittest.expect(o.osVersion, unittest.equals('foo'));
     unittest.expect(o.platformVersion, unittest.equals('foo'));
-    checkUnnamed854(o.recentUsers);
+    checkUnnamed862(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")));
+    checkChromeOsDeviceTpmVersionInfo(o.tpmVersionInfo);
     unittest.expect(o.willAutoRenew, unittest.isTrue);
   }
   buildCounterChromeOsDevice--;
@@ -523,14 +720,14 @@
   buildCounterChromeOsDeviceAction--;
 }
 
-buildUnnamed855() {
+buildUnnamed863() {
   var o = new core.List<api.ChromeOsDevice>();
   o.add(buildChromeOsDevice());
   o.add(buildChromeOsDevice());
   return o;
 }
 
-checkUnnamed855(core.List<api.ChromeOsDevice> o) {
+checkUnnamed863(core.List<api.ChromeOsDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDevice(o[0]);
   checkChromeOsDevice(o[1]);
@@ -541,7 +738,7 @@
   var o = new api.ChromeOsDevices();
   buildCounterChromeOsDevices++;
   if (buildCounterChromeOsDevices < 3) {
-    o.chromeosdevices = buildUnnamed855();
+    o.chromeosdevices = buildUnnamed863();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -553,7 +750,7 @@
 checkChromeOsDevices(api.ChromeOsDevices o) {
   buildCounterChromeOsDevices++;
   if (buildCounterChromeOsDevices < 3) {
-    checkUnnamed855(o.chromeosdevices);
+    checkUnnamed863(o.chromeosdevices);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -561,14 +758,14 @@
   buildCounterChromeOsDevices--;
 }
 
-buildUnnamed856() {
+buildUnnamed864() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed856(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'));
@@ -579,7 +776,7 @@
   var o = new api.ChromeOsMoveDevicesToOu();
   buildCounterChromeOsMoveDevicesToOu++;
   if (buildCounterChromeOsMoveDevicesToOu < 3) {
-    o.deviceIds = buildUnnamed856();
+    o.deviceIds = buildUnnamed864();
   }
   buildCounterChromeOsMoveDevicesToOu--;
   return o;
@@ -588,7 +785,7 @@
 checkChromeOsMoveDevicesToOu(api.ChromeOsMoveDevicesToOu o) {
   buildCounterChromeOsMoveDevicesToOu++;
   if (buildCounterChromeOsMoveDevicesToOu < 3) {
-    checkUnnamed856(o.deviceIds);
+    checkUnnamed864(o.deviceIds);
   }
   buildCounterChromeOsMoveDevicesToOu--;
 }
@@ -693,14 +890,14 @@
   buildCounterDomainAlias--;
 }
 
-buildUnnamed857() {
+buildUnnamed865() {
   var o = new core.List<api.DomainAlias>();
   o.add(buildDomainAlias());
   o.add(buildDomainAlias());
   return o;
 }
 
-checkUnnamed857(core.List<api.DomainAlias> o) {
+checkUnnamed865(core.List<api.DomainAlias> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDomainAlias(o[0]);
   checkDomainAlias(o[1]);
@@ -711,7 +908,7 @@
   var o = new api.DomainAliases();
   buildCounterDomainAliases++;
   if (buildCounterDomainAliases < 3) {
-    o.domainAliases = buildUnnamed857();
+    o.domainAliases = buildUnnamed865();
     o.etag = "foo";
     o.kind = "foo";
   }
@@ -722,21 +919,21 @@
 checkDomainAliases(api.DomainAliases o) {
   buildCounterDomainAliases++;
   if (buildCounterDomainAliases < 3) {
-    checkUnnamed857(o.domainAliases);
+    checkUnnamed865(o.domainAliases);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDomainAliases--;
 }
 
-buildUnnamed858() {
+buildUnnamed866() {
   var o = new core.List<api.DomainAlias>();
   o.add(buildDomainAlias());
   o.add(buildDomainAlias());
   return o;
 }
 
-checkUnnamed858(core.List<api.DomainAlias> o) {
+checkUnnamed866(core.List<api.DomainAlias> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDomainAlias(o[0]);
   checkDomainAlias(o[1]);
@@ -748,7 +945,7 @@
   buildCounterDomains++;
   if (buildCounterDomains < 3) {
     o.creationTime = "foo";
-    o.domainAliases = buildUnnamed858();
+    o.domainAliases = buildUnnamed866();
     o.domainName = "foo";
     o.etag = "foo";
     o.isPrimary = true;
@@ -763,7 +960,7 @@
   buildCounterDomains++;
   if (buildCounterDomains < 3) {
     unittest.expect(o.creationTime, unittest.equals('foo'));
-    checkUnnamed858(o.domainAliases);
+    checkUnnamed866(o.domainAliases);
     unittest.expect(o.domainName, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.isPrimary, unittest.isTrue);
@@ -773,14 +970,14 @@
   buildCounterDomains--;
 }
 
-buildUnnamed859() {
+buildUnnamed867() {
   var o = new core.List<api.Domains>();
   o.add(buildDomains());
   o.add(buildDomains());
   return o;
 }
 
-checkUnnamed859(core.List<api.Domains> o) {
+checkUnnamed867(core.List<api.Domains> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDomains(o[0]);
   checkDomains(o[1]);
@@ -791,7 +988,7 @@
   var o = new api.Domains2();
   buildCounterDomains2++;
   if (buildCounterDomains2 < 3) {
-    o.domains = buildUnnamed859();
+    o.domains = buildUnnamed867();
     o.etag = "foo";
     o.kind = "foo";
   }
@@ -802,34 +999,133 @@
 checkDomains2(api.Domains2 o) {
   buildCounterDomains2++;
   if (buildCounterDomains2 < 3) {
-    checkUnnamed859(o.domains);
+    checkUnnamed867(o.domains);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDomains2--;
 }
 
-buildUnnamed860() {
+core.int buildCounterFeature = 0;
+buildFeature() {
+  var o = new api.Feature();
+  buildCounterFeature++;
+  if (buildCounterFeature < 3) {
+    o.etags = "foo";
+    o.kind = "foo";
+    o.name = "foo";
+  }
+  buildCounterFeature--;
+  return o;
+}
+
+checkFeature(api.Feature o) {
+  buildCounterFeature++;
+  if (buildCounterFeature < 3) {
+    unittest.expect(o.etags, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+  }
+  buildCounterFeature--;
+}
+
+core.int buildCounterFeatureInstance = 0;
+buildFeatureInstance() {
+  var o = new api.FeatureInstance();
+  buildCounterFeatureInstance++;
+  if (buildCounterFeatureInstance < 3) {
+    o.feature = buildFeature();
+  }
+  buildCounterFeatureInstance--;
+  return o;
+}
+
+checkFeatureInstance(api.FeatureInstance o) {
+  buildCounterFeatureInstance++;
+  if (buildCounterFeatureInstance < 3) {
+    checkFeature(o.feature);
+  }
+  buildCounterFeatureInstance--;
+}
+
+core.int buildCounterFeatureRename = 0;
+buildFeatureRename() {
+  var o = new api.FeatureRename();
+  buildCounterFeatureRename++;
+  if (buildCounterFeatureRename < 3) {
+    o.newName = "foo";
+  }
+  buildCounterFeatureRename--;
+  return o;
+}
+
+checkFeatureRename(api.FeatureRename o) {
+  buildCounterFeatureRename++;
+  if (buildCounterFeatureRename < 3) {
+    unittest.expect(o.newName, unittest.equals('foo'));
+  }
+  buildCounterFeatureRename--;
+}
+
+buildUnnamed868() {
+  var o = new core.List<api.Feature>();
+  o.add(buildFeature());
+  o.add(buildFeature());
+  return o;
+}
+
+checkUnnamed868(core.List<api.Feature> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkFeature(o[0]);
+  checkFeature(o[1]);
+}
+
+core.int buildCounterFeatures = 0;
+buildFeatures() {
+  var o = new api.Features();
+  buildCounterFeatures++;
+  if (buildCounterFeatures < 3) {
+    o.etag = "foo";
+    o.features = buildUnnamed868();
+    o.kind = "foo";
+    o.nextPageToken = "foo";
+  }
+  buildCounterFeatures--;
+  return o;
+}
+
+checkFeatures(api.Features o) {
+  buildCounterFeatures++;
+  if (buildCounterFeatures < 3) {
+    unittest.expect(o.etag, unittest.equals('foo'));
+    checkUnnamed868(o.features);
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterFeatures--;
+}
+
+buildUnnamed869() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed860(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'));
 }
 
-buildUnnamed861() {
+buildUnnamed870() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed861(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'));
@@ -841,7 +1137,7 @@
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
     o.adminCreated = true;
-    o.aliases = buildUnnamed860();
+    o.aliases = buildUnnamed869();
     o.description = "foo";
     o.directMembersCount = "foo";
     o.email = "foo";
@@ -849,7 +1145,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.nonEditableAliases = buildUnnamed861();
+    o.nonEditableAliases = buildUnnamed870();
   }
   buildCounterGroup--;
   return o;
@@ -859,7 +1155,7 @@
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
     unittest.expect(o.adminCreated, unittest.isTrue);
-    checkUnnamed860(o.aliases);
+    checkUnnamed869(o.aliases);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.directMembersCount, unittest.equals('foo'));
     unittest.expect(o.email, unittest.equals('foo'));
@@ -867,19 +1163,19 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed861(o.nonEditableAliases);
+    checkUnnamed870(o.nonEditableAliases);
   }
   buildCounterGroup--;
 }
 
-buildUnnamed862() {
+buildUnnamed871() {
   var o = new core.List<api.Group>();
   o.add(buildGroup());
   o.add(buildGroup());
   return o;
 }
 
-checkUnnamed862(core.List<api.Group> o) {
+checkUnnamed871(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGroup(o[0]);
   checkGroup(o[1]);
@@ -891,7 +1187,7 @@
   buildCounterGroups++;
   if (buildCounterGroups < 3) {
     o.etag = "foo";
-    o.groups = buildUnnamed862();
+    o.groups = buildUnnamed871();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -903,7 +1199,7 @@
   buildCounterGroups++;
   if (buildCounterGroups < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed862(o.groups);
+    checkUnnamed871(o.groups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -941,14 +1237,14 @@
   buildCounterMember--;
 }
 
-buildUnnamed863() {
+buildUnnamed872() {
   var o = new core.List<api.Member>();
   o.add(buildMember());
   o.add(buildMember());
   return o;
 }
 
-checkUnnamed863(core.List<api.Member> o) {
+checkUnnamed872(core.List<api.Member> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMember(o[0]);
   checkMember(o[1]);
@@ -961,7 +1257,7 @@
   if (buildCounterMembers < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.members = buildUnnamed863();
+    o.members = buildUnnamed872();
     o.nextPageToken = "foo";
   }
   buildCounterMembers--;
@@ -973,7 +1269,7 @@
   if (buildCounterMembers < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed863(o.members);
+    checkUnnamed872(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMembers--;
@@ -998,14 +1294,14 @@
   buildCounterMembersHasMember--;
 }
 
-buildUnnamed864() {
+buildUnnamed873() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed864(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'));
@@ -1018,7 +1314,7 @@
   if (buildCounterMobileDeviceApplications < 3) {
     o.displayName = "foo";
     o.packageName = "foo";
-    o.permission = buildUnnamed864();
+    o.permission = buildUnnamed873();
     o.versionCode = 42;
     o.versionName = "foo";
   }
@@ -1031,60 +1327,60 @@
   if (buildCounterMobileDeviceApplications < 3) {
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed864(o.permission);
+    checkUnnamed873(o.permission);
     unittest.expect(o.versionCode, unittest.equals(42));
     unittest.expect(o.versionName, unittest.equals('foo'));
   }
   buildCounterMobileDeviceApplications--;
 }
 
-buildUnnamed865() {
+buildUnnamed874() {
   var o = new core.List<api.MobileDeviceApplications>();
   o.add(buildMobileDeviceApplications());
   o.add(buildMobileDeviceApplications());
   return o;
 }
 
-checkUnnamed865(core.List<api.MobileDeviceApplications> o) {
+checkUnnamed874(core.List<api.MobileDeviceApplications> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileDeviceApplications(o[0]);
   checkMobileDeviceApplications(o[1]);
 }
 
-buildUnnamed866() {
+buildUnnamed875() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed866(core.List<core.String> o) {
+checkUnnamed875(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed867() {
+buildUnnamed876() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed867(core.List<core.String> o) {
+checkUnnamed876(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed868() {
+buildUnnamed877() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed868(core.List<core.String> o) {
+checkUnnamed877(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1096,7 +1392,7 @@
   buildCounterMobileDevice++;
   if (buildCounterMobileDevice < 3) {
     o.adbStatus = true;
-    o.applications = buildUnnamed865();
+    o.applications = buildUnnamed874();
     o.basebandVersion = "foo";
     o.bootloaderVersion = "foo";
     o.brand = "foo";
@@ -1106,7 +1402,7 @@
     o.deviceCompromisedStatus = "foo";
     o.deviceId = "foo";
     o.devicePasswordStatus = "foo";
-    o.email = buildUnnamed866();
+    o.email = buildUnnamed875();
     o.encryptionStatus = "foo";
     o.etag = "foo";
     o.firstSync = core.DateTime.parse("2002-02-27T14:01:02");
@@ -1120,10 +1416,10 @@
     o.manufacturer = "foo";
     o.meid = "foo";
     o.model = "foo";
-    o.name = buildUnnamed867();
+    o.name = buildUnnamed876();
     o.networkOperator = "foo";
     o.os = "foo";
-    o.otherAccountsInfo = buildUnnamed868();
+    o.otherAccountsInfo = buildUnnamed877();
     o.privilege = "foo";
     o.releaseVersion = "foo";
     o.resourceId = "foo";
@@ -1144,7 +1440,7 @@
   buildCounterMobileDevice++;
   if (buildCounterMobileDevice < 3) {
     unittest.expect(o.adbStatus, unittest.isTrue);
-    checkUnnamed865(o.applications);
+    checkUnnamed874(o.applications);
     unittest.expect(o.basebandVersion, unittest.equals('foo'));
     unittest.expect(o.bootloaderVersion, unittest.equals('foo'));
     unittest.expect(o.brand, unittest.equals('foo'));
@@ -1154,7 +1450,7 @@
     unittest.expect(o.deviceCompromisedStatus, unittest.equals('foo'));
     unittest.expect(o.deviceId, unittest.equals('foo'));
     unittest.expect(o.devicePasswordStatus, unittest.equals('foo'));
-    checkUnnamed866(o.email);
+    checkUnnamed875(o.email);
     unittest.expect(o.encryptionStatus, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.firstSync,
@@ -1170,10 +1466,10 @@
     unittest.expect(o.manufacturer, unittest.equals('foo'));
     unittest.expect(o.meid, unittest.equals('foo'));
     unittest.expect(o.model, unittest.equals('foo'));
-    checkUnnamed867(o.name);
+    checkUnnamed876(o.name);
     unittest.expect(o.networkOperator, unittest.equals('foo'));
     unittest.expect(o.os, unittest.equals('foo'));
-    checkUnnamed868(o.otherAccountsInfo);
+    checkUnnamed877(o.otherAccountsInfo);
     unittest.expect(o.privilege, unittest.equals('foo'));
     unittest.expect(o.releaseVersion, unittest.equals('foo'));
     unittest.expect(o.resourceId, unittest.equals('foo'));
@@ -1208,14 +1504,14 @@
   buildCounterMobileDeviceAction--;
 }
 
-buildUnnamed869() {
+buildUnnamed878() {
   var o = new core.List<api.MobileDevice>();
   o.add(buildMobileDevice());
   o.add(buildMobileDevice());
   return o;
 }
 
-checkUnnamed869(core.List<api.MobileDevice> o) {
+checkUnnamed878(core.List<api.MobileDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileDevice(o[0]);
   checkMobileDevice(o[1]);
@@ -1228,7 +1524,7 @@
   if (buildCounterMobileDevices < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.mobiledevices = buildUnnamed869();
+    o.mobiledevices = buildUnnamed878();
     o.nextPageToken = "foo";
   }
   buildCounterMobileDevices--;
@@ -1240,7 +1536,7 @@
   if (buildCounterMobileDevices < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed869(o.mobiledevices);
+    checkUnnamed878(o.mobiledevices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMobileDevices--;
@@ -1280,14 +1576,14 @@
   buildCounterNotification--;
 }
 
-buildUnnamed870() {
+buildUnnamed879() {
   var o = new core.List<api.Notification>();
   o.add(buildNotification());
   o.add(buildNotification());
   return o;
 }
 
-checkUnnamed870(core.List<api.Notification> o) {
+checkUnnamed879(core.List<api.Notification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNotification(o[0]);
   checkNotification(o[1]);
@@ -1299,7 +1595,7 @@
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed870();
+    o.items = buildUnnamed879();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.unreadNotificationsCount = 42;
@@ -1312,7 +1608,7 @@
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed870(o.items);
+    checkUnnamed879(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.unreadNotificationsCount, unittest.equals(42));
@@ -1355,14 +1651,14 @@
   buildCounterOrgUnit--;
 }
 
-buildUnnamed871() {
+buildUnnamed880() {
   var o = new core.List<api.OrgUnit>();
   o.add(buildOrgUnit());
   o.add(buildOrgUnit());
   return o;
 }
 
-checkUnnamed871(core.List<api.OrgUnit> o) {
+checkUnnamed880(core.List<api.OrgUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrgUnit(o[0]);
   checkOrgUnit(o[1]);
@@ -1375,7 +1671,7 @@
   if (buildCounterOrgUnits < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.organizationUnits = buildUnnamed871();
+    o.organizationUnits = buildUnnamed880();
   }
   buildCounterOrgUnits--;
   return o;
@@ -1386,19 +1682,19 @@
   if (buildCounterOrgUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed871(o.organizationUnits);
+    checkUnnamed880(o.organizationUnits);
   }
   buildCounterOrgUnits--;
 }
 
-buildUnnamed872() {
+buildUnnamed881() {
   var o = new core.List<api.Privilege>();
   o.add(buildPrivilege());
   o.add(buildPrivilege());
   return o;
 }
 
-checkUnnamed872(core.List<api.Privilege> o) {
+checkUnnamed881(core.List<api.Privilege> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPrivilege(o[0]);
   checkPrivilege(o[1]);
@@ -1409,7 +1705,7 @@
   var o = new api.Privilege();
   buildCounterPrivilege++;
   if (buildCounterPrivilege < 3) {
-    o.childPrivileges = buildUnnamed872();
+    o.childPrivileges = buildUnnamed881();
     o.etag = "foo";
     o.isOuScopable = true;
     o.kind = "foo";
@@ -1424,7 +1720,7 @@
 checkPrivilege(api.Privilege o) {
   buildCounterPrivilege++;
   if (buildCounterPrivilege < 3) {
-    checkUnnamed872(o.childPrivileges);
+    checkUnnamed881(o.childPrivileges);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.isOuScopable, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1435,14 +1731,14 @@
   buildCounterPrivilege--;
 }
 
-buildUnnamed873() {
+buildUnnamed882() {
   var o = new core.List<api.Privilege>();
   o.add(buildPrivilege());
   o.add(buildPrivilege());
   return o;
 }
 
-checkUnnamed873(core.List<api.Privilege> o) {
+checkUnnamed882(core.List<api.Privilege> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPrivilege(o[0]);
   checkPrivilege(o[1]);
@@ -1454,7 +1750,7 @@
   buildCounterPrivileges++;
   if (buildCounterPrivileges < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed873();
+    o.items = buildUnnamed882();
     o.kind = "foo";
   }
   buildCounterPrivileges--;
@@ -1465,7 +1761,7 @@
   buildCounterPrivileges++;
   if (buildCounterPrivileges < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed873(o.items);
+    checkUnnamed882(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPrivileges--;
@@ -1492,14 +1788,14 @@
   buildCounterRoleRolePrivileges--;
 }
 
-buildUnnamed874() {
+buildUnnamed883() {
   var o = new core.List<api.RoleRolePrivileges>();
   o.add(buildRoleRolePrivileges());
   o.add(buildRoleRolePrivileges());
   return o;
 }
 
-checkUnnamed874(core.List<api.RoleRolePrivileges> o) {
+checkUnnamed883(core.List<api.RoleRolePrivileges> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoleRolePrivileges(o[0]);
   checkRoleRolePrivileges(o[1]);
@@ -1517,7 +1813,7 @@
     o.roleDescription = "foo";
     o.roleId = "foo";
     o.roleName = "foo";
-    o.rolePrivileges = buildUnnamed874();
+    o.rolePrivileges = buildUnnamed883();
   }
   buildCounterRole--;
   return o;
@@ -1533,7 +1829,7 @@
     unittest.expect(o.roleDescription, unittest.equals('foo'));
     unittest.expect(o.roleId, unittest.equals('foo'));
     unittest.expect(o.roleName, unittest.equals('foo'));
-    checkUnnamed874(o.rolePrivileges);
+    checkUnnamed883(o.rolePrivileges);
   }
   buildCounterRole--;
 }
@@ -1569,14 +1865,14 @@
   buildCounterRoleAssignment--;
 }
 
-buildUnnamed875() {
+buildUnnamed884() {
   var o = new core.List<api.RoleAssignment>();
   o.add(buildRoleAssignment());
   o.add(buildRoleAssignment());
   return o;
 }
 
-checkUnnamed875(core.List<api.RoleAssignment> o) {
+checkUnnamed884(core.List<api.RoleAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoleAssignment(o[0]);
   checkRoleAssignment(o[1]);
@@ -1588,7 +1884,7 @@
   buildCounterRoleAssignments++;
   if (buildCounterRoleAssignments < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed875();
+    o.items = buildUnnamed884();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1600,21 +1896,21 @@
   buildCounterRoleAssignments++;
   if (buildCounterRoleAssignments < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed875(o.items);
+    checkUnnamed884(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterRoleAssignments--;
 }
 
-buildUnnamed876() {
+buildUnnamed885() {
   var o = new core.List<api.Role>();
   o.add(buildRole());
   o.add(buildRole());
   return o;
 }
 
-checkUnnamed876(core.List<api.Role> o) {
+checkUnnamed885(core.List<api.Role> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRole(o[0]);
   checkRole(o[1]);
@@ -1626,7 +1922,7 @@
   buildCounterRoles++;
   if (buildCounterRoles < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed876();
+    o.items = buildUnnamed885();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1638,21 +1934,21 @@
   buildCounterRoles++;
   if (buildCounterRoles < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed876(o.items);
+    checkUnnamed885(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterRoles--;
 }
 
-buildUnnamed877() {
+buildUnnamed886() {
   var o = new core.List<api.SchemaFieldSpec>();
   o.add(buildSchemaFieldSpec());
   o.add(buildSchemaFieldSpec());
   return o;
 }
 
-checkUnnamed877(core.List<api.SchemaFieldSpec> o) {
+checkUnnamed886(core.List<api.SchemaFieldSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSchemaFieldSpec(o[0]);
   checkSchemaFieldSpec(o[1]);
@@ -1664,7 +1960,7 @@
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
     o.etag = "foo";
-    o.fields = buildUnnamed877();
+    o.fields = buildUnnamed886();
     o.kind = "foo";
     o.schemaId = "foo";
     o.schemaName = "foo";
@@ -1677,7 +1973,7 @@
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed877(o.fields);
+    checkUnnamed886(o.fields);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.schemaId, unittest.equals('foo'));
     unittest.expect(o.schemaName, unittest.equals('foo'));
@@ -1742,14 +2038,14 @@
   buildCounterSchemaFieldSpec--;
 }
 
-buildUnnamed878() {
+buildUnnamed887() {
   var o = new core.List<api.Schema>();
   o.add(buildSchema());
   o.add(buildSchema());
   return o;
 }
 
-checkUnnamed878(core.List<api.Schema> o) {
+checkUnnamed887(core.List<api.Schema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSchema(o[0]);
   checkSchema(o[1]);
@@ -1762,7 +2058,7 @@
   if (buildCounterSchemas < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.schemas = buildUnnamed878();
+    o.schemas = buildUnnamed887();
   }
   buildCounterSchemas--;
   return o;
@@ -1773,19 +2069,19 @@
   if (buildCounterSchemas < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed878(o.schemas);
+    checkUnnamed887(o.schemas);
   }
   buildCounterSchemas--;
 }
 
-buildUnnamed879() {
+buildUnnamed888() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed879(core.List<core.String> o) {
+checkUnnamed888(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1802,7 +2098,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nativeApp = true;
-    o.scopes = buildUnnamed879();
+    o.scopes = buildUnnamed888();
     o.userKey = "foo";
   }
   buildCounterToken--;
@@ -1818,20 +2114,20 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nativeApp, unittest.isTrue);
-    checkUnnamed879(o.scopes);
+    checkUnnamed888(o.scopes);
     unittest.expect(o.userKey, unittest.equals('foo'));
   }
   buildCounterToken--;
 }
 
-buildUnnamed880() {
+buildUnnamed889() {
   var o = new core.List<api.Token>();
   o.add(buildToken());
   o.add(buildToken());
   return o;
 }
 
-checkUnnamed880(core.List<api.Token> o) {
+checkUnnamed889(core.List<api.Token> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkToken(o[0]);
   checkToken(o[1]);
@@ -1843,7 +2139,7 @@
   buildCounterTokens++;
   if (buildCounterTokens < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed880();
+    o.items = buildUnnamed889();
     o.kind = "foo";
   }
   buildCounterTokens--;
@@ -1854,7 +2150,7 @@
   buildCounterTokens++;
   if (buildCounterTokens < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed880(o.items);
+    checkUnnamed889(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTokens--;
@@ -1887,14 +2183,14 @@
   buildCounterTrustedAppId--;
 }
 
-buildUnnamed881() {
+buildUnnamed890() {
   var o = new core.List<api.TrustedAppId>();
   o.add(buildTrustedAppId());
   o.add(buildTrustedAppId());
   return o;
 }
 
-checkUnnamed881(core.List<api.TrustedAppId> o) {
+checkUnnamed890(core.List<api.TrustedAppId> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrustedAppId(o[0]);
   checkTrustedAppId(o[1]);
@@ -1908,7 +2204,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.trustedApps = buildUnnamed881();
+    o.trustedApps = buildUnnamed890();
   }
   buildCounterTrustedApps--;
   return o;
@@ -1920,45 +2216,45 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed881(o.trustedApps);
+    checkUnnamed890(o.trustedApps);
   }
   buildCounterTrustedApps--;
 }
 
-buildUnnamed882() {
+buildUnnamed891() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed882(core.List<core.String> o) {
+checkUnnamed891(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed883() {
+buildUnnamed892() {
   var o = new core.Map<core.String, api.UserCustomProperties>();
   o["x"] = buildUserCustomProperties();
   o["y"] = buildUserCustomProperties();
   return o;
 }
 
-checkUnnamed883(core.Map<core.String, api.UserCustomProperties> o) {
+checkUnnamed892(core.Map<core.String, api.UserCustomProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserCustomProperties(o["x"]);
   checkUserCustomProperties(o["y"]);
 }
 
-buildUnnamed884() {
+buildUnnamed893() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed884(core.List<core.String> o) {
+checkUnnamed893(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1975,10 +2271,10 @@
       'string': 'foo'
     };
     o.agreedToTerms = true;
-    o.aliases = buildUnnamed882();
+    o.aliases = buildUnnamed891();
     o.changePasswordAtNextLogin = true;
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.customSchemas = buildUnnamed883();
+    o.customSchemas = buildUnnamed892();
     o.customerId = "foo";
     o.deletionTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.emails = {
@@ -2029,7 +2325,7 @@
       'string': 'foo'
     };
     o.name = buildUserName();
-    o.nonEditableAliases = buildUnnamed884();
+    o.nonEditableAliases = buildUnnamed893();
     o.notes = {
       'list': [1, 2, 3],
       'bool': true,
@@ -2080,43 +2376,43 @@
 checkUser(api.User o) {
   buildCounterUser++;
   if (buildCounterUser < 3) {
-    var casted3 = (o.addresses) 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.agreedToTerms, unittest.isTrue);
-    checkUnnamed882(o.aliases);
-    unittest.expect(o.changePasswordAtNextLogin, unittest.isTrue);
-    unittest.expect(o.creationTime,
-        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed883(o.customSchemas);
-    unittest.expect(o.customerId, unittest.equals('foo'));
-    unittest.expect(o.deletionTime,
-        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    var casted4 = (o.emails) as core.Map;
+    var casted4 = (o.addresses) 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'));
-    unittest.expect(o.etag, unittest.equals('foo'));
-    var casted5 = (o.externalIds) as core.Map;
+    unittest.expect(o.agreedToTerms, unittest.isTrue);
+    checkUnnamed891(o.aliases);
+    unittest.expect(o.changePasswordAtNextLogin, unittest.isTrue);
+    unittest.expect(o.creationTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    checkUnnamed892(o.customSchemas);
+    unittest.expect(o.customerId, unittest.equals('foo'));
+    unittest.expect(o.deletionTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    var casted5 = (o.emails) 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.gender) as core.Map;
+    unittest.expect(o.etag, unittest.equals('foo'));
+    var casted6 = (o.externalIds) 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'));
-    unittest.expect(o.hashFunction, unittest.equals('foo'));
-    unittest.expect(o.id, unittest.equals('foo'));
-    var casted7 = (o.ims) as core.Map;
+    var casted7 = (o.gender) 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'));
+    unittest.expect(o.hashFunction, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    var casted8 = (o.ims) 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'));
     unittest.expect(o.includeInGlobalAddressList, unittest.isTrue);
     unittest.expect(o.ipWhitelisted, unittest.isTrue);
     unittest.expect(o.isAdmin, unittest.isTrue);
@@ -2124,68 +2420,68 @@
     unittest.expect(o.isEnforcedIn2Sv, unittest.isTrue);
     unittest.expect(o.isEnrolledIn2Sv, unittest.isTrue);
     unittest.expect(o.isMailboxSetup, unittest.isTrue);
-    var casted8 = (o.keywords) 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'));
-    unittest.expect(o.kind, unittest.equals('foo'));
-    var casted9 = (o.languages) as core.Map;
+    var casted9 = (o.keywords) as core.Map;
     unittest.expect(casted9, unittest.hasLength(3));
     unittest.expect(casted9["list"], unittest.equals([1, 2, 3]));
     unittest.expect(casted9["bool"], unittest.equals(true));
     unittest.expect(casted9["string"], unittest.equals('foo'));
-    unittest.expect(o.lastLoginTime,
-        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    var casted10 = (o.locations) as core.Map;
+    unittest.expect(o.kind, unittest.equals('foo'));
+    var casted10 = (o.languages) as core.Map;
     unittest.expect(casted10, unittest.hasLength(3));
     unittest.expect(casted10["list"], unittest.equals([1, 2, 3]));
     unittest.expect(casted10["bool"], unittest.equals(true));
     unittest.expect(casted10["string"], unittest.equals('foo'));
-    checkUserName(o.name);
-    checkUnnamed884(o.nonEditableAliases);
-    var casted11 = (o.notes) as core.Map;
+    unittest.expect(o.lastLoginTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    var casted11 = (o.locations) as core.Map;
     unittest.expect(casted11, unittest.hasLength(3));
     unittest.expect(casted11["list"], unittest.equals([1, 2, 3]));
     unittest.expect(casted11["bool"], unittest.equals(true));
     unittest.expect(casted11["string"], unittest.equals('foo'));
-    unittest.expect(o.orgUnitPath, unittest.equals('foo'));
-    var casted12 = (o.organizations) as core.Map;
+    checkUserName(o.name);
+    checkUnnamed893(o.nonEditableAliases);
+    var casted12 = (o.notes) as core.Map;
     unittest.expect(casted12, unittest.hasLength(3));
     unittest.expect(casted12["list"], unittest.equals([1, 2, 3]));
     unittest.expect(casted12["bool"], unittest.equals(true));
     unittest.expect(casted12["string"], unittest.equals('foo'));
-    unittest.expect(o.password, unittest.equals('foo'));
-    var casted13 = (o.phones) as core.Map;
+    unittest.expect(o.orgUnitPath, unittest.equals('foo'));
+    var casted13 = (o.organizations) as core.Map;
     unittest.expect(casted13, unittest.hasLength(3));
     unittest.expect(casted13["list"], unittest.equals([1, 2, 3]));
     unittest.expect(casted13["bool"], unittest.equals(true));
     unittest.expect(casted13["string"], unittest.equals('foo'));
-    var casted14 = (o.posixAccounts) as core.Map;
+    unittest.expect(o.password, unittest.equals('foo'));
+    var casted14 = (o.phones) as core.Map;
     unittest.expect(casted14, unittest.hasLength(3));
     unittest.expect(casted14["list"], unittest.equals([1, 2, 3]));
     unittest.expect(casted14["bool"], unittest.equals(true));
     unittest.expect(casted14["string"], unittest.equals('foo'));
-    unittest.expect(o.primaryEmail, unittest.equals('foo'));
-    var casted15 = (o.relations) as core.Map;
+    var casted15 = (o.posixAccounts) as core.Map;
     unittest.expect(casted15, unittest.hasLength(3));
     unittest.expect(casted15["list"], unittest.equals([1, 2, 3]));
     unittest.expect(casted15["bool"], unittest.equals(true));
     unittest.expect(casted15["string"], unittest.equals('foo'));
-    var casted16 = (o.sshPublicKeys) as core.Map;
+    unittest.expect(o.primaryEmail, unittest.equals('foo'));
+    var casted16 = (o.relations) as core.Map;
     unittest.expect(casted16, unittest.hasLength(3));
     unittest.expect(casted16["list"], unittest.equals([1, 2, 3]));
     unittest.expect(casted16["bool"], unittest.equals(true));
     unittest.expect(casted16["string"], unittest.equals('foo'));
-    unittest.expect(o.suspended, unittest.isTrue);
-    unittest.expect(o.suspensionReason, unittest.equals('foo'));
-    unittest.expect(o.thumbnailPhotoEtag, unittest.equals('foo'));
-    unittest.expect(o.thumbnailPhotoUrl, unittest.equals('foo'));
-    var casted17 = (o.websites) as core.Map;
+    var casted17 = (o.sshPublicKeys) as core.Map;
     unittest.expect(casted17, unittest.hasLength(3));
     unittest.expect(casted17["list"], unittest.equals([1, 2, 3]));
     unittest.expect(casted17["bool"], unittest.equals(true));
     unittest.expect(casted17["string"], unittest.equals('foo'));
+    unittest.expect(o.suspended, unittest.isTrue);
+    unittest.expect(o.suspensionReason, unittest.equals('foo'));
+    unittest.expect(o.thumbnailPhotoEtag, unittest.equals('foo'));
+    unittest.expect(o.thumbnailPhotoUrl, unittest.equals('foo'));
+    var casted18 = (o.websites) as core.Map;
+    unittest.expect(casted18, unittest.hasLength(3));
+    unittest.expect(casted18["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted18["bool"], unittest.equals(true));
+    unittest.expect(casted18["string"], unittest.equals('foo'));
   }
   buildCounterUser--;
 }
@@ -2271,16 +2567,16 @@
 
 checkUserCustomProperties(api.UserCustomProperties o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted18 = (o["a"]) as core.Map;
-  unittest.expect(casted18, unittest.hasLength(3));
-  unittest.expect(casted18["list"], unittest.equals([1, 2, 3]));
-  unittest.expect(casted18["bool"], unittest.equals(true));
-  unittest.expect(casted18["string"], unittest.equals('foo'));
-  var casted19 = (o["b"]) as core.Map;
+  var casted19 = (o["a"]) as core.Map;
   unittest.expect(casted19, unittest.hasLength(3));
   unittest.expect(casted19["list"], unittest.equals([1, 2, 3]));
   unittest.expect(casted19["bool"], unittest.equals(true));
   unittest.expect(casted19["string"], unittest.equals('foo'));
+  var casted20 = (o["b"]) as core.Map;
+  unittest.expect(casted20, unittest.hasLength(3));
+  unittest.expect(casted20["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted20["bool"], unittest.equals(true));
+  unittest.expect(casted20["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterUserEmail = 0;
@@ -2724,14 +3020,14 @@
   buildCounterUserWebsite--;
 }
 
-buildUnnamed885() {
+buildUnnamed894() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed885(core.List<api.User> o) {
+checkUnnamed894(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
@@ -2746,7 +3042,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.triggerEvent = "foo";
-    o.users = buildUnnamed885();
+    o.users = buildUnnamed894();
   }
   buildCounterUsers--;
   return o;
@@ -2759,7 +3055,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.triggerEvent, unittest.equals('foo'));
-    checkUnnamed885(o.users);
+    checkUnnamed894(o.users);
   }
   buildCounterUsers--;
 }
@@ -2789,14 +3085,14 @@
   buildCounterVerificationCode--;
 }
 
-buildUnnamed886() {
+buildUnnamed895() {
   var o = new core.List<api.VerificationCode>();
   o.add(buildVerificationCode());
   o.add(buildVerificationCode());
   return o;
 }
 
-checkUnnamed886(core.List<api.VerificationCode> o) {
+checkUnnamed895(core.List<api.VerificationCode> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVerificationCode(o[0]);
   checkVerificationCode(o[1]);
@@ -2808,7 +3104,7 @@
   buildCounterVerificationCodes++;
   if (buildCounterVerificationCodes < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed886();
+    o.items = buildUnnamed895();
     o.kind = "foo";
   }
   buildCounterVerificationCodes--;
@@ -2819,59 +3115,59 @@
   buildCounterVerificationCodes++;
   if (buildCounterVerificationCodes < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed886(o.items);
+    checkUnnamed895(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterVerificationCodes--;
 }
 
-buildUnnamed887() {
+buildUnnamed896() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed887(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'));
 }
 
-buildUnnamed888() {
+buildUnnamed897() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed888(core.List<core.String> o) {
+checkUnnamed897(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed889() {
+buildUnnamed898() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed889(core.List<core.String> o) {
+checkUnnamed898(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed890() {
+buildUnnamed899() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed890(core.List<core.String> o) {
+checkUnnamed899(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2918,6 +3214,30 @@
     });
   });
 
+  unittest.group("obj-schema-Building", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildBuilding();
+      var od = new api.Building.fromJson(o.toJson());
+      checkBuilding(od);
+    });
+  });
+
+  unittest.group("obj-schema-BuildingCoordinates", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildBuildingCoordinates();
+      var od = new api.BuildingCoordinates.fromJson(o.toJson());
+      checkBuildingCoordinates(od);
+    });
+  });
+
+  unittest.group("obj-schema-Buildings", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildBuildings();
+      var od = new api.Buildings.fromJson(o.toJson());
+      checkBuildings(od);
+    });
+  });
+
   unittest.group("obj-schema-CalendarResource", () {
     unittest.test("to-json--from-json", () {
       var o = buildCalendarResource();
@@ -2950,6 +3270,14 @@
     });
   });
 
+  unittest.group("obj-schema-ChromeOsDeviceDeviceFiles", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildChromeOsDeviceDeviceFiles();
+      var od = new api.ChromeOsDeviceDeviceFiles.fromJson(o.toJson());
+      checkChromeOsDeviceDeviceFiles(od);
+    });
+  });
+
   unittest.group("obj-schema-ChromeOsDeviceRecentUsers", () {
     unittest.test("to-json--from-json", () {
       var o = buildChromeOsDeviceRecentUsers();
@@ -2958,6 +3286,14 @@
     });
   });
 
+  unittest.group("obj-schema-ChromeOsDeviceTpmVersionInfo", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildChromeOsDeviceTpmVersionInfo();
+      var od = new api.ChromeOsDeviceTpmVersionInfo.fromJson(o.toJson());
+      checkChromeOsDeviceTpmVersionInfo(od);
+    });
+  });
+
   unittest.group("obj-schema-ChromeOsDevice", () {
     unittest.test("to-json--from-json", () {
       var o = buildChromeOsDevice();
@@ -3038,6 +3374,38 @@
     });
   });
 
+  unittest.group("obj-schema-Feature", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildFeature();
+      var od = new api.Feature.fromJson(o.toJson());
+      checkFeature(od);
+    });
+  });
+
+  unittest.group("obj-schema-FeatureInstance", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildFeatureInstance();
+      var od = new api.FeatureInstance.fromJson(o.toJson());
+      checkFeatureInstance(od);
+    });
+  });
+
+  unittest.group("obj-schema-FeatureRename", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildFeatureRename();
+      var od = new api.FeatureRename.fromJson(o.toJson());
+      checkFeatureRename(od);
+    });
+  });
+
+  unittest.group("obj-schema-Features", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildFeatures();
+      var od = new api.Features.fromJson(o.toJson());
+      checkFeatures(od);
+    });
+  });
+
   unittest.group("obj-schema-Group", () {
     unittest.test("to-json--from-json", () {
       var o = buildGroup();
@@ -6546,7 +6914,7 @@
       var mock = new HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed887();
+      var arg_orgUnitPath = buildUnnamed896();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -6614,7 +6982,7 @@
       var mock = new HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed888();
+      var arg_orgUnitPath = buildUnnamed897();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -6821,7 +7189,7 @@
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_request = buildOrgUnit();
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed889();
+      var arg_orgUnitPath = buildUnnamed898();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.OrgUnit.fromJson(json);
@@ -6896,7 +7264,7 @@
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_request = buildOrgUnit();
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed890();
+      var arg_orgUnitPath = buildUnnamed899();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.OrgUnit.fromJson(json);
@@ -7139,6 +7507,414 @@
     });
   });
 
+  unittest.group("resource-ResourcesBuildingsResourceApi", () {
+    unittest.test("method--delete", () {
+      var mock = new HttpServerMock();
+      api.ResourcesBuildingsResourceApi res =
+          new api.AdminApi(mock).resources.buildings;
+      var arg_customer = "foo";
+      var arg_buildingId = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 19),
+            unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/resources/buildings/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customer"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("/resources/buildings/"));
+        pathOffset += 21;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_buildingId"));
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = "";
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .delete(arg_customer, arg_buildingId, $fields: arg_$fields)
+          .then(unittest.expectAsync1((_) {}));
+    });
+
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.ResourcesBuildingsResourceApi res =
+          new api.AdminApi(mock).resources.buildings;
+      var arg_customer = "foo";
+      var arg_buildingId = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 19),
+            unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/resources/buildings/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customer"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("/resources/buildings/"));
+        pathOffset += 21;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_buildingId"));
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildBuilding());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_customer, arg_buildingId, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Building response) {
+        checkBuilding(response);
+      })));
+    });
+
+    unittest.test("method--insert", () {
+      var mock = new HttpServerMock();
+      api.ResourcesBuildingsResourceApi res =
+          new api.AdminApi(mock).resources.buildings;
+      var arg_request = buildBuilding();
+      var arg_customer = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.Building.fromJson(json);
+        checkBuilding(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 + 19),
+            unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/resources/buildings", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customer"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/resources/buildings"));
+        pathOffset += 20;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildBuilding());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .insert(arg_request, arg_customer, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Building response) {
+        checkBuilding(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.ResourcesBuildingsResourceApi res =
+          new api.AdminApi(mock).resources.buildings;
+      var arg_customer = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 19),
+            unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/resources/buildings", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customer"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/resources/buildings"));
+        pathOffset += 20;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildBuildings());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_customer, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Buildings response) {
+        checkBuildings(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+      var mock = new HttpServerMock();
+      api.ResourcesBuildingsResourceApi res =
+          new api.AdminApi(mock).resources.buildings;
+      var arg_request = buildBuilding();
+      var arg_customer = "foo";
+      var arg_buildingId = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.Building.fromJson(json);
+        checkBuilding(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 + 19),
+            unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/resources/buildings/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customer"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("/resources/buildings/"));
+        pathOffset += 21;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_buildingId"));
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildBuilding());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .patch(arg_request, arg_customer, arg_buildingId,
+              $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Building response) {
+        checkBuilding(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+      var mock = new HttpServerMock();
+      api.ResourcesBuildingsResourceApi res =
+          new api.AdminApi(mock).resources.buildings;
+      var arg_request = buildBuilding();
+      var arg_customer = "foo";
+      var arg_buildingId = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.Building.fromJson(json);
+        checkBuilding(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 + 19),
+            unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/resources/buildings/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customer"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("/resources/buildings/"));
+        pathOffset += 21;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_buildingId"));
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildBuilding());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .update(arg_request, arg_customer, arg_buildingId,
+              $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Building response) {
+        checkBuilding(response);
+      })));
+    });
+  });
+
   unittest.group("resource-ResourcesCalendarsResourceApi", () {
     unittest.test("method--delete", () {
       var mock = new HttpServerMock();
@@ -7345,7 +8121,9 @@
           new api.AdminApi(mock).resources.calendars;
       var arg_customer = "foo";
       var arg_maxResults = 42;
+      var arg_orderBy = "foo";
       var arg_pageToken = "foo";
+      var arg_query = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -7392,7 +8170,10 @@
         unittest.expect(core.int.parse(queryMap["maxResults"].first),
             unittest.equals(arg_maxResults));
         unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["query"].first, unittest.equals(arg_query));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -7404,7 +8185,9 @@
       res
           .list(arg_customer,
               maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
               pageToken: arg_pageToken,
+              query: arg_query,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.CalendarResources response) {
         checkCalendarResources(response);
@@ -7556,6 +8339,492 @@
     });
   });
 
+  unittest.group("resource-ResourcesFeaturesResourceApi", () {
+    unittest.test("method--delete", () {
+      var mock = new HttpServerMock();
+      api.ResourcesFeaturesResourceApi res =
+          new api.AdminApi(mock).resources.features;
+      var arg_customer = "foo";
+      var arg_featureKey = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 19),
+            unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/resources/features/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customer"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/resources/features/"));
+        pathOffset += 20;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_featureKey"));
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = "";
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .delete(arg_customer, arg_featureKey, $fields: arg_$fields)
+          .then(unittest.expectAsync1((_) {}));
+    });
+
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.ResourcesFeaturesResourceApi res =
+          new api.AdminApi(mock).resources.features;
+      var arg_customer = "foo";
+      var arg_featureKey = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 19),
+            unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/resources/features/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customer"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/resources/features/"));
+        pathOffset += 20;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_featureKey"));
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildFeature());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_customer, arg_featureKey, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Feature response) {
+        checkFeature(response);
+      })));
+    });
+
+    unittest.test("method--insert", () {
+      var mock = new HttpServerMock();
+      api.ResourcesFeaturesResourceApi res =
+          new api.AdminApi(mock).resources.features;
+      var arg_request = buildFeature();
+      var arg_customer = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.Feature.fromJson(json);
+        checkFeature(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 + 19),
+            unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/resources/features", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customer"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/resources/features"));
+        pathOffset += 19;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildFeature());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .insert(arg_request, arg_customer, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Feature response) {
+        checkFeature(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.ResourcesFeaturesResourceApi res =
+          new api.AdminApi(mock).resources.features;
+      var arg_customer = "foo";
+      var arg_pageToken = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 19),
+            unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/resources/features", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customer"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/resources/features"));
+        pathOffset += 19;
+
+        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]));
+          }
+        }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildFeatures());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_customer, pageToken: arg_pageToken, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Features response) {
+        checkFeatures(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+      var mock = new HttpServerMock();
+      api.ResourcesFeaturesResourceApi res =
+          new api.AdminApi(mock).resources.features;
+      var arg_request = buildFeature();
+      var arg_customer = "foo";
+      var arg_featureKey = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.Feature.fromJson(json);
+        checkFeature(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 + 19),
+            unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/resources/features/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customer"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/resources/features/"));
+        pathOffset += 20;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_featureKey"));
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildFeature());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .patch(arg_request, arg_customer, arg_featureKey,
+              $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Feature response) {
+        checkFeature(response);
+      })));
+    });
+
+    unittest.test("method--rename", () {
+      var mock = new HttpServerMock();
+      api.ResourcesFeaturesResourceApi res =
+          new api.AdminApi(mock).resources.features;
+      var arg_request = buildFeatureRename();
+      var arg_customer = "foo";
+      var arg_oldName = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.FeatureRename.fromJson(json);
+        checkFeatureRename(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 + 19),
+            unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/resources/features/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customer"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/resources/features/"));
+        pathOffset += 20;
+        index = path.indexOf("/rename", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_oldName"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/rename"));
+        pathOffset += 7;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = "";
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .rename(arg_request, arg_customer, arg_oldName, $fields: arg_$fields)
+          .then(unittest.expectAsync1((_) {}));
+    });
+
+    unittest.test("method--update", () {
+      var mock = new HttpServerMock();
+      api.ResourcesFeaturesResourceApi res =
+          new api.AdminApi(mock).resources.features;
+      var arg_request = buildFeature();
+      var arg_customer = "foo";
+      var arg_featureKey = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.Feature.fromJson(json);
+        checkFeature(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 + 19),
+            unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/resources/features/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customer"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/resources/features/"));
+        pathOffset += 20;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_featureKey"));
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildFeature());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .update(arg_request, arg_customer, arg_featureKey,
+              $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Feature response) {
+        checkFeature(response);
+      })));
+    });
+  });
+
   unittest.group("resource-RoleAssignmentsResourceApi", () {
     unittest.test("method--delete", () {
       var mock = new HttpServerMock();
diff --git a/generated/googleapis/test/admin/reports_v1_test.dart b/generated/googleapis/test/admin/reports_v1_test.dart
index 19c83c7..ed25ce0 100644
--- a/generated/googleapis/test/admin/reports_v1_test.dart
+++ b/generated/googleapis/test/admin/reports_v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed723() {
+buildUnnamed727() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed723(core.List<api.Activity> o) {
+checkUnnamed727(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -69,7 +69,7 @@
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed723();
+    o.items = buildUnnamed727();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -81,7 +81,7 @@
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed723(o.items);
+    checkUnnamed727(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -113,27 +113,27 @@
   buildCounterActivityActor--;
 }
 
-buildUnnamed724() {
+buildUnnamed728() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed724(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'));
 }
 
-buildUnnamed725() {
+buildUnnamed729() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed725(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'));
@@ -146,8 +146,8 @@
   if (buildCounterActivityEventsParameters < 3) {
     o.boolValue = true;
     o.intValue = "foo";
-    o.multiIntValue = buildUnnamed724();
-    o.multiValue = buildUnnamed725();
+    o.multiIntValue = buildUnnamed728();
+    o.multiValue = buildUnnamed729();
     o.name = "foo";
     o.value = "foo";
   }
@@ -160,22 +160,22 @@
   if (buildCounterActivityEventsParameters < 3) {
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkUnnamed724(o.multiIntValue);
-    checkUnnamed725(o.multiValue);
+    checkUnnamed728(o.multiIntValue);
+    checkUnnamed729(o.multiValue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterActivityEventsParameters--;
 }
 
-buildUnnamed726() {
+buildUnnamed730() {
   var o = new core.List<api.ActivityEventsParameters>();
   o.add(buildActivityEventsParameters());
   o.add(buildActivityEventsParameters());
   return o;
 }
 
-checkUnnamed726(core.List<api.ActivityEventsParameters> o) {
+checkUnnamed730(core.List<api.ActivityEventsParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityEventsParameters(o[0]);
   checkActivityEventsParameters(o[1]);
@@ -187,7 +187,7 @@
   buildCounterActivityEvents++;
   if (buildCounterActivityEvents < 3) {
     o.name = "foo";
-    o.parameters = buildUnnamed726();
+    o.parameters = buildUnnamed730();
     o.type = "foo";
   }
   buildCounterActivityEvents--;
@@ -198,20 +198,20 @@
   buildCounterActivityEvents++;
   if (buildCounterActivityEvents < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed726(o.parameters);
+    checkUnnamed730(o.parameters);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterActivityEvents--;
 }
 
-buildUnnamed727() {
+buildUnnamed731() {
   var o = new core.List<api.ActivityEvents>();
   o.add(buildActivityEvents());
   o.add(buildActivityEvents());
   return o;
 }
 
-checkUnnamed727(core.List<api.ActivityEvents> o) {
+checkUnnamed731(core.List<api.ActivityEvents> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityEvents(o[0]);
   checkActivityEvents(o[1]);
@@ -250,7 +250,7 @@
   if (buildCounterActivity < 3) {
     o.actor = buildActivityActor();
     o.etag = "foo";
-    o.events = buildUnnamed727();
+    o.events = buildUnnamed731();
     o.id = buildActivityId();
     o.ipAddress = "foo";
     o.kind = "foo";
@@ -265,7 +265,7 @@
   if (buildCounterActivity < 3) {
     checkActivityActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed727(o.events);
+    checkUnnamed731(o.events);
     checkActivityId(o.id);
     unittest.expect(o.ipAddress, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -274,14 +274,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed728() {
+buildUnnamed732() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed728(core.Map<core.String, core.String> o) {
+checkUnnamed732(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'));
@@ -296,7 +296,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed728();
+    o.params = buildUnnamed732();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -314,7 +314,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed728(o.params);
+    checkUnnamed732(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -330,6 +330,7 @@
   buildCounterUsageReportEntity++;
   if (buildCounterUsageReportEntity < 3) {
     o.customerId = "foo";
+    o.entityId = "foo";
     o.profileId = "foo";
     o.type = "foo";
     o.userEmail = "foo";
@@ -342,6 +343,7 @@
   buildCounterUsageReportEntity++;
   if (buildCounterUsageReportEntity < 3) {
     unittest.expect(o.customerId, unittest.equals('foo'));
+    unittest.expect(o.entityId, unittest.equals('foo'));
     unittest.expect(o.profileId, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.userEmail, unittest.equals('foo'));
@@ -349,7 +351,7 @@
   buildCounterUsageReportEntity--;
 }
 
-buildUnnamed729() {
+buildUnnamed733() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -364,7 +366,7 @@
   return o;
 }
 
-checkUnnamed729(core.Map<core.String, core.Object> o) {
+checkUnnamed733(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));
@@ -378,17 +380,17 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed730() {
+buildUnnamed734() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed729());
-  o.add(buildUnnamed729());
+  o.add(buildUnnamed733());
+  o.add(buildUnnamed733());
   return o;
 }
 
-checkUnnamed730(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed734(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed729(o[0]);
-  checkUnnamed729(o[1]);
+  checkUnnamed733(o[0]);
+  checkUnnamed733(o[1]);
 }
 
 core.int buildCounterUsageReportParameters = 0;
@@ -399,7 +401,7 @@
     o.boolValue = true;
     o.datetimeValue = core.DateTime.parse("2002-02-27T14:01:02");
     o.intValue = "foo";
-    o.msgValue = buildUnnamed730();
+    o.msgValue = buildUnnamed734();
     o.name = "foo";
     o.stringValue = "foo";
   }
@@ -414,21 +416,21 @@
     unittest.expect(o.datetimeValue,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkUnnamed730(o.msgValue);
+    checkUnnamed734(o.msgValue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
   buildCounterUsageReportParameters--;
 }
 
-buildUnnamed731() {
+buildUnnamed735() {
   var o = new core.List<api.UsageReportParameters>();
   o.add(buildUsageReportParameters());
   o.add(buildUsageReportParameters());
   return o;
 }
 
-checkUnnamed731(core.List<api.UsageReportParameters> o) {
+checkUnnamed735(core.List<api.UsageReportParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportParameters(o[0]);
   checkUsageReportParameters(o[1]);
@@ -443,7 +445,7 @@
     o.entity = buildUsageReportEntity();
     o.etag = "foo";
     o.kind = "foo";
-    o.parameters = buildUnnamed731();
+    o.parameters = buildUnnamed735();
   }
   buildCounterUsageReport--;
   return o;
@@ -456,19 +458,19 @@
     checkUsageReportEntity(o.entity);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed731(o.parameters);
+    checkUnnamed735(o.parameters);
   }
   buildCounterUsageReport--;
 }
 
-buildUnnamed732() {
+buildUnnamed736() {
   var o = new core.List<api.UsageReport>();
   o.add(buildUsageReport());
   o.add(buildUsageReport());
   return o;
 }
 
-checkUnnamed732(core.List<api.UsageReport> o) {
+checkUnnamed736(core.List<api.UsageReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReport(o[0]);
   checkUsageReport(o[1]);
@@ -495,14 +497,14 @@
   buildCounterUsageReportsWarningsData--;
 }
 
-buildUnnamed733() {
+buildUnnamed737() {
   var o = new core.List<api.UsageReportsWarningsData>();
   o.add(buildUsageReportsWarningsData());
   o.add(buildUsageReportsWarningsData());
   return o;
 }
 
-checkUnnamed733(core.List<api.UsageReportsWarningsData> o) {
+checkUnnamed737(core.List<api.UsageReportsWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportsWarningsData(o[0]);
   checkUsageReportsWarningsData(o[1]);
@@ -514,7 +516,7 @@
   buildCounterUsageReportsWarnings++;
   if (buildCounterUsageReportsWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed733();
+    o.data = buildUnnamed737();
     o.message = "foo";
   }
   buildCounterUsageReportsWarnings--;
@@ -525,20 +527,20 @@
   buildCounterUsageReportsWarnings++;
   if (buildCounterUsageReportsWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed733(o.data);
+    checkUnnamed737(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterUsageReportsWarnings--;
 }
 
-buildUnnamed734() {
+buildUnnamed738() {
   var o = new core.List<api.UsageReportsWarnings>();
   o.add(buildUsageReportsWarnings());
   o.add(buildUsageReportsWarnings());
   return o;
 }
 
-checkUnnamed734(core.List<api.UsageReportsWarnings> o) {
+checkUnnamed738(core.List<api.UsageReportsWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportsWarnings(o[0]);
   checkUsageReportsWarnings(o[1]);
@@ -552,8 +554,8 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.usageReports = buildUnnamed732();
-    o.warnings = buildUnnamed734();
+    o.usageReports = buildUnnamed736();
+    o.warnings = buildUnnamed738();
   }
   buildCounterUsageReports--;
   return o;
@@ -565,8 +567,8 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed732(o.usageReports);
-    checkUnnamed734(o.warnings);
+    checkUnnamed736(o.usageReports);
+    checkUnnamed738(o.warnings);
   }
   buildCounterUsageReports--;
 }
@@ -1011,6 +1013,106 @@
     });
   });
 
+  unittest.group("resource-EntityUsageReportsResourceApi", () {
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.EntityUsageReportsResourceApi res =
+          new api.AdminApi(mock).entityUsageReports;
+      var arg_entityType = "foo";
+      var arg_entityKey = "foo";
+      var arg_date = "foo";
+      var arg_customerId = "foo";
+      var arg_filters = "foo";
+      var arg_maxResults = 42;
+      var arg_pageToken = "foo";
+      var arg_parameters = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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("admin/reports/v1/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("usage/"));
+        pathOffset += 6;
+        index = path.indexOf("/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_entityType"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        index = path.indexOf("/dates/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_entityKey"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/dates/"));
+        pathOffset += 7;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_date"));
+
+        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]));
+          }
+        }
+        unittest.expect(
+            queryMap["customerId"].first, unittest.equals(arg_customerId));
+        unittest.expect(
+            queryMap["filters"].first, unittest.equals(arg_filters));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["parameters"].first, unittest.equals(arg_parameters));
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildUsageReports());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_entityType, arg_entityKey, arg_date,
+              customerId: arg_customerId,
+              filters: arg_filters,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              parameters: arg_parameters,
+              $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.UsageReports response) {
+        checkUsageReports(response);
+      })));
+    });
+  });
+
   unittest.group("resource-UserUsageReportResourceApi", () {
     unittest.test("method--get", () {
       var mock = new HttpServerMock();
diff --git a/generated/googleapis/test/adsense/v1_4_test.dart b/generated/googleapis/test/adsense/v1_4_test.dart
index 390457d..86f220b 100644
--- a/generated/googleapis/test/adsense/v1_4_test.dart
+++ b/generated/googleapis/test/adsense/v1_4_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1973() {
+buildUnnamed1995() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed1973(core.List<api.Account> o) {
+checkUnnamed1995(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -73,7 +73,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.premium = true;
-    o.subAccounts = buildUnnamed1973();
+    o.subAccounts = buildUnnamed1995();
     o.timezone = "foo";
   }
   buildCounterAccount--;
@@ -88,20 +88,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.premium, unittest.isTrue);
-    checkUnnamed1973(o.subAccounts);
+    checkUnnamed1995(o.subAccounts);
     unittest.expect(o.timezone, unittest.equals('foo'));
   }
   buildCounterAccount--;
 }
 
-buildUnnamed1974() {
+buildUnnamed1996() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed1974(core.List<api.Account> o) {
+checkUnnamed1996(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -113,7 +113,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1974();
+    o.items = buildUnnamed1996();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -125,7 +125,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1974(o.items);
+    checkUnnamed1996(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -159,14 +159,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed1975() {
+buildUnnamed1997() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed1975(core.List<api.AdClient> o) {
+checkUnnamed1997(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -178,7 +178,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1975();
+    o.items = buildUnnamed1997();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -190,7 +190,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1975(o.items);
+    checkUnnamed1997(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -425,14 +425,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed1976() {
+buildUnnamed1998() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed1976(core.List<api.AdUnit> o) {
+checkUnnamed1998(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -444,7 +444,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1976();
+    o.items = buildUnnamed1998();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -456,21 +456,21 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1976(o.items);
+    checkUnnamed1998(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAdUnits--;
 }
 
-buildUnnamed1977() {
+buildUnnamed1999() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1977(core.List<core.String> o) {
+checkUnnamed1999(core.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,66 +500,66 @@
   buildCounterAdsenseReportsGenerateResponseHeaders--;
 }
 
-buildUnnamed1978() {
+buildUnnamed2000() {
   var o = new core.List<api.AdsenseReportsGenerateResponseHeaders>();
   o.add(buildAdsenseReportsGenerateResponseHeaders());
   o.add(buildAdsenseReportsGenerateResponseHeaders());
   return o;
 }
 
-checkUnnamed1978(core.List<api.AdsenseReportsGenerateResponseHeaders> o) {
+checkUnnamed2000(core.List<api.AdsenseReportsGenerateResponseHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdsenseReportsGenerateResponseHeaders(o[0]);
   checkAdsenseReportsGenerateResponseHeaders(o[1]);
 }
 
-buildUnnamed1979() {
+buildUnnamed2001() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1979(core.List<core.String> o) {
+checkUnnamed2001(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1980() {
+buildUnnamed2002() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed1979());
-  o.add(buildUnnamed1979());
+  o.add(buildUnnamed2001());
+  o.add(buildUnnamed2001());
   return o;
 }
 
-checkUnnamed1980(core.List<core.List<core.String>> o) {
+checkUnnamed2002(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1979(o[0]);
-  checkUnnamed1979(o[1]);
+  checkUnnamed2001(o[0]);
+  checkUnnamed2001(o[1]);
 }
 
-buildUnnamed1981() {
+buildUnnamed2003() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1981(core.List<core.String> o) {
+checkUnnamed2003(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1982() {
+buildUnnamed2004() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1982(core.List<core.String> o) {
+checkUnnamed2004(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -570,15 +570,15 @@
   var o = new api.AdsenseReportsGenerateResponse();
   buildCounterAdsenseReportsGenerateResponse++;
   if (buildCounterAdsenseReportsGenerateResponse < 3) {
-    o.averages = buildUnnamed1977();
+    o.averages = buildUnnamed1999();
     o.endDate = "foo";
-    o.headers = buildUnnamed1978();
+    o.headers = buildUnnamed2000();
     o.kind = "foo";
-    o.rows = buildUnnamed1980();
+    o.rows = buildUnnamed2002();
     o.startDate = "foo";
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed1981();
-    o.warnings = buildUnnamed1982();
+    o.totals = buildUnnamed2003();
+    o.warnings = buildUnnamed2004();
   }
   buildCounterAdsenseReportsGenerateResponse--;
   return o;
@@ -587,15 +587,15 @@
 checkAdsenseReportsGenerateResponse(api.AdsenseReportsGenerateResponse o) {
   buildCounterAdsenseReportsGenerateResponse++;
   if (buildCounterAdsenseReportsGenerateResponse < 3) {
-    checkUnnamed1977(o.averages);
+    checkUnnamed1999(o.averages);
     unittest.expect(o.endDate, unittest.equals('foo'));
-    checkUnnamed1978(o.headers);
+    checkUnnamed2000(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1980(o.rows);
+    checkUnnamed2002(o.rows);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed1981(o.totals);
-    checkUnnamed1982(o.warnings);
+    checkUnnamed2003(o.totals);
+    checkUnnamed2004(o.warnings);
   }
   buildCounterAdsenseReportsGenerateResponse--;
 }
@@ -629,14 +629,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed1983() {
+buildUnnamed2005() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed1983(core.List<api.Alert> o) {
+checkUnnamed2005(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -647,7 +647,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed1983();
+    o.items = buildUnnamed2005();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -657,7 +657,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed1983(o.items);
+    checkUnnamed2005(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -715,14 +715,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed1984() {
+buildUnnamed2006() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed1984(core.List<api.CustomChannel> o) {
+checkUnnamed2006(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -734,7 +734,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1984();
+    o.items = buildUnnamed2006();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -746,21 +746,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1984(o.items);
+    checkUnnamed2006(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed1985() {
+buildUnnamed2007() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed1985(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed2007(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -771,7 +771,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed1985();
+    o.items = buildUnnamed2007();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -781,7 +781,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed1985(o.items);
+    checkUnnamed2007(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -814,14 +814,14 @@
   buildCounterPayment--;
 }
 
-buildUnnamed1986() {
+buildUnnamed2008() {
   var o = new core.List<api.Payment>();
   o.add(buildPayment());
   o.add(buildPayment());
   return o;
 }
 
-checkUnnamed1986(core.List<api.Payment> o) {
+checkUnnamed2008(core.List<api.Payment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPayment(o[0]);
   checkPayment(o[1]);
@@ -832,7 +832,7 @@
   var o = new api.Payments();
   buildCounterPayments++;
   if (buildCounterPayments < 3) {
-    o.items = buildUnnamed1986();
+    o.items = buildUnnamed2008();
     o.kind = "foo";
   }
   buildCounterPayments--;
@@ -842,72 +842,72 @@
 checkPayments(api.Payments o) {
   buildCounterPayments++;
   if (buildCounterPayments < 3) {
-    checkUnnamed1986(o.items);
+    checkUnnamed2008(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPayments--;
 }
 
-buildUnnamed1987() {
+buildUnnamed2009() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1987(core.List<core.String> o) {
+checkUnnamed2009(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1988() {
+buildUnnamed2010() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1988(core.List<core.String> o) {
+checkUnnamed2010(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1989() {
+buildUnnamed2011() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1989(core.List<core.String> o) {
+checkUnnamed2011(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1990() {
+buildUnnamed2012() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1990(core.List<core.String> o) {
+checkUnnamed2012(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1991() {
+buildUnnamed2013() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1991(core.List<core.String> o) {
+checkUnnamed2013(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -918,13 +918,13 @@
   var o = new api.ReportingMetadataEntry();
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed1987();
-    o.compatibleMetrics = buildUnnamed1988();
+    o.compatibleDimensions = buildUnnamed2009();
+    o.compatibleMetrics = buildUnnamed2010();
     o.id = "foo";
     o.kind = "foo";
-    o.requiredDimensions = buildUnnamed1989();
-    o.requiredMetrics = buildUnnamed1990();
-    o.supportedProducts = buildUnnamed1991();
+    o.requiredDimensions = buildUnnamed2011();
+    o.requiredMetrics = buildUnnamed2012();
+    o.supportedProducts = buildUnnamed2013();
   }
   buildCounterReportingMetadataEntry--;
   return o;
@@ -933,13 +933,13 @@
 checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed1987(o.compatibleDimensions);
-    checkUnnamed1988(o.compatibleMetrics);
+    checkUnnamed2009(o.compatibleDimensions);
+    checkUnnamed2010(o.compatibleMetrics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1989(o.requiredDimensions);
-    checkUnnamed1990(o.requiredMetrics);
-    checkUnnamed1991(o.supportedProducts);
+    checkUnnamed2011(o.requiredDimensions);
+    checkUnnamed2012(o.requiredMetrics);
+    checkUnnamed2013(o.supportedProducts);
   }
   buildCounterReportingMetadataEntry--;
 }
@@ -969,14 +969,14 @@
   buildCounterSavedAdStyle--;
 }
 
-buildUnnamed1992() {
+buildUnnamed2014() {
   var o = new core.List<api.SavedAdStyle>();
   o.add(buildSavedAdStyle());
   o.add(buildSavedAdStyle());
   return o;
 }
 
-checkUnnamed1992(core.List<api.SavedAdStyle> o) {
+checkUnnamed2014(core.List<api.SavedAdStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedAdStyle(o[0]);
   checkSavedAdStyle(o[1]);
@@ -988,7 +988,7 @@
   buildCounterSavedAdStyles++;
   if (buildCounterSavedAdStyles < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1992();
+    o.items = buildUnnamed2014();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1000,7 +1000,7 @@
   buildCounterSavedAdStyles++;
   if (buildCounterSavedAdStyles < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1992(o.items);
+    checkUnnamed2014(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1030,14 +1030,14 @@
   buildCounterSavedReport--;
 }
 
-buildUnnamed1993() {
+buildUnnamed2015() {
   var o = new core.List<api.SavedReport>();
   o.add(buildSavedReport());
   o.add(buildSavedReport());
   return o;
 }
 
-checkUnnamed1993(core.List<api.SavedReport> o) {
+checkUnnamed2015(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedReport(o[0]);
   checkSavedReport(o[1]);
@@ -1049,7 +1049,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1993();
+    o.items = buildUnnamed2015();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1061,7 +1061,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1993(o.items);
+    checkUnnamed2015(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1091,14 +1091,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed1994() {
+buildUnnamed2016() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed1994(core.List<api.UrlChannel> o) {
+checkUnnamed2016(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -1110,7 +1110,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1994();
+    o.items = buildUnnamed2016();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1122,125 +1122,125 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1994(o.items);
+    checkUnnamed2016(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed1995() {
+buildUnnamed2017() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1995(core.List<core.String> o) {
+checkUnnamed2017(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1996() {
+buildUnnamed2018() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1996(core.List<core.String> o) {
+checkUnnamed2018(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1997() {
+buildUnnamed2019() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1997(core.List<core.String> o) {
+checkUnnamed2019(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1998() {
+buildUnnamed2020() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1998(core.List<core.String> o) {
+checkUnnamed2020(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1999() {
+buildUnnamed2021() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1999(core.List<core.String> o) {
+checkUnnamed2021(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2000() {
+buildUnnamed2022() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2000(core.List<core.String> o) {
+checkUnnamed2022(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2001() {
+buildUnnamed2023() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2001(core.List<core.String> o) {
+checkUnnamed2023(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2002() {
+buildUnnamed2024() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2002(core.List<core.String> o) {
+checkUnnamed2024(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2003() {
+buildUnnamed2025() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2003(core.List<core.String> o) {
+checkUnnamed2025(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2505,12 +2505,12 @@
       var arg_startDate = "foo";
       var arg_endDate = "foo";
       var arg_currency = "foo";
-      var arg_dimension = buildUnnamed1995();
-      var arg_filter = buildUnnamed1996();
+      var arg_dimension = buildUnnamed2017();
+      var arg_filter = buildUnnamed2018();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed1997();
-      var arg_sort = buildUnnamed1998();
+      var arg_metric = buildUnnamed2019();
+      var arg_sort = buildUnnamed2020();
       var arg_startIndex = 42;
       var arg_useTimezoneReporting = true;
       var arg_$fields = "foo";
@@ -3853,14 +3853,14 @@
       api.ReportsResourceApi res = new api.AdsenseApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_accountId = buildUnnamed1999();
+      var arg_accountId = buildUnnamed2021();
       var arg_currency = "foo";
-      var arg_dimension = buildUnnamed2000();
-      var arg_filter = buildUnnamed2001();
+      var arg_dimension = buildUnnamed2022();
+      var arg_filter = buildUnnamed2023();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed2002();
-      var arg_sort = buildUnnamed2003();
+      var arg_metric = buildUnnamed2024();
+      var arg_sort = buildUnnamed2025();
       var arg_startIndex = 42;
       var arg_useTimezoneReporting = true;
       var arg_$fields = "foo";
diff --git a/generated/googleapis/test/adsensehost/v4_1_test.dart b/generated/googleapis/test/adsensehost/v4_1_test.dart
index f95166a..1f2dfd7 100644
--- a/generated/googleapis/test/adsensehost/v4_1_test.dart
+++ b/generated/googleapis/test/adsensehost/v4_1_test.dart
@@ -75,14 +75,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed3070() {
+buildUnnamed3096() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed3070(core.List<api.Account> o) {
+checkUnnamed3096(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -94,7 +94,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed3070();
+    o.items = buildUnnamed3096();
     o.kind = "foo";
   }
   buildCounterAccounts--;
@@ -105,7 +105,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed3070(o.items);
+    checkUnnamed3096(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccounts--;
@@ -138,14 +138,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed3071() {
+buildUnnamed3097() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed3071(core.List<api.AdClient> o) {
+checkUnnamed3097(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -157,7 +157,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed3071();
+    o.items = buildUnnamed3097();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -169,7 +169,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed3071(o.items);
+    checkUnnamed3097(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -375,14 +375,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed3072() {
+buildUnnamed3098() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed3072(core.List<api.AdUnit> o) {
+checkUnnamed3098(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -394,7 +394,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed3072();
+    o.items = buildUnnamed3098();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -406,21 +406,21 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed3072(o.items);
+    checkUnnamed3098(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAdUnits--;
 }
 
-buildUnnamed3073() {
+buildUnnamed3099() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3073(core.List<core.String> o) {
+checkUnnamed3099(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -434,7 +434,7 @@
     o.accountId = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.productCodes = buildUnnamed3073();
+    o.productCodes = buildUnnamed3099();
     o.redirectUrl = "foo";
     o.status = "foo";
     o.userLocale = "foo";
@@ -451,7 +451,7 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3073(o.productCodes);
+    checkUnnamed3099(o.productCodes);
     unittest.expect(o.redirectUrl, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.userLocale, unittest.equals('foo'));
@@ -486,14 +486,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed3074() {
+buildUnnamed3100() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed3074(core.List<api.CustomChannel> o) {
+checkUnnamed3100(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -505,7 +505,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed3074();
+    o.items = buildUnnamed3100();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -517,21 +517,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed3074(o.items);
+    checkUnnamed3100(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed3075() {
+buildUnnamed3101() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3075(core.List<core.String> o) {
+checkUnnamed3101(core.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,66 +560,66 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed3076() {
+buildUnnamed3102() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed3076(core.List<api.ReportHeaders> o) {
+checkUnnamed3102(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
-buildUnnamed3077() {
+buildUnnamed3103() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3077(core.List<core.String> o) {
+checkUnnamed3103(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3078() {
+buildUnnamed3104() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed3077());
-  o.add(buildUnnamed3077());
+  o.add(buildUnnamed3103());
+  o.add(buildUnnamed3103());
   return o;
 }
 
-checkUnnamed3078(core.List<core.List<core.String>> o) {
+checkUnnamed3104(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3077(o[0]);
-  checkUnnamed3077(o[1]);
+  checkUnnamed3103(o[0]);
+  checkUnnamed3103(o[1]);
 }
 
-buildUnnamed3079() {
+buildUnnamed3105() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3079(core.List<core.String> o) {
+checkUnnamed3105(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3080() {
+buildUnnamed3106() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3080(core.List<core.String> o) {
+checkUnnamed3106(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -630,13 +630,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.averages = buildUnnamed3075();
-    o.headers = buildUnnamed3076();
+    o.averages = buildUnnamed3101();
+    o.headers = buildUnnamed3102();
     o.kind = "foo";
-    o.rows = buildUnnamed3078();
+    o.rows = buildUnnamed3104();
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed3079();
-    o.warnings = buildUnnamed3080();
+    o.totals = buildUnnamed3105();
+    o.warnings = buildUnnamed3106();
   }
   buildCounterReport--;
   return o;
@@ -645,13 +645,13 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed3075(o.averages);
-    checkUnnamed3076(o.headers);
+    checkUnnamed3101(o.averages);
+    checkUnnamed3102(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3078(o.rows);
+    checkUnnamed3104(o.rows);
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed3079(o.totals);
-    checkUnnamed3080(o.warnings);
+    checkUnnamed3105(o.totals);
+    checkUnnamed3106(o.warnings);
   }
   buildCounterReport--;
 }
@@ -679,14 +679,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed3081() {
+buildUnnamed3107() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed3081(core.List<api.UrlChannel> o) {
+checkUnnamed3107(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -698,7 +698,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed3081();
+    o.items = buildUnnamed3107();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -710,151 +710,151 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed3081(o.items);
+    checkUnnamed3107(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed3082() {
+buildUnnamed3108() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3082(core.List<core.String> o) {
+checkUnnamed3108(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3083() {
+buildUnnamed3109() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3083(core.List<core.String> o) {
+checkUnnamed3109(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3084() {
+buildUnnamed3110() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3084(core.List<core.String> o) {
+checkUnnamed3110(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3085() {
+buildUnnamed3111() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3085(core.List<core.String> o) {
+checkUnnamed3111(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3086() {
+buildUnnamed3112() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3086(core.List<core.String> o) {
+checkUnnamed3112(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3087() {
+buildUnnamed3113() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3087(core.List<core.String> o) {
+checkUnnamed3113(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3088() {
+buildUnnamed3114() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3088(core.List<core.String> o) {
+checkUnnamed3114(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3089() {
+buildUnnamed3115() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3089(core.List<core.String> o) {
+checkUnnamed3115(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3090() {
+buildUnnamed3116() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3090(core.List<core.String> o) {
+checkUnnamed3116(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3091() {
+buildUnnamed3117() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3091(core.List<core.String> o) {
+checkUnnamed3117(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3092() {
+buildUnnamed3118() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3092(core.List<core.String> o) {
+checkUnnamed3118(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1082,7 +1082,7 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.AccountsResourceApi res = new api.AdsensehostApi(mock).accounts;
-      var arg_filterAdClientId = buildUnnamed3082();
+      var arg_filterAdClientId = buildUnnamed3108();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1440,7 +1440,7 @@
       var arg_accountId = "foo";
       var arg_adClientId = "foo";
       var arg_adUnitId = "foo";
-      var arg_hostCustomChannelId = buildUnnamed3083();
+      var arg_hostCustomChannelId = buildUnnamed3109();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1853,12 +1853,12 @@
       var arg_accountId = "foo";
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed3084();
-      var arg_filter = buildUnnamed3085();
+      var arg_dimension = buildUnnamed3110();
+      var arg_filter = buildUnnamed3111();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed3086();
-      var arg_sort = buildUnnamed3087();
+      var arg_metric = buildUnnamed3112();
+      var arg_sort = buildUnnamed3113();
       var arg_startIndex = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2064,7 +2064,7 @@
       var mock = new HttpServerMock();
       api.AssociationsessionsResourceApi res =
           new api.AdsensehostApi(mock).associationsessions;
-      var arg_productCode = buildUnnamed3088();
+      var arg_productCode = buildUnnamed3114();
       var arg_websiteUrl = "foo";
       var arg_userLocale = "foo";
       var arg_websiteLocale = "foo";
@@ -2603,12 +2603,12 @@
       api.ReportsResourceApi res = new api.AdsensehostApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed3089();
-      var arg_filter = buildUnnamed3090();
+      var arg_dimension = buildUnnamed3115();
+      var arg_filter = buildUnnamed3116();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed3091();
-      var arg_sort = buildUnnamed3092();
+      var arg_metric = buildUnnamed3117();
+      var arg_sort = buildUnnamed3118();
       var arg_startIndex = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
diff --git a/generated/googleapis/test/analytics/v3_test.dart b/generated/googleapis/test/analytics/v3_test.dart
index ee789c9..16a8cce 100644
--- a/generated/googleapis/test/analytics/v3_test.dart
+++ b/generated/googleapis/test/analytics/v3_test.dart
@@ -71,14 +71,14 @@
   buildCounterAccountChildLink--;
 }
 
-buildUnnamed1047() {
+buildUnnamed1056() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1047(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'));
@@ -89,7 +89,7 @@
   var o = new api.AccountPermissions();
   buildCounterAccountPermissions++;
   if (buildCounterAccountPermissions < 3) {
-    o.effective = buildUnnamed1047();
+    o.effective = buildUnnamed1056();
   }
   buildCounterAccountPermissions--;
   return o;
@@ -98,7 +98,7 @@
 checkAccountPermissions(api.AccountPermissions o) {
   buildCounterAccountPermissions++;
   if (buildCounterAccountPermissions < 3) {
-    checkUnnamed1047(o.effective);
+    checkUnnamed1056(o.effective);
   }
   buildCounterAccountPermissions--;
 }
@@ -165,14 +165,14 @@
   buildCounterAccountRef--;
 }
 
-buildUnnamed1048() {
+buildUnnamed1057() {
   var o = new core.List<api.AccountSummary>();
   o.add(buildAccountSummary());
   o.add(buildAccountSummary());
   return o;
 }
 
-checkUnnamed1048(core.List<api.AccountSummary> o) {
+checkUnnamed1057(core.List<api.AccountSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountSummary(o[0]);
   checkAccountSummary(o[1]);
@@ -183,7 +183,7 @@
   var o = new api.AccountSummaries();
   buildCounterAccountSummaries++;
   if (buildCounterAccountSummaries < 3) {
-    o.items = buildUnnamed1048();
+    o.items = buildUnnamed1057();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -199,7 +199,7 @@
 checkAccountSummaries(api.AccountSummaries o) {
   buildCounterAccountSummaries++;
   if (buildCounterAccountSummaries < 3) {
-    checkUnnamed1048(o.items);
+    checkUnnamed1057(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -211,14 +211,14 @@
   buildCounterAccountSummaries--;
 }
 
-buildUnnamed1049() {
+buildUnnamed1058() {
   var o = new core.List<api.WebPropertySummary>();
   o.add(buildWebPropertySummary());
   o.add(buildWebPropertySummary());
   return o;
 }
 
-checkUnnamed1049(core.List<api.WebPropertySummary> o) {
+checkUnnamed1058(core.List<api.WebPropertySummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebPropertySummary(o[0]);
   checkWebPropertySummary(o[1]);
@@ -233,7 +233,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.starred = true;
-    o.webProperties = buildUnnamed1049();
+    o.webProperties = buildUnnamed1058();
   }
   buildCounterAccountSummary--;
   return o;
@@ -246,7 +246,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.starred, unittest.isTrue);
-    checkUnnamed1049(o.webProperties);
+    checkUnnamed1058(o.webProperties);
   }
   buildCounterAccountSummary--;
 }
@@ -280,14 +280,14 @@
   buildCounterAccountTicket--;
 }
 
-buildUnnamed1050() {
+buildUnnamed1059() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed1050(core.List<api.Account> o) {
+checkUnnamed1059(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -298,7 +298,7 @@
   var o = new api.Accounts();
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
-    o.items = buildUnnamed1050();
+    o.items = buildUnnamed1059();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -314,7 +314,7 @@
 checkAccounts(api.Accounts o) {
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
-    checkUnnamed1050(o.items);
+    checkUnnamed1059(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -349,14 +349,14 @@
   buildCounterAdWordsAccount--;
 }
 
-buildUnnamed1051() {
+buildUnnamed1060() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1051(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'));
@@ -367,7 +367,7 @@
   var o = new api.AnalyticsDataimportDeleteUploadDataRequest();
   buildCounterAnalyticsDataimportDeleteUploadDataRequest++;
   if (buildCounterAnalyticsDataimportDeleteUploadDataRequest < 3) {
-    o.customDataImportUids = buildUnnamed1051();
+    o.customDataImportUids = buildUnnamed1060();
   }
   buildCounterAnalyticsDataimportDeleteUploadDataRequest--;
   return o;
@@ -377,19 +377,19 @@
     api.AnalyticsDataimportDeleteUploadDataRequest o) {
   buildCounterAnalyticsDataimportDeleteUploadDataRequest++;
   if (buildCounterAnalyticsDataimportDeleteUploadDataRequest < 3) {
-    checkUnnamed1051(o.customDataImportUids);
+    checkUnnamed1060(o.customDataImportUids);
   }
   buildCounterAnalyticsDataimportDeleteUploadDataRequest--;
 }
 
-buildUnnamed1052() {
+buildUnnamed1061() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1052(core.Map<core.String, core.String> o) {
+checkUnnamed1061(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'));
@@ -400,7 +400,7 @@
   var o = new api.Column();
   buildCounterColumn++;
   if (buildCounterColumn < 3) {
-    o.attributes = buildUnnamed1052();
+    o.attributes = buildUnnamed1061();
     o.id = "foo";
     o.kind = "foo";
   }
@@ -411,34 +411,34 @@
 checkColumn(api.Column o) {
   buildCounterColumn++;
   if (buildCounterColumn < 3) {
-    checkUnnamed1052(o.attributes);
+    checkUnnamed1061(o.attributes);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterColumn--;
 }
 
-buildUnnamed1053() {
+buildUnnamed1062() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1053(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'));
 }
 
-buildUnnamed1054() {
+buildUnnamed1063() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed1054(core.List<api.Column> o) {
+checkUnnamed1063(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -449,9 +449,9 @@
   var o = new api.Columns();
   buildCounterColumns++;
   if (buildCounterColumns < 3) {
-    o.attributeNames = buildUnnamed1053();
+    o.attributeNames = buildUnnamed1062();
     o.etag = "foo";
-    o.items = buildUnnamed1054();
+    o.items = buildUnnamed1063();
     o.kind = "foo";
     o.totalResults = 42;
   }
@@ -462,9 +462,9 @@
 checkColumns(api.Columns o) {
   buildCounterColumns++;
   if (buildCounterColumns < 3) {
-    checkUnnamed1053(o.attributeNames);
+    checkUnnamed1062(o.attributeNames);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1054(o.items);
+    checkUnnamed1063(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
   }
@@ -513,27 +513,27 @@
   buildCounterCustomDataSourceParentLink--;
 }
 
-buildUnnamed1055() {
+buildUnnamed1064() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1055(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'));
 }
 
-buildUnnamed1056() {
+buildUnnamed1065() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1056(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'));
@@ -553,8 +553,8 @@
     o.kind = "foo";
     o.name = "foo";
     o.parentLink = buildCustomDataSourceParentLink();
-    o.profilesLinked = buildUnnamed1055();
-    o.schema = buildUnnamed1056();
+    o.profilesLinked = buildUnnamed1064();
+    o.schema = buildUnnamed1065();
     o.selfLink = "foo";
     o.type = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -578,8 +578,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkCustomDataSourceParentLink(o.parentLink);
-    checkUnnamed1055(o.profilesLinked);
-    checkUnnamed1056(o.schema);
+    checkUnnamed1064(o.profilesLinked);
+    checkUnnamed1065(o.schema);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(
@@ -590,14 +590,14 @@
   buildCounterCustomDataSource--;
 }
 
-buildUnnamed1057() {
+buildUnnamed1066() {
   var o = new core.List<api.CustomDataSource>();
   o.add(buildCustomDataSource());
   o.add(buildCustomDataSource());
   return o;
 }
 
-checkUnnamed1057(core.List<api.CustomDataSource> o) {
+checkUnnamed1066(core.List<api.CustomDataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDataSource(o[0]);
   checkCustomDataSource(o[1]);
@@ -608,7 +608,7 @@
   var o = new api.CustomDataSources();
   buildCounterCustomDataSources++;
   if (buildCounterCustomDataSources < 3) {
-    o.items = buildUnnamed1057();
+    o.items = buildUnnamed1066();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -624,7 +624,7 @@
 checkCustomDataSources(api.CustomDataSources o) {
   buildCounterCustomDataSources++;
   if (buildCounterCustomDataSources < 3) {
-    checkUnnamed1057(o.items);
+    checkUnnamed1066(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -700,14 +700,14 @@
   buildCounterCustomDimension--;
 }
 
-buildUnnamed1058() {
+buildUnnamed1067() {
   var o = new core.List<api.CustomDimension>();
   o.add(buildCustomDimension());
   o.add(buildCustomDimension());
   return o;
 }
 
-checkUnnamed1058(core.List<api.CustomDimension> o) {
+checkUnnamed1067(core.List<api.CustomDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDimension(o[0]);
   checkCustomDimension(o[1]);
@@ -718,7 +718,7 @@
   var o = new api.CustomDimensions();
   buildCounterCustomDimensions++;
   if (buildCounterCustomDimensions < 3) {
-    o.items = buildUnnamed1058();
+    o.items = buildUnnamed1067();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -734,7 +734,7 @@
 checkCustomDimensions(api.CustomDimensions o) {
   buildCounterCustomDimensions++;
   if (buildCounterCustomDimensions < 3) {
-    checkUnnamed1058(o.items);
+    checkUnnamed1067(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -816,14 +816,14 @@
   buildCounterCustomMetric--;
 }
 
-buildUnnamed1059() {
+buildUnnamed1068() {
   var o = new core.List<api.CustomMetric>();
   o.add(buildCustomMetric());
   o.add(buildCustomMetric());
   return o;
 }
 
-checkUnnamed1059(core.List<api.CustomMetric> o) {
+checkUnnamed1068(core.List<api.CustomMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomMetric(o[0]);
   checkCustomMetric(o[1]);
@@ -834,7 +834,7 @@
   var o = new api.CustomMetrics();
   buildCounterCustomMetrics++;
   if (buildCounterCustomMetrics < 3) {
-    o.items = buildUnnamed1059();
+    o.items = buildUnnamed1068();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -850,7 +850,7 @@
 checkCustomMetrics(api.CustomMetrics o) {
   buildCounterCustomMetrics++;
   if (buildCounterCustomMetrics < 3) {
-    checkUnnamed1059(o.items);
+    checkUnnamed1068(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -862,14 +862,14 @@
   buildCounterCustomMetrics--;
 }
 
-buildUnnamed1060() {
+buildUnnamed1069() {
   var o = new core.List<api.AdWordsAccount>();
   o.add(buildAdWordsAccount());
   o.add(buildAdWordsAccount());
   return o;
 }
 
-checkUnnamed1060(core.List<api.AdWordsAccount> o) {
+checkUnnamed1069(core.List<api.AdWordsAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdWordsAccount(o[0]);
   checkAdWordsAccount(o[1]);
@@ -894,14 +894,14 @@
   buildCounterEntityAdWordsLinkEntity--;
 }
 
-buildUnnamed1061() {
+buildUnnamed1070() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1061(core.List<core.String> o) {
+checkUnnamed1070(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -912,12 +912,12 @@
   var o = new api.EntityAdWordsLink();
   buildCounterEntityAdWordsLink++;
   if (buildCounterEntityAdWordsLink < 3) {
-    o.adWordsAccounts = buildUnnamed1060();
+    o.adWordsAccounts = buildUnnamed1069();
     o.entity = buildEntityAdWordsLinkEntity();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.profileIds = buildUnnamed1061();
+    o.profileIds = buildUnnamed1070();
     o.selfLink = "foo";
   }
   buildCounterEntityAdWordsLink--;
@@ -927,25 +927,25 @@
 checkEntityAdWordsLink(api.EntityAdWordsLink o) {
   buildCounterEntityAdWordsLink++;
   if (buildCounterEntityAdWordsLink < 3) {
-    checkUnnamed1060(o.adWordsAccounts);
+    checkUnnamed1069(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'));
-    checkUnnamed1061(o.profileIds);
+    checkUnnamed1070(o.profileIds);
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterEntityAdWordsLink--;
 }
 
-buildUnnamed1062() {
+buildUnnamed1071() {
   var o = new core.List<api.EntityAdWordsLink>();
   o.add(buildEntityAdWordsLink());
   o.add(buildEntityAdWordsLink());
   return o;
 }
 
-checkUnnamed1062(core.List<api.EntityAdWordsLink> o) {
+checkUnnamed1071(core.List<api.EntityAdWordsLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAdWordsLink(o[0]);
   checkEntityAdWordsLink(o[1]);
@@ -956,7 +956,7 @@
   var o = new api.EntityAdWordsLinks();
   buildCounterEntityAdWordsLinks++;
   if (buildCounterEntityAdWordsLinks < 3) {
-    o.items = buildUnnamed1062();
+    o.items = buildUnnamed1071();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -971,7 +971,7 @@
 checkEntityAdWordsLinks(api.EntityAdWordsLinks o) {
   buildCounterEntityAdWordsLinks++;
   if (buildCounterEntityAdWordsLinks < 3) {
-    checkUnnamed1062(o.items);
+    checkUnnamed1071(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1005,27 +1005,27 @@
   buildCounterEntityUserLinkEntity--;
 }
 
-buildUnnamed1063() {
+buildUnnamed1072() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1063(core.List<core.String> o) {
+checkUnnamed1072(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1064() {
+buildUnnamed1073() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1064(core.List<core.String> o) {
+checkUnnamed1073(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1036,8 +1036,8 @@
   var o = new api.EntityUserLinkPermissions();
   buildCounterEntityUserLinkPermissions++;
   if (buildCounterEntityUserLinkPermissions < 3) {
-    o.effective = buildUnnamed1063();
-    o.local = buildUnnamed1064();
+    o.effective = buildUnnamed1072();
+    o.local = buildUnnamed1073();
   }
   buildCounterEntityUserLinkPermissions--;
   return o;
@@ -1046,8 +1046,8 @@
 checkEntityUserLinkPermissions(api.EntityUserLinkPermissions o) {
   buildCounterEntityUserLinkPermissions++;
   if (buildCounterEntityUserLinkPermissions < 3) {
-    checkUnnamed1063(o.effective);
-    checkUnnamed1064(o.local);
+    checkUnnamed1072(o.effective);
+    checkUnnamed1073(o.local);
   }
   buildCounterEntityUserLinkPermissions--;
 }
@@ -1081,14 +1081,14 @@
   buildCounterEntityUserLink--;
 }
 
-buildUnnamed1065() {
+buildUnnamed1074() {
   var o = new core.List<api.EntityUserLink>();
   o.add(buildEntityUserLink());
   o.add(buildEntityUserLink());
   return o;
 }
 
-checkUnnamed1065(core.List<api.EntityUserLink> o) {
+checkUnnamed1074(core.List<api.EntityUserLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityUserLink(o[0]);
   checkEntityUserLink(o[1]);
@@ -1099,7 +1099,7 @@
   var o = new api.EntityUserLinks();
   buildCounterEntityUserLinks++;
   if (buildCounterEntityUserLinks < 3) {
-    o.items = buildUnnamed1065();
+    o.items = buildUnnamed1074();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1114,7 +1114,7 @@
 checkEntityUserLinks(api.EntityUserLinks o) {
   buildCounterEntityUserLinks++;
   if (buildCounterEntityUserLinks < 3) {
-    checkUnnamed1065(o.items);
+    checkUnnamed1074(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1173,14 +1173,14 @@
   buildCounterExperimentVariations--;
 }
 
-buildUnnamed1066() {
+buildUnnamed1075() {
   var o = new core.List<api.ExperimentVariations>();
   o.add(buildExperimentVariations());
   o.add(buildExperimentVariations());
   return o;
 }
 
-checkUnnamed1066(core.List<api.ExperimentVariations> o) {
+checkUnnamed1075(core.List<api.ExperimentVariations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExperimentVariations(o[0]);
   checkExperimentVariations(o[1]);
@@ -1215,7 +1215,7 @@
     o.status = "foo";
     o.trafficCoverage = 42.0;
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
-    o.variations = buildUnnamed1066();
+    o.variations = buildUnnamed1075();
     o.webPropertyId = "foo";
     o.winnerConfidenceLevel = 42.0;
     o.winnerFound = true;
@@ -1255,7 +1255,7 @@
     unittest.expect(o.trafficCoverage, unittest.equals(42.0));
     unittest.expect(
         o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1066(o.variations);
+    checkUnnamed1075(o.variations);
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
     unittest.expect(o.winnerConfidenceLevel, unittest.equals(42.0));
     unittest.expect(o.winnerFound, unittest.isTrue);
@@ -1263,14 +1263,14 @@
   buildCounterExperiment--;
 }
 
-buildUnnamed1067() {
+buildUnnamed1076() {
   var o = new core.List<api.Experiment>();
   o.add(buildExperiment());
   o.add(buildExperiment());
   return o;
 }
 
-checkUnnamed1067(core.List<api.Experiment> o) {
+checkUnnamed1076(core.List<api.Experiment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExperiment(o[0]);
   checkExperiment(o[1]);
@@ -1281,7 +1281,7 @@
   var o = new api.Experiments();
   buildCounterExperiments++;
   if (buildCounterExperiments < 3) {
-    o.items = buildUnnamed1067();
+    o.items = buildUnnamed1076();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1297,7 +1297,7 @@
 checkExperiments(api.Experiments o) {
   buildCounterExperiments++;
   if (buildCounterExperiments < 3) {
-    checkUnnamed1067(o.items);
+    checkUnnamed1076(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1547,14 +1547,14 @@
   buildCounterFilterRef--;
 }
 
-buildUnnamed1068() {
+buildUnnamed1077() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed1068(core.List<api.Filter> o) {
+checkUnnamed1077(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -1565,7 +1565,7 @@
   var o = new api.Filters();
   buildCounterFilters++;
   if (buildCounterFilters < 3) {
-    o.items = buildUnnamed1068();
+    o.items = buildUnnamed1077();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1581,7 +1581,7 @@
 checkFilters(api.Filters o) {
   buildCounterFilters++;
   if (buildCounterFilters < 3) {
-    checkUnnamed1068(o.items);
+    checkUnnamed1077(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1616,14 +1616,14 @@
   buildCounterGaDataColumnHeaders--;
 }
 
-buildUnnamed1069() {
+buildUnnamed1078() {
   var o = new core.List<api.GaDataColumnHeaders>();
   o.add(buildGaDataColumnHeaders());
   o.add(buildGaDataColumnHeaders());
   return o;
 }
 
-checkUnnamed1069(core.List<api.GaDataColumnHeaders> o) {
+checkUnnamed1078(core.List<api.GaDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataColumnHeaders(o[0]);
   checkGaDataColumnHeaders(o[1]);
@@ -1652,14 +1652,14 @@
   buildCounterGaDataDataTableCols--;
 }
 
-buildUnnamed1070() {
+buildUnnamed1079() {
   var o = new core.List<api.GaDataDataTableCols>();
   o.add(buildGaDataDataTableCols());
   o.add(buildGaDataDataTableCols());
   return o;
 }
 
-checkUnnamed1070(core.List<api.GaDataDataTableCols> o) {
+checkUnnamed1079(core.List<api.GaDataDataTableCols> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableCols(o[0]);
   checkGaDataDataTableCols(o[1]);
@@ -1684,14 +1684,14 @@
   buildCounterGaDataDataTableRowsC--;
 }
 
-buildUnnamed1071() {
+buildUnnamed1080() {
   var o = new core.List<api.GaDataDataTableRowsC>();
   o.add(buildGaDataDataTableRowsC());
   o.add(buildGaDataDataTableRowsC());
   return o;
 }
 
-checkUnnamed1071(core.List<api.GaDataDataTableRowsC> o) {
+checkUnnamed1080(core.List<api.GaDataDataTableRowsC> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableRowsC(o[0]);
   checkGaDataDataTableRowsC(o[1]);
@@ -1702,7 +1702,7 @@
   var o = new api.GaDataDataTableRows();
   buildCounterGaDataDataTableRows++;
   if (buildCounterGaDataDataTableRows < 3) {
-    o.c = buildUnnamed1071();
+    o.c = buildUnnamed1080();
   }
   buildCounterGaDataDataTableRows--;
   return o;
@@ -1711,19 +1711,19 @@
 checkGaDataDataTableRows(api.GaDataDataTableRows o) {
   buildCounterGaDataDataTableRows++;
   if (buildCounterGaDataDataTableRows < 3) {
-    checkUnnamed1071(o.c);
+    checkUnnamed1080(o.c);
   }
   buildCounterGaDataDataTableRows--;
 }
 
-buildUnnamed1072() {
+buildUnnamed1081() {
   var o = new core.List<api.GaDataDataTableRows>();
   o.add(buildGaDataDataTableRows());
   o.add(buildGaDataDataTableRows());
   return o;
 }
 
-checkUnnamed1072(core.List<api.GaDataDataTableRows> o) {
+checkUnnamed1081(core.List<api.GaDataDataTableRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableRows(o[0]);
   checkGaDataDataTableRows(o[1]);
@@ -1734,8 +1734,8 @@
   var o = new api.GaDataDataTable();
   buildCounterGaDataDataTable++;
   if (buildCounterGaDataDataTable < 3) {
-    o.cols = buildUnnamed1070();
-    o.rows = buildUnnamed1072();
+    o.cols = buildUnnamed1079();
+    o.rows = buildUnnamed1081();
   }
   buildCounterGaDataDataTable--;
   return o;
@@ -1744,8 +1744,8 @@
 checkGaDataDataTable(api.GaDataDataTable o) {
   buildCounterGaDataDataTable++;
   if (buildCounterGaDataDataTable < 3) {
-    checkUnnamed1070(o.cols);
-    checkUnnamed1072(o.rows);
+    checkUnnamed1079(o.cols);
+    checkUnnamed1081(o.rows);
   }
   buildCounterGaDataDataTable--;
 }
@@ -1779,27 +1779,27 @@
   buildCounterGaDataProfileInfo--;
 }
 
-buildUnnamed1073() {
+buildUnnamed1082() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1073(core.List<core.String> o) {
+checkUnnamed1082(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1074() {
+buildUnnamed1083() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1074(core.List<core.String> o) {
+checkUnnamed1083(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1815,10 +1815,10 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed1073();
+    o.metrics = buildUnnamed1082();
     o.samplingLevel = "foo";
     o.segment = "foo";
-    o.sort = buildUnnamed1074();
+    o.sort = buildUnnamed1083();
     o.start_date = "foo";
     o.start_index = 42;
   }
@@ -1834,50 +1834,50 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed1073(o.metrics);
+    checkUnnamed1082(o.metrics);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
     unittest.expect(o.segment, unittest.equals('foo'));
-    checkUnnamed1074(o.sort);
+    checkUnnamed1083(o.sort);
     unittest.expect(o.start_date, unittest.equals('foo'));
     unittest.expect(o.start_index, unittest.equals(42));
   }
   buildCounterGaDataQuery--;
 }
 
-buildUnnamed1075() {
+buildUnnamed1084() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1075(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'));
 }
 
-buildUnnamed1076() {
+buildUnnamed1085() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed1075());
-  o.add(buildUnnamed1075());
+  o.add(buildUnnamed1084());
+  o.add(buildUnnamed1084());
   return o;
 }
 
-checkUnnamed1076(core.List<core.List<core.String>> o) {
+checkUnnamed1085(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1075(o[0]);
-  checkUnnamed1075(o[1]);
+  checkUnnamed1084(o[0]);
+  checkUnnamed1084(o[1]);
 }
 
-buildUnnamed1077() {
+buildUnnamed1086() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1077(core.Map<core.String, core.String> o) {
+checkUnnamed1086(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'));
@@ -1888,7 +1888,7 @@
   var o = new api.GaData();
   buildCounterGaData++;
   if (buildCounterGaData < 3) {
-    o.columnHeaders = buildUnnamed1069();
+    o.columnHeaders = buildUnnamed1078();
     o.containsSampledData = true;
     o.dataLastRefreshed = "foo";
     o.dataTable = buildGaDataDataTable();
@@ -1899,12 +1899,12 @@
     o.previousLink = "foo";
     o.profileInfo = buildGaDataProfileInfo();
     o.query = buildGaDataQuery();
-    o.rows = buildUnnamed1076();
+    o.rows = buildUnnamed1085();
     o.sampleSize = "foo";
     o.sampleSpace = "foo";
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed1077();
+    o.totalsForAllResults = buildUnnamed1086();
   }
   buildCounterGaData--;
   return o;
@@ -1913,7 +1913,7 @@
 checkGaData(api.GaData o) {
   buildCounterGaData++;
   if (buildCounterGaData < 3) {
-    checkUnnamed1069(o.columnHeaders);
+    checkUnnamed1078(o.columnHeaders);
     unittest.expect(o.containsSampledData, unittest.isTrue);
     unittest.expect(o.dataLastRefreshed, unittest.equals('foo'));
     checkGaDataDataTable(o.dataTable);
@@ -1924,12 +1924,12 @@
     unittest.expect(o.previousLink, unittest.equals('foo'));
     checkGaDataProfileInfo(o.profileInfo);
     checkGaDataQuery(o.query);
-    checkUnnamed1076(o.rows);
+    checkUnnamed1085(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));
-    checkUnnamed1077(o.totalsForAllResults);
+    checkUnnamed1086(o.totalsForAllResults);
   }
   buildCounterGaData--;
 }
@@ -1961,14 +1961,14 @@
   buildCounterGoalEventDetailsEventConditions--;
 }
 
-buildUnnamed1078() {
+buildUnnamed1087() {
   var o = new core.List<api.GoalEventDetailsEventConditions>();
   o.add(buildGoalEventDetailsEventConditions());
   o.add(buildGoalEventDetailsEventConditions());
   return o;
 }
 
-checkUnnamed1078(core.List<api.GoalEventDetailsEventConditions> o) {
+checkUnnamed1087(core.List<api.GoalEventDetailsEventConditions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoalEventDetailsEventConditions(o[0]);
   checkGoalEventDetailsEventConditions(o[1]);
@@ -1979,7 +1979,7 @@
   var o = new api.GoalEventDetails();
   buildCounterGoalEventDetails++;
   if (buildCounterGoalEventDetails < 3) {
-    o.eventConditions = buildUnnamed1078();
+    o.eventConditions = buildUnnamed1087();
     o.useEventValue = true;
   }
   buildCounterGoalEventDetails--;
@@ -1989,7 +1989,7 @@
 checkGoalEventDetails(api.GoalEventDetails o) {
   buildCounterGoalEventDetails++;
   if (buildCounterGoalEventDetails < 3) {
-    checkUnnamed1078(o.eventConditions);
+    checkUnnamed1087(o.eventConditions);
     unittest.expect(o.useEventValue, unittest.isTrue);
   }
   buildCounterGoalEventDetails--;
@@ -2039,14 +2039,14 @@
   buildCounterGoalUrlDestinationDetailsSteps--;
 }
 
-buildUnnamed1079() {
+buildUnnamed1088() {
   var o = new core.List<api.GoalUrlDestinationDetailsSteps>();
   o.add(buildGoalUrlDestinationDetailsSteps());
   o.add(buildGoalUrlDestinationDetailsSteps());
   return o;
 }
 
-checkUnnamed1079(core.List<api.GoalUrlDestinationDetailsSteps> o) {
+checkUnnamed1088(core.List<api.GoalUrlDestinationDetailsSteps> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoalUrlDestinationDetailsSteps(o[0]);
   checkGoalUrlDestinationDetailsSteps(o[1]);
@@ -2060,7 +2060,7 @@
     o.caseSensitive = true;
     o.firstStepRequired = true;
     o.matchType = "foo";
-    o.steps = buildUnnamed1079();
+    o.steps = buildUnnamed1088();
     o.url = "foo";
   }
   buildCounterGoalUrlDestinationDetails--;
@@ -2073,7 +2073,7 @@
     unittest.expect(o.caseSensitive, unittest.isTrue);
     unittest.expect(o.firstStepRequired, unittest.isTrue);
     unittest.expect(o.matchType, unittest.equals('foo'));
-    checkUnnamed1079(o.steps);
+    checkUnnamed1088(o.steps);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterGoalUrlDestinationDetails--;
@@ -2176,14 +2176,14 @@
   buildCounterGoal--;
 }
 
-buildUnnamed1080() {
+buildUnnamed1089() {
   var o = new core.List<api.Goal>();
   o.add(buildGoal());
   o.add(buildGoal());
   return o;
 }
 
-checkUnnamed1080(core.List<api.Goal> o) {
+checkUnnamed1089(core.List<api.Goal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoal(o[0]);
   checkGoal(o[1]);
@@ -2194,7 +2194,7 @@
   var o = new api.Goals();
   buildCounterGoals++;
   if (buildCounterGoals < 3) {
-    o.items = buildUnnamed1080();
+    o.items = buildUnnamed1089();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2210,7 +2210,7 @@
 checkGoals(api.Goals o) {
   buildCounterGoals++;
   if (buildCounterGoals < 3) {
-    checkUnnamed1080(o.items);
+    checkUnnamed1089(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2309,14 +2309,14 @@
   buildCounterMcfDataColumnHeaders--;
 }
 
-buildUnnamed1081() {
+buildUnnamed1090() {
   var o = new core.List<api.McfDataColumnHeaders>();
   o.add(buildMcfDataColumnHeaders());
   o.add(buildMcfDataColumnHeaders());
   return o;
 }
 
-checkUnnamed1081(core.List<api.McfDataColumnHeaders> o) {
+checkUnnamed1090(core.List<api.McfDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataColumnHeaders(o[0]);
   checkMcfDataColumnHeaders(o[1]);
@@ -2351,27 +2351,27 @@
   buildCounterMcfDataProfileInfo--;
 }
 
-buildUnnamed1082() {
+buildUnnamed1091() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1082(core.List<core.String> o) {
+checkUnnamed1091(core.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() {
+buildUnnamed1092() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1083(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'));
@@ -2387,10 +2387,10 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed1082();
+    o.metrics = buildUnnamed1091();
     o.samplingLevel = "foo";
     o.segment = "foo";
-    o.sort = buildUnnamed1083();
+    o.sort = buildUnnamed1092();
     o.start_date = "foo";
     o.start_index = 42;
   }
@@ -2406,10 +2406,10 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed1082(o.metrics);
+    checkUnnamed1091(o.metrics);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
     unittest.expect(o.segment, unittest.equals('foo'));
-    checkUnnamed1083(o.sort);
+    checkUnnamed1092(o.sort);
     unittest.expect(o.start_date, unittest.equals('foo'));
     unittest.expect(o.start_index, unittest.equals(42));
   }
@@ -2437,14 +2437,14 @@
   buildCounterMcfDataRowsConversionPathValue--;
 }
 
-buildUnnamed1084() {
+buildUnnamed1093() {
   var o = new core.List<api.McfDataRowsConversionPathValue>();
   o.add(buildMcfDataRowsConversionPathValue());
   o.add(buildMcfDataRowsConversionPathValue());
   return o;
 }
 
-checkUnnamed1084(core.List<api.McfDataRowsConversionPathValue> o) {
+checkUnnamed1093(core.List<api.McfDataRowsConversionPathValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataRowsConversionPathValue(o[0]);
   checkMcfDataRowsConversionPathValue(o[1]);
@@ -2455,7 +2455,7 @@
   var o = new api.McfDataRows();
   buildCounterMcfDataRows++;
   if (buildCounterMcfDataRows < 3) {
-    o.conversionPathValue = buildUnnamed1084();
+    o.conversionPathValue = buildUnnamed1093();
     o.primitiveValue = "foo";
   }
   buildCounterMcfDataRows--;
@@ -2465,46 +2465,46 @@
 checkMcfDataRows(api.McfDataRows o) {
   buildCounterMcfDataRows++;
   if (buildCounterMcfDataRows < 3) {
-    checkUnnamed1084(o.conversionPathValue);
+    checkUnnamed1093(o.conversionPathValue);
     unittest.expect(o.primitiveValue, unittest.equals('foo'));
   }
   buildCounterMcfDataRows--;
 }
 
-buildUnnamed1085() {
+buildUnnamed1094() {
   var o = new core.List<api.McfDataRows>();
   o.add(buildMcfDataRows());
   o.add(buildMcfDataRows());
   return o;
 }
 
-checkUnnamed1085(core.List<api.McfDataRows> o) {
+checkUnnamed1094(core.List<api.McfDataRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataRows(o[0]);
   checkMcfDataRows(o[1]);
 }
 
-buildUnnamed1086() {
+buildUnnamed1095() {
   var o = new core.List<core.List<api.McfDataRows>>();
-  o.add(buildUnnamed1085());
-  o.add(buildUnnamed1085());
+  o.add(buildUnnamed1094());
+  o.add(buildUnnamed1094());
   return o;
 }
 
-checkUnnamed1086(core.List<core.List<api.McfDataRows>> o) {
+checkUnnamed1095(core.List<core.List<api.McfDataRows>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1085(o[0]);
-  checkUnnamed1085(o[1]);
+  checkUnnamed1094(o[0]);
+  checkUnnamed1094(o[1]);
 }
 
-buildUnnamed1087() {
+buildUnnamed1096() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1087(core.Map<core.String, core.String> o) {
+checkUnnamed1096(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'));
@@ -2515,7 +2515,7 @@
   var o = new api.McfData();
   buildCounterMcfData++;
   if (buildCounterMcfData < 3) {
-    o.columnHeaders = buildUnnamed1081();
+    o.columnHeaders = buildUnnamed1090();
     o.containsSampledData = true;
     o.id = "foo";
     o.itemsPerPage = 42;
@@ -2524,12 +2524,12 @@
     o.previousLink = "foo";
     o.profileInfo = buildMcfDataProfileInfo();
     o.query = buildMcfDataQuery();
-    o.rows = buildUnnamed1086();
+    o.rows = buildUnnamed1095();
     o.sampleSize = "foo";
     o.sampleSpace = "foo";
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed1087();
+    o.totalsForAllResults = buildUnnamed1096();
   }
   buildCounterMcfData--;
   return o;
@@ -2538,7 +2538,7 @@
 checkMcfData(api.McfData o) {
   buildCounterMcfData++;
   if (buildCounterMcfData < 3) {
-    checkUnnamed1081(o.columnHeaders);
+    checkUnnamed1090(o.columnHeaders);
     unittest.expect(o.containsSampledData, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.itemsPerPage, unittest.equals(42));
@@ -2547,12 +2547,12 @@
     unittest.expect(o.previousLink, unittest.equals('foo'));
     checkMcfDataProfileInfo(o.profileInfo);
     checkMcfDataQuery(o.query);
-    checkUnnamed1086(o.rows);
+    checkUnnamed1095(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));
-    checkUnnamed1087(o.totalsForAllResults);
+    checkUnnamed1096(o.totalsForAllResults);
   }
   buildCounterMcfData--;
 }
@@ -2599,14 +2599,14 @@
   buildCounterProfileParentLink--;
 }
 
-buildUnnamed1088() {
+buildUnnamed1097() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1088(core.List<core.String> o) {
+checkUnnamed1097(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2617,7 +2617,7 @@
   var o = new api.ProfilePermissions();
   buildCounterProfilePermissions++;
   if (buildCounterProfilePermissions < 3) {
-    o.effective = buildUnnamed1088();
+    o.effective = buildUnnamed1097();
   }
   buildCounterProfilePermissions--;
   return o;
@@ -2626,7 +2626,7 @@
 checkProfilePermissions(api.ProfilePermissions o) {
   buildCounterProfilePermissions++;
   if (buildCounterProfilePermissions < 3) {
-    checkUnnamed1088(o.effective);
+    checkUnnamed1097(o.effective);
   }
   buildCounterProfilePermissions--;
 }
@@ -2731,14 +2731,14 @@
   buildCounterProfileFilterLink--;
 }
 
-buildUnnamed1089() {
+buildUnnamed1098() {
   var o = new core.List<api.ProfileFilterLink>();
   o.add(buildProfileFilterLink());
   o.add(buildProfileFilterLink());
   return o;
 }
 
-checkUnnamed1089(core.List<api.ProfileFilterLink> o) {
+checkUnnamed1098(core.List<api.ProfileFilterLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfileFilterLink(o[0]);
   checkProfileFilterLink(o[1]);
@@ -2749,7 +2749,7 @@
   var o = new api.ProfileFilterLinks();
   buildCounterProfileFilterLinks++;
   if (buildCounterProfileFilterLinks < 3) {
-    o.items = buildUnnamed1089();
+    o.items = buildUnnamed1098();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2765,7 +2765,7 @@
 checkProfileFilterLinks(api.ProfileFilterLinks o) {
   buildCounterProfileFilterLinks++;
   if (buildCounterProfileFilterLinks < 3) {
-    checkUnnamed1089(o.items);
+    checkUnnamed1098(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2835,14 +2835,14 @@
   buildCounterProfileSummary--;
 }
 
-buildUnnamed1090() {
+buildUnnamed1099() {
   var o = new core.List<api.Profile>();
   o.add(buildProfile());
   o.add(buildProfile());
   return o;
 }
 
-checkUnnamed1090(core.List<api.Profile> o) {
+checkUnnamed1099(core.List<api.Profile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfile(o[0]);
   checkProfile(o[1]);
@@ -2853,7 +2853,7 @@
   var o = new api.Profiles();
   buildCounterProfiles++;
   if (buildCounterProfiles < 3) {
-    o.items = buildUnnamed1090();
+    o.items = buildUnnamed1099();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2869,7 +2869,7 @@
 checkProfiles(api.Profiles o) {
   buildCounterProfiles++;
   if (buildCounterProfiles < 3) {
-    checkUnnamed1090(o.items);
+    checkUnnamed1099(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2904,14 +2904,14 @@
   buildCounterRealtimeDataColumnHeaders--;
 }
 
-buildUnnamed1091() {
+buildUnnamed1100() {
   var o = new core.List<api.RealtimeDataColumnHeaders>();
   o.add(buildRealtimeDataColumnHeaders());
   o.add(buildRealtimeDataColumnHeaders());
   return o;
 }
 
-checkUnnamed1091(core.List<api.RealtimeDataColumnHeaders> o) {
+checkUnnamed1100(core.List<api.RealtimeDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRealtimeDataColumnHeaders(o[0]);
   checkRealtimeDataColumnHeaders(o[1]);
@@ -2946,27 +2946,27 @@
   buildCounterRealtimeDataProfileInfo--;
 }
 
-buildUnnamed1092() {
+buildUnnamed1101() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1092(core.List<core.String> o) {
+checkUnnamed1101(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1093() {
+buildUnnamed1102() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1093(core.List<core.String> o) {
+checkUnnamed1102(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2981,8 +2981,8 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed1092();
-    o.sort = buildUnnamed1093();
+    o.metrics = buildUnnamed1101();
+    o.sort = buildUnnamed1102();
   }
   buildCounterRealtimeDataQuery--;
   return o;
@@ -2995,46 +2995,46 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed1092(o.metrics);
-    checkUnnamed1093(o.sort);
+    checkUnnamed1101(o.metrics);
+    checkUnnamed1102(o.sort);
   }
   buildCounterRealtimeDataQuery--;
 }
 
-buildUnnamed1094() {
+buildUnnamed1103() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1094(core.List<core.String> o) {
+checkUnnamed1103(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1095() {
+buildUnnamed1104() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed1094());
-  o.add(buildUnnamed1094());
+  o.add(buildUnnamed1103());
+  o.add(buildUnnamed1103());
   return o;
 }
 
-checkUnnamed1095(core.List<core.List<core.String>> o) {
+checkUnnamed1104(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1094(o[0]);
-  checkUnnamed1094(o[1]);
+  checkUnnamed1103(o[0]);
+  checkUnnamed1103(o[1]);
 }
 
-buildUnnamed1096() {
+buildUnnamed1105() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1096(core.Map<core.String, core.String> o) {
+checkUnnamed1105(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'));
@@ -3045,15 +3045,15 @@
   var o = new api.RealtimeData();
   buildCounterRealtimeData++;
   if (buildCounterRealtimeData < 3) {
-    o.columnHeaders = buildUnnamed1091();
+    o.columnHeaders = buildUnnamed1100();
     o.id = "foo";
     o.kind = "foo";
     o.profileInfo = buildRealtimeDataProfileInfo();
     o.query = buildRealtimeDataQuery();
-    o.rows = buildUnnamed1095();
+    o.rows = buildUnnamed1104();
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed1096();
+    o.totalsForAllResults = buildUnnamed1105();
   }
   buildCounterRealtimeData--;
   return o;
@@ -3062,15 +3062,15 @@
 checkRealtimeData(api.RealtimeData o) {
   buildCounterRealtimeData++;
   if (buildCounterRealtimeData < 3) {
-    checkUnnamed1091(o.columnHeaders);
+    checkUnnamed1100(o.columnHeaders);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkRealtimeDataProfileInfo(o.profileInfo);
     checkRealtimeDataQuery(o.query);
-    checkUnnamed1095(o.rows);
+    checkUnnamed1104(o.rows);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed1096(o.totalsForAllResults);
+    checkUnnamed1105(o.totalsForAllResults);
   }
   buildCounterRealtimeData--;
 }
@@ -3095,27 +3095,27 @@
   buildCounterRemarketingAudienceAudienceDefinition--;
 }
 
-buildUnnamed1097() {
+buildUnnamed1106() {
   var o = new core.List<api.LinkedForeignAccount>();
   o.add(buildLinkedForeignAccount());
   o.add(buildLinkedForeignAccount());
   return o;
 }
 
-checkUnnamed1097(core.List<api.LinkedForeignAccount> o) {
+checkUnnamed1106(core.List<api.LinkedForeignAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLinkedForeignAccount(o[0]);
   checkLinkedForeignAccount(o[1]);
 }
 
-buildUnnamed1098() {
+buildUnnamed1107() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1098(core.List<core.String> o) {
+checkUnnamed1107(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3185,8 +3185,8 @@
     o.id = "foo";
     o.internalWebPropertyId = "foo";
     o.kind = "foo";
-    o.linkedAdAccounts = buildUnnamed1097();
-    o.linkedViews = buildUnnamed1098();
+    o.linkedAdAccounts = buildUnnamed1106();
+    o.linkedViews = buildUnnamed1107();
     o.name = "foo";
     o.stateBasedAudienceDefinition =
         buildRemarketingAudienceStateBasedAudienceDefinition();
@@ -3209,8 +3209,8 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.internalWebPropertyId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1097(o.linkedAdAccounts);
-    checkUnnamed1098(o.linkedViews);
+    checkUnnamed1106(o.linkedAdAccounts);
+    checkUnnamed1107(o.linkedViews);
     unittest.expect(o.name, unittest.equals('foo'));
     checkRemarketingAudienceStateBasedAudienceDefinition(
         o.stateBasedAudienceDefinition);
@@ -3221,14 +3221,14 @@
   buildCounterRemarketingAudience--;
 }
 
-buildUnnamed1099() {
+buildUnnamed1108() {
   var o = new core.List<api.RemarketingAudience>();
   o.add(buildRemarketingAudience());
   o.add(buildRemarketingAudience());
   return o;
 }
 
-checkUnnamed1099(core.List<api.RemarketingAudience> o) {
+checkUnnamed1108(core.List<api.RemarketingAudience> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRemarketingAudience(o[0]);
   checkRemarketingAudience(o[1]);
@@ -3239,7 +3239,7 @@
   var o = new api.RemarketingAudiences();
   buildCounterRemarketingAudiences++;
   if (buildCounterRemarketingAudiences < 3) {
-    o.items = buildUnnamed1099();
+    o.items = buildUnnamed1108();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3255,7 +3255,7 @@
 checkRemarketingAudiences(api.RemarketingAudiences o) {
   buildCounterRemarketingAudiences++;
   if (buildCounterRemarketingAudiences < 3) {
-    checkUnnamed1099(o.items);
+    checkUnnamed1108(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3304,14 +3304,14 @@
   buildCounterSegment--;
 }
 
-buildUnnamed1100() {
+buildUnnamed1109() {
   var o = new core.List<api.Segment>();
   o.add(buildSegment());
   o.add(buildSegment());
   return o;
 }
 
-checkUnnamed1100(core.List<api.Segment> o) {
+checkUnnamed1109(core.List<api.Segment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegment(o[0]);
   checkSegment(o[1]);
@@ -3322,7 +3322,7 @@
   var o = new api.Segments();
   buildCounterSegments++;
   if (buildCounterSegments < 3) {
-    o.items = buildUnnamed1100();
+    o.items = buildUnnamed1109();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3338,7 +3338,7 @@
 checkSegments(api.Segments o) {
   buildCounterSegments++;
   if (buildCounterSegments < 3) {
-    checkUnnamed1100(o.items);
+    checkUnnamed1109(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3451,14 +3451,14 @@
   buildCounterUnsampledReport--;
 }
 
-buildUnnamed1101() {
+buildUnnamed1110() {
   var o = new core.List<api.UnsampledReport>();
   o.add(buildUnsampledReport());
   o.add(buildUnsampledReport());
   return o;
 }
 
-checkUnnamed1101(core.List<api.UnsampledReport> o) {
+checkUnnamed1110(core.List<api.UnsampledReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUnsampledReport(o[0]);
   checkUnsampledReport(o[1]);
@@ -3469,7 +3469,7 @@
   var o = new api.UnsampledReports();
   buildCounterUnsampledReports++;
   if (buildCounterUnsampledReports < 3) {
-    o.items = buildUnnamed1101();
+    o.items = buildUnnamed1110();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3485,7 +3485,7 @@
 checkUnsampledReports(api.UnsampledReports o) {
   buildCounterUnsampledReports++;
   if (buildCounterUnsampledReports < 3) {
-    checkUnnamed1101(o.items);
+    checkUnnamed1110(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3497,14 +3497,14 @@
   buildCounterUnsampledReports--;
 }
 
-buildUnnamed1102() {
+buildUnnamed1111() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1102(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'));
@@ -3517,7 +3517,7 @@
   if (buildCounterUpload < 3) {
     o.accountId = "foo";
     o.customDataSourceId = "foo";
-    o.errors = buildUnnamed1102();
+    o.errors = buildUnnamed1111();
     o.id = "foo";
     o.kind = "foo";
     o.status = "foo";
@@ -3532,7 +3532,7 @@
   if (buildCounterUpload < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.customDataSourceId, unittest.equals('foo'));
-    checkUnnamed1102(o.errors);
+    checkUnnamed1111(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -3542,14 +3542,14 @@
   buildCounterUpload--;
 }
 
-buildUnnamed1103() {
+buildUnnamed1112() {
   var o = new core.List<api.Upload>();
   o.add(buildUpload());
   o.add(buildUpload());
   return o;
 }
 
-checkUnnamed1103(core.List<api.Upload> o) {
+checkUnnamed1112(core.List<api.Upload> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUpload(o[0]);
   checkUpload(o[1]);
@@ -3560,7 +3560,7 @@
   var o = new api.Uploads();
   buildCounterUploads++;
   if (buildCounterUploads < 3) {
-    o.items = buildUnnamed1103();
+    o.items = buildUnnamed1112();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3575,7 +3575,7 @@
 checkUploads(api.Uploads o) {
   buildCounterUploads++;
   if (buildCounterUploads < 3) {
-    checkUnnamed1103(o.items);
+    checkUnnamed1112(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3638,14 +3638,14 @@
   buildCounterWebPropertyRef--;
 }
 
-buildUnnamed1104() {
+buildUnnamed1113() {
   var o = new core.List<api.ProfileSummary>();
   o.add(buildProfileSummary());
   o.add(buildProfileSummary());
   return o;
 }
 
-checkUnnamed1104(core.List<api.ProfileSummary> o) {
+checkUnnamed1113(core.List<api.ProfileSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfileSummary(o[0]);
   checkProfileSummary(o[1]);
@@ -3661,7 +3661,7 @@
     o.kind = "foo";
     o.level = "foo";
     o.name = "foo";
-    o.profiles = buildUnnamed1104();
+    o.profiles = buildUnnamed1113();
     o.starred = true;
     o.websiteUrl = "foo";
   }
@@ -3677,21 +3677,21 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1104(o.profiles);
+    checkUnnamed1113(o.profiles);
     unittest.expect(o.starred, unittest.isTrue);
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
   }
   buildCounterWebPropertySummary--;
 }
 
-buildUnnamed1105() {
+buildUnnamed1114() {
   var o = new core.List<api.Webproperty>();
   o.add(buildWebproperty());
   o.add(buildWebproperty());
   return o;
 }
 
-checkUnnamed1105(core.List<api.Webproperty> o) {
+checkUnnamed1114(core.List<api.Webproperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebproperty(o[0]);
   checkWebproperty(o[1]);
@@ -3702,7 +3702,7 @@
   var o = new api.Webproperties();
   buildCounterWebproperties++;
   if (buildCounterWebproperties < 3) {
-    o.items = buildUnnamed1105();
+    o.items = buildUnnamed1114();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3718,7 +3718,7 @@
 checkWebproperties(api.Webproperties o) {
   buildCounterWebproperties++;
   if (buildCounterWebproperties < 3) {
-    checkUnnamed1105(o.items);
+    checkUnnamed1114(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3772,14 +3772,14 @@
   buildCounterWebpropertyParentLink--;
 }
 
-buildUnnamed1106() {
+buildUnnamed1115() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1106(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'));
@@ -3790,7 +3790,7 @@
   var o = new api.WebpropertyPermissions();
   buildCounterWebpropertyPermissions++;
   if (buildCounterWebpropertyPermissions < 3) {
-    o.effective = buildUnnamed1106();
+    o.effective = buildUnnamed1115();
   }
   buildCounterWebpropertyPermissions--;
   return o;
@@ -3799,7 +3799,7 @@
 checkWebpropertyPermissions(api.WebpropertyPermissions o) {
   buildCounterWebpropertyPermissions++;
   if (buildCounterWebpropertyPermissions < 3) {
-    checkUnnamed1106(o.effective);
+    checkUnnamed1115(o.effective);
   }
   buildCounterWebpropertyPermissions--;
 }
diff --git a/generated/googleapis/test/analyticsreporting/v4_test.dart b/generated/googleapis/test/analyticsreporting/v4_test.dart
index 6076c6e..9402061 100644
--- a/generated/googleapis/test/analyticsreporting/v4_test.dart
+++ b/generated/googleapis/test/analyticsreporting/v4_test.dart
@@ -73,14 +73,14 @@
   buildCounterCohort--;
 }
 
-buildUnnamed197() {
+buildUnnamed191() {
   var o = new core.List<api.Cohort>();
   o.add(buildCohort());
   o.add(buildCohort());
   return o;
 }
 
-checkUnnamed197(core.List<api.Cohort> o) {
+checkUnnamed191(core.List<api.Cohort> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCohort(o[0]);
   checkCohort(o[1]);
@@ -91,7 +91,7 @@
   var o = new api.CohortGroup();
   buildCounterCohortGroup++;
   if (buildCounterCohortGroup < 3) {
-    o.cohorts = buildUnnamed197();
+    o.cohorts = buildUnnamed191();
     o.lifetimeValue = true;
   }
   buildCounterCohortGroup--;
@@ -101,20 +101,20 @@
 checkCohortGroup(api.CohortGroup o) {
   buildCounterCohortGroup++;
   if (buildCounterCohortGroup < 3) {
-    checkUnnamed197(o.cohorts);
+    checkUnnamed191(o.cohorts);
     unittest.expect(o.lifetimeValue, unittest.isTrue);
   }
   buildCounterCohortGroup--;
 }
 
-buildUnnamed198() {
+buildUnnamed192() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed198(core.List<core.String> o) {
+checkUnnamed192(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -125,7 +125,7 @@
   var o = new api.ColumnHeader();
   buildCounterColumnHeader++;
   if (buildCounterColumnHeader < 3) {
-    o.dimensions = buildUnnamed198();
+    o.dimensions = buildUnnamed192();
     o.metricHeader = buildMetricHeader();
   }
   buildCounterColumnHeader--;
@@ -135,7 +135,7 @@
 checkColumnHeader(api.ColumnHeader o) {
   buildCounterColumnHeader++;
   if (buildCounterColumnHeader < 3) {
-    checkUnnamed198(o.dimensions);
+    checkUnnamed192(o.dimensions);
     checkMetricHeader(o.metricHeader);
   }
   buildCounterColumnHeader--;
@@ -162,27 +162,27 @@
   buildCounterDateRange--;
 }
 
-buildUnnamed199() {
+buildUnnamed193() {
   var o = new core.List<api.PivotValueRegion>();
   o.add(buildPivotValueRegion());
   o.add(buildPivotValueRegion());
   return o;
 }
 
-checkUnnamed199(core.List<api.PivotValueRegion> o) {
+checkUnnamed193(core.List<api.PivotValueRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPivotValueRegion(o[0]);
   checkPivotValueRegion(o[1]);
 }
 
-buildUnnamed200() {
+buildUnnamed194() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed200(core.List<core.String> o) {
+checkUnnamed194(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -193,8 +193,8 @@
   var o = new api.DateRangeValues();
   buildCounterDateRangeValues++;
   if (buildCounterDateRangeValues < 3) {
-    o.pivotValueRegions = buildUnnamed199();
-    o.values = buildUnnamed200();
+    o.pivotValueRegions = buildUnnamed193();
+    o.values = buildUnnamed194();
   }
   buildCounterDateRangeValues--;
   return o;
@@ -203,20 +203,20 @@
 checkDateRangeValues(api.DateRangeValues o) {
   buildCounterDateRangeValues++;
   if (buildCounterDateRangeValues < 3) {
-    checkUnnamed199(o.pivotValueRegions);
-    checkUnnamed200(o.values);
+    checkUnnamed193(o.pivotValueRegions);
+    checkUnnamed194(o.values);
   }
   buildCounterDateRangeValues--;
 }
 
-buildUnnamed201() {
+buildUnnamed195() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed201(core.List<core.String> o) {
+checkUnnamed195(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -227,7 +227,7 @@
   var o = new api.Dimension();
   buildCounterDimension++;
   if (buildCounterDimension < 3) {
-    o.histogramBuckets = buildUnnamed201();
+    o.histogramBuckets = buildUnnamed195();
     o.name = "foo";
   }
   buildCounterDimension--;
@@ -237,20 +237,20 @@
 checkDimension(api.Dimension o) {
   buildCounterDimension++;
   if (buildCounterDimension < 3) {
-    checkUnnamed201(o.histogramBuckets);
+    checkUnnamed195(o.histogramBuckets);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterDimension--;
 }
 
-buildUnnamed202() {
+buildUnnamed196() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed202(core.List<core.String> o) {
+checkUnnamed196(core.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 (buildCounterDimensionFilter < 3) {
     o.caseSensitive = true;
     o.dimensionName = "foo";
-    o.expressions = buildUnnamed202();
+    o.expressions = buildUnnamed196();
     o.not = true;
     o.operator = "foo";
   }
@@ -276,21 +276,21 @@
   if (buildCounterDimensionFilter < 3) {
     unittest.expect(o.caseSensitive, unittest.isTrue);
     unittest.expect(o.dimensionName, unittest.equals('foo'));
-    checkUnnamed202(o.expressions);
+    checkUnnamed196(o.expressions);
     unittest.expect(o.not, unittest.isTrue);
     unittest.expect(o.operator, unittest.equals('foo'));
   }
   buildCounterDimensionFilter--;
 }
 
-buildUnnamed203() {
+buildUnnamed197() {
   var o = new core.List<api.DimensionFilter>();
   o.add(buildDimensionFilter());
   o.add(buildDimensionFilter());
   return o;
 }
 
-checkUnnamed203(core.List<api.DimensionFilter> o) {
+checkUnnamed197(core.List<api.DimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionFilter(o[0]);
   checkDimensionFilter(o[1]);
@@ -301,7 +301,7 @@
   var o = new api.DimensionFilterClause();
   buildCounterDimensionFilterClause++;
   if (buildCounterDimensionFilterClause < 3) {
-    o.filters = buildUnnamed203();
+    o.filters = buildUnnamed197();
     o.operator = "foo";
   }
   buildCounterDimensionFilterClause--;
@@ -311,7 +311,7 @@
 checkDimensionFilterClause(api.DimensionFilterClause o) {
   buildCounterDimensionFilterClause++;
   if (buildCounterDimensionFilterClause < 3) {
-    checkUnnamed203(o.filters);
+    checkUnnamed197(o.filters);
     unittest.expect(o.operator, unittest.equals('foo'));
   }
   buildCounterDimensionFilterClause--;
@@ -340,14 +340,14 @@
   buildCounterDynamicSegment--;
 }
 
-buildUnnamed204() {
+buildUnnamed198() {
   var o = new core.List<api.ReportRequest>();
   o.add(buildReportRequest());
   o.add(buildReportRequest());
   return o;
 }
 
-checkUnnamed204(core.List<api.ReportRequest> o) {
+checkUnnamed198(core.List<api.ReportRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequest(o[0]);
   checkReportRequest(o[1]);
@@ -358,7 +358,7 @@
   var o = new api.GetReportsRequest();
   buildCounterGetReportsRequest++;
   if (buildCounterGetReportsRequest < 3) {
-    o.reportRequests = buildUnnamed204();
+    o.reportRequests = buildUnnamed198();
     o.useResourceQuotas = true;
   }
   buildCounterGetReportsRequest--;
@@ -368,20 +368,20 @@
 checkGetReportsRequest(api.GetReportsRequest o) {
   buildCounterGetReportsRequest++;
   if (buildCounterGetReportsRequest < 3) {
-    checkUnnamed204(o.reportRequests);
+    checkUnnamed198(o.reportRequests);
     unittest.expect(o.useResourceQuotas, unittest.isTrue);
   }
   buildCounterGetReportsRequest--;
 }
 
-buildUnnamed205() {
+buildUnnamed199() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed205(core.List<api.Report> o) {
+checkUnnamed199(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -393,7 +393,7 @@
   buildCounterGetReportsResponse++;
   if (buildCounterGetReportsResponse < 3) {
     o.queryCost = 42;
-    o.reports = buildUnnamed205();
+    o.reports = buildUnnamed199();
     o.resourceQuotasRemaining = buildResourceQuotasRemaining();
   }
   buildCounterGetReportsResponse--;
@@ -404,7 +404,7 @@
   buildCounterGetReportsResponse++;
   if (buildCounterGetReportsResponse < 3) {
     unittest.expect(o.queryCost, unittest.equals(42));
-    checkUnnamed205(o.reports);
+    checkUnnamed199(o.reports);
     checkResourceQuotasRemaining(o.resourceQuotasRemaining);
   }
   buildCounterGetReportsResponse--;
@@ -458,14 +458,14 @@
   buildCounterMetricFilter--;
 }
 
-buildUnnamed206() {
+buildUnnamed200() {
   var o = new core.List<api.MetricFilter>();
   o.add(buildMetricFilter());
   o.add(buildMetricFilter());
   return o;
 }
 
-checkUnnamed206(core.List<api.MetricFilter> o) {
+checkUnnamed200(core.List<api.MetricFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricFilter(o[0]);
   checkMetricFilter(o[1]);
@@ -476,7 +476,7 @@
   var o = new api.MetricFilterClause();
   buildCounterMetricFilterClause++;
   if (buildCounterMetricFilterClause < 3) {
-    o.filters = buildUnnamed206();
+    o.filters = buildUnnamed200();
     o.operator = "foo";
   }
   buildCounterMetricFilterClause--;
@@ -486,33 +486,33 @@
 checkMetricFilterClause(api.MetricFilterClause o) {
   buildCounterMetricFilterClause++;
   if (buildCounterMetricFilterClause < 3) {
-    checkUnnamed206(o.filters);
+    checkUnnamed200(o.filters);
     unittest.expect(o.operator, unittest.equals('foo'));
   }
   buildCounterMetricFilterClause--;
 }
 
-buildUnnamed207() {
+buildUnnamed201() {
   var o = new core.List<api.MetricHeaderEntry>();
   o.add(buildMetricHeaderEntry());
   o.add(buildMetricHeaderEntry());
   return o;
 }
 
-checkUnnamed207(core.List<api.MetricHeaderEntry> o) {
+checkUnnamed201(core.List<api.MetricHeaderEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricHeaderEntry(o[0]);
   checkMetricHeaderEntry(o[1]);
 }
 
-buildUnnamed208() {
+buildUnnamed202() {
   var o = new core.List<api.PivotHeader>();
   o.add(buildPivotHeader());
   o.add(buildPivotHeader());
   return o;
 }
 
-checkUnnamed208(core.List<api.PivotHeader> o) {
+checkUnnamed202(core.List<api.PivotHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPivotHeader(o[0]);
   checkPivotHeader(o[1]);
@@ -523,8 +523,8 @@
   var o = new api.MetricHeader();
   buildCounterMetricHeader++;
   if (buildCounterMetricHeader < 3) {
-    o.metricHeaderEntries = buildUnnamed207();
-    o.pivotHeaders = buildUnnamed208();
+    o.metricHeaderEntries = buildUnnamed201();
+    o.pivotHeaders = buildUnnamed202();
   }
   buildCounterMetricHeader--;
   return o;
@@ -533,8 +533,8 @@
 checkMetricHeader(api.MetricHeader o) {
   buildCounterMetricHeader++;
   if (buildCounterMetricHeader < 3) {
-    checkUnnamed207(o.metricHeaderEntries);
-    checkUnnamed208(o.pivotHeaders);
+    checkUnnamed201(o.metricHeaderEntries);
+    checkUnnamed202(o.pivotHeaders);
   }
   buildCounterMetricHeader--;
 }
@@ -560,14 +560,14 @@
   buildCounterMetricHeaderEntry--;
 }
 
-buildUnnamed209() {
+buildUnnamed203() {
   var o = new core.List<api.SegmentFilterClause>();
   o.add(buildSegmentFilterClause());
   o.add(buildSegmentFilterClause());
   return o;
 }
 
-checkUnnamed209(core.List<api.SegmentFilterClause> o) {
+checkUnnamed203(core.List<api.SegmentFilterClause> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentFilterClause(o[0]);
   checkSegmentFilterClause(o[1]);
@@ -578,7 +578,7 @@
   var o = new api.OrFiltersForSegment();
   buildCounterOrFiltersForSegment++;
   if (buildCounterOrFiltersForSegment < 3) {
-    o.segmentFilterClauses = buildUnnamed209();
+    o.segmentFilterClauses = buildUnnamed203();
   }
   buildCounterOrFiltersForSegment--;
   return o;
@@ -587,7 +587,7 @@
 checkOrFiltersForSegment(api.OrFiltersForSegment o) {
   buildCounterOrFiltersForSegment++;
   if (buildCounterOrFiltersForSegment < 3) {
-    checkUnnamed209(o.segmentFilterClauses);
+    checkUnnamed203(o.segmentFilterClauses);
   }
   buildCounterOrFiltersForSegment--;
 }
@@ -615,40 +615,40 @@
   buildCounterOrderBy--;
 }
 
-buildUnnamed210() {
+buildUnnamed204() {
   var o = new core.List<api.DimensionFilterClause>();
   o.add(buildDimensionFilterClause());
   o.add(buildDimensionFilterClause());
   return o;
 }
 
-checkUnnamed210(core.List<api.DimensionFilterClause> o) {
+checkUnnamed204(core.List<api.DimensionFilterClause> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionFilterClause(o[0]);
   checkDimensionFilterClause(o[1]);
 }
 
-buildUnnamed211() {
+buildUnnamed205() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed211(core.List<api.Dimension> o) {
+checkUnnamed205(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed212() {
+buildUnnamed206() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed212(core.List<api.Metric> o) {
+checkUnnamed206(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -659,10 +659,10 @@
   var o = new api.Pivot();
   buildCounterPivot++;
   if (buildCounterPivot < 3) {
-    o.dimensionFilterClauses = buildUnnamed210();
-    o.dimensions = buildUnnamed211();
+    o.dimensionFilterClauses = buildUnnamed204();
+    o.dimensions = buildUnnamed205();
     o.maxGroupCount = 42;
-    o.metrics = buildUnnamed212();
+    o.metrics = buildUnnamed206();
     o.startGroup = 42;
   }
   buildCounterPivot--;
@@ -672,23 +672,23 @@
 checkPivot(api.Pivot o) {
   buildCounterPivot++;
   if (buildCounterPivot < 3) {
-    checkUnnamed210(o.dimensionFilterClauses);
-    checkUnnamed211(o.dimensions);
+    checkUnnamed204(o.dimensionFilterClauses);
+    checkUnnamed205(o.dimensions);
     unittest.expect(o.maxGroupCount, unittest.equals(42));
-    checkUnnamed212(o.metrics);
+    checkUnnamed206(o.metrics);
     unittest.expect(o.startGroup, unittest.equals(42));
   }
   buildCounterPivot--;
 }
 
-buildUnnamed213() {
+buildUnnamed207() {
   var o = new core.List<api.PivotHeaderEntry>();
   o.add(buildPivotHeaderEntry());
   o.add(buildPivotHeaderEntry());
   return o;
 }
 
-checkUnnamed213(core.List<api.PivotHeaderEntry> o) {
+checkUnnamed207(core.List<api.PivotHeaderEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPivotHeaderEntry(o[0]);
   checkPivotHeaderEntry(o[1]);
@@ -699,7 +699,7 @@
   var o = new api.PivotHeader();
   buildCounterPivotHeader++;
   if (buildCounterPivotHeader < 3) {
-    o.pivotHeaderEntries = buildUnnamed213();
+    o.pivotHeaderEntries = buildUnnamed207();
     o.totalPivotGroupsCount = 42;
   }
   buildCounterPivotHeader--;
@@ -709,12 +709,155 @@
 checkPivotHeader(api.PivotHeader o) {
   buildCounterPivotHeader++;
   if (buildCounterPivotHeader < 3) {
-    checkUnnamed213(o.pivotHeaderEntries);
+    checkUnnamed207(o.pivotHeaderEntries);
     unittest.expect(o.totalPivotGroupsCount, unittest.equals(42));
   }
   buildCounterPivotHeader--;
 }
 
+buildUnnamed208() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed208(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed209() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed209(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterPivotHeaderEntry = 0;
+buildPivotHeaderEntry() {
+  var o = new api.PivotHeaderEntry();
+  buildCounterPivotHeaderEntry++;
+  if (buildCounterPivotHeaderEntry < 3) {
+    o.dimensionNames = buildUnnamed208();
+    o.dimensionValues = buildUnnamed209();
+    o.metric = buildMetricHeaderEntry();
+  }
+  buildCounterPivotHeaderEntry--;
+  return o;
+}
+
+checkPivotHeaderEntry(api.PivotHeaderEntry o) {
+  buildCounterPivotHeaderEntry++;
+  if (buildCounterPivotHeaderEntry < 3) {
+    checkUnnamed208(o.dimensionNames);
+    checkUnnamed209(o.dimensionValues);
+    checkMetricHeaderEntry(o.metric);
+  }
+  buildCounterPivotHeaderEntry--;
+}
+
+buildUnnamed210() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed210(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterPivotValueRegion = 0;
+buildPivotValueRegion() {
+  var o = new api.PivotValueRegion();
+  buildCounterPivotValueRegion++;
+  if (buildCounterPivotValueRegion < 3) {
+    o.values = buildUnnamed210();
+  }
+  buildCounterPivotValueRegion--;
+  return o;
+}
+
+checkPivotValueRegion(api.PivotValueRegion o) {
+  buildCounterPivotValueRegion++;
+  if (buildCounterPivotValueRegion < 3) {
+    checkUnnamed210(o.values);
+  }
+  buildCounterPivotValueRegion--;
+}
+
+core.int buildCounterReport = 0;
+buildReport() {
+  var o = new api.Report();
+  buildCounterReport++;
+  if (buildCounterReport < 3) {
+    o.columnHeader = buildColumnHeader();
+    o.data = buildReportData();
+    o.nextPageToken = "foo";
+  }
+  buildCounterReport--;
+  return o;
+}
+
+checkReport(api.Report o) {
+  buildCounterReport++;
+  if (buildCounterReport < 3) {
+    checkColumnHeader(o.columnHeader);
+    checkReportData(o.data);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterReport--;
+}
+
+buildUnnamed211() {
+  var o = new core.List<api.DateRangeValues>();
+  o.add(buildDateRangeValues());
+  o.add(buildDateRangeValues());
+  return o;
+}
+
+checkUnnamed211(core.List<api.DateRangeValues> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDateRangeValues(o[0]);
+  checkDateRangeValues(o[1]);
+}
+
+buildUnnamed212() {
+  var o = new core.List<api.DateRangeValues>();
+  o.add(buildDateRangeValues());
+  o.add(buildDateRangeValues());
+  return o;
+}
+
+checkUnnamed212(core.List<api.DateRangeValues> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDateRangeValues(o[0]);
+  checkDateRangeValues(o[1]);
+}
+
+buildUnnamed213() {
+  var o = new core.List<api.ReportRow>();
+  o.add(buildReportRow());
+  o.add(buildReportRow());
+  return o;
+}
+
+checkUnnamed213(core.List<api.ReportRow> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkReportRow(o[0]);
+  checkReportRow(o[1]);
+}
+
 buildUnnamed214() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -741,157 +884,14 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterPivotHeaderEntry = 0;
-buildPivotHeaderEntry() {
-  var o = new api.PivotHeaderEntry();
-  buildCounterPivotHeaderEntry++;
-  if (buildCounterPivotHeaderEntry < 3) {
-    o.dimensionNames = buildUnnamed214();
-    o.dimensionValues = buildUnnamed215();
-    o.metric = buildMetricHeaderEntry();
-  }
-  buildCounterPivotHeaderEntry--;
-  return o;
-}
-
-checkPivotHeaderEntry(api.PivotHeaderEntry o) {
-  buildCounterPivotHeaderEntry++;
-  if (buildCounterPivotHeaderEntry < 3) {
-    checkUnnamed214(o.dimensionNames);
-    checkUnnamed215(o.dimensionValues);
-    checkMetricHeaderEntry(o.metric);
-  }
-  buildCounterPivotHeaderEntry--;
-}
-
 buildUnnamed216() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed216(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterPivotValueRegion = 0;
-buildPivotValueRegion() {
-  var o = new api.PivotValueRegion();
-  buildCounterPivotValueRegion++;
-  if (buildCounterPivotValueRegion < 3) {
-    o.values = buildUnnamed216();
-  }
-  buildCounterPivotValueRegion--;
-  return o;
-}
-
-checkPivotValueRegion(api.PivotValueRegion o) {
-  buildCounterPivotValueRegion++;
-  if (buildCounterPivotValueRegion < 3) {
-    checkUnnamed216(o.values);
-  }
-  buildCounterPivotValueRegion--;
-}
-
-core.int buildCounterReport = 0;
-buildReport() {
-  var o = new api.Report();
-  buildCounterReport++;
-  if (buildCounterReport < 3) {
-    o.columnHeader = buildColumnHeader();
-    o.data = buildReportData();
-    o.nextPageToken = "foo";
-  }
-  buildCounterReport--;
-  return o;
-}
-
-checkReport(api.Report o) {
-  buildCounterReport++;
-  if (buildCounterReport < 3) {
-    checkColumnHeader(o.columnHeader);
-    checkReportData(o.data);
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-  }
-  buildCounterReport--;
-}
-
-buildUnnamed217() {
   var o = new core.List<api.DateRangeValues>();
   o.add(buildDateRangeValues());
   o.add(buildDateRangeValues());
   return o;
 }
 
-checkUnnamed217(core.List<api.DateRangeValues> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkDateRangeValues(o[0]);
-  checkDateRangeValues(o[1]);
-}
-
-buildUnnamed218() {
-  var o = new core.List<api.DateRangeValues>();
-  o.add(buildDateRangeValues());
-  o.add(buildDateRangeValues());
-  return o;
-}
-
-checkUnnamed218(core.List<api.DateRangeValues> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkDateRangeValues(o[0]);
-  checkDateRangeValues(o[1]);
-}
-
-buildUnnamed219() {
-  var o = new core.List<api.ReportRow>();
-  o.add(buildReportRow());
-  o.add(buildReportRow());
-  return o;
-}
-
-checkUnnamed219(core.List<api.ReportRow> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkReportRow(o[0]);
-  checkReportRow(o[1]);
-}
-
-buildUnnamed220() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed220(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed221() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed221(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed222() {
-  var o = new core.List<api.DateRangeValues>();
-  o.add(buildDateRangeValues());
-  o.add(buildDateRangeValues());
-  return o;
-}
-
-checkUnnamed222(core.List<api.DateRangeValues> o) {
+checkUnnamed216(core.List<api.DateRangeValues> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDateRangeValues(o[0]);
   checkDateRangeValues(o[1]);
@@ -904,13 +904,13 @@
   if (buildCounterReportData < 3) {
     o.dataLastRefreshed = "foo";
     o.isDataGolden = true;
-    o.maximums = buildUnnamed217();
-    o.minimums = buildUnnamed218();
+    o.maximums = buildUnnamed211();
+    o.minimums = buildUnnamed212();
     o.rowCount = 42;
-    o.rows = buildUnnamed219();
-    o.samplesReadCounts = buildUnnamed220();
-    o.samplingSpaceSizes = buildUnnamed221();
-    o.totals = buildUnnamed222();
+    o.rows = buildUnnamed213();
+    o.samplesReadCounts = buildUnnamed214();
+    o.samplingSpaceSizes = buildUnnamed215();
+    o.totals = buildUnnamed216();
   }
   buildCounterReportData--;
   return o;
@@ -921,116 +921,116 @@
   if (buildCounterReportData < 3) {
     unittest.expect(o.dataLastRefreshed, unittest.equals('foo'));
     unittest.expect(o.isDataGolden, unittest.isTrue);
-    checkUnnamed217(o.maximums);
-    checkUnnamed218(o.minimums);
+    checkUnnamed211(o.maximums);
+    checkUnnamed212(o.minimums);
     unittest.expect(o.rowCount, unittest.equals(42));
-    checkUnnamed219(o.rows);
-    checkUnnamed220(o.samplesReadCounts);
-    checkUnnamed221(o.samplingSpaceSizes);
-    checkUnnamed222(o.totals);
+    checkUnnamed213(o.rows);
+    checkUnnamed214(o.samplesReadCounts);
+    checkUnnamed215(o.samplingSpaceSizes);
+    checkUnnamed216(o.totals);
   }
   buildCounterReportData--;
 }
 
-buildUnnamed223() {
+buildUnnamed217() {
   var o = new core.List<api.DateRange>();
   o.add(buildDateRange());
   o.add(buildDateRange());
   return o;
 }
 
-checkUnnamed223(core.List<api.DateRange> o) {
+checkUnnamed217(core.List<api.DateRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDateRange(o[0]);
   checkDateRange(o[1]);
 }
 
-buildUnnamed224() {
+buildUnnamed218() {
   var o = new core.List<api.DimensionFilterClause>();
   o.add(buildDimensionFilterClause());
   o.add(buildDimensionFilterClause());
   return o;
 }
 
-checkUnnamed224(core.List<api.DimensionFilterClause> o) {
+checkUnnamed218(core.List<api.DimensionFilterClause> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionFilterClause(o[0]);
   checkDimensionFilterClause(o[1]);
 }
 
-buildUnnamed225() {
+buildUnnamed219() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed225(core.List<api.Dimension> o) {
+checkUnnamed219(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed226() {
+buildUnnamed220() {
   var o = new core.List<api.MetricFilterClause>();
   o.add(buildMetricFilterClause());
   o.add(buildMetricFilterClause());
   return o;
 }
 
-checkUnnamed226(core.List<api.MetricFilterClause> o) {
+checkUnnamed220(core.List<api.MetricFilterClause> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricFilterClause(o[0]);
   checkMetricFilterClause(o[1]);
 }
 
-buildUnnamed227() {
+buildUnnamed221() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed227(core.List<api.Metric> o) {
+checkUnnamed221(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed228() {
+buildUnnamed222() {
   var o = new core.List<api.OrderBy>();
   o.add(buildOrderBy());
   o.add(buildOrderBy());
   return o;
 }
 
-checkUnnamed228(core.List<api.OrderBy> o) {
+checkUnnamed222(core.List<api.OrderBy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderBy(o[0]);
   checkOrderBy(o[1]);
 }
 
-buildUnnamed229() {
+buildUnnamed223() {
   var o = new core.List<api.Pivot>();
   o.add(buildPivot());
   o.add(buildPivot());
   return o;
 }
 
-checkUnnamed229(core.List<api.Pivot> o) {
+checkUnnamed223(core.List<api.Pivot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPivot(o[0]);
   checkPivot(o[1]);
 }
 
-buildUnnamed230() {
+buildUnnamed224() {
   var o = new core.List<api.Segment>();
   o.add(buildSegment());
   o.add(buildSegment());
   return o;
 }
 
-checkUnnamed230(core.List<api.Segment> o) {
+checkUnnamed224(core.List<api.Segment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegment(o[0]);
   checkSegment(o[1]);
@@ -1042,21 +1042,21 @@
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
     o.cohortGroup = buildCohortGroup();
-    o.dateRanges = buildUnnamed223();
-    o.dimensionFilterClauses = buildUnnamed224();
-    o.dimensions = buildUnnamed225();
+    o.dateRanges = buildUnnamed217();
+    o.dimensionFilterClauses = buildUnnamed218();
+    o.dimensions = buildUnnamed219();
     o.filtersExpression = "foo";
     o.hideTotals = true;
     o.hideValueRanges = true;
     o.includeEmptyRows = true;
-    o.metricFilterClauses = buildUnnamed226();
-    o.metrics = buildUnnamed227();
-    o.orderBys = buildUnnamed228();
+    o.metricFilterClauses = buildUnnamed220();
+    o.metrics = buildUnnamed221();
+    o.orderBys = buildUnnamed222();
     o.pageSize = 42;
     o.pageToken = "foo";
-    o.pivots = buildUnnamed229();
+    o.pivots = buildUnnamed223();
     o.samplingLevel = "foo";
-    o.segments = buildUnnamed230();
+    o.segments = buildUnnamed224();
     o.viewId = "foo";
   }
   buildCounterReportRequest--;
@@ -1067,47 +1067,47 @@
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
     checkCohortGroup(o.cohortGroup);
-    checkUnnamed223(o.dateRanges);
-    checkUnnamed224(o.dimensionFilterClauses);
-    checkUnnamed225(o.dimensions);
+    checkUnnamed217(o.dateRanges);
+    checkUnnamed218(o.dimensionFilterClauses);
+    checkUnnamed219(o.dimensions);
     unittest.expect(o.filtersExpression, unittest.equals('foo'));
     unittest.expect(o.hideTotals, unittest.isTrue);
     unittest.expect(o.hideValueRanges, unittest.isTrue);
     unittest.expect(o.includeEmptyRows, unittest.isTrue);
-    checkUnnamed226(o.metricFilterClauses);
-    checkUnnamed227(o.metrics);
-    checkUnnamed228(o.orderBys);
+    checkUnnamed220(o.metricFilterClauses);
+    checkUnnamed221(o.metrics);
+    checkUnnamed222(o.orderBys);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed229(o.pivots);
+    checkUnnamed223(o.pivots);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
-    checkUnnamed230(o.segments);
+    checkUnnamed224(o.segments);
     unittest.expect(o.viewId, unittest.equals('foo'));
   }
   buildCounterReportRequest--;
 }
 
-buildUnnamed231() {
+buildUnnamed225() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed231(core.List<core.String> o) {
+checkUnnamed225(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed232() {
+buildUnnamed226() {
   var o = new core.List<api.DateRangeValues>();
   o.add(buildDateRangeValues());
   o.add(buildDateRangeValues());
   return o;
 }
 
-checkUnnamed232(core.List<api.DateRangeValues> o) {
+checkUnnamed226(core.List<api.DateRangeValues> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDateRangeValues(o[0]);
   checkDateRangeValues(o[1]);
@@ -1118,8 +1118,8 @@
   var o = new api.ReportRow();
   buildCounterReportRow++;
   if (buildCounterReportRow < 3) {
-    o.dimensions = buildUnnamed231();
-    o.metrics = buildUnnamed232();
+    o.dimensions = buildUnnamed225();
+    o.metrics = buildUnnamed226();
   }
   buildCounterReportRow--;
   return o;
@@ -1128,8 +1128,8 @@
 checkReportRow(api.ReportRow o) {
   buildCounterReportRow++;
   if (buildCounterReportRow < 3) {
-    checkUnnamed231(o.dimensions);
-    checkUnnamed232(o.metrics);
+    checkUnnamed225(o.dimensions);
+    checkUnnamed226(o.metrics);
   }
   buildCounterReportRow--;
 }
@@ -1176,14 +1176,14 @@
   buildCounterSegment--;
 }
 
-buildUnnamed233() {
+buildUnnamed227() {
   var o = new core.List<api.SegmentFilter>();
   o.add(buildSegmentFilter());
   o.add(buildSegmentFilter());
   return o;
 }
 
-checkUnnamed233(core.List<api.SegmentFilter> o) {
+checkUnnamed227(core.List<api.SegmentFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentFilter(o[0]);
   checkSegmentFilter(o[1]);
@@ -1194,7 +1194,7 @@
   var o = new api.SegmentDefinition();
   buildCounterSegmentDefinition++;
   if (buildCounterSegmentDefinition < 3) {
-    o.segmentFilters = buildUnnamed233();
+    o.segmentFilters = buildUnnamed227();
   }
   buildCounterSegmentDefinition--;
   return o;
@@ -1203,19 +1203,19 @@
 checkSegmentDefinition(api.SegmentDefinition o) {
   buildCounterSegmentDefinition++;
   if (buildCounterSegmentDefinition < 3) {
-    checkUnnamed233(o.segmentFilters);
+    checkUnnamed227(o.segmentFilters);
   }
   buildCounterSegmentDefinition--;
 }
 
-buildUnnamed234() {
+buildUnnamed228() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed234(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'));
@@ -1228,7 +1228,7 @@
   if (buildCounterSegmentDimensionFilter < 3) {
     o.caseSensitive = true;
     o.dimensionName = "foo";
-    o.expressions = buildUnnamed234();
+    o.expressions = buildUnnamed228();
     o.maxComparisonValue = "foo";
     o.minComparisonValue = "foo";
     o.operator = "foo";
@@ -1242,7 +1242,7 @@
   if (buildCounterSegmentDimensionFilter < 3) {
     unittest.expect(o.caseSensitive, unittest.isTrue);
     unittest.expect(o.dimensionName, unittest.equals('foo'));
-    checkUnnamed234(o.expressions);
+    checkUnnamed228(o.expressions);
     unittest.expect(o.maxComparisonValue, unittest.equals('foo'));
     unittest.expect(o.minComparisonValue, unittest.equals('foo'));
     unittest.expect(o.operator, unittest.equals('foo'));
@@ -1323,14 +1323,14 @@
   buildCounterSegmentMetricFilter--;
 }
 
-buildUnnamed235() {
+buildUnnamed229() {
   var o = new core.List<api.OrFiltersForSegment>();
   o.add(buildOrFiltersForSegment());
   o.add(buildOrFiltersForSegment());
   return o;
 }
 
-checkUnnamed235(core.List<api.OrFiltersForSegment> o) {
+checkUnnamed229(core.List<api.OrFiltersForSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrFiltersForSegment(o[0]);
   checkOrFiltersForSegment(o[1]);
@@ -1342,7 +1342,7 @@
   buildCounterSegmentSequenceStep++;
   if (buildCounterSegmentSequenceStep < 3) {
     o.matchType = "foo";
-    o.orFiltersForSegment = buildUnnamed235();
+    o.orFiltersForSegment = buildUnnamed229();
   }
   buildCounterSegmentSequenceStep--;
   return o;
@@ -1352,19 +1352,19 @@
   buildCounterSegmentSequenceStep++;
   if (buildCounterSegmentSequenceStep < 3) {
     unittest.expect(o.matchType, unittest.equals('foo'));
-    checkUnnamed235(o.orFiltersForSegment);
+    checkUnnamed229(o.orFiltersForSegment);
   }
   buildCounterSegmentSequenceStep--;
 }
 
-buildUnnamed236() {
+buildUnnamed230() {
   var o = new core.List<api.SegmentSequenceStep>();
   o.add(buildSegmentSequenceStep());
   o.add(buildSegmentSequenceStep());
   return o;
 }
 
-checkUnnamed236(core.List<api.SegmentSequenceStep> o) {
+checkUnnamed230(core.List<api.SegmentSequenceStep> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentSequenceStep(o[0]);
   checkSegmentSequenceStep(o[1]);
@@ -1376,7 +1376,7 @@
   buildCounterSequenceSegment++;
   if (buildCounterSequenceSegment < 3) {
     o.firstStepShouldMatchFirstHit = true;
-    o.segmentSequenceSteps = buildUnnamed236();
+    o.segmentSequenceSteps = buildUnnamed230();
   }
   buildCounterSequenceSegment--;
   return o;
@@ -1386,19 +1386,19 @@
   buildCounterSequenceSegment++;
   if (buildCounterSequenceSegment < 3) {
     unittest.expect(o.firstStepShouldMatchFirstHit, unittest.isTrue);
-    checkUnnamed236(o.segmentSequenceSteps);
+    checkUnnamed230(o.segmentSequenceSteps);
   }
   buildCounterSequenceSegment--;
 }
 
-buildUnnamed237() {
+buildUnnamed231() {
   var o = new core.List<api.OrFiltersForSegment>();
   o.add(buildOrFiltersForSegment());
   o.add(buildOrFiltersForSegment());
   return o;
 }
 
-checkUnnamed237(core.List<api.OrFiltersForSegment> o) {
+checkUnnamed231(core.List<api.OrFiltersForSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrFiltersForSegment(o[0]);
   checkOrFiltersForSegment(o[1]);
@@ -1409,7 +1409,7 @@
   var o = new api.SimpleSegment();
   buildCounterSimpleSegment++;
   if (buildCounterSimpleSegment < 3) {
-    o.orFiltersForSegment = buildUnnamed237();
+    o.orFiltersForSegment = buildUnnamed231();
   }
   buildCounterSimpleSegment--;
   return o;
@@ -1418,7 +1418,7 @@
 checkSimpleSegment(api.SimpleSegment o) {
   buildCounterSimpleSegment++;
   if (buildCounterSimpleSegment < 3) {
-    checkUnnamed237(o.orFiltersForSegment);
+    checkUnnamed231(o.orFiltersForSegment);
   }
   buildCounterSimpleSegment--;
 }
diff --git a/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart b/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
index 7f3253f..589b024 100644
--- a/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
+++ b/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
@@ -94,14 +94,14 @@
   buildCounterClaimDeviceResponse--;
 }
 
-buildUnnamed32() {
+buildUnnamed35() {
   var o = new core.List<api.PartnerClaim>();
   o.add(buildPartnerClaim());
   o.add(buildPartnerClaim());
   return o;
 }
 
-checkUnnamed32(core.List<api.PartnerClaim> o) {
+checkUnnamed35(core.List<api.PartnerClaim> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPartnerClaim(o[0]);
   checkPartnerClaim(o[1]);
@@ -112,7 +112,7 @@
   var o = new api.ClaimDevicesRequest();
   buildCounterClaimDevicesRequest++;
   if (buildCounterClaimDevicesRequest < 3) {
-    o.claims = buildUnnamed32();
+    o.claims = buildUnnamed35();
   }
   buildCounterClaimDevicesRequest--;
   return o;
@@ -121,32 +121,32 @@
 checkClaimDevicesRequest(api.ClaimDevicesRequest o) {
   buildCounterClaimDevicesRequest++;
   if (buildCounterClaimDevicesRequest < 3) {
-    checkUnnamed32(o.claims);
+    checkUnnamed35(o.claims);
   }
   buildCounterClaimDevicesRequest--;
 }
 
-buildUnnamed33() {
+buildUnnamed36() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed33(core.List<core.String> o) {
+checkUnnamed36(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed34() {
+buildUnnamed37() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed34(core.List<core.String> o) {
+checkUnnamed37(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -157,11 +157,11 @@
   var o = new api.Company();
   buildCounterCompany++;
   if (buildCounterCompany < 3) {
-    o.adminEmails = buildUnnamed33();
+    o.adminEmails = buildUnnamed36();
     o.companyId = "foo";
     o.companyName = "foo";
     o.name = "foo";
-    o.ownerEmails = buildUnnamed34();
+    o.ownerEmails = buildUnnamed37();
   }
   buildCounterCompany--;
   return o;
@@ -170,15 +170,52 @@
 checkCompany(api.Company o) {
   buildCounterCompany++;
   if (buildCounterCompany < 3) {
-    checkUnnamed33(o.adminEmails);
+    checkUnnamed36(o.adminEmails);
     unittest.expect(o.companyId, unittest.equals('foo'));
     unittest.expect(o.companyName, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed34(o.ownerEmails);
+    checkUnnamed37(o.ownerEmails);
   }
   buildCounterCompany--;
 }
 
+core.int buildCounterConfiguration = 0;
+buildConfiguration() {
+  var o = new api.Configuration();
+  buildCounterConfiguration++;
+  if (buildCounterConfiguration < 3) {
+    o.companyName = "foo";
+    o.configurationId = "foo";
+    o.configurationName = "foo";
+    o.contactEmail = "foo";
+    o.contactPhone = "foo";
+    o.customMessage = "foo";
+    o.dpcExtras = "foo";
+    o.dpcResourcePath = "foo";
+    o.isDefault = true;
+    o.name = "foo";
+  }
+  buildCounterConfiguration--;
+  return o;
+}
+
+checkConfiguration(api.Configuration o) {
+  buildCounterConfiguration++;
+  if (buildCounterConfiguration < 3) {
+    unittest.expect(o.companyName, unittest.equals('foo'));
+    unittest.expect(o.configurationId, unittest.equals('foo'));
+    unittest.expect(o.configurationName, unittest.equals('foo'));
+    unittest.expect(o.contactEmail, unittest.equals('foo'));
+    unittest.expect(o.contactPhone, unittest.equals('foo'));
+    unittest.expect(o.customMessage, unittest.equals('foo'));
+    unittest.expect(o.dpcExtras, unittest.equals('foo'));
+    unittest.expect(o.dpcResourcePath, unittest.equals('foo'));
+    unittest.expect(o.isDefault, unittest.isTrue);
+    unittest.expect(o.name, unittest.equals('foo'));
+  }
+  buildCounterConfiguration--;
+}
+
 core.int buildCounterCreateCustomerRequest = 0;
 buildCreateCustomerRequest() {
   var o = new api.CreateCustomerRequest();
@@ -198,14 +235,208 @@
   buildCounterCreateCustomerRequest--;
 }
 
-buildUnnamed35() {
+core.int buildCounterCustomerApplyConfigurationRequest = 0;
+buildCustomerApplyConfigurationRequest() {
+  var o = new api.CustomerApplyConfigurationRequest();
+  buildCounterCustomerApplyConfigurationRequest++;
+  if (buildCounterCustomerApplyConfigurationRequest < 3) {
+    o.configuration = "foo";
+    o.device = buildDeviceReference();
+  }
+  buildCounterCustomerApplyConfigurationRequest--;
+  return o;
+}
+
+checkCustomerApplyConfigurationRequest(
+    api.CustomerApplyConfigurationRequest o) {
+  buildCounterCustomerApplyConfigurationRequest++;
+  if (buildCounterCustomerApplyConfigurationRequest < 3) {
+    unittest.expect(o.configuration, unittest.equals('foo'));
+    checkDeviceReference(o.device);
+  }
+  buildCounterCustomerApplyConfigurationRequest--;
+}
+
+buildUnnamed38() {
+  var o = new core.List<api.Configuration>();
+  o.add(buildConfiguration());
+  o.add(buildConfiguration());
+  return o;
+}
+
+checkUnnamed38(core.List<api.Configuration> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkConfiguration(o[0]);
+  checkConfiguration(o[1]);
+}
+
+core.int buildCounterCustomerListConfigurationsResponse = 0;
+buildCustomerListConfigurationsResponse() {
+  var o = new api.CustomerListConfigurationsResponse();
+  buildCounterCustomerListConfigurationsResponse++;
+  if (buildCounterCustomerListConfigurationsResponse < 3) {
+    o.configurations = buildUnnamed38();
+  }
+  buildCounterCustomerListConfigurationsResponse--;
+  return o;
+}
+
+checkCustomerListConfigurationsResponse(
+    api.CustomerListConfigurationsResponse o) {
+  buildCounterCustomerListConfigurationsResponse++;
+  if (buildCounterCustomerListConfigurationsResponse < 3) {
+    checkUnnamed38(o.configurations);
+  }
+  buildCounterCustomerListConfigurationsResponse--;
+}
+
+buildUnnamed39() {
+  var o = new core.List<api.Company>();
+  o.add(buildCompany());
+  o.add(buildCompany());
+  return o;
+}
+
+checkUnnamed39(core.List<api.Company> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkCompany(o[0]);
+  checkCompany(o[1]);
+}
+
+core.int buildCounterCustomerListCustomersResponse = 0;
+buildCustomerListCustomersResponse() {
+  var o = new api.CustomerListCustomersResponse();
+  buildCounterCustomerListCustomersResponse++;
+  if (buildCounterCustomerListCustomersResponse < 3) {
+    o.customers = buildUnnamed39();
+    o.nextPageToken = "foo";
+  }
+  buildCounterCustomerListCustomersResponse--;
+  return o;
+}
+
+checkCustomerListCustomersResponse(api.CustomerListCustomersResponse o) {
+  buildCounterCustomerListCustomersResponse++;
+  if (buildCounterCustomerListCustomersResponse < 3) {
+    checkUnnamed39(o.customers);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterCustomerListCustomersResponse--;
+}
+
+buildUnnamed40() {
+  var o = new core.List<api.Device>();
+  o.add(buildDevice());
+  o.add(buildDevice());
+  return o;
+}
+
+checkUnnamed40(core.List<api.Device> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDevice(o[0]);
+  checkDevice(o[1]);
+}
+
+core.int buildCounterCustomerListDevicesResponse = 0;
+buildCustomerListDevicesResponse() {
+  var o = new api.CustomerListDevicesResponse();
+  buildCounterCustomerListDevicesResponse++;
+  if (buildCounterCustomerListDevicesResponse < 3) {
+    o.devices = buildUnnamed40();
+    o.nextPageToken = "foo";
+  }
+  buildCounterCustomerListDevicesResponse--;
+  return o;
+}
+
+checkCustomerListDevicesResponse(api.CustomerListDevicesResponse o) {
+  buildCounterCustomerListDevicesResponse++;
+  if (buildCounterCustomerListDevicesResponse < 3) {
+    checkUnnamed40(o.devices);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterCustomerListDevicesResponse--;
+}
+
+buildUnnamed41() {
+  var o = new core.List<api.Dpc>();
+  o.add(buildDpc());
+  o.add(buildDpc());
+  return o;
+}
+
+checkUnnamed41(core.List<api.Dpc> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDpc(o[0]);
+  checkDpc(o[1]);
+}
+
+core.int buildCounterCustomerListDpcsResponse = 0;
+buildCustomerListDpcsResponse() {
+  var o = new api.CustomerListDpcsResponse();
+  buildCounterCustomerListDpcsResponse++;
+  if (buildCounterCustomerListDpcsResponse < 3) {
+    o.dpcs = buildUnnamed41();
+  }
+  buildCounterCustomerListDpcsResponse--;
+  return o;
+}
+
+checkCustomerListDpcsResponse(api.CustomerListDpcsResponse o) {
+  buildCounterCustomerListDpcsResponse++;
+  if (buildCounterCustomerListDpcsResponse < 3) {
+    checkUnnamed41(o.dpcs);
+  }
+  buildCounterCustomerListDpcsResponse--;
+}
+
+core.int buildCounterCustomerRemoveConfigurationRequest = 0;
+buildCustomerRemoveConfigurationRequest() {
+  var o = new api.CustomerRemoveConfigurationRequest();
+  buildCounterCustomerRemoveConfigurationRequest++;
+  if (buildCounterCustomerRemoveConfigurationRequest < 3) {
+    o.device = buildDeviceReference();
+  }
+  buildCounterCustomerRemoveConfigurationRequest--;
+  return o;
+}
+
+checkCustomerRemoveConfigurationRequest(
+    api.CustomerRemoveConfigurationRequest o) {
+  buildCounterCustomerRemoveConfigurationRequest++;
+  if (buildCounterCustomerRemoveConfigurationRequest < 3) {
+    checkDeviceReference(o.device);
+  }
+  buildCounterCustomerRemoveConfigurationRequest--;
+}
+
+core.int buildCounterCustomerUnclaimDeviceRequest = 0;
+buildCustomerUnclaimDeviceRequest() {
+  var o = new api.CustomerUnclaimDeviceRequest();
+  buildCounterCustomerUnclaimDeviceRequest++;
+  if (buildCounterCustomerUnclaimDeviceRequest < 3) {
+    o.device = buildDeviceReference();
+  }
+  buildCounterCustomerUnclaimDeviceRequest--;
+  return o;
+}
+
+checkCustomerUnclaimDeviceRequest(api.CustomerUnclaimDeviceRequest o) {
+  buildCounterCustomerUnclaimDeviceRequest++;
+  if (buildCounterCustomerUnclaimDeviceRequest < 3) {
+    checkDeviceReference(o.device);
+  }
+  buildCounterCustomerUnclaimDeviceRequest--;
+}
+
+buildUnnamed42() {
   var o = new core.List<api.DeviceClaim>();
   o.add(buildDeviceClaim());
   o.add(buildDeviceClaim());
   return o;
 }
 
-checkUnnamed35(core.List<api.DeviceClaim> o) {
+checkUnnamed42(core.List<api.DeviceClaim> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeviceClaim(o[0]);
   checkDeviceClaim(o[1]);
@@ -216,7 +447,7 @@
   var o = new api.Device();
   buildCounterDevice++;
   if (buildCounterDevice < 3) {
-    o.claims = buildUnnamed35();
+    o.claims = buildUnnamed42();
     o.configuration = "foo";
     o.deviceId = "foo";
     o.deviceIdentifier = buildDeviceIdentifier();
@@ -230,7 +461,7 @@
 checkDevice(api.Device o) {
   buildCounterDevice++;
   if (buildCounterDevice < 3) {
-    checkUnnamed35(o.claims);
+    checkUnnamed42(o.claims);
     unittest.expect(o.configuration, unittest.equals('foo'));
     unittest.expect(o.deviceId, unittest.equals('foo'));
     checkDeviceIdentifier(o.deviceIdentifier);
@@ -286,14 +517,14 @@
   buildCounterDeviceIdentifier--;
 }
 
-buildUnnamed36() {
+buildUnnamed43() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed36(core.Map<core.String, core.String> o) {
+checkUnnamed43(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'));
@@ -304,7 +535,7 @@
   var o = new api.DeviceMetadata();
   buildCounterDeviceMetadata++;
   if (buildCounterDeviceMetadata < 3) {
-    o.entries = buildUnnamed36();
+    o.entries = buildUnnamed43();
   }
   buildCounterDeviceMetadata--;
   return o;
@@ -313,11 +544,32 @@
 checkDeviceMetadata(api.DeviceMetadata o) {
   buildCounterDeviceMetadata++;
   if (buildCounterDeviceMetadata < 3) {
-    checkUnnamed36(o.entries);
+    checkUnnamed43(o.entries);
   }
   buildCounterDeviceMetadata--;
 }
 
+core.int buildCounterDeviceReference = 0;
+buildDeviceReference() {
+  var o = new api.DeviceReference();
+  buildCounterDeviceReference++;
+  if (buildCounterDeviceReference < 3) {
+    o.deviceId = "foo";
+    o.deviceIdentifier = buildDeviceIdentifier();
+  }
+  buildCounterDeviceReference--;
+  return o;
+}
+
+checkDeviceReference(api.DeviceReference o) {
+  buildCounterDeviceReference++;
+  if (buildCounterDeviceReference < 3) {
+    unittest.expect(o.deviceId, unittest.equals('foo'));
+    checkDeviceIdentifier(o.deviceIdentifier);
+  }
+  buildCounterDeviceReference--;
+}
+
 core.int buildCounterDevicesLongRunningOperationMetadata = 0;
 buildDevicesLongRunningOperationMetadata() {
   var o = new api.DevicesLongRunningOperationMetadata();
@@ -342,14 +594,14 @@
   buildCounterDevicesLongRunningOperationMetadata--;
 }
 
-buildUnnamed37() {
+buildUnnamed44() {
   var o = new core.List<api.OperationPerDevice>();
   o.add(buildOperationPerDevice());
   o.add(buildOperationPerDevice());
   return o;
 }
 
-checkUnnamed37(core.List<api.OperationPerDevice> o) {
+checkUnnamed44(core.List<api.OperationPerDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationPerDevice(o[0]);
   checkOperationPerDevice(o[1]);
@@ -360,7 +612,7 @@
   var o = new api.DevicesLongRunningOperationResponse();
   buildCounterDevicesLongRunningOperationResponse++;
   if (buildCounterDevicesLongRunningOperationResponse < 3) {
-    o.perDeviceStatus = buildUnnamed37();
+    o.perDeviceStatus = buildUnnamed44();
     o.successCount = 42;
   }
   buildCounterDevicesLongRunningOperationResponse--;
@@ -371,12 +623,35 @@
     api.DevicesLongRunningOperationResponse o) {
   buildCounterDevicesLongRunningOperationResponse++;
   if (buildCounterDevicesLongRunningOperationResponse < 3) {
-    checkUnnamed37(o.perDeviceStatus);
+    checkUnnamed44(o.perDeviceStatus);
     unittest.expect(o.successCount, unittest.equals(42));
   }
   buildCounterDevicesLongRunningOperationResponse--;
 }
 
+core.int buildCounterDpc = 0;
+buildDpc() {
+  var o = new api.Dpc();
+  buildCounterDpc++;
+  if (buildCounterDpc < 3) {
+    o.dpcName = "foo";
+    o.name = "foo";
+    o.packageName = "foo";
+  }
+  buildCounterDpc--;
+  return o;
+}
+
+checkDpc(api.Dpc o) {
+  buildCounterDpc++;
+  if (buildCounterDpc < 3) {
+    unittest.expect(o.dpcName, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.packageName, unittest.equals('foo'));
+  }
+  buildCounterDpc--;
+}
+
 core.int buildCounterEmpty = 0;
 buildEmpty() {
   var o = new api.Empty();
@@ -416,14 +691,14 @@
   buildCounterFindDevicesByDeviceIdentifierRequest--;
 }
 
-buildUnnamed38() {
+buildUnnamed45() {
   var o = new core.List<api.Device>();
   o.add(buildDevice());
   o.add(buildDevice());
   return o;
 }
 
-checkUnnamed38(core.List<api.Device> o) {
+checkUnnamed45(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDevice(o[0]);
   checkDevice(o[1]);
@@ -434,7 +709,7 @@
   var o = new api.FindDevicesByDeviceIdentifierResponse();
   buildCounterFindDevicesByDeviceIdentifierResponse++;
   if (buildCounterFindDevicesByDeviceIdentifierResponse < 3) {
-    o.devices = buildUnnamed38();
+    o.devices = buildUnnamed45();
     o.nextPageToken = "foo";
   }
   buildCounterFindDevicesByDeviceIdentifierResponse--;
@@ -445,20 +720,20 @@
     api.FindDevicesByDeviceIdentifierResponse o) {
   buildCounterFindDevicesByDeviceIdentifierResponse++;
   if (buildCounterFindDevicesByDeviceIdentifierResponse < 3) {
-    checkUnnamed38(o.devices);
+    checkUnnamed45(o.devices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterFindDevicesByDeviceIdentifierResponse--;
 }
 
-buildUnnamed39() {
+buildUnnamed46() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed39(core.List<core.String> o) {
+checkUnnamed46(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -469,7 +744,7 @@
   var o = new api.FindDevicesByOwnerRequest();
   buildCounterFindDevicesByOwnerRequest++;
   if (buildCounterFindDevicesByOwnerRequest < 3) {
-    o.customerId = buildUnnamed39();
+    o.customerId = buildUnnamed46();
     o.limit = "foo";
     o.pageToken = "foo";
     o.sectionType = "foo";
@@ -481,7 +756,7 @@
 checkFindDevicesByOwnerRequest(api.FindDevicesByOwnerRequest o) {
   buildCounterFindDevicesByOwnerRequest++;
   if (buildCounterFindDevicesByOwnerRequest < 3) {
-    checkUnnamed39(o.customerId);
+    checkUnnamed46(o.customerId);
     unittest.expect(o.limit, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     unittest.expect(o.sectionType, unittest.equals('foo'));
@@ -489,14 +764,14 @@
   buildCounterFindDevicesByOwnerRequest--;
 }
 
-buildUnnamed40() {
+buildUnnamed47() {
   var o = new core.List<api.Device>();
   o.add(buildDevice());
   o.add(buildDevice());
   return o;
 }
 
-checkUnnamed40(core.List<api.Device> o) {
+checkUnnamed47(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDevice(o[0]);
   checkDevice(o[1]);
@@ -507,7 +782,7 @@
   var o = new api.FindDevicesByOwnerResponse();
   buildCounterFindDevicesByOwnerResponse++;
   if (buildCounterFindDevicesByOwnerResponse < 3) {
-    o.devices = buildUnnamed40();
+    o.devices = buildUnnamed47();
     o.nextPageToken = "foo";
   }
   buildCounterFindDevicesByOwnerResponse--;
@@ -517,20 +792,20 @@
 checkFindDevicesByOwnerResponse(api.FindDevicesByOwnerResponse o) {
   buildCounterFindDevicesByOwnerResponse++;
   if (buildCounterFindDevicesByOwnerResponse < 3) {
-    checkUnnamed40(o.devices);
+    checkUnnamed47(o.devices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterFindDevicesByOwnerResponse--;
 }
 
-buildUnnamed41() {
+buildUnnamed48() {
   var o = new core.List<api.Company>();
   o.add(buildCompany());
   o.add(buildCompany());
   return o;
 }
 
-checkUnnamed41(core.List<api.Company> o) {
+checkUnnamed48(core.List<api.Company> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCompany(o[0]);
   checkCompany(o[1]);
@@ -541,7 +816,7 @@
   var o = new api.ListCustomersResponse();
   buildCounterListCustomersResponse++;
   if (buildCounterListCustomersResponse < 3) {
-    o.customers = buildUnnamed41();
+    o.customers = buildUnnamed48();
   }
   buildCounterListCustomersResponse--;
   return o;
@@ -550,12 +825,12 @@
 checkListCustomersResponse(api.ListCustomersResponse o) {
   buildCounterListCustomersResponse++;
   if (buildCounterListCustomersResponse < 3) {
-    checkUnnamed41(o.customers);
+    checkUnnamed48(o.customers);
   }
   buildCounterListCustomersResponse--;
 }
 
-buildUnnamed42() {
+buildUnnamed49() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -570,7 +845,7 @@
   return o;
 }
 
-checkUnnamed42(core.Map<core.String, core.Object> o) {
+checkUnnamed49(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));
@@ -584,7 +859,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed43() {
+buildUnnamed50() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -599,7 +874,7 @@
   return o;
 }
 
-checkUnnamed43(core.Map<core.String, core.Object> o) {
+checkUnnamed50(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -620,9 +895,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed42();
+    o.metadata = buildUnnamed49();
     o.name = "foo";
-    o.response = buildUnnamed43();
+    o.response = buildUnnamed50();
   }
   buildCounterOperation--;
   return o;
@@ -633,9 +908,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed42(o.metadata);
+    checkUnnamed49(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed43(o.response);
+    checkUnnamed50(o.response);
   }
   buildCounterOperation--;
 }
@@ -738,7 +1013,7 @@
   buildCounterPerDeviceStatusInBatch--;
 }
 
-buildUnnamed44() {
+buildUnnamed51() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -753,7 +1028,7 @@
   return o;
 }
 
-checkUnnamed44(core.Map<core.String, core.Object> o) {
+checkUnnamed51(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -767,17 +1042,17 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed45() {
+buildUnnamed52() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed44());
-  o.add(buildUnnamed44());
+  o.add(buildUnnamed51());
+  o.add(buildUnnamed51());
   return o;
 }
 
-checkUnnamed45(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed52(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed44(o[0]);
-  checkUnnamed44(o[1]);
+  checkUnnamed51(o[0]);
+  checkUnnamed51(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -786,7 +1061,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed45();
+    o.details = buildUnnamed52();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -797,7 +1072,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed45(o.details);
+    checkUnnamed52(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -826,14 +1101,14 @@
   buildCounterUnclaimDeviceRequest--;
 }
 
-buildUnnamed46() {
+buildUnnamed53() {
   var o = new core.List<api.PartnerUnclaim>();
   o.add(buildPartnerUnclaim());
   o.add(buildPartnerUnclaim());
   return o;
 }
 
-checkUnnamed46(core.List<api.PartnerUnclaim> o) {
+checkUnnamed53(core.List<api.PartnerUnclaim> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPartnerUnclaim(o[0]);
   checkPartnerUnclaim(o[1]);
@@ -844,7 +1119,7 @@
   var o = new api.UnclaimDevicesRequest();
   buildCounterUnclaimDevicesRequest++;
   if (buildCounterUnclaimDevicesRequest < 3) {
-    o.unclaims = buildUnnamed46();
+    o.unclaims = buildUnnamed53();
   }
   buildCounterUnclaimDevicesRequest--;
   return o;
@@ -853,19 +1128,19 @@
 checkUnclaimDevicesRequest(api.UnclaimDevicesRequest o) {
   buildCounterUnclaimDevicesRequest++;
   if (buildCounterUnclaimDevicesRequest < 3) {
-    checkUnnamed46(o.unclaims);
+    checkUnnamed53(o.unclaims);
   }
   buildCounterUnclaimDevicesRequest--;
 }
 
-buildUnnamed47() {
+buildUnnamed54() {
   var o = new core.List<api.UpdateMetadataArguments>();
   o.add(buildUpdateMetadataArguments());
   o.add(buildUpdateMetadataArguments());
   return o;
 }
 
-checkUnnamed47(core.List<api.UpdateMetadataArguments> o) {
+checkUnnamed54(core.List<api.UpdateMetadataArguments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUpdateMetadataArguments(o[0]);
   checkUpdateMetadataArguments(o[1]);
@@ -876,7 +1151,7 @@
   var o = new api.UpdateDeviceMetadataInBatchRequest();
   buildCounterUpdateDeviceMetadataInBatchRequest++;
   if (buildCounterUpdateDeviceMetadataInBatchRequest < 3) {
-    o.updates = buildUnnamed47();
+    o.updates = buildUnnamed54();
   }
   buildCounterUpdateDeviceMetadataInBatchRequest--;
   return o;
@@ -886,7 +1161,7 @@
     api.UpdateDeviceMetadataInBatchRequest o) {
   buildCounterUpdateDeviceMetadataInBatchRequest++;
   if (buildCounterUpdateDeviceMetadataInBatchRequest < 3) {
-    checkUnnamed47(o.updates);
+    checkUnnamed54(o.updates);
   }
   buildCounterUpdateDeviceMetadataInBatchRequest--;
 }
@@ -966,6 +1241,14 @@
     });
   });
 
+  unittest.group("obj-schema-Configuration", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildConfiguration();
+      var od = new api.Configuration.fromJson(o.toJson());
+      checkConfiguration(od);
+    });
+  });
+
   unittest.group("obj-schema-CreateCustomerRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateCustomerRequest();
@@ -974,6 +1257,62 @@
     });
   });
 
+  unittest.group("obj-schema-CustomerApplyConfigurationRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCustomerApplyConfigurationRequest();
+      var od = new api.CustomerApplyConfigurationRequest.fromJson(o.toJson());
+      checkCustomerApplyConfigurationRequest(od);
+    });
+  });
+
+  unittest.group("obj-schema-CustomerListConfigurationsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCustomerListConfigurationsResponse();
+      var od = new api.CustomerListConfigurationsResponse.fromJson(o.toJson());
+      checkCustomerListConfigurationsResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-CustomerListCustomersResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCustomerListCustomersResponse();
+      var od = new api.CustomerListCustomersResponse.fromJson(o.toJson());
+      checkCustomerListCustomersResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-CustomerListDevicesResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCustomerListDevicesResponse();
+      var od = new api.CustomerListDevicesResponse.fromJson(o.toJson());
+      checkCustomerListDevicesResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-CustomerListDpcsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCustomerListDpcsResponse();
+      var od = new api.CustomerListDpcsResponse.fromJson(o.toJson());
+      checkCustomerListDpcsResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-CustomerRemoveConfigurationRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCustomerRemoveConfigurationRequest();
+      var od = new api.CustomerRemoveConfigurationRequest.fromJson(o.toJson());
+      checkCustomerRemoveConfigurationRequest(od);
+    });
+  });
+
+  unittest.group("obj-schema-CustomerUnclaimDeviceRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCustomerUnclaimDeviceRequest();
+      var od = new api.CustomerUnclaimDeviceRequest.fromJson(o.toJson());
+      checkCustomerUnclaimDeviceRequest(od);
+    });
+  });
+
   unittest.group("obj-schema-Device", () {
     unittest.test("to-json--from-json", () {
       var o = buildDevice();
@@ -1006,6 +1345,14 @@
     });
   });
 
+  unittest.group("obj-schema-DeviceReference", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildDeviceReference();
+      var od = new api.DeviceReference.fromJson(o.toJson());
+      checkDeviceReference(od);
+    });
+  });
+
   unittest.group("obj-schema-DevicesLongRunningOperationMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildDevicesLongRunningOperationMetadata();
@@ -1022,6 +1369,14 @@
     });
   });
 
+  unittest.group("obj-schema-Dpc", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildDpc();
+      var od = new api.Dpc.fromJson(o.toJson());
+      checkDpc(od);
+    });
+  });
+
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -1160,6 +1515,680 @@
     });
   });
 
+  unittest.group("resource-CustomersResourceApi", () {
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.CustomersResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).customers;
+      var arg_pageToken = "foo";
+      var arg_pageSize = 42;
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 12),
+            unittest.equals("v1/customers"));
+        pathOffset += 12;
+
+        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]));
+          }
+        }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildCustomerListCustomersResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              $fields: arg_$fields)
+          .then(unittest
+              .expectAsync1(((api.CustomerListCustomersResponse response) {
+        checkCustomerListCustomersResponse(response);
+      })));
+    });
+  });
+
+  unittest.group("resource-CustomersConfigurationsResourceApi", () {
+    unittest.test("method--create", () {
+      var mock = new HttpServerMock();
+      api.CustomersConfigurationsResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).customers.configurations;
+      var arg_request = buildConfiguration();
+      var arg_parent = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.Configuration.fromJson(json);
+        checkConfiguration(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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildConfiguration());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .create(arg_request, arg_parent, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Configuration response) {
+        checkConfiguration(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+      var mock = new HttpServerMock();
+      api.CustomersConfigurationsResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).customers.configurations;
+      var arg_name = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildEmpty());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .delete(arg_name, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Empty response) {
+        checkEmpty(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.CustomersConfigurationsResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).customers.configurations;
+      var arg_name = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildConfiguration());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_name, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Configuration response) {
+        checkConfiguration(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.CustomersConfigurationsResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).customers.configurations;
+      var arg_parent = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp =
+            convert.JSON.encode(buildCustomerListConfigurationsResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_parent, $fields: arg_$fields).then(unittest
+          .expectAsync1(((api.CustomerListConfigurationsResponse response) {
+        checkCustomerListConfigurationsResponse(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+      var mock = new HttpServerMock();
+      api.CustomersConfigurationsResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).customers.configurations;
+      var arg_request = buildConfiguration();
+      var arg_name = "foo";
+      var arg_updateMask = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.Configuration.fromJson(json);
+        checkConfiguration(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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildConfiguration());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .patch(arg_request, arg_name,
+              updateMask: arg_updateMask, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Configuration response) {
+        checkConfiguration(response);
+      })));
+    });
+  });
+
+  unittest.group("resource-CustomersDevicesResourceApi", () {
+    unittest.test("method--applyConfiguration", () {
+      var mock = new HttpServerMock();
+      api.CustomersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).customers.devices;
+      var arg_request = buildCustomerApplyConfigurationRequest();
+      var arg_parent = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.CustomerApplyConfigurationRequest.fromJson(json);
+        checkCustomerApplyConfigurationRequest(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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildEmpty());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .applyConfiguration(arg_request, arg_parent, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Empty response) {
+        checkEmpty(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.CustomersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).customers.devices;
+      var arg_name = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildDevice());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_name, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Device response) {
+        checkDevice(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.CustomersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).customers.devices;
+      var arg_parent = "foo";
+      var arg_pageToken = "foo";
+      var arg_pageSize = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["pageSize"].first, unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildCustomerListDevicesResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_parent,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              $fields: arg_$fields)
+          .then(unittest
+              .expectAsync1(((api.CustomerListDevicesResponse response) {
+        checkCustomerListDevicesResponse(response);
+      })));
+    });
+
+    unittest.test("method--removeConfiguration", () {
+      var mock = new HttpServerMock();
+      api.CustomersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).customers.devices;
+      var arg_request = buildCustomerRemoveConfigurationRequest();
+      var arg_parent = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.CustomerRemoveConfigurationRequest.fromJson(json);
+        checkCustomerRemoveConfigurationRequest(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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildEmpty());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .removeConfiguration(arg_request, arg_parent, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Empty response) {
+        checkEmpty(response);
+      })));
+    });
+
+    unittest.test("method--unclaim", () {
+      var mock = new HttpServerMock();
+      api.CustomersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).customers.devices;
+      var arg_request = buildCustomerUnclaimDeviceRequest();
+      var arg_parent = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.CustomerUnclaimDeviceRequest.fromJson(json);
+        checkCustomerUnclaimDeviceRequest(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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildEmpty());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .unclaim(arg_request, arg_parent, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Empty response) {
+        checkEmpty(response);
+      })));
+    });
+  });
+
+  unittest.group("resource-CustomersDpcsResourceApi", () {
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.CustomersDpcsResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).customers.dpcs;
+      var arg_parent = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildCustomerListDpcsResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_parent, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.CustomerListDpcsResponse response) {
+        checkCustomerListDpcsResponse(response);
+      })));
+    });
+  });
+
   unittest.group("resource-OperationsResourceApi", () {
     unittest.test("method--get", () {
       var mock = new HttpServerMock();
diff --git a/generated/googleapis/test/androidenterprise/v1_test.dart b/generated/googleapis/test/androidenterprise/v1_test.dart
index fc6b148..ff66f6b 100644
--- a/generated/googleapis/test/androidenterprise/v1_test.dart
+++ b/generated/googleapis/test/androidenterprise/v1_test.dart
@@ -90,14 +90,14 @@
   buildCounterAdministratorWebToken--;
 }
 
-buildUnnamed2222() {
+buildUnnamed2244() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2222(core.List<core.String> o) {
+checkUnnamed2244(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -110,7 +110,7 @@
   if (buildCounterAdministratorWebTokenSpec < 3) {
     o.kind = "foo";
     o.parent = "foo";
-    o.permission = buildUnnamed2222();
+    o.permission = buildUnnamed2244();
   }
   buildCounterAdministratorWebTokenSpec--;
   return o;
@@ -121,7 +121,7 @@
   if (buildCounterAdministratorWebTokenSpec < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
-    checkUnnamed2222(o.permission);
+    checkUnnamed2244(o.permission);
   }
   buildCounterAdministratorWebTokenSpec--;
 }
@@ -147,14 +147,14 @@
   buildCounterAndroidDevicePolicyConfig--;
 }
 
-buildUnnamed2223() {
+buildUnnamed2245() {
   var o = new core.List<api.AppRestrictionsSchemaRestriction>();
   o.add(buildAppRestrictionsSchemaRestriction());
   o.add(buildAppRestrictionsSchemaRestriction());
   return o;
 }
 
-checkUnnamed2223(core.List<api.AppRestrictionsSchemaRestriction> o) {
+checkUnnamed2245(core.List<api.AppRestrictionsSchemaRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAppRestrictionsSchemaRestriction(o[0]);
   checkAppRestrictionsSchemaRestriction(o[1]);
@@ -166,7 +166,7 @@
   buildCounterAppRestrictionsSchema++;
   if (buildCounterAppRestrictionsSchema < 3) {
     o.kind = "foo";
-    o.restrictions = buildUnnamed2223();
+    o.restrictions = buildUnnamed2245();
   }
   buildCounterAppRestrictionsSchema--;
   return o;
@@ -176,7 +176,7 @@
   buildCounterAppRestrictionsSchema++;
   if (buildCounterAppRestrictionsSchema < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2223(o.restrictions);
+    checkUnnamed2245(o.restrictions);
   }
   buildCounterAppRestrictionsSchema--;
 }
@@ -200,40 +200,40 @@
   buildCounterAppRestrictionsSchemaChangeEvent--;
 }
 
-buildUnnamed2224() {
+buildUnnamed2246() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2224(core.List<core.String> o) {
+checkUnnamed2246(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2225() {
+buildUnnamed2247() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2225(core.List<core.String> o) {
+checkUnnamed2247(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2226() {
+buildUnnamed2248() {
   var o = new core.List<api.AppRestrictionsSchemaRestriction>();
   o.add(buildAppRestrictionsSchemaRestriction());
   o.add(buildAppRestrictionsSchemaRestriction());
   return o;
 }
 
-checkUnnamed2226(core.List<api.AppRestrictionsSchemaRestriction> o) {
+checkUnnamed2248(core.List<api.AppRestrictionsSchemaRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAppRestrictionsSchemaRestriction(o[0]);
   checkAppRestrictionsSchemaRestriction(o[1]);
@@ -246,10 +246,10 @@
   if (buildCounterAppRestrictionsSchemaRestriction < 3) {
     o.defaultValue = buildAppRestrictionsSchemaRestrictionRestrictionValue();
     o.description = "foo";
-    o.entry = buildUnnamed2224();
-    o.entryValue = buildUnnamed2225();
+    o.entry = buildUnnamed2246();
+    o.entryValue = buildUnnamed2247();
     o.key = "foo";
-    o.nestedRestriction = buildUnnamed2226();
+    o.nestedRestriction = buildUnnamed2248();
     o.restrictionType = "foo";
     o.title = "foo";
   }
@@ -262,24 +262,24 @@
   if (buildCounterAppRestrictionsSchemaRestriction < 3) {
     checkAppRestrictionsSchemaRestrictionRestrictionValue(o.defaultValue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2224(o.entry);
-    checkUnnamed2225(o.entryValue);
+    checkUnnamed2246(o.entry);
+    checkUnnamed2247(o.entryValue);
     unittest.expect(o.key, unittest.equals('foo'));
-    checkUnnamed2226(o.nestedRestriction);
+    checkUnnamed2248(o.nestedRestriction);
     unittest.expect(o.restrictionType, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterAppRestrictionsSchemaRestriction--;
 }
 
-buildUnnamed2227() {
+buildUnnamed2249() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2227(core.List<core.String> o) {
+checkUnnamed2249(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -293,7 +293,7 @@
     o.type = "foo";
     o.valueBool = true;
     o.valueInteger = 42;
-    o.valueMultiselect = buildUnnamed2227();
+    o.valueMultiselect = buildUnnamed2249();
     o.valueString = "foo";
   }
   buildCounterAppRestrictionsSchemaRestrictionRestrictionValue--;
@@ -307,7 +307,7 @@
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.valueBool, unittest.isTrue);
     unittest.expect(o.valueInteger, unittest.equals(42));
-    checkUnnamed2227(o.valueMultiselect);
+    checkUnnamed2249(o.valueMultiselect);
     unittest.expect(o.valueString, unittest.equals('foo'));
   }
   buildCounterAppRestrictionsSchemaRestrictionRestrictionValue--;
@@ -397,14 +397,14 @@
   buildCounterAuthenticationToken--;
 }
 
-buildUnnamed2228() {
+buildUnnamed2250() {
   var o = new core.List<api.VariableSet>();
   o.add(buildVariableSet());
   o.add(buildVariableSet());
   return o;
 }
 
-checkUnnamed2228(core.List<api.VariableSet> o) {
+checkUnnamed2250(core.List<api.VariableSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariableSet(o[0]);
   checkVariableSet(o[1]);
@@ -417,7 +417,7 @@
   if (buildCounterConfigurationVariables < 3) {
     o.kind = "foo";
     o.mcmId = "foo";
-    o.variableSet = buildUnnamed2228();
+    o.variableSet = buildUnnamed2250();
   }
   buildCounterConfigurationVariables--;
   return o;
@@ -428,7 +428,7 @@
   if (buildCounterConfigurationVariables < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.mcmId, unittest.equals('foo'));
-    checkUnnamed2228(o.variableSet);
+    checkUnnamed2250(o.variableSet);
   }
   buildCounterConfigurationVariables--;
 }
@@ -479,14 +479,14 @@
   buildCounterDeviceState--;
 }
 
-buildUnnamed2229() {
+buildUnnamed2251() {
   var o = new core.List<api.Device>();
   o.add(buildDevice());
   o.add(buildDevice());
   return o;
 }
 
-checkUnnamed2229(core.List<api.Device> o) {
+checkUnnamed2251(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDevice(o[0]);
   checkDevice(o[1]);
@@ -497,7 +497,7 @@
   var o = new api.DevicesListResponse();
   buildCounterDevicesListResponse++;
   if (buildCounterDevicesListResponse < 3) {
-    o.device = buildUnnamed2229();
+    o.device = buildUnnamed2251();
     o.kind = "foo";
   }
   buildCounterDevicesListResponse--;
@@ -507,20 +507,20 @@
 checkDevicesListResponse(api.DevicesListResponse o) {
   buildCounterDevicesListResponse++;
   if (buildCounterDevicesListResponse < 3) {
-    checkUnnamed2229(o.device);
+    checkUnnamed2251(o.device);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDevicesListResponse--;
 }
 
-buildUnnamed2230() {
+buildUnnamed2252() {
   var o = new core.List<api.Administrator>();
   o.add(buildAdministrator());
   o.add(buildAdministrator());
   return o;
 }
 
-checkUnnamed2230(core.List<api.Administrator> o) {
+checkUnnamed2252(core.List<api.Administrator> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdministrator(o[0]);
   checkAdministrator(o[1]);
@@ -531,7 +531,7 @@
   var o = new api.Enterprise();
   buildCounterEnterprise++;
   if (buildCounterEnterprise < 3) {
-    o.administrator = buildUnnamed2230();
+    o.administrator = buildUnnamed2252();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -544,7 +544,7 @@
 checkEnterprise(api.Enterprise o) {
   buildCounterEnterprise++;
   if (buildCounterEnterprise < 3) {
-    checkUnnamed2230(o.administrator);
+    checkUnnamed2252(o.administrator);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -574,14 +574,14 @@
   buildCounterEnterpriseAccount--;
 }
 
-buildUnnamed2231() {
+buildUnnamed2253() {
   var o = new core.List<api.Enterprise>();
   o.add(buildEnterprise());
   o.add(buildEnterprise());
   return o;
 }
 
-checkUnnamed2231(core.List<api.Enterprise> o) {
+checkUnnamed2253(core.List<api.Enterprise> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnterprise(o[0]);
   checkEnterprise(o[1]);
@@ -592,7 +592,7 @@
   var o = new api.EnterprisesListResponse();
   buildCounterEnterprisesListResponse++;
   if (buildCounterEnterprisesListResponse < 3) {
-    o.enterprise = buildUnnamed2231();
+    o.enterprise = buildUnnamed2253();
     o.kind = "foo";
   }
   buildCounterEnterprisesListResponse--;
@@ -602,7 +602,7 @@
 checkEnterprisesListResponse(api.EnterprisesListResponse o) {
   buildCounterEnterprisesListResponse++;
   if (buildCounterEnterprisesListResponse < 3) {
-    checkUnnamed2231(o.enterprise);
+    checkUnnamed2253(o.enterprise);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterEnterprisesListResponse--;
@@ -653,14 +653,14 @@
   buildCounterEntitlement--;
 }
 
-buildUnnamed2232() {
+buildUnnamed2254() {
   var o = new core.List<api.Entitlement>();
   o.add(buildEntitlement());
   o.add(buildEntitlement());
   return o;
 }
 
-checkUnnamed2232(core.List<api.Entitlement> o) {
+checkUnnamed2254(core.List<api.Entitlement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntitlement(o[0]);
   checkEntitlement(o[1]);
@@ -671,7 +671,7 @@
   var o = new api.EntitlementsListResponse();
   buildCounterEntitlementsListResponse++;
   if (buildCounterEntitlementsListResponse < 3) {
-    o.entitlement = buildUnnamed2232();
+    o.entitlement = buildUnnamed2254();
     o.kind = "foo";
   }
   buildCounterEntitlementsListResponse--;
@@ -681,7 +681,7 @@
 checkEntitlementsListResponse(api.EntitlementsListResponse o) {
   buildCounterEntitlementsListResponse++;
   if (buildCounterEntitlementsListResponse < 3) {
-    checkUnnamed2232(o.entitlement);
+    checkUnnamed2254(o.entitlement);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterEntitlementsListResponse--;
@@ -718,14 +718,14 @@
   buildCounterGroupLicense--;
 }
 
-buildUnnamed2233() {
+buildUnnamed2255() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed2233(core.List<api.User> o) {
+checkUnnamed2255(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
@@ -737,7 +737,7 @@
   buildCounterGroupLicenseUsersListResponse++;
   if (buildCounterGroupLicenseUsersListResponse < 3) {
     o.kind = "foo";
-    o.user = buildUnnamed2233();
+    o.user = buildUnnamed2255();
   }
   buildCounterGroupLicenseUsersListResponse--;
   return o;
@@ -747,19 +747,19 @@
   buildCounterGroupLicenseUsersListResponse++;
   if (buildCounterGroupLicenseUsersListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2233(o.user);
+    checkUnnamed2255(o.user);
   }
   buildCounterGroupLicenseUsersListResponse--;
 }
 
-buildUnnamed2234() {
+buildUnnamed2256() {
   var o = new core.List<api.GroupLicense>();
   o.add(buildGroupLicense());
   o.add(buildGroupLicense());
   return o;
 }
 
-checkUnnamed2234(core.List<api.GroupLicense> o) {
+checkUnnamed2256(core.List<api.GroupLicense> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGroupLicense(o[0]);
   checkGroupLicense(o[1]);
@@ -770,7 +770,7 @@
   var o = new api.GroupLicensesListResponse();
   buildCounterGroupLicensesListResponse++;
   if (buildCounterGroupLicensesListResponse < 3) {
-    o.groupLicense = buildUnnamed2234();
+    o.groupLicense = buildUnnamed2256();
     o.kind = "foo";
   }
   buildCounterGroupLicensesListResponse--;
@@ -780,7 +780,7 @@
 checkGroupLicensesListResponse(api.GroupLicensesListResponse o) {
   buildCounterGroupLicensesListResponse++;
   if (buildCounterGroupLicensesListResponse < 3) {
-    checkUnnamed2234(o.groupLicense);
+    checkUnnamed2256(o.groupLicense);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterGroupLicensesListResponse--;
@@ -838,14 +838,14 @@
   buildCounterInstallFailureEvent--;
 }
 
-buildUnnamed2235() {
+buildUnnamed2257() {
   var o = new core.List<api.Install>();
   o.add(buildInstall());
   o.add(buildInstall());
   return o;
 }
 
-checkUnnamed2235(core.List<api.Install> o) {
+checkUnnamed2257(core.List<api.Install> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstall(o[0]);
   checkInstall(o[1]);
@@ -856,7 +856,7 @@
   var o = new api.InstallsListResponse();
   buildCounterInstallsListResponse++;
   if (buildCounterInstallsListResponse < 3) {
-    o.install = buildUnnamed2235();
+    o.install = buildUnnamed2257();
     o.kind = "foo";
   }
   buildCounterInstallsListResponse--;
@@ -866,7 +866,7 @@
 checkInstallsListResponse(api.InstallsListResponse o) {
   buildCounterInstallsListResponse++;
   if (buildCounterInstallsListResponse < 3) {
-    checkUnnamed2235(o.install);
+    checkUnnamed2257(o.install);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterInstallsListResponse--;
@@ -893,14 +893,14 @@
   buildCounterLocalizedText--;
 }
 
-buildUnnamed2236() {
+buildUnnamed2258() {
   var o = new core.List<api.ManagedProperty>();
   o.add(buildManagedProperty());
   o.add(buildManagedProperty());
   return o;
 }
 
-checkUnnamed2236(core.List<api.ManagedProperty> o) {
+checkUnnamed2258(core.List<api.ManagedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedProperty(o[0]);
   checkManagedProperty(o[1]);
@@ -913,7 +913,7 @@
   if (buildCounterManagedConfiguration < 3) {
     o.configurationVariables = buildConfigurationVariables();
     o.kind = "foo";
-    o.managedProperty = buildUnnamed2236();
+    o.managedProperty = buildUnnamed2258();
     o.productId = "foo";
   }
   buildCounterManagedConfiguration--;
@@ -925,20 +925,20 @@
   if (buildCounterManagedConfiguration < 3) {
     checkConfigurationVariables(o.configurationVariables);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2236(o.managedProperty);
+    checkUnnamed2258(o.managedProperty);
     unittest.expect(o.productId, unittest.equals('foo'));
   }
   buildCounterManagedConfiguration--;
 }
 
-buildUnnamed2237() {
+buildUnnamed2259() {
   var o = new core.List<api.ManagedConfiguration>();
   o.add(buildManagedConfiguration());
   o.add(buildManagedConfiguration());
   return o;
 }
 
-checkUnnamed2237(core.List<api.ManagedConfiguration> o) {
+checkUnnamed2259(core.List<api.ManagedConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedConfiguration(o[0]);
   checkManagedConfiguration(o[1]);
@@ -950,7 +950,7 @@
   buildCounterManagedConfigurationsForDeviceListResponse++;
   if (buildCounterManagedConfigurationsForDeviceListResponse < 3) {
     o.kind = "foo";
-    o.managedConfigurationForDevice = buildUnnamed2237();
+    o.managedConfigurationForDevice = buildUnnamed2259();
   }
   buildCounterManagedConfigurationsForDeviceListResponse--;
   return o;
@@ -961,19 +961,19 @@
   buildCounterManagedConfigurationsForDeviceListResponse++;
   if (buildCounterManagedConfigurationsForDeviceListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2237(o.managedConfigurationForDevice);
+    checkUnnamed2259(o.managedConfigurationForDevice);
   }
   buildCounterManagedConfigurationsForDeviceListResponse--;
 }
 
-buildUnnamed2238() {
+buildUnnamed2260() {
   var o = new core.List<api.ManagedConfiguration>();
   o.add(buildManagedConfiguration());
   o.add(buildManagedConfiguration());
   return o;
 }
 
-checkUnnamed2238(core.List<api.ManagedConfiguration> o) {
+checkUnnamed2260(core.List<api.ManagedConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedConfiguration(o[0]);
   checkManagedConfiguration(o[1]);
@@ -985,7 +985,7 @@
   buildCounterManagedConfigurationsForUserListResponse++;
   if (buildCounterManagedConfigurationsForUserListResponse < 3) {
     o.kind = "foo";
-    o.managedConfigurationForUser = buildUnnamed2238();
+    o.managedConfigurationForUser = buildUnnamed2260();
   }
   buildCounterManagedConfigurationsForUserListResponse--;
   return o;
@@ -996,19 +996,19 @@
   buildCounterManagedConfigurationsForUserListResponse++;
   if (buildCounterManagedConfigurationsForUserListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2238(o.managedConfigurationForUser);
+    checkUnnamed2260(o.managedConfigurationForUser);
   }
   buildCounterManagedConfigurationsForUserListResponse--;
 }
 
-buildUnnamed2239() {
+buildUnnamed2261() {
   var o = new core.List<api.ManagedProperty>();
   o.add(buildManagedProperty());
   o.add(buildManagedProperty());
   return o;
 }
 
-checkUnnamed2239(core.List<api.ManagedProperty> o) {
+checkUnnamed2261(core.List<api.ManagedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedProperty(o[0]);
   checkManagedProperty(o[1]);
@@ -1020,7 +1020,7 @@
   buildCounterManagedConfigurationsSettings++;
   if (buildCounterManagedConfigurationsSettings < 3) {
     o.kind = "foo";
-    o.managedProperty = buildUnnamed2239();
+    o.managedProperty = buildUnnamed2261();
     o.mcmId = "foo";
     o.name = "foo";
   }
@@ -1032,21 +1032,21 @@
   buildCounterManagedConfigurationsSettings++;
   if (buildCounterManagedConfigurationsSettings < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2239(o.managedProperty);
+    checkUnnamed2261(o.managedProperty);
     unittest.expect(o.mcmId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterManagedConfigurationsSettings--;
 }
 
-buildUnnamed2240() {
+buildUnnamed2262() {
   var o = new core.List<api.ManagedConfigurationsSettings>();
   o.add(buildManagedConfigurationsSettings());
   o.add(buildManagedConfigurationsSettings());
   return o;
 }
 
-checkUnnamed2240(core.List<api.ManagedConfigurationsSettings> o) {
+checkUnnamed2262(core.List<api.ManagedConfigurationsSettings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedConfigurationsSettings(o[0]);
   checkManagedConfigurationsSettings(o[1]);
@@ -1058,7 +1058,7 @@
   buildCounterManagedConfigurationsSettingsListResponse++;
   if (buildCounterManagedConfigurationsSettingsListResponse < 3) {
     o.kind = "foo";
-    o.managedConfigurationsSettings = buildUnnamed2240();
+    o.managedConfigurationsSettings = buildUnnamed2262();
   }
   buildCounterManagedConfigurationsSettingsListResponse--;
   return o;
@@ -1069,32 +1069,32 @@
   buildCounterManagedConfigurationsSettingsListResponse++;
   if (buildCounterManagedConfigurationsSettingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2240(o.managedConfigurationsSettings);
+    checkUnnamed2262(o.managedConfigurationsSettings);
   }
   buildCounterManagedConfigurationsSettingsListResponse--;
 }
 
-buildUnnamed2241() {
+buildUnnamed2263() {
   var o = new core.List<api.ManagedPropertyBundle>();
   o.add(buildManagedPropertyBundle());
   o.add(buildManagedPropertyBundle());
   return o;
 }
 
-checkUnnamed2241(core.List<api.ManagedPropertyBundle> o) {
+checkUnnamed2263(core.List<api.ManagedPropertyBundle> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedPropertyBundle(o[0]);
   checkManagedPropertyBundle(o[1]);
 }
 
-buildUnnamed2242() {
+buildUnnamed2264() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2242(core.List<core.String> o) {
+checkUnnamed2264(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1108,10 +1108,10 @@
     o.key = "foo";
     o.valueBool = true;
     o.valueBundle = buildManagedPropertyBundle();
-    o.valueBundleArray = buildUnnamed2241();
+    o.valueBundleArray = buildUnnamed2263();
     o.valueInteger = 42;
     o.valueString = "foo";
-    o.valueStringArray = buildUnnamed2242();
+    o.valueStringArray = buildUnnamed2264();
   }
   buildCounterManagedProperty--;
   return o;
@@ -1123,22 +1123,22 @@
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.valueBool, unittest.isTrue);
     checkManagedPropertyBundle(o.valueBundle);
-    checkUnnamed2241(o.valueBundleArray);
+    checkUnnamed2263(o.valueBundleArray);
     unittest.expect(o.valueInteger, unittest.equals(42));
     unittest.expect(o.valueString, unittest.equals('foo'));
-    checkUnnamed2242(o.valueStringArray);
+    checkUnnamed2264(o.valueStringArray);
   }
   buildCounterManagedProperty--;
 }
 
-buildUnnamed2243() {
+buildUnnamed2265() {
   var o = new core.List<api.ManagedProperty>();
   o.add(buildManagedProperty());
   o.add(buildManagedProperty());
   return o;
 }
 
-checkUnnamed2243(core.List<api.ManagedProperty> o) {
+checkUnnamed2265(core.List<api.ManagedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedProperty(o[0]);
   checkManagedProperty(o[1]);
@@ -1149,7 +1149,7 @@
   var o = new api.ManagedPropertyBundle();
   buildCounterManagedPropertyBundle++;
   if (buildCounterManagedPropertyBundle < 3) {
-    o.managedProperty = buildUnnamed2243();
+    o.managedProperty = buildUnnamed2265();
   }
   buildCounterManagedPropertyBundle--;
   return o;
@@ -1158,7 +1158,7 @@
 checkManagedPropertyBundle(api.ManagedPropertyBundle o) {
   buildCounterManagedPropertyBundle++;
   if (buildCounterManagedPropertyBundle < 3) {
-    checkUnnamed2243(o.managedProperty);
+    checkUnnamed2265(o.managedProperty);
   }
   buildCounterManagedPropertyBundle--;
 }
@@ -1186,27 +1186,27 @@
   buildCounterNewDeviceEvent--;
 }
 
-buildUnnamed2244() {
+buildUnnamed2266() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2244(core.List<core.String> o) {
+checkUnnamed2266(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2245() {
+buildUnnamed2267() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2245(core.List<core.String> o) {
+checkUnnamed2267(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1217,9 +1217,9 @@
   var o = new api.NewPermissionsEvent();
   buildCounterNewPermissionsEvent++;
   if (buildCounterNewPermissionsEvent < 3) {
-    o.approvedPermissions = buildUnnamed2244();
+    o.approvedPermissions = buildUnnamed2266();
     o.productId = "foo";
-    o.requestedPermissions = buildUnnamed2245();
+    o.requestedPermissions = buildUnnamed2267();
   }
   buildCounterNewPermissionsEvent--;
   return o;
@@ -1228,9 +1228,9 @@
 checkNewPermissionsEvent(api.NewPermissionsEvent o) {
   buildCounterNewPermissionsEvent++;
   if (buildCounterNewPermissionsEvent < 3) {
-    checkUnnamed2244(o.approvedPermissions);
+    checkUnnamed2266(o.approvedPermissions);
     unittest.expect(o.productId, unittest.equals('foo'));
-    checkUnnamed2245(o.requestedPermissions);
+    checkUnnamed2267(o.requestedPermissions);
   }
   buildCounterNewPermissionsEvent--;
 }
@@ -1273,14 +1273,14 @@
   buildCounterNotification--;
 }
 
-buildUnnamed2246() {
+buildUnnamed2268() {
   var o = new core.List<api.Notification>();
   o.add(buildNotification());
   o.add(buildNotification());
   return o;
 }
 
-checkUnnamed2246(core.List<api.Notification> o) {
+checkUnnamed2268(core.List<api.Notification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNotification(o[0]);
   checkNotification(o[1]);
@@ -1292,7 +1292,7 @@
   buildCounterNotificationSet++;
   if (buildCounterNotificationSet < 3) {
     o.kind = "foo";
-    o.notification = buildUnnamed2246();
+    o.notification = buildUnnamed2268();
     o.notificationSetId = "foo";
   }
   buildCounterNotificationSet--;
@@ -1303,7 +1303,7 @@
   buildCounterNotificationSet++;
   if (buildCounterNotificationSet < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2246(o.notification);
+    checkUnnamed2268(o.notification);
     unittest.expect(o.notificationSetId, unittest.equals('foo'));
   }
   buildCounterNotificationSet--;
@@ -1357,14 +1357,14 @@
   buildCounterPermission--;
 }
 
-buildUnnamed2247() {
+buildUnnamed2269() {
   var o = new core.List<api.ProductPolicy>();
   o.add(buildProductPolicy());
   o.add(buildProductPolicy());
   return o;
 }
 
-checkUnnamed2247(core.List<api.ProductPolicy> o) {
+checkUnnamed2269(core.List<api.ProductPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductPolicy(o[0]);
   checkProductPolicy(o[1]);
@@ -1376,7 +1376,7 @@
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
     o.productAvailabilityPolicy = "foo";
-    o.productPolicy = buildUnnamed2247();
+    o.productPolicy = buildUnnamed2269();
   }
   buildCounterPolicy--;
   return o;
@@ -1386,32 +1386,71 @@
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
     unittest.expect(o.productAvailabilityPolicy, unittest.equals('foo'));
-    checkUnnamed2247(o.productPolicy);
+    checkUnnamed2269(o.productPolicy);
   }
   buildCounterPolicy--;
 }
 
-buildUnnamed2248() {
+buildUnnamed2270() {
   var o = new core.List<api.AppVersion>();
   o.add(buildAppVersion());
   o.add(buildAppVersion());
   return o;
 }
 
-checkUnnamed2248(core.List<api.AppVersion> o) {
+checkUnnamed2270(core.List<api.AppVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAppVersion(o[0]);
   checkAppVersion(o[1]);
 }
 
-buildUnnamed2249() {
+buildUnnamed2271() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2249(core.List<core.String> o) {
+checkUnnamed2271(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2272() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2272(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2273() {
+  var o = new core.List<api.ProductPermission>();
+  o.add(buildProductPermission());
+  o.add(buildProductPermission());
+  return o;
+}
+
+checkUnnamed2273(core.List<api.ProductPermission> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkProductPermission(o[0]);
+  checkProductPermission(o[1]);
+}
+
+buildUnnamed2274() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2274(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1422,16 +1461,25 @@
   var o = new api.Product();
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    o.appVersion = buildUnnamed2248();
+    o.appVersion = buildUnnamed2270();
     o.authorName = "foo";
-    o.availableTracks = buildUnnamed2249();
+    o.availableCountries = buildUnnamed2271();
+    o.availableTracks = buildUnnamed2272();
+    o.category = "foo";
+    o.contentRating = "foo";
+    o.description = "foo";
     o.detailsUrl = "foo";
     o.distributionChannel = "foo";
     o.iconUrl = "foo";
     o.kind = "foo";
+    o.lastUpdatedTimestampMillis = "foo";
+    o.minAndroidSdkVersion = 42;
+    o.permissions = buildUnnamed2273();
     o.productId = "foo";
     o.productPricing = "foo";
+    o.recentChanges = "foo";
     o.requiresContainerApp = true;
+    o.screenshotUrls = buildUnnamed2274();
     o.signingCertificate = buildProductSigningCertificate();
     o.smallIconUrl = "foo";
     o.title = "foo";
@@ -1444,16 +1492,25 @@
 checkProduct(api.Product o) {
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    checkUnnamed2248(o.appVersion);
+    checkUnnamed2270(o.appVersion);
     unittest.expect(o.authorName, unittest.equals('foo'));
-    checkUnnamed2249(o.availableTracks);
+    checkUnnamed2271(o.availableCountries);
+    checkUnnamed2272(o.availableTracks);
+    unittest.expect(o.category, unittest.equals('foo'));
+    unittest.expect(o.contentRating, unittest.equals('foo'));
+    unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.detailsUrl, unittest.equals('foo'));
     unittest.expect(o.distributionChannel, unittest.equals('foo'));
     unittest.expect(o.iconUrl, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.lastUpdatedTimestampMillis, unittest.equals('foo'));
+    unittest.expect(o.minAndroidSdkVersion, unittest.equals(42));
+    checkUnnamed2273(o.permissions);
     unittest.expect(o.productId, unittest.equals('foo'));
     unittest.expect(o.productPricing, unittest.equals('foo'));
+    unittest.expect(o.recentChanges, unittest.equals('foo'));
     unittest.expect(o.requiresContainerApp, unittest.isTrue);
+    checkUnnamed2274(o.screenshotUrls);
     checkProductSigningCertificate(o.signingCertificate);
     unittest.expect(o.smallIconUrl, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
@@ -1525,14 +1582,14 @@
   buildCounterProductPermission--;
 }
 
-buildUnnamed2250() {
+buildUnnamed2275() {
   var o = new core.List<api.ProductPermission>();
   o.add(buildProductPermission());
   o.add(buildProductPermission());
   return o;
 }
 
-checkUnnamed2250(core.List<api.ProductPermission> o) {
+checkUnnamed2275(core.List<api.ProductPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductPermission(o[0]);
   checkProductPermission(o[1]);
@@ -1544,7 +1601,7 @@
   buildCounterProductPermissions++;
   if (buildCounterProductPermissions < 3) {
     o.kind = "foo";
-    o.permission = buildUnnamed2250();
+    o.permission = buildUnnamed2275();
     o.productId = "foo";
   }
   buildCounterProductPermissions--;
@@ -1555,20 +1612,20 @@
   buildCounterProductPermissions++;
   if (buildCounterProductPermissions < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2250(o.permission);
+    checkUnnamed2275(o.permission);
     unittest.expect(o.productId, unittest.equals('foo'));
   }
   buildCounterProductPermissions--;
 }
 
-buildUnnamed2251() {
+buildUnnamed2276() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2251(core.List<core.String> o) {
+checkUnnamed2276(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1580,7 +1637,7 @@
   buildCounterProductPolicy++;
   if (buildCounterProductPolicy < 3) {
     o.productId = "foo";
-    o.tracks = buildUnnamed2251();
+    o.tracks = buildUnnamed2276();
   }
   buildCounterProductPolicy--;
   return o;
@@ -1590,32 +1647,32 @@
   buildCounterProductPolicy++;
   if (buildCounterProductPolicy < 3) {
     unittest.expect(o.productId, unittest.equals('foo'));
-    checkUnnamed2251(o.tracks);
+    checkUnnamed2276(o.tracks);
   }
   buildCounterProductPolicy--;
 }
 
-buildUnnamed2252() {
+buildUnnamed2277() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2252(core.List<core.String> o) {
+checkUnnamed2277(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2253() {
+buildUnnamed2278() {
   var o = new core.List<api.ProductVisibility>();
   o.add(buildProductVisibility());
   o.add(buildProductVisibility());
   return o;
 }
 
-checkUnnamed2253(core.List<api.ProductVisibility> o) {
+checkUnnamed2278(core.List<api.ProductVisibility> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductVisibility(o[0]);
   checkProductVisibility(o[1]);
@@ -1627,9 +1684,9 @@
   buildCounterProductSet++;
   if (buildCounterProductSet < 3) {
     o.kind = "foo";
-    o.productId = buildUnnamed2252();
+    o.productId = buildUnnamed2277();
     o.productSetBehavior = "foo";
-    o.productVisibility = buildUnnamed2253();
+    o.productVisibility = buildUnnamed2278();
   }
   buildCounterProductSet--;
   return o;
@@ -1639,9 +1696,9 @@
   buildCounterProductSet++;
   if (buildCounterProductSet < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2252(o.productId);
+    checkUnnamed2277(o.productId);
     unittest.expect(o.productSetBehavior, unittest.equals('foo'));
-    checkUnnamed2253(o.productVisibility);
+    checkUnnamed2278(o.productVisibility);
   }
   buildCounterProductSet--;
 }
@@ -1667,14 +1724,14 @@
   buildCounterProductSigningCertificate--;
 }
 
-buildUnnamed2254() {
+buildUnnamed2279() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2254(core.List<core.String> o) {
+checkUnnamed2279(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1686,7 +1743,7 @@
   buildCounterProductVisibility++;
   if (buildCounterProductVisibility < 3) {
     o.productId = "foo";
-    o.tracks = buildUnnamed2254();
+    o.tracks = buildUnnamed2279();
   }
   buildCounterProductVisibility--;
   return o;
@@ -1696,7 +1753,7 @@
   buildCounterProductVisibility++;
   if (buildCounterProductVisibility < 3) {
     unittest.expect(o.productId, unittest.equals('foo'));
-    checkUnnamed2254(o.tracks);
+    checkUnnamed2279(o.tracks);
   }
   buildCounterProductVisibility--;
 }
@@ -1742,14 +1799,14 @@
   buildCounterProductsGenerateApprovalUrlResponse--;
 }
 
-buildUnnamed2255() {
+buildUnnamed2280() {
   var o = new core.List<api.Product>();
   o.add(buildProduct());
   o.add(buildProduct());
   return o;
 }
 
-checkUnnamed2255(core.List<api.Product> o) {
+checkUnnamed2280(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProduct(o[0]);
   checkProduct(o[1]);
@@ -1762,7 +1819,7 @@
   if (buildCounterProductsListResponse < 3) {
     o.kind = "foo";
     o.pageInfo = buildPageInfo();
-    o.product = buildUnnamed2255();
+    o.product = buildUnnamed2280();
     o.tokenPagination = buildTokenPagination();
   }
   buildCounterProductsListResponse--;
@@ -1774,7 +1831,7 @@
   if (buildCounterProductsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
-    checkUnnamed2255(o.product);
+    checkUnnamed2280(o.product);
     checkTokenPagination(o.tokenPagination);
   }
   buildCounterProductsListResponse--;
@@ -1830,14 +1887,14 @@
   buildCounterServiceAccountKey--;
 }
 
-buildUnnamed2256() {
+buildUnnamed2281() {
   var o = new core.List<api.ServiceAccountKey>();
   o.add(buildServiceAccountKey());
   o.add(buildServiceAccountKey());
   return o;
 }
 
-checkUnnamed2256(core.List<api.ServiceAccountKey> o) {
+checkUnnamed2281(core.List<api.ServiceAccountKey> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccountKey(o[0]);
   checkServiceAccountKey(o[1]);
@@ -1848,7 +1905,7 @@
   var o = new api.ServiceAccountKeysListResponse();
   buildCounterServiceAccountKeysListResponse++;
   if (buildCounterServiceAccountKeysListResponse < 3) {
-    o.serviceAccountKey = buildUnnamed2256();
+    o.serviceAccountKey = buildUnnamed2281();
   }
   buildCounterServiceAccountKeysListResponse--;
   return o;
@@ -1857,7 +1914,7 @@
 checkServiceAccountKeysListResponse(api.ServiceAccountKeysListResponse o) {
   buildCounterServiceAccountKeysListResponse++;
   if (buildCounterServiceAccountKeysListResponse < 3) {
-    checkUnnamed2256(o.serviceAccountKey);
+    checkUnnamed2281(o.serviceAccountKey);
   }
   buildCounterServiceAccountKeysListResponse--;
 }
@@ -1885,27 +1942,27 @@
   buildCounterSignupInfo--;
 }
 
-buildUnnamed2257() {
+buildUnnamed2282() {
   var o = new core.List<api.LocalizedText>();
   o.add(buildLocalizedText());
   o.add(buildLocalizedText());
   return o;
 }
 
-checkUnnamed2257(core.List<api.LocalizedText> o) {
+checkUnnamed2282(core.List<api.LocalizedText> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocalizedText(o[0]);
   checkLocalizedText(o[1]);
 }
 
-buildUnnamed2258() {
+buildUnnamed2283() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2258(core.List<core.String> o) {
+checkUnnamed2283(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1918,9 +1975,9 @@
   if (buildCounterStoreCluster < 3) {
     o.id = "foo";
     o.kind = "foo";
-    o.name = buildUnnamed2257();
+    o.name = buildUnnamed2282();
     o.orderInPage = "foo";
-    o.productId = buildUnnamed2258();
+    o.productId = buildUnnamed2283();
   }
   buildCounterStoreCluster--;
   return o;
@@ -1931,9 +1988,9 @@
   if (buildCounterStoreCluster < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2257(o.name);
+    checkUnnamed2282(o.name);
     unittest.expect(o.orderInPage, unittest.equals('foo'));
-    checkUnnamed2258(o.productId);
+    checkUnnamed2283(o.productId);
   }
   buildCounterStoreCluster--;
 }
@@ -1961,14 +2018,14 @@
   buildCounterStoreLayout--;
 }
 
-buildUnnamed2259() {
+buildUnnamed2284() {
   var o = new core.List<api.StoreCluster>();
   o.add(buildStoreCluster());
   o.add(buildStoreCluster());
   return o;
 }
 
-checkUnnamed2259(core.List<api.StoreCluster> o) {
+checkUnnamed2284(core.List<api.StoreCluster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStoreCluster(o[0]);
   checkStoreCluster(o[1]);
@@ -1979,7 +2036,7 @@
   var o = new api.StoreLayoutClustersListResponse();
   buildCounterStoreLayoutClustersListResponse++;
   if (buildCounterStoreLayoutClustersListResponse < 3) {
-    o.cluster = buildUnnamed2259();
+    o.cluster = buildUnnamed2284();
     o.kind = "foo";
   }
   buildCounterStoreLayoutClustersListResponse--;
@@ -1989,20 +2046,20 @@
 checkStoreLayoutClustersListResponse(api.StoreLayoutClustersListResponse o) {
   buildCounterStoreLayoutClustersListResponse++;
   if (buildCounterStoreLayoutClustersListResponse < 3) {
-    checkUnnamed2259(o.cluster);
+    checkUnnamed2284(o.cluster);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterStoreLayoutClustersListResponse--;
 }
 
-buildUnnamed2260() {
+buildUnnamed2285() {
   var o = new core.List<api.StorePage>();
   o.add(buildStorePage());
   o.add(buildStorePage());
   return o;
 }
 
-checkUnnamed2260(core.List<api.StorePage> o) {
+checkUnnamed2285(core.List<api.StorePage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStorePage(o[0]);
   checkStorePage(o[1]);
@@ -2014,7 +2071,7 @@
   buildCounterStoreLayoutPagesListResponse++;
   if (buildCounterStoreLayoutPagesListResponse < 3) {
     o.kind = "foo";
-    o.page = buildUnnamed2260();
+    o.page = buildUnnamed2285();
   }
   buildCounterStoreLayoutPagesListResponse--;
   return o;
@@ -2024,32 +2081,32 @@
   buildCounterStoreLayoutPagesListResponse++;
   if (buildCounterStoreLayoutPagesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2260(o.page);
+    checkUnnamed2285(o.page);
   }
   buildCounterStoreLayoutPagesListResponse--;
 }
 
-buildUnnamed2261() {
+buildUnnamed2286() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2261(core.List<core.String> o) {
+checkUnnamed2286(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2262() {
+buildUnnamed2287() {
   var o = new core.List<api.LocalizedText>();
   o.add(buildLocalizedText());
   o.add(buildLocalizedText());
   return o;
 }
 
-checkUnnamed2262(core.List<api.LocalizedText> o) {
+checkUnnamed2287(core.List<api.LocalizedText> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocalizedText(o[0]);
   checkLocalizedText(o[1]);
@@ -2062,8 +2119,8 @@
   if (buildCounterStorePage < 3) {
     o.id = "foo";
     o.kind = "foo";
-    o.link = buildUnnamed2261();
-    o.name = buildUnnamed2262();
+    o.link = buildUnnamed2286();
+    o.name = buildUnnamed2287();
   }
   buildCounterStorePage--;
   return o;
@@ -2074,8 +2131,8 @@
   if (buildCounterStorePage < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2261(o.link);
-    checkUnnamed2262(o.name);
+    checkUnnamed2286(o.link);
+    checkUnnamed2287(o.name);
   }
   buildCounterStorePage--;
 }
@@ -2155,14 +2212,14 @@
   buildCounterUserToken--;
 }
 
-buildUnnamed2263() {
+buildUnnamed2288() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed2263(core.List<api.User> o) {
+checkUnnamed2288(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
@@ -2174,7 +2231,7 @@
   buildCounterUsersListResponse++;
   if (buildCounterUsersListResponse < 3) {
     o.kind = "foo";
-    o.user = buildUnnamed2263();
+    o.user = buildUnnamed2288();
   }
   buildCounterUsersListResponse--;
   return o;
@@ -2184,7 +2241,7 @@
   buildCounterUsersListResponse++;
   if (buildCounterUsersListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2263(o.user);
+    checkUnnamed2288(o.user);
   }
   buildCounterUsersListResponse--;
 }
diff --git a/generated/googleapis/test/androidmanagement/v1_test.dart b/generated/googleapis/test/androidmanagement/v1_test.dart
index 1673e07..52a5e17 100644
--- a/generated/googleapis/test/androidmanagement/v1_test.dart
+++ b/generated/googleapis/test/androidmanagement/v1_test.dart
@@ -90,27 +90,27 @@
   buildCounterApiLevelCondition--;
 }
 
-buildUnnamed1614() {
+buildUnnamed1636() {
   var o = new core.List<api.ManagedProperty>();
   o.add(buildManagedProperty());
   o.add(buildManagedProperty());
   return o;
 }
 
-checkUnnamed1614(core.List<api.ManagedProperty> o) {
+checkUnnamed1636(core.List<api.ManagedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedProperty(o[0]);
   checkManagedProperty(o[1]);
 }
 
-buildUnnamed1615() {
+buildUnnamed1637() {
   var o = new core.List<api.ApplicationPermission>();
   o.add(buildApplicationPermission());
   o.add(buildApplicationPermission());
   return o;
 }
 
-checkUnnamed1615(core.List<api.ApplicationPermission> o) {
+checkUnnamed1637(core.List<api.ApplicationPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApplicationPermission(o[0]);
   checkApplicationPermission(o[1]);
@@ -121,9 +121,9 @@
   var o = new api.Application();
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
-    o.managedProperties = buildUnnamed1614();
+    o.managedProperties = buildUnnamed1636();
     o.name = "foo";
-    o.permissions = buildUnnamed1615();
+    o.permissions = buildUnnamed1637();
     o.title = "foo";
   }
   buildCounterApplication--;
@@ -133,9 +133,9 @@
 checkApplication(api.Application o) {
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
-    checkUnnamed1614(o.managedProperties);
+    checkUnnamed1636(o.managedProperties);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1615(o.permissions);
+    checkUnnamed1637(o.permissions);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterApplication--;
@@ -164,7 +164,7 @@
   buildCounterApplicationPermission--;
 }
 
-buildUnnamed1616() {
+buildUnnamed1638() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -179,7 +179,7 @@
   return o;
 }
 
-checkUnnamed1616(core.Map<core.String, core.Object> o) {
+checkUnnamed1638(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));
@@ -193,14 +193,14 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1617() {
+buildUnnamed1639() {
   var o = new core.List<api.PermissionGrant>();
   o.add(buildPermissionGrant());
   o.add(buildPermissionGrant());
   return o;
 }
 
-checkUnnamed1617(core.List<api.PermissionGrant> o) {
+checkUnnamed1639(core.List<api.PermissionGrant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermissionGrant(o[0]);
   checkPermissionGrant(o[1]);
@@ -214,9 +214,9 @@
     o.defaultPermissionPolicy = "foo";
     o.installType = "foo";
     o.lockTaskAllowed = true;
-    o.managedConfiguration = buildUnnamed1616();
+    o.managedConfiguration = buildUnnamed1638();
     o.packageName = "foo";
-    o.permissionGrants = buildUnnamed1617();
+    o.permissionGrants = buildUnnamed1639();
   }
   buildCounterApplicationPolicy--;
   return o;
@@ -228,21 +228,21 @@
     unittest.expect(o.defaultPermissionPolicy, unittest.equals('foo'));
     unittest.expect(o.installType, unittest.equals('foo'));
     unittest.expect(o.lockTaskAllowed, unittest.isTrue);
-    checkUnnamed1616(o.managedConfiguration);
+    checkUnnamed1638(o.managedConfiguration);
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed1617(o.permissionGrants);
+    checkUnnamed1639(o.permissionGrants);
   }
   buildCounterApplicationPolicy--;
 }
 
-buildUnnamed1618() {
+buildUnnamed1640() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1618(core.List<core.String> o) {
+checkUnnamed1640(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -256,7 +256,7 @@
     o.createTime = "foo";
     o.duration = "foo";
     o.newPassword = "foo";
-    o.resetPasswordFlags = buildUnnamed1618();
+    o.resetPasswordFlags = buildUnnamed1640();
     o.type = "foo";
   }
   buildCounterCommand--;
@@ -269,7 +269,7 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.duration, unittest.equals('foo'));
     unittest.expect(o.newPassword, unittest.equals('foo'));
-    checkUnnamed1618(o.resetPasswordFlags);
+    checkUnnamed1640(o.resetPasswordFlags);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterCommand--;
@@ -298,79 +298,79 @@
   buildCounterComplianceRule--;
 }
 
-buildUnnamed1619() {
+buildUnnamed1641() {
   var o = new core.List<api.Display>();
   o.add(buildDisplay());
   o.add(buildDisplay());
   return o;
 }
 
-checkUnnamed1619(core.List<api.Display> o) {
+checkUnnamed1641(core.List<api.Display> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisplay(o[0]);
   checkDisplay(o[1]);
 }
 
-buildUnnamed1620() {
+buildUnnamed1642() {
   var o = new core.List<api.HardwareStatus>();
   o.add(buildHardwareStatus());
   o.add(buildHardwareStatus());
   return o;
 }
 
-checkUnnamed1620(core.List<api.HardwareStatus> o) {
+checkUnnamed1642(core.List<api.HardwareStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHardwareStatus(o[0]);
   checkHardwareStatus(o[1]);
 }
 
-buildUnnamed1621() {
+buildUnnamed1643() {
   var o = new core.List<api.MemoryEvent>();
   o.add(buildMemoryEvent());
   o.add(buildMemoryEvent());
   return o;
 }
 
-checkUnnamed1621(core.List<api.MemoryEvent> o) {
+checkUnnamed1643(core.List<api.MemoryEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMemoryEvent(o[0]);
   checkMemoryEvent(o[1]);
 }
 
-buildUnnamed1622() {
+buildUnnamed1644() {
   var o = new core.List<api.NonComplianceDetail>();
   o.add(buildNonComplianceDetail());
   o.add(buildNonComplianceDetail());
   return o;
 }
 
-checkUnnamed1622(core.List<api.NonComplianceDetail> o) {
+checkUnnamed1644(core.List<api.NonComplianceDetail> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNonComplianceDetail(o[0]);
   checkNonComplianceDetail(o[1]);
 }
 
-buildUnnamed1623() {
+buildUnnamed1645() {
   var o = new core.List<api.PowerManagementEvent>();
   o.add(buildPowerManagementEvent());
   o.add(buildPowerManagementEvent());
   return o;
 }
 
-checkUnnamed1623(core.List<api.PowerManagementEvent> o) {
+checkUnnamed1645(core.List<api.PowerManagementEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPowerManagementEvent(o[0]);
   checkPowerManagementEvent(o[1]);
 }
 
-buildUnnamed1624() {
+buildUnnamed1646() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1624(core.List<core.String> o) {
+checkUnnamed1646(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -385,25 +385,26 @@
     o.appliedPolicyName = "foo";
     o.appliedPolicyVersion = "foo";
     o.appliedState = "foo";
+    o.deviceSettings = buildDeviceSettings();
     o.disabledReason = buildUserFacingMessage();
-    o.displays = buildUnnamed1619();
+    o.displays = buildUnnamed1641();
     o.enrollmentTime = "foo";
     o.enrollmentTokenData = "foo";
     o.enrollmentTokenName = "foo";
     o.hardwareInfo = buildHardwareInfo();
-    o.hardwareStatusSamples = buildUnnamed1620();
+    o.hardwareStatusSamples = buildUnnamed1642();
     o.lastPolicyComplianceReportTime = "foo";
     o.lastPolicySyncTime = "foo";
     o.lastStatusReportTime = "foo";
-    o.memoryEvents = buildUnnamed1621();
+    o.memoryEvents = buildUnnamed1643();
     o.memoryInfo = buildMemoryInfo();
     o.name = "foo";
     o.networkInfo = buildNetworkInfo();
-    o.nonComplianceDetails = buildUnnamed1622();
+    o.nonComplianceDetails = buildUnnamed1644();
     o.policyCompliant = true;
     o.policyName = "foo";
-    o.powerManagementEvents = buildUnnamed1623();
-    o.previousDeviceNames = buildUnnamed1624();
+    o.powerManagementEvents = buildUnnamed1645();
+    o.previousDeviceNames = buildUnnamed1646();
     o.softwareInfo = buildSoftwareInfo();
     o.state = "foo";
     o.userName = "foo";
@@ -419,25 +420,26 @@
     unittest.expect(o.appliedPolicyName, unittest.equals('foo'));
     unittest.expect(o.appliedPolicyVersion, unittest.equals('foo'));
     unittest.expect(o.appliedState, unittest.equals('foo'));
+    checkDeviceSettings(o.deviceSettings);
     checkUserFacingMessage(o.disabledReason);
-    checkUnnamed1619(o.displays);
+    checkUnnamed1641(o.displays);
     unittest.expect(o.enrollmentTime, unittest.equals('foo'));
     unittest.expect(o.enrollmentTokenData, unittest.equals('foo'));
     unittest.expect(o.enrollmentTokenName, unittest.equals('foo'));
     checkHardwareInfo(o.hardwareInfo);
-    checkUnnamed1620(o.hardwareStatusSamples);
+    checkUnnamed1642(o.hardwareStatusSamples);
     unittest.expect(o.lastPolicyComplianceReportTime, unittest.equals('foo'));
     unittest.expect(o.lastPolicySyncTime, unittest.equals('foo'));
     unittest.expect(o.lastStatusReportTime, unittest.equals('foo'));
-    checkUnnamed1621(o.memoryEvents);
+    checkUnnamed1643(o.memoryEvents);
     checkMemoryInfo(o.memoryInfo);
     unittest.expect(o.name, unittest.equals('foo'));
     checkNetworkInfo(o.networkInfo);
-    checkUnnamed1622(o.nonComplianceDetails);
+    checkUnnamed1644(o.nonComplianceDetails);
     unittest.expect(o.policyCompliant, unittest.isTrue);
     unittest.expect(o.policyName, unittest.equals('foo'));
-    checkUnnamed1623(o.powerManagementEvents);
-    checkUnnamed1624(o.previousDeviceNames);
+    checkUnnamed1645(o.powerManagementEvents);
+    checkUnnamed1646(o.previousDeviceNames);
     checkSoftwareInfo(o.softwareInfo);
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.userName, unittest.equals('foo'));
@@ -445,6 +447,35 @@
   buildCounterDevice--;
 }
 
+core.int buildCounterDeviceSettings = 0;
+buildDeviceSettings() {
+  var o = new api.DeviceSettings();
+  buildCounterDeviceSettings++;
+  if (buildCounterDeviceSettings < 3) {
+    o.adbEnabled = true;
+    o.developmentSettingsEnabled = true;
+    o.encryptionStatus = "foo";
+    o.isDeviceSecure = true;
+    o.isEncrypted = true;
+    o.unknownSourcesEnabled = true;
+  }
+  buildCounterDeviceSettings--;
+  return o;
+}
+
+checkDeviceSettings(api.DeviceSettings o) {
+  buildCounterDeviceSettings++;
+  if (buildCounterDeviceSettings < 3) {
+    unittest.expect(o.adbEnabled, unittest.isTrue);
+    unittest.expect(o.developmentSettingsEnabled, unittest.isTrue);
+    unittest.expect(o.encryptionStatus, unittest.equals('foo'));
+    unittest.expect(o.isDeviceSecure, unittest.isTrue);
+    unittest.expect(o.isEncrypted, unittest.isTrue);
+    unittest.expect(o.unknownSourcesEnabled, unittest.isTrue);
+  }
+  buildCounterDeviceSettings--;
+}
+
 core.int buildCounterDisplay = 0;
 buildDisplay() {
   var o = new api.Display();
@@ -522,14 +553,14 @@
   buildCounterEnrollmentToken--;
 }
 
-buildUnnamed1625() {
+buildUnnamed1647() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1625(core.List<core.String> o) {
+checkUnnamed1647(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -541,7 +572,7 @@
   buildCounterEnterprise++;
   if (buildCounterEnterprise < 3) {
     o.appAutoApprovalEnabled = true;
-    o.enabledNotificationTypes = buildUnnamed1625();
+    o.enabledNotificationTypes = buildUnnamed1647();
     o.enterpriseDisplayName = "foo";
     o.logo = buildExternalData();
     o.name = "foo";
@@ -556,7 +587,7 @@
   buildCounterEnterprise++;
   if (buildCounterEnterprise < 3) {
     unittest.expect(o.appAutoApprovalEnabled, unittest.isTrue);
-    checkUnnamed1625(o.enabledNotificationTypes);
+    checkUnnamed1647(o.enabledNotificationTypes);
     unittest.expect(o.enterpriseDisplayName, unittest.equals('foo'));
     checkExternalData(o.logo);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -587,105 +618,105 @@
   buildCounterExternalData--;
 }
 
-buildUnnamed1626() {
+buildUnnamed1648() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1626(core.List<core.double> o) {
+checkUnnamed1648(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));
 }
 
-buildUnnamed1627() {
+buildUnnamed1649() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1627(core.List<core.double> o) {
+checkUnnamed1649(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));
 }
 
-buildUnnamed1628() {
+buildUnnamed1650() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1628(core.List<core.double> o) {
+checkUnnamed1650(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));
 }
 
-buildUnnamed1629() {
+buildUnnamed1651() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1629(core.List<core.double> o) {
+checkUnnamed1651(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));
 }
 
-buildUnnamed1630() {
+buildUnnamed1652() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1630(core.List<core.double> o) {
+checkUnnamed1652(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));
 }
 
-buildUnnamed1631() {
+buildUnnamed1653() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1631(core.List<core.double> o) {
+checkUnnamed1653(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));
 }
 
-buildUnnamed1632() {
+buildUnnamed1654() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1632(core.List<core.double> o) {
+checkUnnamed1654(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));
 }
 
-buildUnnamed1633() {
+buildUnnamed1655() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1633(core.List<core.double> o) {
+checkUnnamed1655(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));
@@ -696,20 +727,20 @@
   var o = new api.HardwareInfo();
   buildCounterHardwareInfo++;
   if (buildCounterHardwareInfo < 3) {
-    o.batteryShutdownTemperatures = buildUnnamed1626();
-    o.batteryThrottlingTemperatures = buildUnnamed1627();
+    o.batteryShutdownTemperatures = buildUnnamed1648();
+    o.batteryThrottlingTemperatures = buildUnnamed1649();
     o.brand = "foo";
-    o.cpuShutdownTemperatures = buildUnnamed1628();
-    o.cpuThrottlingTemperatures = buildUnnamed1629();
+    o.cpuShutdownTemperatures = buildUnnamed1650();
+    o.cpuThrottlingTemperatures = buildUnnamed1651();
     o.deviceBasebandVersion = "foo";
-    o.gpuShutdownTemperatures = buildUnnamed1630();
-    o.gpuThrottlingTemperatures = buildUnnamed1631();
+    o.gpuShutdownTemperatures = buildUnnamed1652();
+    o.gpuThrottlingTemperatures = buildUnnamed1653();
     o.hardware = "foo";
     o.manufacturer = "foo";
     o.model = "foo";
     o.serialNumber = "foo";
-    o.skinShutdownTemperatures = buildUnnamed1632();
-    o.skinThrottlingTemperatures = buildUnnamed1633();
+    o.skinShutdownTemperatures = buildUnnamed1654();
+    o.skinThrottlingTemperatures = buildUnnamed1655();
   }
   buildCounterHardwareInfo--;
   return o;
@@ -718,97 +749,97 @@
 checkHardwareInfo(api.HardwareInfo o) {
   buildCounterHardwareInfo++;
   if (buildCounterHardwareInfo < 3) {
-    checkUnnamed1626(o.batteryShutdownTemperatures);
-    checkUnnamed1627(o.batteryThrottlingTemperatures);
+    checkUnnamed1648(o.batteryShutdownTemperatures);
+    checkUnnamed1649(o.batteryThrottlingTemperatures);
     unittest.expect(o.brand, unittest.equals('foo'));
-    checkUnnamed1628(o.cpuShutdownTemperatures);
-    checkUnnamed1629(o.cpuThrottlingTemperatures);
+    checkUnnamed1650(o.cpuShutdownTemperatures);
+    checkUnnamed1651(o.cpuThrottlingTemperatures);
     unittest.expect(o.deviceBasebandVersion, unittest.equals('foo'));
-    checkUnnamed1630(o.gpuShutdownTemperatures);
-    checkUnnamed1631(o.gpuThrottlingTemperatures);
+    checkUnnamed1652(o.gpuShutdownTemperatures);
+    checkUnnamed1653(o.gpuThrottlingTemperatures);
     unittest.expect(o.hardware, unittest.equals('foo'));
     unittest.expect(o.manufacturer, unittest.equals('foo'));
     unittest.expect(o.model, unittest.equals('foo'));
     unittest.expect(o.serialNumber, unittest.equals('foo'));
-    checkUnnamed1632(o.skinShutdownTemperatures);
-    checkUnnamed1633(o.skinThrottlingTemperatures);
+    checkUnnamed1654(o.skinShutdownTemperatures);
+    checkUnnamed1655(o.skinThrottlingTemperatures);
   }
   buildCounterHardwareInfo--;
 }
 
-buildUnnamed1634() {
+buildUnnamed1656() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1634(core.List<core.double> o) {
+checkUnnamed1656(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));
 }
 
-buildUnnamed1635() {
+buildUnnamed1657() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1635(core.List<core.double> o) {
+checkUnnamed1657(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));
 }
 
-buildUnnamed1636() {
+buildUnnamed1658() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1636(core.List<core.double> o) {
+checkUnnamed1658(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));
 }
 
-buildUnnamed1637() {
+buildUnnamed1659() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1637(core.List<core.double> o) {
+checkUnnamed1659(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));
 }
 
-buildUnnamed1638() {
+buildUnnamed1660() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1638(core.List<core.double> o) {
+checkUnnamed1660(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));
 }
 
-buildUnnamed1639() {
+buildUnnamed1661() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1639(core.List<core.double> o) {
+checkUnnamed1661(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));
@@ -819,13 +850,13 @@
   var o = new api.HardwareStatus();
   buildCounterHardwareStatus++;
   if (buildCounterHardwareStatus < 3) {
-    o.batteryTemperatures = buildUnnamed1634();
-    o.cpuTemperatures = buildUnnamed1635();
-    o.cpuUsages = buildUnnamed1636();
+    o.batteryTemperatures = buildUnnamed1656();
+    o.cpuTemperatures = buildUnnamed1657();
+    o.cpuUsages = buildUnnamed1658();
     o.createTime = "foo";
-    o.fanSpeeds = buildUnnamed1637();
-    o.gpuTemperatures = buildUnnamed1638();
-    o.skinTemperatures = buildUnnamed1639();
+    o.fanSpeeds = buildUnnamed1659();
+    o.gpuTemperatures = buildUnnamed1660();
+    o.skinTemperatures = buildUnnamed1661();
   }
   buildCounterHardwareStatus--;
   return o;
@@ -834,25 +865,25 @@
 checkHardwareStatus(api.HardwareStatus o) {
   buildCounterHardwareStatus++;
   if (buildCounterHardwareStatus < 3) {
-    checkUnnamed1634(o.batteryTemperatures);
-    checkUnnamed1635(o.cpuTemperatures);
-    checkUnnamed1636(o.cpuUsages);
+    checkUnnamed1656(o.batteryTemperatures);
+    checkUnnamed1657(o.cpuTemperatures);
+    checkUnnamed1658(o.cpuUsages);
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkUnnamed1637(o.fanSpeeds);
-    checkUnnamed1638(o.gpuTemperatures);
-    checkUnnamed1639(o.skinTemperatures);
+    checkUnnamed1659(o.fanSpeeds);
+    checkUnnamed1660(o.gpuTemperatures);
+    checkUnnamed1661(o.skinTemperatures);
   }
   buildCounterHardwareStatus--;
 }
 
-buildUnnamed1640() {
+buildUnnamed1662() {
   var o = new core.List<api.Device>();
   o.add(buildDevice());
   o.add(buildDevice());
   return o;
 }
 
-checkUnnamed1640(core.List<api.Device> o) {
+checkUnnamed1662(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDevice(o[0]);
   checkDevice(o[1]);
@@ -863,7 +894,7 @@
   var o = new api.ListDevicesResponse();
   buildCounterListDevicesResponse++;
   if (buildCounterListDevicesResponse < 3) {
-    o.devices = buildUnnamed1640();
+    o.devices = buildUnnamed1662();
     o.nextPageToken = "foo";
   }
   buildCounterListDevicesResponse--;
@@ -873,20 +904,20 @@
 checkListDevicesResponse(api.ListDevicesResponse o) {
   buildCounterListDevicesResponse++;
   if (buildCounterListDevicesResponse < 3) {
-    checkUnnamed1640(o.devices);
+    checkUnnamed1662(o.devices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDevicesResponse--;
 }
 
-buildUnnamed1641() {
+buildUnnamed1663() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1641(core.List<api.Operation> o) {
+checkUnnamed1663(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -898,7 +929,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed1641();
+    o.operations = buildUnnamed1663();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -908,19 +939,19 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1641(o.operations);
+    checkUnnamed1663(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed1642() {
+buildUnnamed1664() {
   var o = new core.List<api.Policy>();
   o.add(buildPolicy());
   o.add(buildPolicy());
   return o;
 }
 
-checkUnnamed1642(core.List<api.Policy> o) {
+checkUnnamed1664(core.List<api.Policy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPolicy(o[0]);
   checkPolicy(o[1]);
@@ -932,7 +963,7 @@
   buildCounterListPoliciesResponse++;
   if (buildCounterListPoliciesResponse < 3) {
     o.nextPageToken = "foo";
-    o.policies = buildUnnamed1642();
+    o.policies = buildUnnamed1664();
   }
   buildCounterListPoliciesResponse--;
   return o;
@@ -942,32 +973,32 @@
   buildCounterListPoliciesResponse++;
   if (buildCounterListPoliciesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1642(o.policies);
+    checkUnnamed1664(o.policies);
   }
   buildCounterListPoliciesResponse--;
 }
 
-buildUnnamed1643() {
+buildUnnamed1665() {
   var o = new core.List<api.ManagedPropertyEntry>();
   o.add(buildManagedPropertyEntry());
   o.add(buildManagedPropertyEntry());
   return o;
 }
 
-checkUnnamed1643(core.List<api.ManagedPropertyEntry> o) {
+checkUnnamed1665(core.List<api.ManagedPropertyEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedPropertyEntry(o[0]);
   checkManagedPropertyEntry(o[1]);
 }
 
-buildUnnamed1644() {
+buildUnnamed1666() {
   var o = new core.List<api.ManagedProperty>();
   o.add(buildManagedProperty());
   o.add(buildManagedProperty());
   return o;
 }
 
-checkUnnamed1644(core.List<api.ManagedProperty> o) {
+checkUnnamed1666(core.List<api.ManagedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedProperty(o[0]);
   checkManagedProperty(o[1]);
@@ -984,9 +1015,9 @@
       'string': 'foo'
     };
     o.description = "foo";
-    o.entries = buildUnnamed1643();
+    o.entries = buildUnnamed1665();
     o.key = "foo";
-    o.nestedProperties = buildUnnamed1644();
+    o.nestedProperties = buildUnnamed1666();
     o.title = "foo";
     o.type = "foo";
   }
@@ -1003,9 +1034,9 @@
     unittest.expect(casted3["bool"], unittest.equals(true));
     unittest.expect(casted3["string"], unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1643(o.entries);
+    checkUnnamed1665(o.entries);
     unittest.expect(o.key, unittest.equals('foo'));
-    checkUnnamed1644(o.nestedProperties);
+    checkUnnamed1666(o.nestedProperties);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -1160,7 +1191,7 @@
   buildCounterNonComplianceDetailCondition--;
 }
 
-buildUnnamed1645() {
+buildUnnamed1667() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1175,7 +1206,7 @@
   return o;
 }
 
-checkUnnamed1645(core.Map<core.String, core.Object> o) {
+checkUnnamed1667(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -1189,7 +1220,7 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1646() {
+buildUnnamed1668() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1204,7 +1235,7 @@
   return o;
 }
 
-checkUnnamed1646(core.Map<core.String, core.Object> o) {
+checkUnnamed1668(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o["x"]) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -1225,9 +1256,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed1645();
+    o.metadata = buildUnnamed1667();
     o.name = "foo";
-    o.response = buildUnnamed1646();
+    o.response = buildUnnamed1668();
   }
   buildCounterOperation--;
   return o;
@@ -1238,21 +1269,21 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed1645(o.metadata);
+    checkUnnamed1667(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1646(o.response);
+    checkUnnamed1668(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1647() {
+buildUnnamed1669() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1647(core.List<core.String> o) {
+checkUnnamed1669(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1263,7 +1294,7 @@
   var o = new api.PackageNameList();
   buildCounterPackageNameList++;
   if (buildCounterPackageNameList < 3) {
-    o.packageNames = buildUnnamed1647();
+    o.packageNames = buildUnnamed1669();
   }
   buildCounterPackageNameList--;
   return o;
@@ -1272,7 +1303,7 @@
 checkPackageNameList(api.PackageNameList o) {
   buildCounterPackageNameList++;
   if (buildCounterPackageNameList < 3) {
-    checkUnnamed1647(o.packageNames);
+    checkUnnamed1669(o.packageNames);
   }
   buildCounterPackageNameList--;
 }
@@ -1337,27 +1368,27 @@
   buildCounterPermissionGrant--;
 }
 
-buildUnnamed1648() {
+buildUnnamed1670() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1648(core.List<core.String> o) {
+checkUnnamed1670(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1649() {
+buildUnnamed1671() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1649(core.List<core.String> o) {
+checkUnnamed1671(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1368,8 +1399,8 @@
   var o = new api.PersistentPreferredActivity();
   buildCounterPersistentPreferredActivity++;
   if (buildCounterPersistentPreferredActivity < 3) {
-    o.actions = buildUnnamed1648();
-    o.categories = buildUnnamed1649();
+    o.actions = buildUnnamed1670();
+    o.categories = buildUnnamed1671();
     o.receiverActivity = "foo";
   }
   buildCounterPersistentPreferredActivity--;
@@ -1379,79 +1410,79 @@
 checkPersistentPreferredActivity(api.PersistentPreferredActivity o) {
   buildCounterPersistentPreferredActivity++;
   if (buildCounterPersistentPreferredActivity < 3) {
-    checkUnnamed1648(o.actions);
-    checkUnnamed1649(o.categories);
+    checkUnnamed1670(o.actions);
+    checkUnnamed1671(o.categories);
     unittest.expect(o.receiverActivity, unittest.equals('foo'));
   }
   buildCounterPersistentPreferredActivity--;
 }
 
-buildUnnamed1650() {
+buildUnnamed1672() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1650(core.List<core.String> o) {
+checkUnnamed1672(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1651() {
+buildUnnamed1673() {
   var o = new core.List<api.ApplicationPolicy>();
   o.add(buildApplicationPolicy());
   o.add(buildApplicationPolicy());
   return o;
 }
 
-checkUnnamed1651(core.List<api.ApplicationPolicy> o) {
+checkUnnamed1673(core.List<api.ApplicationPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApplicationPolicy(o[0]);
   checkApplicationPolicy(o[1]);
 }
 
-buildUnnamed1652() {
+buildUnnamed1674() {
   var o = new core.List<api.ComplianceRule>();
   o.add(buildComplianceRule());
   o.add(buildComplianceRule());
   return o;
 }
 
-checkUnnamed1652(core.List<api.ComplianceRule> o) {
+checkUnnamed1674(core.List<api.ComplianceRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComplianceRule(o[0]);
   checkComplianceRule(o[1]);
 }
 
-buildUnnamed1653() {
+buildUnnamed1675() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1653(core.List<core.String> o) {
+checkUnnamed1675(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1654() {
+buildUnnamed1676() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1654(core.List<core.String> o) {
+checkUnnamed1676(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1655() {
+buildUnnamed1677() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1466,7 +1497,7 @@
   return o;
 }
 
-checkUnnamed1655(core.Map<core.String, core.Object> o) {
+checkUnnamed1677(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted9 = (o["x"]) as core.Map;
   unittest.expect(casted9, unittest.hasLength(3));
@@ -1480,27 +1511,27 @@
   unittest.expect(casted10["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1656() {
+buildUnnamed1678() {
   var o = new core.List<api.PersistentPreferredActivity>();
   o.add(buildPersistentPreferredActivity());
   o.add(buildPersistentPreferredActivity());
   return o;
 }
 
-checkUnnamed1656(core.List<api.PersistentPreferredActivity> o) {
+checkUnnamed1678(core.List<api.PersistentPreferredActivity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersistentPreferredActivity(o[0]);
   checkPersistentPreferredActivity(o[1]);
 }
 
-buildUnnamed1657() {
+buildUnnamed1679() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1657(core.List<core.String> o) {
+checkUnnamed1679(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1511,11 +1542,11 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.accountTypesWithManagementDisabled = buildUnnamed1650();
+    o.accountTypesWithManagementDisabled = buildUnnamed1672();
     o.addUserDisabled = true;
     o.adjustVolumeDisabled = true;
     o.alwaysOnVpnPackage = buildAlwaysOnVpnPackage();
-    o.applications = buildUnnamed1651();
+    o.applications = buildUnnamed1673();
     o.autoTimeRequired = true;
     o.blockApplicationsEnabled = true;
     o.bluetoothConfigDisabled = true;
@@ -1523,7 +1554,7 @@
     o.bluetoothDisabled = true;
     o.cameraDisabled = true;
     o.cellBroadcastsConfigDisabled = true;
-    o.complianceRules = buildUnnamed1652();
+    o.complianceRules = buildUnnamed1674();
     o.createWindowsDisabled = true;
     o.credentialsConfigDisabled = true;
     o.dataRoamingDisabled = true;
@@ -1531,12 +1562,12 @@
     o.defaultPermissionPolicy = "foo";
     o.ensureVerifyAppsEnabled = true;
     o.factoryResetDisabled = true;
-    o.frpAdminEmails = buildUnnamed1653();
+    o.frpAdminEmails = buildUnnamed1675();
     o.funDisabled = true;
     o.installAppsDisabled = true;
     o.installUnknownSourcesAllowed = true;
     o.keyguardDisabled = true;
-    o.keyguardDisabledFeatures = buildUnnamed1654();
+    o.keyguardDisabledFeatures = buildUnnamed1676();
     o.longSupportMessage = buildUserFacingMessage();
     o.maximumTimeToLock = "foo";
     o.mobileNetworksConfigDisabled = true;
@@ -1545,12 +1576,12 @@
     o.name = "foo";
     o.networkEscapeHatchEnabled = true;
     o.networkResetDisabled = true;
-    o.openNetworkConfiguration = buildUnnamed1655();
+    o.openNetworkConfiguration = buildUnnamed1677();
     o.outgoingBeamDisabled = true;
     o.outgoingCallsDisabled = true;
     o.passwordRequirements = buildPasswordRequirements();
     o.permittedInputMethods = buildPackageNameList();
-    o.persistentPreferredActivities = buildUnnamed1656();
+    o.persistentPreferredActivities = buildUnnamed1678();
     o.recommendedGlobalProxy = buildProxyInfo();
     o.removeUserDisabled = true;
     o.safeBootDisabled = true;
@@ -1561,7 +1592,7 @@
     o.smsDisabled = true;
     o.statusBarDisabled = true;
     o.statusReportingSettings = buildStatusReportingSettings();
-    o.stayOnPluggedModes = buildUnnamed1657();
+    o.stayOnPluggedModes = buildUnnamed1679();
     o.systemUpdate = buildSystemUpdate();
     o.tetheringConfigDisabled = true;
     o.uninstallAppsDisabled = true;
@@ -1579,11 +1610,11 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed1650(o.accountTypesWithManagementDisabled);
+    checkUnnamed1672(o.accountTypesWithManagementDisabled);
     unittest.expect(o.addUserDisabled, unittest.isTrue);
     unittest.expect(o.adjustVolumeDisabled, unittest.isTrue);
     checkAlwaysOnVpnPackage(o.alwaysOnVpnPackage);
-    checkUnnamed1651(o.applications);
+    checkUnnamed1673(o.applications);
     unittest.expect(o.autoTimeRequired, unittest.isTrue);
     unittest.expect(o.blockApplicationsEnabled, unittest.isTrue);
     unittest.expect(o.bluetoothConfigDisabled, unittest.isTrue);
@@ -1591,7 +1622,7 @@
     unittest.expect(o.bluetoothDisabled, unittest.isTrue);
     unittest.expect(o.cameraDisabled, unittest.isTrue);
     unittest.expect(o.cellBroadcastsConfigDisabled, unittest.isTrue);
-    checkUnnamed1652(o.complianceRules);
+    checkUnnamed1674(o.complianceRules);
     unittest.expect(o.createWindowsDisabled, unittest.isTrue);
     unittest.expect(o.credentialsConfigDisabled, unittest.isTrue);
     unittest.expect(o.dataRoamingDisabled, unittest.isTrue);
@@ -1599,12 +1630,12 @@
     unittest.expect(o.defaultPermissionPolicy, unittest.equals('foo'));
     unittest.expect(o.ensureVerifyAppsEnabled, unittest.isTrue);
     unittest.expect(o.factoryResetDisabled, unittest.isTrue);
-    checkUnnamed1653(o.frpAdminEmails);
+    checkUnnamed1675(o.frpAdminEmails);
     unittest.expect(o.funDisabled, unittest.isTrue);
     unittest.expect(o.installAppsDisabled, unittest.isTrue);
     unittest.expect(o.installUnknownSourcesAllowed, unittest.isTrue);
     unittest.expect(o.keyguardDisabled, unittest.isTrue);
-    checkUnnamed1654(o.keyguardDisabledFeatures);
+    checkUnnamed1676(o.keyguardDisabledFeatures);
     checkUserFacingMessage(o.longSupportMessage);
     unittest.expect(o.maximumTimeToLock, unittest.equals('foo'));
     unittest.expect(o.mobileNetworksConfigDisabled, unittest.isTrue);
@@ -1613,12 +1644,12 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.networkEscapeHatchEnabled, unittest.isTrue);
     unittest.expect(o.networkResetDisabled, unittest.isTrue);
-    checkUnnamed1655(o.openNetworkConfiguration);
+    checkUnnamed1677(o.openNetworkConfiguration);
     unittest.expect(o.outgoingBeamDisabled, unittest.isTrue);
     unittest.expect(o.outgoingCallsDisabled, unittest.isTrue);
     checkPasswordRequirements(o.passwordRequirements);
     checkPackageNameList(o.permittedInputMethods);
-    checkUnnamed1656(o.persistentPreferredActivities);
+    checkUnnamed1678(o.persistentPreferredActivities);
     checkProxyInfo(o.recommendedGlobalProxy);
     unittest.expect(o.removeUserDisabled, unittest.isTrue);
     unittest.expect(o.safeBootDisabled, unittest.isTrue);
@@ -1629,7 +1660,7 @@
     unittest.expect(o.smsDisabled, unittest.isTrue);
     unittest.expect(o.statusBarDisabled, unittest.isTrue);
     checkStatusReportingSettings(o.statusReportingSettings);
-    checkUnnamed1657(o.stayOnPluggedModes);
+    checkUnnamed1679(o.stayOnPluggedModes);
     checkSystemUpdate(o.systemUpdate);
     unittest.expect(o.tetheringConfigDisabled, unittest.isTrue);
     unittest.expect(o.uninstallAppsDisabled, unittest.isTrue);
@@ -1666,14 +1697,14 @@
   buildCounterPowerManagementEvent--;
 }
 
-buildUnnamed1658() {
+buildUnnamed1680() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1658(core.List<core.String> o) {
+checkUnnamed1680(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1684,7 +1715,7 @@
   var o = new api.ProxyInfo();
   buildCounterProxyInfo++;
   if (buildCounterProxyInfo < 3) {
-    o.excludedHosts = buildUnnamed1658();
+    o.excludedHosts = buildUnnamed1680();
     o.host = "foo";
     o.pacUri = "foo";
     o.port = 42;
@@ -1696,7 +1727,7 @@
 checkProxyInfo(api.ProxyInfo o) {
   buildCounterProxyInfo++;
   if (buildCounterProxyInfo < 3) {
-    checkUnnamed1658(o.excludedHosts);
+    checkUnnamed1680(o.excludedHosts);
     unittest.expect(o.host, unittest.equals('foo'));
     unittest.expect(o.pacUri, unittest.equals('foo'));
     unittest.expect(o.port, unittest.equals(42));
@@ -1732,6 +1763,8 @@
   if (buildCounterSoftwareInfo < 3) {
     o.androidBuildNumber = "foo";
     o.androidBuildTime = "foo";
+    o.androidDevicePolicyVersionCode = 42;
+    o.androidDevicePolicyVersionName = "foo";
     o.androidVersion = "foo";
     o.bootloaderVersion = "foo";
     o.deviceKernelVersion = "foo";
@@ -1746,6 +1779,8 @@
   if (buildCounterSoftwareInfo < 3) {
     unittest.expect(o.androidBuildNumber, unittest.equals('foo'));
     unittest.expect(o.androidBuildTime, unittest.equals('foo'));
+    unittest.expect(o.androidDevicePolicyVersionCode, unittest.equals(42));
+    unittest.expect(o.androidDevicePolicyVersionName, unittest.equals('foo'));
     unittest.expect(o.androidVersion, unittest.equals('foo'));
     unittest.expect(o.bootloaderVersion, unittest.equals('foo'));
     unittest.expect(o.deviceKernelVersion, unittest.equals('foo'));
@@ -1754,7 +1789,7 @@
   buildCounterSoftwareInfo--;
 }
 
-buildUnnamed1659() {
+buildUnnamed1681() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1769,7 +1804,7 @@
   return o;
 }
 
-checkUnnamed1659(core.Map<core.String, core.Object> o) {
+checkUnnamed1681(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted11 = (o["x"]) as core.Map;
   unittest.expect(casted11, unittest.hasLength(3));
@@ -1783,17 +1818,17 @@
   unittest.expect(casted12["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1660() {
+buildUnnamed1682() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1659());
-  o.add(buildUnnamed1659());
+  o.add(buildUnnamed1681());
+  o.add(buildUnnamed1681());
   return o;
 }
 
-checkUnnamed1660(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1682(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1659(o[0]);
-  checkUnnamed1659(o[1]);
+  checkUnnamed1681(o[0]);
+  checkUnnamed1681(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1802,7 +1837,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1660();
+    o.details = buildUnnamed1682();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1813,7 +1848,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1660(o.details);
+    checkUnnamed1682(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -1824,6 +1859,7 @@
   var o = new api.StatusReportingSettings();
   buildCounterStatusReportingSettings++;
   if (buildCounterStatusReportingSettings < 3) {
+    o.deviceSettingsEnabled = true;
     o.displayInfoEnabled = true;
     o.hardwareStatusEnabled = true;
     o.memoryInfoEnabled = true;
@@ -1838,6 +1874,7 @@
 checkStatusReportingSettings(api.StatusReportingSettings o) {
   buildCounterStatusReportingSettings++;
   if (buildCounterStatusReportingSettings < 3) {
+    unittest.expect(o.deviceSettingsEnabled, unittest.isTrue);
     unittest.expect(o.displayInfoEnabled, unittest.isTrue);
     unittest.expect(o.hardwareStatusEnabled, unittest.isTrue);
     unittest.expect(o.memoryInfoEnabled, unittest.isTrue);
@@ -1871,14 +1908,14 @@
   buildCounterSystemUpdate--;
 }
 
-buildUnnamed1661() {
+buildUnnamed1683() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1661(core.Map<core.String, core.String> o) {
+checkUnnamed1683(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'));
@@ -1890,7 +1927,7 @@
   buildCounterUserFacingMessage++;
   if (buildCounterUserFacingMessage < 3) {
     o.defaultMessage = "foo";
-    o.localizedMessages = buildUnnamed1661();
+    o.localizedMessages = buildUnnamed1683();
   }
   buildCounterUserFacingMessage--;
   return o;
@@ -1900,19 +1937,19 @@
   buildCounterUserFacingMessage++;
   if (buildCounterUserFacingMessage < 3) {
     unittest.expect(o.defaultMessage, unittest.equals('foo'));
-    checkUnnamed1661(o.localizedMessages);
+    checkUnnamed1683(o.localizedMessages);
   }
   buildCounterUserFacingMessage--;
 }
 
-buildUnnamed1662() {
+buildUnnamed1684() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1662(core.List<core.String> o) {
+checkUnnamed1684(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1925,7 +1962,7 @@
   if (buildCounterWebToken < 3) {
     o.name = "foo";
     o.parentFrameUrl = "foo";
-    o.permissions = buildUnnamed1662();
+    o.permissions = buildUnnamed1684();
     o.value = "foo";
   }
   buildCounterWebToken--;
@@ -1937,7 +1974,7 @@
   if (buildCounterWebToken < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parentFrameUrl, unittest.equals('foo'));
-    checkUnnamed1662(o.permissions);
+    checkUnnamed1684(o.permissions);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterWebToken--;
@@ -2008,6 +2045,14 @@
     });
   });
 
+  unittest.group("obj-schema-DeviceSettings", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildDeviceSettings();
+      var od = new api.DeviceSettings.fromJson(o.toJson());
+      checkDeviceSettings(od);
+    });
+  });
+
   unittest.group("obj-schema-Display", () {
     unittest.test("to-json--from-json", () {
       var o = buildDisplay();
diff --git a/generated/googleapis/test/androidpublisher/v2_test.dart b/generated/googleapis/test/androidpublisher/v2_test.dart
index d2cd187..ef57993 100644
--- a/generated/googleapis/test/androidpublisher/v2_test.dart
+++ b/generated/googleapis/test/androidpublisher/v2_test.dart
@@ -113,14 +113,14 @@
   buildCounterApkListing--;
 }
 
-buildUnnamed2960() {
+buildUnnamed2986() {
   var o = new core.List<api.ApkListing>();
   o.add(buildApkListing());
   o.add(buildApkListing());
   return o;
 }
 
-checkUnnamed2960(core.List<api.ApkListing> o) {
+checkUnnamed2986(core.List<api.ApkListing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApkListing(o[0]);
   checkApkListing(o[1]);
@@ -132,7 +132,7 @@
   buildCounterApkListingsListResponse++;
   if (buildCounterApkListingsListResponse < 3) {
     o.kind = "foo";
-    o.listings = buildUnnamed2960();
+    o.listings = buildUnnamed2986();
   }
   buildCounterApkListingsListResponse--;
   return o;
@@ -142,7 +142,7 @@
   buildCounterApkListingsListResponse++;
   if (buildCounterApkListingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2960(o.listings);
+    checkUnnamed2986(o.listings);
   }
   buildCounterApkListingsListResponse--;
 }
@@ -185,14 +185,14 @@
   buildCounterApksAddExternallyHostedResponse--;
 }
 
-buildUnnamed2961() {
+buildUnnamed2987() {
   var o = new core.List<api.Apk>();
   o.add(buildApk());
   o.add(buildApk());
   return o;
 }
 
-checkUnnamed2961(core.List<api.Apk> o) {
+checkUnnamed2987(core.List<api.Apk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApk(o[0]);
   checkApk(o[1]);
@@ -203,7 +203,7 @@
   var o = new api.ApksListResponse();
   buildCounterApksListResponse++;
   if (buildCounterApksListResponse < 3) {
-    o.apks = buildUnnamed2961();
+    o.apks = buildUnnamed2987();
     o.kind = "foo";
   }
   buildCounterApksListResponse--;
@@ -213,7 +213,7 @@
 checkApksListResponse(api.ApksListResponse o) {
   buildCounterApksListResponse++;
   if (buildCounterApksListResponse < 3) {
-    checkUnnamed2961(o.apks);
+    checkUnnamed2987(o.apks);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterApksListResponse--;
@@ -409,14 +409,14 @@
   buildCounterEntitlement--;
 }
 
-buildUnnamed2962() {
+buildUnnamed2988() {
   var o = new core.List<api.Entitlement>();
   o.add(buildEntitlement());
   o.add(buildEntitlement());
   return o;
 }
 
-checkUnnamed2962(core.List<api.Entitlement> o) {
+checkUnnamed2988(core.List<api.Entitlement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntitlement(o[0]);
   checkEntitlement(o[1]);
@@ -428,7 +428,7 @@
   buildCounterEntitlementsListResponse++;
   if (buildCounterEntitlementsListResponse < 3) {
     o.pageInfo = buildPageInfo();
-    o.resources = buildUnnamed2962();
+    o.resources = buildUnnamed2988();
     o.tokenPagination = buildTokenPagination();
   }
   buildCounterEntitlementsListResponse--;
@@ -439,7 +439,7 @@
   buildCounterEntitlementsListResponse++;
   if (buildCounterEntitlementsListResponse < 3) {
     checkPageInfo(o.pageInfo);
-    checkUnnamed2962(o.resources);
+    checkUnnamed2988(o.resources);
     checkTokenPagination(o.tokenPagination);
   }
   buildCounterEntitlementsListResponse--;
@@ -485,53 +485,53 @@
   buildCounterExpansionFilesUploadResponse--;
 }
 
-buildUnnamed2963() {
+buildUnnamed2989() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2963(core.List<core.String> o) {
+checkUnnamed2989(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2964() {
+buildUnnamed2990() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2964(core.List<core.String> o) {
+checkUnnamed2990(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2965() {
+buildUnnamed2991() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2965(core.List<core.String> o) {
+checkUnnamed2991(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2966() {
+buildUnnamed2992() {
   var o = new core.List<api.ExternallyHostedApkUsesPermission>();
   o.add(buildExternallyHostedApkUsesPermission());
   o.add(buildExternallyHostedApkUsesPermission());
   return o;
 }
 
-checkUnnamed2966(core.List<api.ExternallyHostedApkUsesPermission> o) {
+checkUnnamed2992(core.List<api.ExternallyHostedApkUsesPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExternallyHostedApkUsesPermission(o[0]);
   checkExternallyHostedApkUsesPermission(o[1]);
@@ -543,7 +543,7 @@
   buildCounterExternallyHostedApk++;
   if (buildCounterExternallyHostedApk < 3) {
     o.applicationLabel = "foo";
-    o.certificateBase64s = buildUnnamed2963();
+    o.certificateBase64s = buildUnnamed2989();
     o.externallyHostedUrl = "foo";
     o.fileSha1Base64 = "foo";
     o.fileSha256Base64 = "foo";
@@ -551,10 +551,10 @@
     o.iconBase64 = "foo";
     o.maximumSdk = 42;
     o.minimumSdk = 42;
-    o.nativeCodes = buildUnnamed2964();
+    o.nativeCodes = buildUnnamed2990();
     o.packageName = "foo";
-    o.usesFeatures = buildUnnamed2965();
-    o.usesPermissions = buildUnnamed2966();
+    o.usesFeatures = buildUnnamed2991();
+    o.usesPermissions = buildUnnamed2992();
     o.versionCode = 42;
     o.versionName = "foo";
   }
@@ -566,7 +566,7 @@
   buildCounterExternallyHostedApk++;
   if (buildCounterExternallyHostedApk < 3) {
     unittest.expect(o.applicationLabel, unittest.equals('foo'));
-    checkUnnamed2963(o.certificateBase64s);
+    checkUnnamed2989(o.certificateBase64s);
     unittest.expect(o.externallyHostedUrl, unittest.equals('foo'));
     unittest.expect(o.fileSha1Base64, unittest.equals('foo'));
     unittest.expect(o.fileSha256Base64, unittest.equals('foo'));
@@ -574,10 +574,10 @@
     unittest.expect(o.iconBase64, unittest.equals('foo'));
     unittest.expect(o.maximumSdk, unittest.equals(42));
     unittest.expect(o.minimumSdk, unittest.equals(42));
-    checkUnnamed2964(o.nativeCodes);
+    checkUnnamed2990(o.nativeCodes);
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed2965(o.usesFeatures);
-    checkUnnamed2966(o.usesPermissions);
+    checkUnnamed2991(o.usesFeatures);
+    checkUnnamed2992(o.usesPermissions);
     unittest.expect(o.versionCode, unittest.equals(42));
     unittest.expect(o.versionName, unittest.equals('foo'));
   }
@@ -629,14 +629,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed2967() {
+buildUnnamed2993() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed2967(core.List<api.Image> o) {
+checkUnnamed2993(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -647,7 +647,7 @@
   var o = new api.ImagesDeleteAllResponse();
   buildCounterImagesDeleteAllResponse++;
   if (buildCounterImagesDeleteAllResponse < 3) {
-    o.deleted = buildUnnamed2967();
+    o.deleted = buildUnnamed2993();
   }
   buildCounterImagesDeleteAllResponse--;
   return o;
@@ -656,19 +656,19 @@
 checkImagesDeleteAllResponse(api.ImagesDeleteAllResponse o) {
   buildCounterImagesDeleteAllResponse++;
   if (buildCounterImagesDeleteAllResponse < 3) {
-    checkUnnamed2967(o.deleted);
+    checkUnnamed2993(o.deleted);
   }
   buildCounterImagesDeleteAllResponse--;
 }
 
-buildUnnamed2968() {
+buildUnnamed2994() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed2968(core.List<api.Image> o) {
+checkUnnamed2994(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -679,7 +679,7 @@
   var o = new api.ImagesListResponse();
   buildCounterImagesListResponse++;
   if (buildCounterImagesListResponse < 3) {
-    o.images = buildUnnamed2968();
+    o.images = buildUnnamed2994();
   }
   buildCounterImagesListResponse--;
   return o;
@@ -688,7 +688,7 @@
 checkImagesListResponse(api.ImagesListResponse o) {
   buildCounterImagesListResponse++;
   if (buildCounterImagesListResponse < 3) {
-    checkUnnamed2968(o.images);
+    checkUnnamed2994(o.images);
   }
   buildCounterImagesListResponse--;
 }
@@ -712,27 +712,27 @@
   buildCounterImagesUploadResponse--;
 }
 
-buildUnnamed2969() {
+buildUnnamed2995() {
   var o = new core.Map<core.String, api.InAppProductListing>();
   o["x"] = buildInAppProductListing();
   o["y"] = buildInAppProductListing();
   return o;
 }
 
-checkUnnamed2969(core.Map<core.String, api.InAppProductListing> o) {
+checkUnnamed2995(core.Map<core.String, api.InAppProductListing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInAppProductListing(o["x"]);
   checkInAppProductListing(o["y"]);
 }
 
-buildUnnamed2970() {
+buildUnnamed2996() {
   var o = new core.Map<core.String, api.Price>();
   o["x"] = buildPrice();
   o["y"] = buildPrice();
   return o;
 }
 
-checkUnnamed2970(core.Map<core.String, api.Price> o) {
+checkUnnamed2996(core.Map<core.String, api.Price> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPrice(o["x"]);
   checkPrice(o["y"]);
@@ -745,9 +745,9 @@
   if (buildCounterInAppProduct < 3) {
     o.defaultLanguage = "foo";
     o.defaultPrice = buildPrice();
-    o.listings = buildUnnamed2969();
+    o.listings = buildUnnamed2995();
     o.packageName = "foo";
-    o.prices = buildUnnamed2970();
+    o.prices = buildUnnamed2996();
     o.purchaseType = "foo";
     o.season = buildSeason();
     o.sku = "foo";
@@ -764,9 +764,9 @@
   if (buildCounterInAppProduct < 3) {
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     checkPrice(o.defaultPrice);
-    checkUnnamed2969(o.listings);
+    checkUnnamed2995(o.listings);
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed2970(o.prices);
+    checkUnnamed2996(o.prices);
     unittest.expect(o.purchaseType, unittest.equals('foo'));
     checkSeason(o.season);
     unittest.expect(o.sku, unittest.equals('foo'));
@@ -798,14 +798,14 @@
   buildCounterInAppProductListing--;
 }
 
-buildUnnamed2971() {
+buildUnnamed2997() {
   var o = new core.List<api.InAppProduct>();
   o.add(buildInAppProduct());
   o.add(buildInAppProduct());
   return o;
 }
 
-checkUnnamed2971(core.List<api.InAppProduct> o) {
+checkUnnamed2997(core.List<api.InAppProduct> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInAppProduct(o[0]);
   checkInAppProduct(o[1]);
@@ -816,7 +816,7 @@
   var o = new api.InappproductsListResponse();
   buildCounterInappproductsListResponse++;
   if (buildCounterInappproductsListResponse < 3) {
-    o.inappproduct = buildUnnamed2971();
+    o.inappproduct = buildUnnamed2997();
     o.kind = "foo";
     o.pageInfo = buildPageInfo();
     o.tokenPagination = buildTokenPagination();
@@ -828,7 +828,7 @@
 checkInappproductsListResponse(api.InappproductsListResponse o) {
   buildCounterInappproductsListResponse++;
   if (buildCounterInappproductsListResponse < 3) {
-    checkUnnamed2971(o.inappproduct);
+    checkUnnamed2997(o.inappproduct);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
     checkTokenPagination(o.tokenPagination);
@@ -863,14 +863,14 @@
   buildCounterListing--;
 }
 
-buildUnnamed2972() {
+buildUnnamed2998() {
   var o = new core.List<api.Listing>();
   o.add(buildListing());
   o.add(buildListing());
   return o;
 }
 
-checkUnnamed2972(core.List<api.Listing> o) {
+checkUnnamed2998(core.List<api.Listing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListing(o[0]);
   checkListing(o[1]);
@@ -882,7 +882,7 @@
   buildCounterListingsListResponse++;
   if (buildCounterListingsListResponse < 3) {
     o.kind = "foo";
-    o.listings = buildUnnamed2972();
+    o.listings = buildUnnamed2998();
   }
   buildCounterListingsListResponse--;
   return o;
@@ -892,7 +892,7 @@
   buildCounterListingsListResponse++;
   if (buildCounterListingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2972(o.listings);
+    checkUnnamed2998(o.listings);
   }
   buildCounterListingsListResponse--;
 }
@@ -973,6 +973,7 @@
     o.orderId = "foo";
     o.purchaseState = 42;
     o.purchaseTimeMillis = "foo";
+    o.purchaseType = 42;
   }
   buildCounterProductPurchase--;
   return o;
@@ -987,6 +988,7 @@
     unittest.expect(o.orderId, unittest.equals('foo'));
     unittest.expect(o.purchaseState, unittest.equals(42));
     unittest.expect(o.purchaseTimeMillis, unittest.equals('foo'));
+    unittest.expect(o.purchaseType, unittest.equals(42));
   }
   buildCounterProductPurchase--;
 }
@@ -1012,14 +1014,14 @@
   buildCounterProrate--;
 }
 
-buildUnnamed2973() {
+buildUnnamed2999() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed2973(core.List<api.Comment> o) {
+checkUnnamed2999(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -1031,7 +1033,7 @@
   buildCounterReview++;
   if (buildCounterReview < 3) {
     o.authorName = "foo";
-    o.comments = buildUnnamed2973();
+    o.comments = buildUnnamed2999();
     o.reviewId = "foo";
   }
   buildCounterReview--;
@@ -1042,7 +1044,7 @@
   buildCounterReview++;
   if (buildCounterReview < 3) {
     unittest.expect(o.authorName, unittest.equals('foo'));
-    checkUnnamed2973(o.comments);
+    checkUnnamed2999(o.comments);
     unittest.expect(o.reviewId, unittest.equals('foo'));
   }
   buildCounterReview--;
@@ -1069,14 +1071,14 @@
   buildCounterReviewReplyResult--;
 }
 
-buildUnnamed2974() {
+buildUnnamed3000() {
   var o = new core.List<api.Review>();
   o.add(buildReview());
   o.add(buildReview());
   return o;
 }
 
-checkUnnamed2974(core.List<api.Review> o) {
+checkUnnamed3000(core.List<api.Review> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReview(o[0]);
   checkReview(o[1]);
@@ -1088,7 +1090,7 @@
   buildCounterReviewsListResponse++;
   if (buildCounterReviewsListResponse < 3) {
     o.pageInfo = buildPageInfo();
-    o.reviews = buildUnnamed2974();
+    o.reviews = buildUnnamed3000();
     o.tokenPagination = buildTokenPagination();
   }
   buildCounterReviewsListResponse--;
@@ -1099,7 +1101,7 @@
   buildCounterReviewsListResponse++;
   if (buildCounterReviewsListResponse < 3) {
     checkPageInfo(o.pageInfo);
-    checkUnnamed2974(o.reviews);
+    checkUnnamed3000(o.reviews);
     checkTokenPagination(o.tokenPagination);
   }
   buildCounterReviewsListResponse--;
@@ -1143,14 +1145,14 @@
   buildCounterReviewsReplyResponse--;
 }
 
-buildUnnamed2975() {
+buildUnnamed3001() {
   var o = new core.List<api.Prorate>();
   o.add(buildProrate());
   o.add(buildProrate());
   return o;
 }
 
-checkUnnamed2975(core.List<api.Prorate> o) {
+checkUnnamed3001(core.List<api.Prorate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProrate(o[0]);
   checkProrate(o[1]);
@@ -1162,7 +1164,7 @@
   buildCounterSeason++;
   if (buildCounterSeason < 3) {
     o.end = buildMonthDay();
-    o.prorations = buildUnnamed2975();
+    o.prorations = buildUnnamed3001();
     o.start = buildMonthDay();
   }
   buildCounterSeason--;
@@ -1173,7 +1175,7 @@
   buildCounterSeason++;
   if (buildCounterSeason < 3) {
     checkMonthDay(o.end);
-    checkUnnamed2975(o.prorations);
+    checkUnnamed3001(o.prorations);
     checkMonthDay(o.start);
   }
   buildCounterSeason--;
@@ -1211,10 +1213,12 @@
     o.developerPayload = "foo";
     o.expiryTimeMillis = "foo";
     o.kind = "foo";
+    o.linkedPurchaseToken = "foo";
     o.orderId = "foo";
     o.paymentState = 42;
     o.priceAmountMicros = "foo";
     o.priceCurrencyCode = "foo";
+    o.purchaseType = 42;
     o.startTimeMillis = "foo";
     o.userCancellationTimeMillis = "foo";
   }
@@ -1231,10 +1235,12 @@
     unittest.expect(o.developerPayload, unittest.equals('foo'));
     unittest.expect(o.expiryTimeMillis, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.linkedPurchaseToken, unittest.equals('foo'));
     unittest.expect(o.orderId, unittest.equals('foo'));
     unittest.expect(o.paymentState, unittest.equals(42));
     unittest.expect(o.priceAmountMicros, unittest.equals('foo'));
     unittest.expect(o.priceCurrencyCode, unittest.equals('foo'));
+    unittest.expect(o.purchaseType, unittest.equals(42));
     unittest.expect(o.startTimeMillis, unittest.equals('foo'));
     unittest.expect(o.userCancellationTimeMillis, unittest.equals('foo'));
   }
@@ -1281,27 +1287,27 @@
   buildCounterSubscriptionPurchasesDeferResponse--;
 }
 
-buildUnnamed2976() {
+buildUnnamed3002() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2976(core.List<core.String> o) {
+checkUnnamed3002(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2977() {
+buildUnnamed3003() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2977(core.List<core.String> o) {
+checkUnnamed3003(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1312,8 +1318,8 @@
   var o = new api.Testers();
   buildCounterTesters++;
   if (buildCounterTesters < 3) {
-    o.googleGroups = buildUnnamed2976();
-    o.googlePlusCommunities = buildUnnamed2977();
+    o.googleGroups = buildUnnamed3002();
+    o.googlePlusCommunities = buildUnnamed3003();
   }
   buildCounterTesters--;
   return o;
@@ -1322,8 +1328,8 @@
 checkTesters(api.Testers o) {
   buildCounterTesters++;
   if (buildCounterTesters < 3) {
-    checkUnnamed2976(o.googleGroups);
-    checkUnnamed2977(o.googlePlusCommunities);
+    checkUnnamed3002(o.googleGroups);
+    checkUnnamed3003(o.googlePlusCommunities);
   }
   buildCounterTesters--;
 }
@@ -1370,14 +1376,14 @@
   buildCounterTokenPagination--;
 }
 
-buildUnnamed2978() {
+buildUnnamed3004() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2978(core.List<core.int> o) {
+checkUnnamed3004(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));
@@ -1390,7 +1396,7 @@
   if (buildCounterTrack < 3) {
     o.track = "foo";
     o.userFraction = 42.0;
-    o.versionCodes = buildUnnamed2978();
+    o.versionCodes = buildUnnamed3004();
   }
   buildCounterTrack--;
   return o;
@@ -1401,19 +1407,19 @@
   if (buildCounterTrack < 3) {
     unittest.expect(o.track, unittest.equals('foo'));
     unittest.expect(o.userFraction, unittest.equals(42.0));
-    checkUnnamed2978(o.versionCodes);
+    checkUnnamed3004(o.versionCodes);
   }
   buildCounterTrack--;
 }
 
-buildUnnamed2979() {
+buildUnnamed3005() {
   var o = new core.List<api.Track>();
   o.add(buildTrack());
   o.add(buildTrack());
   return o;
 }
 
-checkUnnamed2979(core.List<api.Track> o) {
+checkUnnamed3005(core.List<api.Track> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrack(o[0]);
   checkTrack(o[1]);
@@ -1425,7 +1431,7 @@
   buildCounterTracksListResponse++;
   if (buildCounterTracksListResponse < 3) {
     o.kind = "foo";
-    o.tracks = buildUnnamed2979();
+    o.tracks = buildUnnamed3005();
   }
   buildCounterTracksListResponse--;
   return o;
@@ -1435,7 +1441,7 @@
   buildCounterTracksListResponse++;
   if (buildCounterTracksListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2979(o.tracks);
+    checkUnnamed3005(o.tracks);
   }
   buildCounterTracksListResponse--;
 }
@@ -1506,14 +1512,14 @@
   buildCounterVoidedPurchase--;
 }
 
-buildUnnamed2980() {
+buildUnnamed3006() {
   var o = new core.List<api.VoidedPurchase>();
   o.add(buildVoidedPurchase());
   o.add(buildVoidedPurchase());
   return o;
 }
 
-checkUnnamed2980(core.List<api.VoidedPurchase> o) {
+checkUnnamed3006(core.List<api.VoidedPurchase> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVoidedPurchase(o[0]);
   checkVoidedPurchase(o[1]);
@@ -1526,7 +1532,7 @@
   if (buildCounterVoidedPurchasesListResponse < 3) {
     o.pageInfo = buildPageInfo();
     o.tokenPagination = buildTokenPagination();
-    o.voidedPurchases = buildUnnamed2980();
+    o.voidedPurchases = buildUnnamed3006();
   }
   buildCounterVoidedPurchasesListResponse--;
   return o;
@@ -1537,7 +1543,7 @@
   if (buildCounterVoidedPurchasesListResponse < 3) {
     checkPageInfo(o.pageInfo);
     checkTokenPagination(o.tokenPagination);
-    checkUnnamed2980(o.voidedPurchases);
+    checkUnnamed3006(o.voidedPurchases);
   }
   buildCounterVoidedPurchasesListResponse--;
 }
diff --git a/generated/googleapis/test/appengine/v1_test.dart b/generated/googleapis/test/appengine/v1_test.dart
index 51151fe..49697f8 100644
--- a/generated/googleapis/test/appengine/v1_test.dart
+++ b/generated/googleapis/test/appengine/v1_test.dart
@@ -96,14 +96,14 @@
   buildCounterApiEndpointHandler--;
 }
 
-buildUnnamed3113() {
+buildUnnamed3139() {
   var o = new core.List<api.UrlDispatchRule>();
   o.add(buildUrlDispatchRule());
   o.add(buildUrlDispatchRule());
   return o;
 }
 
-checkUnnamed3113(core.List<api.UrlDispatchRule> o) {
+checkUnnamed3139(core.List<api.UrlDispatchRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlDispatchRule(o[0]);
   checkUrlDispatchRule(o[1]);
@@ -119,7 +119,7 @@
     o.defaultBucket = "foo";
     o.defaultCookieExpiration = "foo";
     o.defaultHostname = "foo";
-    o.dispatchRules = buildUnnamed3113();
+    o.dispatchRules = buildUnnamed3139();
     o.featureSettings = buildFeatureSettings();
     o.gcrDomain = "foo";
     o.iap = buildIdentityAwareProxy();
@@ -140,7 +140,7 @@
     unittest.expect(o.defaultBucket, unittest.equals('foo'));
     unittest.expect(o.defaultCookieExpiration, unittest.equals('foo'));
     unittest.expect(o.defaultHostname, unittest.equals('foo'));
-    checkUnnamed3113(o.dispatchRules);
+    checkUnnamed3139(o.dispatchRules);
     checkFeatureSettings(o.featureSettings);
     unittest.expect(o.gcrDomain, unittest.equals('foo'));
     checkIdentityAwareProxy(o.iap);
@@ -152,27 +152,27 @@
   buildCounterApplication--;
 }
 
-buildUnnamed3114() {
+buildUnnamed3140() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3114(core.List<core.String> o) {
+checkUnnamed3140(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3115() {
+buildUnnamed3141() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3115(core.List<core.String> o) {
+checkUnnamed3141(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -186,11 +186,11 @@
     o.certificateRawData = buildCertificateRawData();
     o.displayName = "foo";
     o.domainMappingsCount = 42;
-    o.domainNames = buildUnnamed3114();
+    o.domainNames = buildUnnamed3140();
     o.expireTime = "foo";
     o.id = "foo";
     o.name = "foo";
-    o.visibleDomainMappings = buildUnnamed3115();
+    o.visibleDomainMappings = buildUnnamed3141();
   }
   buildCounterAuthorizedCertificate--;
   return o;
@@ -202,11 +202,11 @@
     checkCertificateRawData(o.certificateRawData);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domainMappingsCount, unittest.equals(42));
-    checkUnnamed3114(o.domainNames);
+    checkUnnamed3140(o.domainNames);
     unittest.expect(o.expireTime, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3115(o.visibleDomainMappings);
+    checkUnnamed3141(o.visibleDomainMappings);
   }
   buildCounterAuthorizedCertificate--;
 }
@@ -296,14 +296,14 @@
   buildCounterBasicScaling--;
 }
 
-buildUnnamed3116() {
+buildUnnamed3142() {
   var o = new core.List<api.FirewallRule>();
   o.add(buildFirewallRule());
   o.add(buildFirewallRule());
   return o;
 }
 
-checkUnnamed3116(core.List<api.FirewallRule> o) {
+checkUnnamed3142(core.List<api.FirewallRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewallRule(o[0]);
   checkFirewallRule(o[1]);
@@ -314,7 +314,7 @@
   var o = new api.BatchUpdateIngressRulesRequest();
   buildCounterBatchUpdateIngressRulesRequest++;
   if (buildCounterBatchUpdateIngressRulesRequest < 3) {
-    o.ingressRules = buildUnnamed3116();
+    o.ingressRules = buildUnnamed3142();
   }
   buildCounterBatchUpdateIngressRulesRequest--;
   return o;
@@ -323,19 +323,19 @@
 checkBatchUpdateIngressRulesRequest(api.BatchUpdateIngressRulesRequest o) {
   buildCounterBatchUpdateIngressRulesRequest++;
   if (buildCounterBatchUpdateIngressRulesRequest < 3) {
-    checkUnnamed3116(o.ingressRules);
+    checkUnnamed3142(o.ingressRules);
   }
   buildCounterBatchUpdateIngressRulesRequest--;
 }
 
-buildUnnamed3117() {
+buildUnnamed3143() {
   var o = new core.List<api.FirewallRule>();
   o.add(buildFirewallRule());
   o.add(buildFirewallRule());
   return o;
 }
 
-checkUnnamed3117(core.List<api.FirewallRule> o) {
+checkUnnamed3143(core.List<api.FirewallRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewallRule(o[0]);
   checkFirewallRule(o[1]);
@@ -346,7 +346,7 @@
   var o = new api.BatchUpdateIngressRulesResponse();
   buildCounterBatchUpdateIngressRulesResponse++;
   if (buildCounterBatchUpdateIngressRulesResponse < 3) {
-    o.ingressRules = buildUnnamed3117();
+    o.ingressRules = buildUnnamed3143();
   }
   buildCounterBatchUpdateIngressRulesResponse--;
   return o;
@@ -355,7 +355,7 @@
 checkBatchUpdateIngressRulesResponse(api.BatchUpdateIngressRulesResponse o) {
   buildCounterBatchUpdateIngressRulesResponse++;
   if (buildCounterBatchUpdateIngressRulesResponse < 3) {
-    checkUnnamed3117(o.ingressRules);
+    checkUnnamed3143(o.ingressRules);
   }
   buildCounterBatchUpdateIngressRulesResponse--;
 }
@@ -440,14 +440,14 @@
   buildCounterDebugInstanceRequest--;
 }
 
-buildUnnamed3118() {
+buildUnnamed3144() {
   var o = new core.Map<core.String, api.FileInfo>();
   o["x"] = buildFileInfo();
   o["y"] = buildFileInfo();
   return o;
 }
 
-checkUnnamed3118(core.Map<core.String, api.FileInfo> o) {
+checkUnnamed3144(core.Map<core.String, api.FileInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFileInfo(o["x"]);
   checkFileInfo(o["y"]);
@@ -459,7 +459,7 @@
   buildCounterDeployment++;
   if (buildCounterDeployment < 3) {
     o.container = buildContainerInfo();
-    o.files = buildUnnamed3118();
+    o.files = buildUnnamed3144();
     o.zip = buildZipInfo();
   }
   buildCounterDeployment--;
@@ -470,7 +470,7 @@
   buildCounterDeployment++;
   if (buildCounterDeployment < 3) {
     checkContainerInfo(o.container);
-    checkUnnamed3118(o.files);
+    checkUnnamed3144(o.files);
     checkZipInfo(o.zip);
   }
   buildCounterDeployment--;
@@ -501,14 +501,14 @@
   buildCounterDiskUtilization--;
 }
 
-buildUnnamed3119() {
+buildUnnamed3145() {
   var o = new core.List<api.ResourceRecord>();
   o.add(buildResourceRecord());
   o.add(buildResourceRecord());
   return o;
 }
 
-checkUnnamed3119(core.List<api.ResourceRecord> o) {
+checkUnnamed3145(core.List<api.ResourceRecord> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecord(o[0]);
   checkResourceRecord(o[1]);
@@ -521,7 +521,7 @@
   if (buildCounterDomainMapping < 3) {
     o.id = "foo";
     o.name = "foo";
-    o.resourceRecords = buildUnnamed3119();
+    o.resourceRecords = buildUnnamed3145();
     o.sslSettings = buildSslSettings();
   }
   buildCounterDomainMapping--;
@@ -533,7 +533,7 @@
   if (buildCounterDomainMapping < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3119(o.resourceRecords);
+    checkUnnamed3145(o.resourceRecords);
     checkSslSettings(o.sslSettings);
   }
   buildCounterDomainMapping--;
@@ -791,14 +791,14 @@
   buildCounterLibrary--;
 }
 
-buildUnnamed3120() {
+buildUnnamed3146() {
   var o = new core.List<api.AuthorizedCertificate>();
   o.add(buildAuthorizedCertificate());
   o.add(buildAuthorizedCertificate());
   return o;
 }
 
-checkUnnamed3120(core.List<api.AuthorizedCertificate> o) {
+checkUnnamed3146(core.List<api.AuthorizedCertificate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthorizedCertificate(o[0]);
   checkAuthorizedCertificate(o[1]);
@@ -809,7 +809,7 @@
   var o = new api.ListAuthorizedCertificatesResponse();
   buildCounterListAuthorizedCertificatesResponse++;
   if (buildCounterListAuthorizedCertificatesResponse < 3) {
-    o.certificates = buildUnnamed3120();
+    o.certificates = buildUnnamed3146();
     o.nextPageToken = "foo";
   }
   buildCounterListAuthorizedCertificatesResponse--;
@@ -820,20 +820,20 @@
     api.ListAuthorizedCertificatesResponse o) {
   buildCounterListAuthorizedCertificatesResponse++;
   if (buildCounterListAuthorizedCertificatesResponse < 3) {
-    checkUnnamed3120(o.certificates);
+    checkUnnamed3146(o.certificates);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListAuthorizedCertificatesResponse--;
 }
 
-buildUnnamed3121() {
+buildUnnamed3147() {
   var o = new core.List<api.AuthorizedDomain>();
   o.add(buildAuthorizedDomain());
   o.add(buildAuthorizedDomain());
   return o;
 }
 
-checkUnnamed3121(core.List<api.AuthorizedDomain> o) {
+checkUnnamed3147(core.List<api.AuthorizedDomain> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthorizedDomain(o[0]);
   checkAuthorizedDomain(o[1]);
@@ -844,7 +844,7 @@
   var o = new api.ListAuthorizedDomainsResponse();
   buildCounterListAuthorizedDomainsResponse++;
   if (buildCounterListAuthorizedDomainsResponse < 3) {
-    o.domains = buildUnnamed3121();
+    o.domains = buildUnnamed3147();
     o.nextPageToken = "foo";
   }
   buildCounterListAuthorizedDomainsResponse--;
@@ -854,20 +854,20 @@
 checkListAuthorizedDomainsResponse(api.ListAuthorizedDomainsResponse o) {
   buildCounterListAuthorizedDomainsResponse++;
   if (buildCounterListAuthorizedDomainsResponse < 3) {
-    checkUnnamed3121(o.domains);
+    checkUnnamed3147(o.domains);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListAuthorizedDomainsResponse--;
 }
 
-buildUnnamed3122() {
+buildUnnamed3148() {
   var o = new core.List<api.DomainMapping>();
   o.add(buildDomainMapping());
   o.add(buildDomainMapping());
   return o;
 }
 
-checkUnnamed3122(core.List<api.DomainMapping> o) {
+checkUnnamed3148(core.List<api.DomainMapping> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDomainMapping(o[0]);
   checkDomainMapping(o[1]);
@@ -878,7 +878,7 @@
   var o = new api.ListDomainMappingsResponse();
   buildCounterListDomainMappingsResponse++;
   if (buildCounterListDomainMappingsResponse < 3) {
-    o.domainMappings = buildUnnamed3122();
+    o.domainMappings = buildUnnamed3148();
     o.nextPageToken = "foo";
   }
   buildCounterListDomainMappingsResponse--;
@@ -888,20 +888,20 @@
 checkListDomainMappingsResponse(api.ListDomainMappingsResponse o) {
   buildCounterListDomainMappingsResponse++;
   if (buildCounterListDomainMappingsResponse < 3) {
-    checkUnnamed3122(o.domainMappings);
+    checkUnnamed3148(o.domainMappings);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDomainMappingsResponse--;
 }
 
-buildUnnamed3123() {
+buildUnnamed3149() {
   var o = new core.List<api.FirewallRule>();
   o.add(buildFirewallRule());
   o.add(buildFirewallRule());
   return o;
 }
 
-checkUnnamed3123(core.List<api.FirewallRule> o) {
+checkUnnamed3149(core.List<api.FirewallRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewallRule(o[0]);
   checkFirewallRule(o[1]);
@@ -912,7 +912,7 @@
   var o = new api.ListIngressRulesResponse();
   buildCounterListIngressRulesResponse++;
   if (buildCounterListIngressRulesResponse < 3) {
-    o.ingressRules = buildUnnamed3123();
+    o.ingressRules = buildUnnamed3149();
     o.nextPageToken = "foo";
   }
   buildCounterListIngressRulesResponse--;
@@ -922,20 +922,20 @@
 checkListIngressRulesResponse(api.ListIngressRulesResponse o) {
   buildCounterListIngressRulesResponse++;
   if (buildCounterListIngressRulesResponse < 3) {
-    checkUnnamed3123(o.ingressRules);
+    checkUnnamed3149(o.ingressRules);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListIngressRulesResponse--;
 }
 
-buildUnnamed3124() {
+buildUnnamed3150() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed3124(core.List<api.Instance> o) {
+checkUnnamed3150(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -946,7 +946,7 @@
   var o = new api.ListInstancesResponse();
   buildCounterListInstancesResponse++;
   if (buildCounterListInstancesResponse < 3) {
-    o.instances = buildUnnamed3124();
+    o.instances = buildUnnamed3150();
     o.nextPageToken = "foo";
   }
   buildCounterListInstancesResponse--;
@@ -956,20 +956,20 @@
 checkListInstancesResponse(api.ListInstancesResponse o) {
   buildCounterListInstancesResponse++;
   if (buildCounterListInstancesResponse < 3) {
-    checkUnnamed3124(o.instances);
+    checkUnnamed3150(o.instances);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListInstancesResponse--;
 }
 
-buildUnnamed3125() {
+buildUnnamed3151() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed3125(core.List<api.Location> o) {
+checkUnnamed3151(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
@@ -980,7 +980,7 @@
   var o = new api.ListLocationsResponse();
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    o.locations = buildUnnamed3125();
+    o.locations = buildUnnamed3151();
     o.nextPageToken = "foo";
   }
   buildCounterListLocationsResponse--;
@@ -990,20 +990,20 @@
 checkListLocationsResponse(api.ListLocationsResponse o) {
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    checkUnnamed3125(o.locations);
+    checkUnnamed3151(o.locations);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListLocationsResponse--;
 }
 
-buildUnnamed3126() {
+buildUnnamed3152() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed3126(core.List<api.Operation> o) {
+checkUnnamed3152(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -1015,7 +1015,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed3126();
+    o.operations = buildUnnamed3152();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -1025,19 +1025,19 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3126(o.operations);
+    checkUnnamed3152(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed3127() {
+buildUnnamed3153() {
   var o = new core.List<api.Service>();
   o.add(buildService());
   o.add(buildService());
   return o;
 }
 
-checkUnnamed3127(core.List<api.Service> o) {
+checkUnnamed3153(core.List<api.Service> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkService(o[0]);
   checkService(o[1]);
@@ -1049,7 +1049,7 @@
   buildCounterListServicesResponse++;
   if (buildCounterListServicesResponse < 3) {
     o.nextPageToken = "foo";
-    o.services = buildUnnamed3127();
+    o.services = buildUnnamed3153();
   }
   buildCounterListServicesResponse--;
   return o;
@@ -1059,19 +1059,19 @@
   buildCounterListServicesResponse++;
   if (buildCounterListServicesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3127(o.services);
+    checkUnnamed3153(o.services);
   }
   buildCounterListServicesResponse--;
 }
 
-buildUnnamed3128() {
+buildUnnamed3154() {
   var o = new core.List<api.Version>();
   o.add(buildVersion());
   o.add(buildVersion());
   return o;
 }
 
-checkUnnamed3128(core.List<api.Version> o) {
+checkUnnamed3154(core.List<api.Version> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVersion(o[0]);
   checkVersion(o[1]);
@@ -1083,7 +1083,7 @@
   buildCounterListVersionsResponse++;
   if (buildCounterListVersionsResponse < 3) {
     o.nextPageToken = "foo";
-    o.versions = buildUnnamed3128();
+    o.versions = buildUnnamed3154();
   }
   buildCounterListVersionsResponse--;
   return o;
@@ -1093,7 +1093,7 @@
   buildCounterListVersionsResponse++;
   if (buildCounterListVersionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3128(o.versions);
+    checkUnnamed3154(o.versions);
   }
   buildCounterListVersionsResponse--;
 }
@@ -1129,20 +1129,20 @@
   buildCounterLivenessCheck--;
 }
 
-buildUnnamed3129() {
+buildUnnamed3155() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3129(core.Map<core.String, core.String> o) {
+checkUnnamed3155(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'));
 }
 
-buildUnnamed3130() {
+buildUnnamed3156() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1157,7 +1157,7 @@
   return o;
 }
 
-checkUnnamed3130(core.Map<core.String, core.Object> o) {
+checkUnnamed3156(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));
@@ -1176,9 +1176,9 @@
   var o = new api.Location();
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    o.labels = buildUnnamed3129();
+    o.labels = buildUnnamed3155();
     o.locationId = "foo";
-    o.metadata = buildUnnamed3130();
+    o.metadata = buildUnnamed3156();
     o.name = "foo";
   }
   buildCounterLocation--;
@@ -1188,9 +1188,9 @@
 checkLocation(api.Location o) {
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    checkUnnamed3129(o.labels);
+    checkUnnamed3155(o.labels);
     unittest.expect(o.locationId, unittest.equals('foo'));
-    checkUnnamed3130(o.metadata);
+    checkUnnamed3156(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterLocation--;
@@ -1236,14 +1236,14 @@
   buildCounterManualScaling--;
 }
 
-buildUnnamed3131() {
+buildUnnamed3157() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3131(core.List<core.String> o) {
+checkUnnamed3157(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1254,7 +1254,7 @@
   var o = new api.Network();
   buildCounterNetwork++;
   if (buildCounterNetwork < 3) {
-    o.forwardedPorts = buildUnnamed3131();
+    o.forwardedPorts = buildUnnamed3157();
     o.instanceTag = "foo";
     o.name = "foo";
     o.subnetworkName = "foo";
@@ -1266,7 +1266,7 @@
 checkNetwork(api.Network o) {
   buildCounterNetwork++;
   if (buildCounterNetwork < 3) {
-    checkUnnamed3131(o.forwardedPorts);
+    checkUnnamed3157(o.forwardedPorts);
     unittest.expect(o.instanceTag, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.subnetworkName, unittest.equals('foo'));
@@ -1299,7 +1299,7 @@
   buildCounterNetworkUtilization--;
 }
 
-buildUnnamed3132() {
+buildUnnamed3158() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1314,7 +1314,7 @@
   return o;
 }
 
-checkUnnamed3132(core.Map<core.String, core.Object> o) {
+checkUnnamed3158(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -1328,7 +1328,7 @@
   unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3133() {
+buildUnnamed3159() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1343,7 +1343,7 @@
   return o;
 }
 
-checkUnnamed3133(core.Map<core.String, core.Object> o) {
+checkUnnamed3159(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -1364,9 +1364,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed3132();
+    o.metadata = buildUnnamed3158();
     o.name = "foo";
-    o.response = buildUnnamed3133();
+    o.response = buildUnnamed3159();
   }
   buildCounterOperation--;
   return o;
@@ -1377,9 +1377,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed3132(o.metadata);
+    checkUnnamed3158(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3133(o.response);
+    checkUnnamed3159(o.response);
   }
   buildCounterOperation--;
 }
@@ -1413,14 +1413,14 @@
   buildCounterOperationMetadata--;
 }
 
-buildUnnamed3134() {
+buildUnnamed3160() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3134(core.List<core.String> o) {
+checkUnnamed3160(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1437,7 +1437,7 @@
     o.method = "foo";
     o.target = "foo";
     o.user = "foo";
-    o.warning = buildUnnamed3134();
+    o.warning = buildUnnamed3160();
   }
   buildCounterOperationMetadataV1--;
   return o;
@@ -1452,19 +1452,19 @@
     unittest.expect(o.method, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed3134(o.warning);
+    checkUnnamed3160(o.warning);
   }
   buildCounterOperationMetadataV1--;
 }
 
-buildUnnamed3135() {
+buildUnnamed3161() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3135(core.List<core.String> o) {
+checkUnnamed3161(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1481,7 +1481,7 @@
     o.method = "foo";
     o.target = "foo";
     o.user = "foo";
-    o.warning = buildUnnamed3135();
+    o.warning = buildUnnamed3161();
   }
   buildCounterOperationMetadataV1Alpha--;
   return o;
@@ -1496,19 +1496,19 @@
     unittest.expect(o.method, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed3135(o.warning);
+    checkUnnamed3161(o.warning);
   }
   buildCounterOperationMetadataV1Alpha--;
 }
 
-buildUnnamed3136() {
+buildUnnamed3162() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3136(core.List<core.String> o) {
+checkUnnamed3162(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1525,7 +1525,7 @@
     o.method = "foo";
     o.target = "foo";
     o.user = "foo";
-    o.warning = buildUnnamed3136();
+    o.warning = buildUnnamed3162();
   }
   buildCounterOperationMetadataV1Beta--;
   return o;
@@ -1540,7 +1540,7 @@
     unittest.expect(o.method, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed3136(o.warning);
+    checkUnnamed3162(o.warning);
   }
   buildCounterOperationMetadataV1Beta--;
 }
@@ -1662,14 +1662,14 @@
   buildCounterResourceRecord--;
 }
 
-buildUnnamed3137() {
+buildUnnamed3163() {
   var o = new core.List<api.Volume>();
   o.add(buildVolume());
   o.add(buildVolume());
   return o;
 }
 
-checkUnnamed3137(core.List<api.Volume> o) {
+checkUnnamed3163(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolume(o[0]);
   checkVolume(o[1]);
@@ -1683,7 +1683,7 @@
     o.cpu = 42.0;
     o.diskGb = 42.0;
     o.memoryGb = 42.0;
-    o.volumes = buildUnnamed3137();
+    o.volumes = buildUnnamed3163();
   }
   buildCounterResources--;
   return o;
@@ -1695,7 +1695,7 @@
     unittest.expect(o.cpu, unittest.equals(42.0));
     unittest.expect(o.diskGb, unittest.equals(42.0));
     unittest.expect(o.memoryGb, unittest.equals(42.0));
-    checkUnnamed3137(o.volumes);
+    checkUnnamed3163(o.volumes);
   }
   buildCounterResources--;
 }
@@ -1786,14 +1786,14 @@
   buildCounterStandardSchedulerSettings--;
 }
 
-buildUnnamed3138() {
+buildUnnamed3164() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3138(core.Map<core.String, core.String> o) {
+checkUnnamed3164(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'));
@@ -1806,7 +1806,7 @@
   if (buildCounterStaticFilesHandler < 3) {
     o.applicationReadable = true;
     o.expiration = "foo";
-    o.httpHeaders = buildUnnamed3138();
+    o.httpHeaders = buildUnnamed3164();
     o.mimeType = "foo";
     o.path = "foo";
     o.requireMatchingFile = true;
@@ -1821,7 +1821,7 @@
   if (buildCounterStaticFilesHandler < 3) {
     unittest.expect(o.applicationReadable, unittest.isTrue);
     unittest.expect(o.expiration, unittest.equals('foo'));
-    checkUnnamed3138(o.httpHeaders);
+    checkUnnamed3164(o.httpHeaders);
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.path, unittest.equals('foo'));
     unittest.expect(o.requireMatchingFile, unittest.isTrue);
@@ -1830,7 +1830,7 @@
   buildCounterStaticFilesHandler--;
 }
 
-buildUnnamed3139() {
+buildUnnamed3165() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1845,7 +1845,7 @@
   return o;
 }
 
-checkUnnamed3139(core.Map<core.String, core.Object> o) {
+checkUnnamed3165(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o["x"]) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -1859,17 +1859,17 @@
   unittest.expect(casted8["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3140() {
+buildUnnamed3166() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed3139());
-  o.add(buildUnnamed3139());
+  o.add(buildUnnamed3165());
+  o.add(buildUnnamed3165());
   return o;
 }
 
-checkUnnamed3140(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed3166(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3139(o[0]);
-  checkUnnamed3139(o[1]);
+  checkUnnamed3165(o[0]);
+  checkUnnamed3165(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1878,7 +1878,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed3140();
+    o.details = buildUnnamed3166();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1889,20 +1889,20 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed3140(o.details);
+    checkUnnamed3166(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-buildUnnamed3141() {
+buildUnnamed3167() {
   var o = new core.Map<core.String, core.double>();
   o["x"] = 42.0;
   o["y"] = 42.0;
   return o;
 }
 
-checkUnnamed3141(core.Map<core.String, core.double> o) {
+checkUnnamed3167(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));
@@ -1913,7 +1913,7 @@
   var o = new api.TrafficSplit();
   buildCounterTrafficSplit++;
   if (buildCounterTrafficSplit < 3) {
-    o.allocations = buildUnnamed3141();
+    o.allocations = buildUnnamed3167();
     o.shardBy = "foo";
   }
   buildCounterTrafficSplit--;
@@ -1923,7 +1923,7 @@
 checkTrafficSplit(api.TrafficSplit o) {
   buildCounterTrafficSplit++;
   if (buildCounterTrafficSplit < 3) {
-    checkUnnamed3141(o.allocations);
+    checkUnnamed3167(o.allocations);
     unittest.expect(o.shardBy, unittest.equals('foo'));
   }
   buildCounterTrafficSplit--;
@@ -1985,79 +1985,79 @@
   buildCounterUrlMap--;
 }
 
-buildUnnamed3142() {
+buildUnnamed3168() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3142(core.Map<core.String, core.String> o) {
+checkUnnamed3168(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'));
 }
 
-buildUnnamed3143() {
+buildUnnamed3169() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3143(core.Map<core.String, core.String> o) {
+checkUnnamed3169(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'));
 }
 
-buildUnnamed3144() {
+buildUnnamed3170() {
   var o = new core.List<api.ErrorHandler>();
   o.add(buildErrorHandler());
   o.add(buildErrorHandler());
   return o;
 }
 
-checkUnnamed3144(core.List<api.ErrorHandler> o) {
+checkUnnamed3170(core.List<api.ErrorHandler> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorHandler(o[0]);
   checkErrorHandler(o[1]);
 }
 
-buildUnnamed3145() {
+buildUnnamed3171() {
   var o = new core.List<api.UrlMap>();
   o.add(buildUrlMap());
   o.add(buildUrlMap());
   return o;
 }
 
-checkUnnamed3145(core.List<api.UrlMap> o) {
+checkUnnamed3171(core.List<api.UrlMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMap(o[0]);
   checkUrlMap(o[1]);
 }
 
-buildUnnamed3146() {
+buildUnnamed3172() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3146(core.List<core.String> o) {
+checkUnnamed3172(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3147() {
+buildUnnamed3173() {
   var o = new core.List<api.Library>();
   o.add(buildLibrary());
   o.add(buildLibrary());
   return o;
 }
 
-checkUnnamed3147(core.List<api.Library> o) {
+checkUnnamed3173(core.List<api.Library> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLibrary(o[0]);
   checkLibrary(o[1]);
@@ -2071,7 +2071,7 @@
     o.apiConfig = buildApiConfigHandler();
     o.automaticScaling = buildAutomaticScaling();
     o.basicScaling = buildBasicScaling();
-    o.betaSettings = buildUnnamed3142();
+    o.betaSettings = buildUnnamed3168();
     o.createTime = "foo";
     o.createdBy = "foo";
     o.defaultExpiration = "foo";
@@ -2079,14 +2079,14 @@
     o.diskUsageBytes = "foo";
     o.endpointsApiService = buildEndpointsApiService();
     o.env = "foo";
-    o.envVariables = buildUnnamed3143();
-    o.errorHandlers = buildUnnamed3144();
-    o.handlers = buildUnnamed3145();
+    o.envVariables = buildUnnamed3169();
+    o.errorHandlers = buildUnnamed3170();
+    o.handlers = buildUnnamed3171();
     o.healthCheck = buildHealthCheck();
     o.id = "foo";
-    o.inboundServices = buildUnnamed3146();
+    o.inboundServices = buildUnnamed3172();
     o.instanceClass = "foo";
-    o.libraries = buildUnnamed3147();
+    o.libraries = buildUnnamed3173();
     o.livenessCheck = buildLivenessCheck();
     o.manualScaling = buildManualScaling();
     o.name = "foo";
@@ -2111,7 +2111,7 @@
     checkApiConfigHandler(o.apiConfig);
     checkAutomaticScaling(o.automaticScaling);
     checkBasicScaling(o.basicScaling);
-    checkUnnamed3142(o.betaSettings);
+    checkUnnamed3168(o.betaSettings);
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.createdBy, unittest.equals('foo'));
     unittest.expect(o.defaultExpiration, unittest.equals('foo'));
@@ -2119,14 +2119,14 @@
     unittest.expect(o.diskUsageBytes, unittest.equals('foo'));
     checkEndpointsApiService(o.endpointsApiService);
     unittest.expect(o.env, unittest.equals('foo'));
-    checkUnnamed3143(o.envVariables);
-    checkUnnamed3144(o.errorHandlers);
-    checkUnnamed3145(o.handlers);
+    checkUnnamed3169(o.envVariables);
+    checkUnnamed3170(o.errorHandlers);
+    checkUnnamed3171(o.handlers);
     checkHealthCheck(o.healthCheck);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed3146(o.inboundServices);
+    checkUnnamed3172(o.inboundServices);
     unittest.expect(o.instanceClass, unittest.equals('foo'));
-    checkUnnamed3147(o.libraries);
+    checkUnnamed3173(o.libraries);
     checkLivenessCheck(o.livenessCheck);
     checkManualScaling(o.manualScaling);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -3554,8 +3554,8 @@
       api.AppsDomainMappingsResourceApi res =
           new api.AppengineApi(mock).apps.domainMappings;
       var arg_appsId = "foo";
-      var arg_pageSize = 42;
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3596,10 +3596,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3610,8 +3610,8 @@
       }), true);
       res
           .list(arg_appsId,
-              pageSize: arg_pageSize,
               pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(
               unittest.expectAsync1(((api.ListDomainMappingsResponse response) {
@@ -3954,9 +3954,9 @@
       api.AppsFirewallIngressRulesResourceApi res =
           new api.AppengineApi(mock).apps.firewall.ingressRules;
       var arg_appsId = "foo";
+      var arg_pageSize = 42;
       var arg_matchingAddress = "foo";
       var arg_pageToken = "foo";
-      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3997,12 +3997,12 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["matchingAddress"].first,
             unittest.equals(arg_matchingAddress));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -4013,9 +4013,9 @@
       }), true);
       res
           .list(arg_appsId,
+              pageSize: arg_pageSize,
               matchingAddress: arg_matchingAddress,
               pageToken: arg_pageToken,
-              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListIngressRulesResponse response) {
         checkListIngressRulesResponse(response);
@@ -4165,9 +4165,9 @@
       api.AppsLocationsResourceApi res =
           new api.AppengineApi(mock).apps.locations;
       var arg_appsId = "foo";
+      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_filter = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -4208,11 +4208,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -4223,9 +4223,9 @@
       }), true);
       res
           .list(arg_appsId,
+              filter: arg_filter,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
-              filter: arg_filter,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListLocationsResponse response) {
         checkListLocationsResponse(response);
@@ -4303,9 +4303,9 @@
       api.AppsOperationsResourceApi res =
           new api.AppengineApi(mock).apps.operations;
       var arg_appsId = "foo";
-      var arg_pageSize = 42;
       var arg_filter = "foo";
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -4346,11 +4346,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -4361,9 +4361,9 @@
       }), true);
       res
           .list(arg_appsId,
-              pageSize: arg_pageSize,
               filter: arg_filter,
               pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
@@ -4576,8 +4576,8 @@
       var arg_request = buildService();
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
-      var arg_migrateTraffic = true;
       var arg_updateMask = "foo";
+      var arg_migrateTraffic = true;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.Service.fromJson(json);
@@ -4624,10 +4624,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["migrateTraffic"].first,
-            unittest.equals("$arg_migrateTraffic"));
         unittest.expect(
             queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+        unittest.expect(queryMap["migrateTraffic"].first,
+            unittest.equals("$arg_migrateTraffic"));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -4638,8 +4638,8 @@
       }), true);
       res
           .patch(arg_request, arg_appsId, arg_servicesId,
-              migrateTraffic: arg_migrateTraffic,
               updateMask: arg_updateMask,
+              migrateTraffic: arg_migrateTraffic,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
@@ -4880,9 +4880,9 @@
           new api.AppengineApi(mock).apps.services.versions;
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_view = "foo";
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -4932,11 +4932,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
         unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -4947,9 +4947,9 @@
       }), true);
       res
           .list(arg_appsId, arg_servicesId,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
               view: arg_view,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListVersionsResponse response) {
         checkListVersionsResponse(response);
diff --git a/generated/googleapis/test/appsactivity/v1_test.dart b/generated/googleapis/test/appsactivity/v1_test.dart
index 5f80921..2252add 100644
--- a/generated/googleapis/test/appsactivity/v1_test.dart
+++ b/generated/googleapis/test/appsactivity/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1144() {
+buildUnnamed1155() {
   var o = new core.List<api.Event>();
   o.add(buildEvent());
   o.add(buildEvent());
   return o;
 }
 
-checkUnnamed1144(core.List<api.Event> o) {
+checkUnnamed1155(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEvent(o[0]);
   checkEvent(o[1]);
@@ -69,7 +69,7 @@
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
     o.combinedEvent = buildEvent();
-    o.singleEvents = buildUnnamed1144();
+    o.singleEvents = buildUnnamed1155();
   }
   buildCounterActivity--;
   return o;
@@ -79,32 +79,32 @@
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
     checkEvent(o.combinedEvent);
-    checkUnnamed1144(o.singleEvents);
+    checkUnnamed1155(o.singleEvents);
   }
   buildCounterActivity--;
 }
 
-buildUnnamed1145() {
+buildUnnamed1156() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1145(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'));
 }
 
-buildUnnamed1146() {
+buildUnnamed1157() {
   var o = new core.List<api.PermissionChange>();
   o.add(buildPermissionChange());
   o.add(buildPermissionChange());
   return o;
 }
 
-checkUnnamed1146(core.List<api.PermissionChange> o) {
+checkUnnamed1157(core.List<api.PermissionChange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermissionChange(o[0]);
   checkPermissionChange(o[1]);
@@ -115,11 +115,11 @@
   var o = new api.Event();
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
-    o.additionalEventTypes = buildUnnamed1145();
+    o.additionalEventTypes = buildUnnamed1156();
     o.eventTimeMillis = "foo";
     o.fromUserDeletion = true;
     o.move = buildMove();
-    o.permissionChanges = buildUnnamed1146();
+    o.permissionChanges = buildUnnamed1157();
     o.primaryEventType = "foo";
     o.rename = buildRename();
     o.target = buildTarget();
@@ -132,11 +132,11 @@
 checkEvent(api.Event o) {
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
-    checkUnnamed1145(o.additionalEventTypes);
+    checkUnnamed1156(o.additionalEventTypes);
     unittest.expect(o.eventTimeMillis, unittest.equals('foo'));
     unittest.expect(o.fromUserDeletion, unittest.isTrue);
     checkMove(o.move);
-    checkUnnamed1146(o.permissionChanges);
+    checkUnnamed1157(o.permissionChanges);
     unittest.expect(o.primaryEventType, unittest.equals('foo'));
     checkRename(o.rename);
     checkTarget(o.target);
@@ -145,14 +145,14 @@
   buildCounterEvent--;
 }
 
-buildUnnamed1147() {
+buildUnnamed1158() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed1147(core.List<api.Activity> o) {
+checkUnnamed1158(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -163,7 +163,7 @@
   var o = new api.ListActivitiesResponse();
   buildCounterListActivitiesResponse++;
   if (buildCounterListActivitiesResponse < 3) {
-    o.activities = buildUnnamed1147();
+    o.activities = buildUnnamed1158();
     o.nextPageToken = "foo";
   }
   buildCounterListActivitiesResponse--;
@@ -173,33 +173,33 @@
 checkListActivitiesResponse(api.ListActivitiesResponse o) {
   buildCounterListActivitiesResponse++;
   if (buildCounterListActivitiesResponse < 3) {
-    checkUnnamed1147(o.activities);
+    checkUnnamed1158(o.activities);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListActivitiesResponse--;
 }
 
-buildUnnamed1148() {
+buildUnnamed1159() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed1148(core.List<api.Parent> o) {
+checkUnnamed1159(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
 }
 
-buildUnnamed1149() {
+buildUnnamed1160() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed1149(core.List<api.Parent> o) {
+checkUnnamed1160(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
@@ -210,8 +210,8 @@
   var o = new api.Move();
   buildCounterMove++;
   if (buildCounterMove < 3) {
-    o.addedParents = buildUnnamed1148();
-    o.removedParents = buildUnnamed1149();
+    o.addedParents = buildUnnamed1159();
+    o.removedParents = buildUnnamed1160();
   }
   buildCounterMove--;
   return o;
@@ -220,8 +220,8 @@
 checkMove(api.Move o) {
   buildCounterMove++;
   if (buildCounterMove < 3) {
-    checkUnnamed1148(o.addedParents);
-    checkUnnamed1149(o.removedParents);
+    checkUnnamed1159(o.addedParents);
+    checkUnnamed1160(o.removedParents);
   }
   buildCounterMove--;
 }
@@ -278,27 +278,27 @@
   buildCounterPermission--;
 }
 
-buildUnnamed1150() {
+buildUnnamed1161() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed1150(core.List<api.Permission> o) {
+checkUnnamed1161(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
 }
 
-buildUnnamed1151() {
+buildUnnamed1162() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed1151(core.List<api.Permission> o) {
+checkUnnamed1162(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -309,8 +309,8 @@
   var o = new api.PermissionChange();
   buildCounterPermissionChange++;
   if (buildCounterPermissionChange < 3) {
-    o.addedPermissions = buildUnnamed1150();
-    o.removedPermissions = buildUnnamed1151();
+    o.addedPermissions = buildUnnamed1161();
+    o.removedPermissions = buildUnnamed1162();
   }
   buildCounterPermissionChange--;
   return o;
@@ -319,8 +319,8 @@
 checkPermissionChange(api.PermissionChange o) {
   buildCounterPermissionChange++;
   if (buildCounterPermissionChange < 3) {
-    checkUnnamed1150(o.addedPermissions);
-    checkUnnamed1151(o.removedPermissions);
+    checkUnnamed1161(o.addedPermissions);
+    checkUnnamed1162(o.removedPermissions);
   }
   buildCounterPermissionChange--;
 }
diff --git a/generated/googleapis/test/appstate/v1_test.dart b/generated/googleapis/test/appstate/v1_test.dart
index daa68d9..f42495e 100644
--- a/generated/googleapis/test/appstate/v1_test.dart
+++ b/generated/googleapis/test/appstate/v1_test.dart
@@ -75,14 +75,14 @@
   buildCounterGetResponse--;
 }
 
-buildUnnamed2668() {
+buildUnnamed2693() {
   var o = new core.List<api.GetResponse>();
   o.add(buildGetResponse());
   o.add(buildGetResponse());
   return o;
 }
 
-checkUnnamed2668(core.List<api.GetResponse> o) {
+checkUnnamed2693(core.List<api.GetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGetResponse(o[0]);
   checkGetResponse(o[1]);
@@ -93,7 +93,7 @@
   var o = new api.ListResponse();
   buildCounterListResponse++;
   if (buildCounterListResponse < 3) {
-    o.items = buildUnnamed2668();
+    o.items = buildUnnamed2693();
     o.kind = "foo";
     o.maximumKeyCount = 42;
   }
@@ -104,7 +104,7 @@
 checkListResponse(api.ListResponse o) {
   buildCounterListResponse++;
   if (buildCounterListResponse < 3) {
-    checkUnnamed2668(o.items);
+    checkUnnamed2693(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 6040267..920afbf 100644
--- a/generated/googleapis/test/bigquery/v2_test.dart
+++ b/generated/googleapis/test/bigquery/v2_test.dart
@@ -79,14 +79,14 @@
   buildCounterBigtableColumn--;
 }
 
-buildUnnamed3187() {
+buildUnnamed3215() {
   var o = new core.List<api.BigtableColumn>();
   o.add(buildBigtableColumn());
   o.add(buildBigtableColumn());
   return o;
 }
 
-checkUnnamed3187(core.List<api.BigtableColumn> o) {
+checkUnnamed3215(core.List<api.BigtableColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBigtableColumn(o[0]);
   checkBigtableColumn(o[1]);
@@ -97,7 +97,7 @@
   var o = new api.BigtableColumnFamily();
   buildCounterBigtableColumnFamily++;
   if (buildCounterBigtableColumnFamily < 3) {
-    o.columns = buildUnnamed3187();
+    o.columns = buildUnnamed3215();
     o.encoding = "foo";
     o.familyId = "foo";
     o.onlyReadLatest = true;
@@ -110,7 +110,7 @@
 checkBigtableColumnFamily(api.BigtableColumnFamily o) {
   buildCounterBigtableColumnFamily++;
   if (buildCounterBigtableColumnFamily < 3) {
-    checkUnnamed3187(o.columns);
+    checkUnnamed3215(o.columns);
     unittest.expect(o.encoding, unittest.equals('foo'));
     unittest.expect(o.familyId, unittest.equals('foo'));
     unittest.expect(o.onlyReadLatest, unittest.isTrue);
@@ -119,14 +119,14 @@
   buildCounterBigtableColumnFamily--;
 }
 
-buildUnnamed3188() {
+buildUnnamed3216() {
   var o = new core.List<api.BigtableColumnFamily>();
   o.add(buildBigtableColumnFamily());
   o.add(buildBigtableColumnFamily());
   return o;
 }
 
-checkUnnamed3188(core.List<api.BigtableColumnFamily> o) {
+checkUnnamed3216(core.List<api.BigtableColumnFamily> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBigtableColumnFamily(o[0]);
   checkBigtableColumnFamily(o[1]);
@@ -137,7 +137,7 @@
   var o = new api.BigtableOptions();
   buildCounterBigtableOptions++;
   if (buildCounterBigtableOptions < 3) {
-    o.columnFamilies = buildUnnamed3188();
+    o.columnFamilies = buildUnnamed3216();
     o.ignoreUnspecifiedColumnFamilies = true;
     o.readRowkeyAsString = true;
   }
@@ -148,7 +148,7 @@
 checkBigtableOptions(api.BigtableOptions o) {
   buildCounterBigtableOptions++;
   if (buildCounterBigtableOptions < 3) {
-    checkUnnamed3188(o.columnFamilies);
+    checkUnnamed3216(o.columnFamilies);
     unittest.expect(o.ignoreUnspecifiedColumnFamilies, unittest.isTrue);
     unittest.expect(o.readRowkeyAsString, unittest.isTrue);
   }
@@ -213,27 +213,27 @@
   buildCounterDatasetAccess--;
 }
 
-buildUnnamed3189() {
+buildUnnamed3217() {
   var o = new core.List<api.DatasetAccess>();
   o.add(buildDatasetAccess());
   o.add(buildDatasetAccess());
   return o;
 }
 
-checkUnnamed3189(core.List<api.DatasetAccess> o) {
+checkUnnamed3217(core.List<api.DatasetAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatasetAccess(o[0]);
   checkDatasetAccess(o[1]);
 }
 
-buildUnnamed3190() {
+buildUnnamed3218() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3190(core.Map<core.String, core.String> o) {
+checkUnnamed3218(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'));
@@ -244,7 +244,7 @@
   var o = new api.Dataset();
   buildCounterDataset++;
   if (buildCounterDataset < 3) {
-    o.access = buildUnnamed3189();
+    o.access = buildUnnamed3217();
     o.creationTime = "foo";
     o.datasetReference = buildDatasetReference();
     o.defaultTableExpirationMs = "foo";
@@ -253,7 +253,7 @@
     o.friendlyName = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed3190();
+    o.labels = buildUnnamed3218();
     o.lastModifiedTime = "foo";
     o.location = "foo";
     o.selfLink = "foo";
@@ -265,7 +265,7 @@
 checkDataset(api.Dataset o) {
   buildCounterDataset++;
   if (buildCounterDataset < 3) {
-    checkUnnamed3189(o.access);
+    checkUnnamed3217(o.access);
     unittest.expect(o.creationTime, unittest.equals('foo'));
     checkDatasetReference(o.datasetReference);
     unittest.expect(o.defaultTableExpirationMs, unittest.equals('foo'));
@@ -274,7 +274,7 @@
     unittest.expect(o.friendlyName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3190(o.labels);
+    checkUnnamed3218(o.labels);
     unittest.expect(o.lastModifiedTime, unittest.equals('foo'));
     unittest.expect(o.location, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -282,14 +282,14 @@
   buildCounterDataset--;
 }
 
-buildUnnamed3191() {
+buildUnnamed3219() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3191(core.Map<core.String, core.String> o) {
+checkUnnamed3219(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'));
@@ -304,7 +304,7 @@
     o.friendlyName = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed3191();
+    o.labels = buildUnnamed3219();
   }
   buildCounterDatasetListDatasets--;
   return o;
@@ -317,19 +317,19 @@
     unittest.expect(o.friendlyName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3191(o.labels);
+    checkUnnamed3219(o.labels);
   }
   buildCounterDatasetListDatasets--;
 }
 
-buildUnnamed3192() {
+buildUnnamed3220() {
   var o = new core.List<api.DatasetListDatasets>();
   o.add(buildDatasetListDatasets());
   o.add(buildDatasetListDatasets());
   return o;
 }
 
-checkUnnamed3192(core.List<api.DatasetListDatasets> o) {
+checkUnnamed3220(core.List<api.DatasetListDatasets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatasetListDatasets(o[0]);
   checkDatasetListDatasets(o[1]);
@@ -340,7 +340,7 @@
   var o = new api.DatasetList();
   buildCounterDatasetList++;
   if (buildCounterDatasetList < 3) {
-    o.datasets = buildUnnamed3192();
+    o.datasets = buildUnnamed3220();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -352,7 +352,7 @@
 checkDatasetList(api.DatasetList o) {
   buildCounterDatasetList++;
   if (buildCounterDatasetList < 3) {
-    checkUnnamed3192(o.datasets);
+    checkUnnamed3220(o.datasets);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -425,14 +425,14 @@
   buildCounterErrorProto--;
 }
 
-buildUnnamed3193() {
+buildUnnamed3221() {
   var o = new core.List<api.ExplainQueryStep>();
   o.add(buildExplainQueryStep());
   o.add(buildExplainQueryStep());
   return o;
 }
 
-checkUnnamed3193(core.List<api.ExplainQueryStep> o) {
+checkUnnamed3221(core.List<api.ExplainQueryStep> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExplainQueryStep(o[0]);
   checkExplainQueryStep(o[1]);
@@ -443,12 +443,14 @@
   var o = new api.ExplainQueryStage();
   buildCounterExplainQueryStage++;
   if (buildCounterExplainQueryStage < 3) {
+    o.completedParallelInputs = "foo";
     o.computeMsAvg = "foo";
     o.computeMsMax = "foo";
     o.computeRatioAvg = 42.0;
     o.computeRatioMax = 42.0;
     o.id = "foo";
     o.name = "foo";
+    o.parallelInputs = "foo";
     o.readMsAvg = "foo";
     o.readMsMax = "foo";
     o.readRatioAvg = 42.0;
@@ -458,7 +460,7 @@
     o.shuffleOutputBytes = "foo";
     o.shuffleOutputBytesSpilled = "foo";
     o.status = "foo";
-    o.steps = buildUnnamed3193();
+    o.steps = buildUnnamed3221();
     o.waitMsAvg = "foo";
     o.waitMsMax = "foo";
     o.waitRatioAvg = 42.0;
@@ -475,12 +477,14 @@
 checkExplainQueryStage(api.ExplainQueryStage o) {
   buildCounterExplainQueryStage++;
   if (buildCounterExplainQueryStage < 3) {
+    unittest.expect(o.completedParallelInputs, unittest.equals('foo'));
     unittest.expect(o.computeMsAvg, unittest.equals('foo'));
     unittest.expect(o.computeMsMax, unittest.equals('foo'));
     unittest.expect(o.computeRatioAvg, unittest.equals(42.0));
     unittest.expect(o.computeRatioMax, unittest.equals(42.0));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.parallelInputs, unittest.equals('foo'));
     unittest.expect(o.readMsAvg, unittest.equals('foo'));
     unittest.expect(o.readMsMax, unittest.equals('foo'));
     unittest.expect(o.readRatioAvg, unittest.equals(42.0));
@@ -490,7 +494,7 @@
     unittest.expect(o.shuffleOutputBytes, unittest.equals('foo'));
     unittest.expect(o.shuffleOutputBytesSpilled, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed3193(o.steps);
+    checkUnnamed3221(o.steps);
     unittest.expect(o.waitMsAvg, unittest.equals('foo'));
     unittest.expect(o.waitMsMax, unittest.equals('foo'));
     unittest.expect(o.waitRatioAvg, unittest.equals(42.0));
@@ -503,14 +507,14 @@
   buildCounterExplainQueryStage--;
 }
 
-buildUnnamed3194() {
+buildUnnamed3222() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3194(core.List<core.String> o) {
+checkUnnamed3222(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -522,7 +526,7 @@
   buildCounterExplainQueryStep++;
   if (buildCounterExplainQueryStep < 3) {
     o.kind = "foo";
-    o.substeps = buildUnnamed3194();
+    o.substeps = buildUnnamed3222();
   }
   buildCounterExplainQueryStep--;
   return o;
@@ -532,19 +536,19 @@
   buildCounterExplainQueryStep++;
   if (buildCounterExplainQueryStep < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3194(o.substeps);
+    checkUnnamed3222(o.substeps);
   }
   buildCounterExplainQueryStep--;
 }
 
-buildUnnamed3195() {
+buildUnnamed3223() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3195(core.List<core.String> o) {
+checkUnnamed3223(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -564,7 +568,7 @@
     o.maxBadRecords = 42;
     o.schema = buildTableSchema();
     o.sourceFormat = "foo";
-    o.sourceUris = buildUnnamed3195();
+    o.sourceUris = buildUnnamed3223();
   }
   buildCounterExternalDataConfiguration--;
   return o;
@@ -582,32 +586,32 @@
     unittest.expect(o.maxBadRecords, unittest.equals(42));
     checkTableSchema(o.schema);
     unittest.expect(o.sourceFormat, unittest.equals('foo'));
-    checkUnnamed3195(o.sourceUris);
+    checkUnnamed3223(o.sourceUris);
   }
   buildCounterExternalDataConfiguration--;
 }
 
-buildUnnamed3196() {
+buildUnnamed3224() {
   var o = new core.List<api.ErrorProto>();
   o.add(buildErrorProto());
   o.add(buildErrorProto());
   return o;
 }
 
-checkUnnamed3196(core.List<api.ErrorProto> o) {
+checkUnnamed3224(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorProto(o[0]);
   checkErrorProto(o[1]);
 }
 
-buildUnnamed3197() {
+buildUnnamed3225() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed3197(core.List<api.TableRow> o) {
+checkUnnamed3225(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -619,14 +623,14 @@
   buildCounterGetQueryResultsResponse++;
   if (buildCounterGetQueryResultsResponse < 3) {
     o.cacheHit = true;
-    o.errors = buildUnnamed3196();
+    o.errors = buildUnnamed3224();
     o.etag = "foo";
     o.jobComplete = true;
     o.jobReference = buildJobReference();
     o.kind = "foo";
     o.numDmlAffectedRows = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed3197();
+    o.rows = buildUnnamed3225();
     o.schema = buildTableSchema();
     o.totalBytesProcessed = "foo";
     o.totalRows = "foo";
@@ -639,14 +643,14 @@
   buildCounterGetQueryResultsResponse++;
   if (buildCounterGetQueryResultsResponse < 3) {
     unittest.expect(o.cacheHit, unittest.isTrue);
-    checkUnnamed3196(o.errors);
+    checkUnnamed3224(o.errors);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.jobComplete, unittest.isTrue);
     checkJobReference(o.jobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.numDmlAffectedRows, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed3197(o.rows);
+    checkUnnamed3225(o.rows);
     checkTableSchema(o.schema);
     unittest.expect(o.totalBytesProcessed, unittest.equals('foo'));
     unittest.expect(o.totalRows, unittest.equals('foo'));
@@ -750,14 +754,14 @@
   buildCounterJobCancelResponse--;
 }
 
-buildUnnamed3198() {
+buildUnnamed3226() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3198(core.Map<core.String, core.String> o) {
+checkUnnamed3226(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'));
@@ -771,7 +775,7 @@
     o.copy = buildJobConfigurationTableCopy();
     o.dryRun = true;
     o.extract = buildJobConfigurationExtract();
-    o.labels = buildUnnamed3198();
+    o.labels = buildUnnamed3226();
     o.load = buildJobConfigurationLoad();
     o.query = buildJobConfigurationQuery();
   }
@@ -785,21 +789,21 @@
     checkJobConfigurationTableCopy(o.copy);
     unittest.expect(o.dryRun, unittest.isTrue);
     checkJobConfigurationExtract(o.extract);
-    checkUnnamed3198(o.labels);
+    checkUnnamed3226(o.labels);
     checkJobConfigurationLoad(o.load);
     checkJobConfigurationQuery(o.query);
   }
   buildCounterJobConfiguration--;
 }
 
-buildUnnamed3199() {
+buildUnnamed3227() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3199(core.List<core.String> o) {
+checkUnnamed3227(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -813,7 +817,7 @@
     o.compression = "foo";
     o.destinationFormat = "foo";
     o.destinationUri = "foo";
-    o.destinationUris = buildUnnamed3199();
+    o.destinationUris = buildUnnamed3227();
     o.fieldDelimiter = "foo";
     o.printHeader = true;
     o.sourceTable = buildTableReference();
@@ -828,7 +832,7 @@
     unittest.expect(o.compression, unittest.equals('foo'));
     unittest.expect(o.destinationFormat, unittest.equals('foo'));
     unittest.expect(o.destinationUri, unittest.equals('foo'));
-    checkUnnamed3199(o.destinationUris);
+    checkUnnamed3227(o.destinationUris);
     unittest.expect(o.fieldDelimiter, unittest.equals('foo'));
     unittest.expect(o.printHeader, unittest.isTrue);
     checkTableReference(o.sourceTable);
@@ -836,40 +840,40 @@
   buildCounterJobConfigurationExtract--;
 }
 
-buildUnnamed3200() {
+buildUnnamed3228() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3200(core.List<core.String> o) {
+checkUnnamed3228(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3201() {
+buildUnnamed3229() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3201(core.List<core.String> o) {
+checkUnnamed3229(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3202() {
+buildUnnamed3230() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3202(core.List<core.String> o) {
+checkUnnamed3230(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -891,15 +895,15 @@
     o.ignoreUnknownValues = true;
     o.maxBadRecords = 42;
     o.nullMarker = "foo";
-    o.projectionFields = buildUnnamed3200();
+    o.projectionFields = buildUnnamed3228();
     o.quote = "foo";
     o.schema = buildTableSchema();
     o.schemaInline = "foo";
     o.schemaInlineFormat = "foo";
-    o.schemaUpdateOptions = buildUnnamed3201();
+    o.schemaUpdateOptions = buildUnnamed3229();
     o.skipLeadingRows = 42;
     o.sourceFormat = "foo";
-    o.sourceUris = buildUnnamed3202();
+    o.sourceUris = buildUnnamed3230();
     o.timePartitioning = buildTimePartitioning();
     o.writeDisposition = "foo";
   }
@@ -921,68 +925,68 @@
     unittest.expect(o.ignoreUnknownValues, unittest.isTrue);
     unittest.expect(o.maxBadRecords, unittest.equals(42));
     unittest.expect(o.nullMarker, unittest.equals('foo'));
-    checkUnnamed3200(o.projectionFields);
+    checkUnnamed3228(o.projectionFields);
     unittest.expect(o.quote, unittest.equals('foo'));
     checkTableSchema(o.schema);
     unittest.expect(o.schemaInline, unittest.equals('foo'));
     unittest.expect(o.schemaInlineFormat, unittest.equals('foo'));
-    checkUnnamed3201(o.schemaUpdateOptions);
+    checkUnnamed3229(o.schemaUpdateOptions);
     unittest.expect(o.skipLeadingRows, unittest.equals(42));
     unittest.expect(o.sourceFormat, unittest.equals('foo'));
-    checkUnnamed3202(o.sourceUris);
+    checkUnnamed3230(o.sourceUris);
     checkTimePartitioning(o.timePartitioning);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationLoad--;
 }
 
-buildUnnamed3203() {
+buildUnnamed3231() {
   var o = new core.List<api.QueryParameter>();
   o.add(buildQueryParameter());
   o.add(buildQueryParameter());
   return o;
 }
 
-checkUnnamed3203(core.List<api.QueryParameter> o) {
+checkUnnamed3231(core.List<api.QueryParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQueryParameter(o[0]);
   checkQueryParameter(o[1]);
 }
 
-buildUnnamed3204() {
+buildUnnamed3232() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3204(core.List<core.String> o) {
+checkUnnamed3232(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3205() {
+buildUnnamed3233() {
   var o = new core.Map<core.String, api.ExternalDataConfiguration>();
   o["x"] = buildExternalDataConfiguration();
   o["y"] = buildExternalDataConfiguration();
   return o;
 }
 
-checkUnnamed3205(core.Map<core.String, api.ExternalDataConfiguration> o) {
+checkUnnamed3233(core.Map<core.String, api.ExternalDataConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExternalDataConfiguration(o["x"]);
   checkExternalDataConfiguration(o["y"]);
 }
 
-buildUnnamed3206() {
+buildUnnamed3234() {
   var o = new core.List<api.UserDefinedFunctionResource>();
   o.add(buildUserDefinedFunctionResource());
   o.add(buildUserDefinedFunctionResource());
   return o;
 }
 
-checkUnnamed3206(core.List<api.UserDefinedFunctionResource> o) {
+checkUnnamed3234(core.List<api.UserDefinedFunctionResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserDefinedFunctionResource(o[0]);
   checkUserDefinedFunctionResource(o[1]);
@@ -1005,13 +1009,13 @@
     o.preserveNulls = true;
     o.priority = "foo";
     o.query = "foo";
-    o.queryParameters = buildUnnamed3203();
-    o.schemaUpdateOptions = buildUnnamed3204();
-    o.tableDefinitions = buildUnnamed3205();
+    o.queryParameters = buildUnnamed3231();
+    o.schemaUpdateOptions = buildUnnamed3232();
+    o.tableDefinitions = buildUnnamed3233();
     o.timePartitioning = buildTimePartitioning();
     o.useLegacySql = true;
     o.useQueryCache = true;
-    o.userDefinedFunctionResources = buildUnnamed3206();
+    o.userDefinedFunctionResources = buildUnnamed3234();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationQuery--;
@@ -1033,26 +1037,26 @@
     unittest.expect(o.preserveNulls, unittest.isTrue);
     unittest.expect(o.priority, unittest.equals('foo'));
     unittest.expect(o.query, unittest.equals('foo'));
-    checkUnnamed3203(o.queryParameters);
-    checkUnnamed3204(o.schemaUpdateOptions);
-    checkUnnamed3205(o.tableDefinitions);
+    checkUnnamed3231(o.queryParameters);
+    checkUnnamed3232(o.schemaUpdateOptions);
+    checkUnnamed3233(o.tableDefinitions);
     checkTimePartitioning(o.timePartitioning);
     unittest.expect(o.useLegacySql, unittest.isTrue);
     unittest.expect(o.useQueryCache, unittest.isTrue);
-    checkUnnamed3206(o.userDefinedFunctionResources);
+    checkUnnamed3234(o.userDefinedFunctionResources);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationQuery--;
 }
 
-buildUnnamed3207() {
+buildUnnamed3235() {
   var o = new core.List<api.TableReference>();
   o.add(buildTableReference());
   o.add(buildTableReference());
   return o;
 }
 
-checkUnnamed3207(core.List<api.TableReference> o) {
+checkUnnamed3235(core.List<api.TableReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableReference(o[0]);
   checkTableReference(o[1]);
@@ -1067,7 +1071,7 @@
     o.destinationEncryptionConfiguration = buildEncryptionConfiguration();
     o.destinationTable = buildTableReference();
     o.sourceTable = buildTableReference();
-    o.sourceTables = buildUnnamed3207();
+    o.sourceTables = buildUnnamed3235();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationTableCopy--;
@@ -1081,7 +1085,7 @@
     checkEncryptionConfiguration(o.destinationEncryptionConfiguration);
     checkTableReference(o.destinationTable);
     checkTableReference(o.sourceTable);
-    checkUnnamed3207(o.sourceTables);
+    checkUnnamed3235(o.sourceTables);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationTableCopy--;
@@ -1122,14 +1126,14 @@
   buildCounterJobListJobs--;
 }
 
-buildUnnamed3208() {
+buildUnnamed3236() {
   var o = new core.List<api.JobListJobs>();
   o.add(buildJobListJobs());
   o.add(buildJobListJobs());
   return o;
 }
 
-checkUnnamed3208(core.List<api.JobListJobs> o) {
+checkUnnamed3236(core.List<api.JobListJobs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJobListJobs(o[0]);
   checkJobListJobs(o[1]);
@@ -1141,7 +1145,7 @@
   buildCounterJobList++;
   if (buildCounterJobList < 3) {
     o.etag = "foo";
-    o.jobs = buildUnnamed3208();
+    o.jobs = buildUnnamed3236();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1153,7 +1157,7 @@
   buildCounterJobList++;
   if (buildCounterJobList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed3208(o.jobs);
+    checkUnnamed3236(o.jobs);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1212,40 +1216,53 @@
   buildCounterJobStatistics--;
 }
 
-buildUnnamed3209() {
+buildUnnamed3237() {
   var o = new core.List<api.ExplainQueryStage>();
   o.add(buildExplainQueryStage());
   o.add(buildExplainQueryStage());
   return o;
 }
 
-checkUnnamed3209(core.List<api.ExplainQueryStage> o) {
+checkUnnamed3237(core.List<api.ExplainQueryStage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExplainQueryStage(o[0]);
   checkExplainQueryStage(o[1]);
 }
 
-buildUnnamed3210() {
+buildUnnamed3238() {
   var o = new core.List<api.TableReference>();
   o.add(buildTableReference());
   o.add(buildTableReference());
   return o;
 }
 
-checkUnnamed3210(core.List<api.TableReference> o) {
+checkUnnamed3238(core.List<api.TableReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableReference(o[0]);
   checkTableReference(o[1]);
 }
 
-buildUnnamed3211() {
+buildUnnamed3239() {
+  var o = new core.List<api.QueryTimelineSample>();
+  o.add(buildQueryTimelineSample());
+  o.add(buildQueryTimelineSample());
+  return o;
+}
+
+checkUnnamed3239(core.List<api.QueryTimelineSample> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkQueryTimelineSample(o[0]);
+  checkQueryTimelineSample(o[1]);
+}
+
+buildUnnamed3240() {
   var o = new core.List<api.QueryParameter>();
   o.add(buildQueryParameter());
   o.add(buildQueryParameter());
   return o;
 }
 
-checkUnnamed3211(core.List<api.QueryParameter> o) {
+checkUnnamed3240(core.List<api.QueryParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQueryParameter(o[0]);
   checkQueryParameter(o[1]);
@@ -1260,15 +1277,17 @@
     o.cacheHit = true;
     o.ddlOperationPerformed = "foo";
     o.ddlTargetTable = buildTableReference();
+    o.estimatedBytesProcessed = "foo";
     o.numDmlAffectedRows = "foo";
-    o.queryPlan = buildUnnamed3209();
-    o.referencedTables = buildUnnamed3210();
+    o.queryPlan = buildUnnamed3237();
+    o.referencedTables = buildUnnamed3238();
     o.schema = buildTableSchema();
     o.statementType = "foo";
+    o.timeline = buildUnnamed3239();
     o.totalBytesBilled = "foo";
     o.totalBytesProcessed = "foo";
     o.totalSlotMs = "foo";
-    o.undeclaredQueryParameters = buildUnnamed3211();
+    o.undeclaredQueryParameters = buildUnnamed3240();
   }
   buildCounterJobStatistics2--;
   return o;
@@ -1281,15 +1300,17 @@
     unittest.expect(o.cacheHit, unittest.isTrue);
     unittest.expect(o.ddlOperationPerformed, unittest.equals('foo'));
     checkTableReference(o.ddlTargetTable);
+    unittest.expect(o.estimatedBytesProcessed, unittest.equals('foo'));
     unittest.expect(o.numDmlAffectedRows, unittest.equals('foo'));
-    checkUnnamed3209(o.queryPlan);
-    checkUnnamed3210(o.referencedTables);
+    checkUnnamed3237(o.queryPlan);
+    checkUnnamed3238(o.referencedTables);
     checkTableSchema(o.schema);
     unittest.expect(o.statementType, unittest.equals('foo'));
+    checkUnnamed3239(o.timeline);
     unittest.expect(o.totalBytesBilled, unittest.equals('foo'));
     unittest.expect(o.totalBytesProcessed, unittest.equals('foo'));
     unittest.expect(o.totalSlotMs, unittest.equals('foo'));
-    checkUnnamed3211(o.undeclaredQueryParameters);
+    checkUnnamed3240(o.undeclaredQueryParameters);
   }
   buildCounterJobStatistics2--;
 }
@@ -1321,14 +1342,14 @@
   buildCounterJobStatistics3--;
 }
 
-buildUnnamed3212() {
+buildUnnamed3241() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3212(core.List<core.String> o) {
+checkUnnamed3241(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1339,7 +1360,7 @@
   var o = new api.JobStatistics4();
   buildCounterJobStatistics4++;
   if (buildCounterJobStatistics4 < 3) {
-    o.destinationUriFileCounts = buildUnnamed3212();
+    o.destinationUriFileCounts = buildUnnamed3241();
   }
   buildCounterJobStatistics4--;
   return o;
@@ -1348,19 +1369,19 @@
 checkJobStatistics4(api.JobStatistics4 o) {
   buildCounterJobStatistics4++;
   if (buildCounterJobStatistics4 < 3) {
-    checkUnnamed3212(o.destinationUriFileCounts);
+    checkUnnamed3241(o.destinationUriFileCounts);
   }
   buildCounterJobStatistics4--;
 }
 
-buildUnnamed3213() {
+buildUnnamed3242() {
   var o = new core.List<api.ErrorProto>();
   o.add(buildErrorProto());
   o.add(buildErrorProto());
   return o;
 }
 
-checkUnnamed3213(core.List<api.ErrorProto> o) {
+checkUnnamed3242(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorProto(o[0]);
   checkErrorProto(o[1]);
@@ -1372,7 +1393,7 @@
   buildCounterJobStatus++;
   if (buildCounterJobStatus < 3) {
     o.errorResult = buildErrorProto();
-    o.errors = buildUnnamed3213();
+    o.errors = buildUnnamed3242();
     o.state = "foo";
   }
   buildCounterJobStatus--;
@@ -1383,7 +1404,7 @@
   buildCounterJobStatus++;
   if (buildCounterJobStatus < 3) {
     checkErrorProto(o.errorResult);
-    checkUnnamed3213(o.errors);
+    checkUnnamed3242(o.errors);
     unittest.expect(o.state, unittest.equals('foo'));
   }
   buildCounterJobStatus--;
@@ -1445,14 +1466,14 @@
   buildCounterProjectListProjects--;
 }
 
-buildUnnamed3214() {
+buildUnnamed3243() {
   var o = new core.List<api.ProjectListProjects>();
   o.add(buildProjectListProjects());
   o.add(buildProjectListProjects());
   return o;
 }
 
-checkUnnamed3214(core.List<api.ProjectListProjects> o) {
+checkUnnamed3243(core.List<api.ProjectListProjects> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProjectListProjects(o[0]);
   checkProjectListProjects(o[1]);
@@ -1466,7 +1487,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.projects = buildUnnamed3214();
+    o.projects = buildUnnamed3243();
     o.totalItems = 42;
   }
   buildCounterProjectList--;
@@ -1479,7 +1500,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3214(o.projects);
+    checkUnnamed3243(o.projects);
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterProjectList--;
@@ -1550,14 +1571,14 @@
   buildCounterQueryParameterTypeStructTypes--;
 }
 
-buildUnnamed3215() {
+buildUnnamed3244() {
   var o = new core.List<api.QueryParameterTypeStructTypes>();
   o.add(buildQueryParameterTypeStructTypes());
   o.add(buildQueryParameterTypeStructTypes());
   return o;
 }
 
-checkUnnamed3215(core.List<api.QueryParameterTypeStructTypes> o) {
+checkUnnamed3244(core.List<api.QueryParameterTypeStructTypes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQueryParameterTypeStructTypes(o[0]);
   checkQueryParameterTypeStructTypes(o[1]);
@@ -1569,7 +1590,7 @@
   buildCounterQueryParameterType++;
   if (buildCounterQueryParameterType < 3) {
     o.arrayType = buildQueryParameterType();
-    o.structTypes = buildUnnamed3215();
+    o.structTypes = buildUnnamed3244();
     o.type = "foo";
   }
   buildCounterQueryParameterType--;
@@ -1580,33 +1601,33 @@
   buildCounterQueryParameterType++;
   if (buildCounterQueryParameterType < 3) {
     checkQueryParameterType(o.arrayType);
-    checkUnnamed3215(o.structTypes);
+    checkUnnamed3244(o.structTypes);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterQueryParameterType--;
 }
 
-buildUnnamed3216() {
+buildUnnamed3245() {
   var o = new core.List<api.QueryParameterValue>();
   o.add(buildQueryParameterValue());
   o.add(buildQueryParameterValue());
   return o;
 }
 
-checkUnnamed3216(core.List<api.QueryParameterValue> o) {
+checkUnnamed3245(core.List<api.QueryParameterValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQueryParameterValue(o[0]);
   checkQueryParameterValue(o[1]);
 }
 
-buildUnnamed3217() {
+buildUnnamed3246() {
   var o = new core.Map<core.String, api.QueryParameterValue>();
   o["x"] = buildQueryParameterValue();
   o["y"] = buildQueryParameterValue();
   return o;
 }
 
-checkUnnamed3217(core.Map<core.String, api.QueryParameterValue> o) {
+checkUnnamed3246(core.Map<core.String, api.QueryParameterValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQueryParameterValue(o["x"]);
   checkQueryParameterValue(o["y"]);
@@ -1617,8 +1638,8 @@
   var o = new api.QueryParameterValue();
   buildCounterQueryParameterValue++;
   if (buildCounterQueryParameterValue < 3) {
-    o.arrayValues = buildUnnamed3216();
-    o.structValues = buildUnnamed3217();
+    o.arrayValues = buildUnnamed3245();
+    o.structValues = buildUnnamed3246();
     o.value = "foo";
   }
   buildCounterQueryParameterValue--;
@@ -1628,21 +1649,21 @@
 checkQueryParameterValue(api.QueryParameterValue o) {
   buildCounterQueryParameterValue++;
   if (buildCounterQueryParameterValue < 3) {
-    checkUnnamed3216(o.arrayValues);
-    checkUnnamed3217(o.structValues);
+    checkUnnamed3245(o.arrayValues);
+    checkUnnamed3246(o.structValues);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterQueryParameterValue--;
 }
 
-buildUnnamed3218() {
+buildUnnamed3247() {
   var o = new core.List<api.QueryParameter>();
   o.add(buildQueryParameter());
   o.add(buildQueryParameter());
   return o;
 }
 
-checkUnnamed3218(core.List<api.QueryParameter> o) {
+checkUnnamed3247(core.List<api.QueryParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQueryParameter(o[0]);
   checkQueryParameter(o[1]);
@@ -1660,7 +1681,7 @@
     o.parameterMode = "foo";
     o.preserveNulls = true;
     o.query = "foo";
-    o.queryParameters = buildUnnamed3218();
+    o.queryParameters = buildUnnamed3247();
     o.timeoutMs = 42;
     o.useLegacySql = true;
     o.useQueryCache = true;
@@ -1679,7 +1700,7 @@
     unittest.expect(o.parameterMode, unittest.equals('foo'));
     unittest.expect(o.preserveNulls, unittest.isTrue);
     unittest.expect(o.query, unittest.equals('foo'));
-    checkUnnamed3218(o.queryParameters);
+    checkUnnamed3247(o.queryParameters);
     unittest.expect(o.timeoutMs, unittest.equals(42));
     unittest.expect(o.useLegacySql, unittest.isTrue);
     unittest.expect(o.useQueryCache, unittest.isTrue);
@@ -1687,27 +1708,27 @@
   buildCounterQueryRequest--;
 }
 
-buildUnnamed3219() {
+buildUnnamed3248() {
   var o = new core.List<api.ErrorProto>();
   o.add(buildErrorProto());
   o.add(buildErrorProto());
   return o;
 }
 
-checkUnnamed3219(core.List<api.ErrorProto> o) {
+checkUnnamed3248(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorProto(o[0]);
   checkErrorProto(o[1]);
 }
 
-buildUnnamed3220() {
+buildUnnamed3249() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed3220(core.List<api.TableRow> o) {
+checkUnnamed3249(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -1719,13 +1740,13 @@
   buildCounterQueryResponse++;
   if (buildCounterQueryResponse < 3) {
     o.cacheHit = true;
-    o.errors = buildUnnamed3219();
+    o.errors = buildUnnamed3248();
     o.jobComplete = true;
     o.jobReference = buildJobReference();
     o.kind = "foo";
     o.numDmlAffectedRows = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed3220();
+    o.rows = buildUnnamed3249();
     o.schema = buildTableSchema();
     o.totalBytesProcessed = "foo";
     o.totalRows = "foo";
@@ -1738,13 +1759,13 @@
   buildCounterQueryResponse++;
   if (buildCounterQueryResponse < 3) {
     unittest.expect(o.cacheHit, unittest.isTrue);
-    checkUnnamed3219(o.errors);
+    checkUnnamed3248(o.errors);
     unittest.expect(o.jobComplete, unittest.isTrue);
     checkJobReference(o.jobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.numDmlAffectedRows, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed3220(o.rows);
+    checkUnnamed3249(o.rows);
     checkTableSchema(o.schema);
     unittest.expect(o.totalBytesProcessed, unittest.equals('foo'));
     unittest.expect(o.totalRows, unittest.equals('foo'));
@@ -1752,6 +1773,35 @@
   buildCounterQueryResponse--;
 }
 
+core.int buildCounterQueryTimelineSample = 0;
+buildQueryTimelineSample() {
+  var o = new api.QueryTimelineSample();
+  buildCounterQueryTimelineSample++;
+  if (buildCounterQueryTimelineSample < 3) {
+    o.activeInputs = 42;
+    o.completedInputs = 42;
+    o.completedInputsForActiveStages = 42;
+    o.elapsedMs = "foo";
+    o.pendingInputs = "foo";
+    o.totalSlotMs = "foo";
+  }
+  buildCounterQueryTimelineSample--;
+  return o;
+}
+
+checkQueryTimelineSample(api.QueryTimelineSample o) {
+  buildCounterQueryTimelineSample++;
+  if (buildCounterQueryTimelineSample < 3) {
+    unittest.expect(o.activeInputs, unittest.equals(42));
+    unittest.expect(o.completedInputs, unittest.equals(42));
+    unittest.expect(o.completedInputsForActiveStages, unittest.equals(42));
+    unittest.expect(o.elapsedMs, unittest.equals('foo'));
+    unittest.expect(o.pendingInputs, unittest.equals('foo'));
+    unittest.expect(o.totalSlotMs, unittest.equals('foo'));
+  }
+  buildCounterQueryTimelineSample--;
+}
+
 core.int buildCounterStreamingbuffer = 0;
 buildStreamingbuffer() {
   var o = new api.Streamingbuffer();
@@ -1775,14 +1825,14 @@
   buildCounterStreamingbuffer--;
 }
 
-buildUnnamed3221() {
+buildUnnamed3250() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3221(core.Map<core.String, core.String> o) {
+checkUnnamed3250(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'));
@@ -1802,7 +1852,7 @@
     o.friendlyName = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed3221();
+    o.labels = buildUnnamed3250();
     o.lastModifiedTime = "foo";
     o.location = "foo";
     o.numBytes = "foo";
@@ -1832,7 +1882,7 @@
     unittest.expect(o.friendlyName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3221(o.labels);
+    checkUnnamed3250(o.labels);
     unittest.expect(o.lastModifiedTime, unittest.equals('foo'));
     unittest.expect(o.location, unittest.equals('foo'));
     unittest.expect(o.numBytes, unittest.equals('foo'));
@@ -1897,14 +1947,14 @@
   buildCounterTableDataInsertAllRequestRows--;
 }
 
-buildUnnamed3222() {
+buildUnnamed3251() {
   var o = new core.List<api.TableDataInsertAllRequestRows>();
   o.add(buildTableDataInsertAllRequestRows());
   o.add(buildTableDataInsertAllRequestRows());
   return o;
 }
 
-checkUnnamed3222(core.List<api.TableDataInsertAllRequestRows> o) {
+checkUnnamed3251(core.List<api.TableDataInsertAllRequestRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableDataInsertAllRequestRows(o[0]);
   checkTableDataInsertAllRequestRows(o[1]);
@@ -1917,7 +1967,7 @@
   if (buildCounterTableDataInsertAllRequest < 3) {
     o.ignoreUnknownValues = true;
     o.kind = "foo";
-    o.rows = buildUnnamed3222();
+    o.rows = buildUnnamed3251();
     o.skipInvalidRows = true;
     o.templateSuffix = "foo";
   }
@@ -1930,21 +1980,21 @@
   if (buildCounterTableDataInsertAllRequest < 3) {
     unittest.expect(o.ignoreUnknownValues, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3222(o.rows);
+    checkUnnamed3251(o.rows);
     unittest.expect(o.skipInvalidRows, unittest.isTrue);
     unittest.expect(o.templateSuffix, unittest.equals('foo'));
   }
   buildCounterTableDataInsertAllRequest--;
 }
 
-buildUnnamed3223() {
+buildUnnamed3252() {
   var o = new core.List<api.ErrorProto>();
   o.add(buildErrorProto());
   o.add(buildErrorProto());
   return o;
 }
 
-checkUnnamed3223(core.List<api.ErrorProto> o) {
+checkUnnamed3252(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorProto(o[0]);
   checkErrorProto(o[1]);
@@ -1955,7 +2005,7 @@
   var o = new api.TableDataInsertAllResponseInsertErrors();
   buildCounterTableDataInsertAllResponseInsertErrors++;
   if (buildCounterTableDataInsertAllResponseInsertErrors < 3) {
-    o.errors = buildUnnamed3223();
+    o.errors = buildUnnamed3252();
     o.index = 42;
   }
   buildCounterTableDataInsertAllResponseInsertErrors--;
@@ -1966,20 +2016,20 @@
     api.TableDataInsertAllResponseInsertErrors o) {
   buildCounterTableDataInsertAllResponseInsertErrors++;
   if (buildCounterTableDataInsertAllResponseInsertErrors < 3) {
-    checkUnnamed3223(o.errors);
+    checkUnnamed3252(o.errors);
     unittest.expect(o.index, unittest.equals(42));
   }
   buildCounterTableDataInsertAllResponseInsertErrors--;
 }
 
-buildUnnamed3224() {
+buildUnnamed3253() {
   var o = new core.List<api.TableDataInsertAllResponseInsertErrors>();
   o.add(buildTableDataInsertAllResponseInsertErrors());
   o.add(buildTableDataInsertAllResponseInsertErrors());
   return o;
 }
 
-checkUnnamed3224(core.List<api.TableDataInsertAllResponseInsertErrors> o) {
+checkUnnamed3253(core.List<api.TableDataInsertAllResponseInsertErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableDataInsertAllResponseInsertErrors(o[0]);
   checkTableDataInsertAllResponseInsertErrors(o[1]);
@@ -1990,7 +2040,7 @@
   var o = new api.TableDataInsertAllResponse();
   buildCounterTableDataInsertAllResponse++;
   if (buildCounterTableDataInsertAllResponse < 3) {
-    o.insertErrors = buildUnnamed3224();
+    o.insertErrors = buildUnnamed3253();
     o.kind = "foo";
   }
   buildCounterTableDataInsertAllResponse--;
@@ -2000,20 +2050,20 @@
 checkTableDataInsertAllResponse(api.TableDataInsertAllResponse o) {
   buildCounterTableDataInsertAllResponse++;
   if (buildCounterTableDataInsertAllResponse < 3) {
-    checkUnnamed3224(o.insertErrors);
+    checkUnnamed3253(o.insertErrors);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTableDataInsertAllResponse--;
 }
 
-buildUnnamed3225() {
+buildUnnamed3254() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed3225(core.List<api.TableRow> o) {
+checkUnnamed3254(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -2027,7 +2077,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed3225();
+    o.rows = buildUnnamed3254();
     o.totalRows = "foo";
   }
   buildCounterTableDataList--;
@@ -2040,20 +2090,20 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed3225(o.rows);
+    checkUnnamed3254(o.rows);
     unittest.expect(o.totalRows, unittest.equals('foo'));
   }
   buildCounterTableDataList--;
 }
 
-buildUnnamed3226() {
+buildUnnamed3255() {
   var o = new core.List<api.TableFieldSchema>();
   o.add(buildTableFieldSchema());
   o.add(buildTableFieldSchema());
   return o;
 }
 
-checkUnnamed3226(core.List<api.TableFieldSchema> o) {
+checkUnnamed3255(core.List<api.TableFieldSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableFieldSchema(o[0]);
   checkTableFieldSchema(o[1]);
@@ -2065,7 +2115,7 @@
   buildCounterTableFieldSchema++;
   if (buildCounterTableFieldSchema < 3) {
     o.description = "foo";
-    o.fields = buildUnnamed3226();
+    o.fields = buildUnnamed3255();
     o.mode = "foo";
     o.name = "foo";
     o.type = "foo";
@@ -2078,7 +2128,7 @@
   buildCounterTableFieldSchema++;
   if (buildCounterTableFieldSchema < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed3226(o.fields);
+    checkUnnamed3255(o.fields);
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -2086,14 +2136,14 @@
   buildCounterTableFieldSchema--;
 }
 
-buildUnnamed3227() {
+buildUnnamed3256() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3227(core.Map<core.String, core.String> o) {
+checkUnnamed3256(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'));
@@ -2128,7 +2178,7 @@
     o.friendlyName = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed3227();
+    o.labels = buildUnnamed3256();
     o.tableReference = buildTableReference();
     o.timePartitioning = buildTimePartitioning();
     o.type = "foo";
@@ -2146,7 +2196,7 @@
     unittest.expect(o.friendlyName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3227(o.labels);
+    checkUnnamed3256(o.labels);
     checkTableReference(o.tableReference);
     checkTimePartitioning(o.timePartitioning);
     unittest.expect(o.type, unittest.equals('foo'));
@@ -2155,14 +2205,14 @@
   buildCounterTableListTables--;
 }
 
-buildUnnamed3228() {
+buildUnnamed3257() {
   var o = new core.List<api.TableListTables>();
   o.add(buildTableListTables());
   o.add(buildTableListTables());
   return o;
 }
 
-checkUnnamed3228(core.List<api.TableListTables> o) {
+checkUnnamed3257(core.List<api.TableListTables> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableListTables(o[0]);
   checkTableListTables(o[1]);
@@ -2176,7 +2226,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.tables = buildUnnamed3228();
+    o.tables = buildUnnamed3257();
     o.totalItems = 42;
   }
   buildCounterTableList--;
@@ -2189,7 +2239,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3228(o.tables);
+    checkUnnamed3257(o.tables);
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterTableList--;
@@ -2218,14 +2268,14 @@
   buildCounterTableReference--;
 }
 
-buildUnnamed3229() {
+buildUnnamed3258() {
   var o = new core.List<api.TableCell>();
   o.add(buildTableCell());
   o.add(buildTableCell());
   return o;
 }
 
-checkUnnamed3229(core.List<api.TableCell> o) {
+checkUnnamed3258(core.List<api.TableCell> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableCell(o[0]);
   checkTableCell(o[1]);
@@ -2236,7 +2286,7 @@
   var o = new api.TableRow();
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
-    o.f = buildUnnamed3229();
+    o.f = buildUnnamed3258();
   }
   buildCounterTableRow--;
   return o;
@@ -2245,19 +2295,19 @@
 checkTableRow(api.TableRow o) {
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
-    checkUnnamed3229(o.f);
+    checkUnnamed3258(o.f);
   }
   buildCounterTableRow--;
 }
 
-buildUnnamed3230() {
+buildUnnamed3259() {
   var o = new core.List<api.TableFieldSchema>();
   o.add(buildTableFieldSchema());
   o.add(buildTableFieldSchema());
   return o;
 }
 
-checkUnnamed3230(core.List<api.TableFieldSchema> o) {
+checkUnnamed3259(core.List<api.TableFieldSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableFieldSchema(o[0]);
   checkTableFieldSchema(o[1]);
@@ -2268,7 +2318,7 @@
   var o = new api.TableSchema();
   buildCounterTableSchema++;
   if (buildCounterTableSchema < 3) {
-    o.fields = buildUnnamed3230();
+    o.fields = buildUnnamed3259();
   }
   buildCounterTableSchema--;
   return o;
@@ -2277,7 +2327,7 @@
 checkTableSchema(api.TableSchema o) {
   buildCounterTableSchema++;
   if (buildCounterTableSchema < 3) {
-    checkUnnamed3230(o.fields);
+    checkUnnamed3259(o.fields);
   }
   buildCounterTableSchema--;
 }
@@ -2326,14 +2376,14 @@
   buildCounterUserDefinedFunctionResource--;
 }
 
-buildUnnamed3231() {
+buildUnnamed3260() {
   var o = new core.List<api.UserDefinedFunctionResource>();
   o.add(buildUserDefinedFunctionResource());
   o.add(buildUserDefinedFunctionResource());
   return o;
 }
 
-checkUnnamed3231(core.List<api.UserDefinedFunctionResource> o) {
+checkUnnamed3260(core.List<api.UserDefinedFunctionResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserDefinedFunctionResource(o[0]);
   checkUserDefinedFunctionResource(o[1]);
@@ -2346,7 +2396,7 @@
   if (buildCounterViewDefinition < 3) {
     o.query = "foo";
     o.useLegacySql = true;
-    o.userDefinedFunctionResources = buildUnnamed3231();
+    o.userDefinedFunctionResources = buildUnnamed3260();
   }
   buildCounterViewDefinition--;
   return o;
@@ -2357,19 +2407,19 @@
   if (buildCounterViewDefinition < 3) {
     unittest.expect(o.query, unittest.equals('foo'));
     unittest.expect(o.useLegacySql, unittest.isTrue);
-    checkUnnamed3231(o.userDefinedFunctionResources);
+    checkUnnamed3260(o.userDefinedFunctionResources);
   }
   buildCounterViewDefinition--;
 }
 
-buildUnnamed3232() {
+buildUnnamed3261() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3232(core.List<core.String> o) {
+checkUnnamed3261(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2712,6 +2762,14 @@
     });
   });
 
+  unittest.group("obj-schema-QueryTimelineSample", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildQueryTimelineSample();
+      var od = new api.QueryTimelineSample.fromJson(o.toJson());
+      checkQueryTimelineSample(od);
+    });
+  });
+
   unittest.group("obj-schema-Streamingbuffer", () {
     unittest.test("to-json--from-json", () {
       var o = buildStreamingbuffer();
@@ -3577,7 +3635,7 @@
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_projection = "foo";
-      var arg_stateFilter = buildUnnamed3232();
+      var arg_stateFilter = buildUnnamed3261();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/bigquerydatatransfer/v1_test.dart b/generated/googleapis/test/bigquerydatatransfer/v1_test.dart
index 43383ed..9371c0a 100644
--- a/generated/googleapis/test/bigquerydatatransfer/v1_test.dart
+++ b/generated/googleapis/test/bigquerydatatransfer/v1_test.dart
@@ -84,27 +84,27 @@
   buildCounterCheckValidCredsResponse--;
 }
 
-buildUnnamed688() {
+buildUnnamed692() {
   var o = new core.List<api.DataSourceParameter>();
   o.add(buildDataSourceParameter());
   o.add(buildDataSourceParameter());
   return o;
 }
 
-checkUnnamed688(core.List<api.DataSourceParameter> o) {
+checkUnnamed692(core.List<api.DataSourceParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataSourceParameter(o[0]);
   checkDataSourceParameter(o[1]);
 }
 
-buildUnnamed689() {
+buildUnnamed693() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed689(core.List<core.String> o) {
+checkUnnamed693(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -127,8 +127,8 @@
     o.manualRunsDisabled = true;
     o.minimumScheduleInterval = "foo";
     o.name = "foo";
-    o.parameters = buildUnnamed688();
-    o.scopes = buildUnnamed689();
+    o.parameters = buildUnnamed692();
+    o.scopes = buildUnnamed693();
     o.supportsCustomSchedule = true;
     o.supportsMultipleTransfers = true;
     o.transferType = "foo";
@@ -153,8 +153,8 @@
     unittest.expect(o.manualRunsDisabled, unittest.isTrue);
     unittest.expect(o.minimumScheduleInterval, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed688(o.parameters);
-    checkUnnamed689(o.scopes);
+    checkUnnamed692(o.parameters);
+    checkUnnamed693(o.scopes);
     unittest.expect(o.supportsCustomSchedule, unittest.isTrue);
     unittest.expect(o.supportsMultipleTransfers, unittest.isTrue);
     unittest.expect(o.transferType, unittest.equals('foo'));
@@ -163,27 +163,27 @@
   buildCounterDataSource--;
 }
 
-buildUnnamed690() {
+buildUnnamed694() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed690(core.List<core.String> o) {
+checkUnnamed694(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed691() {
+buildUnnamed695() {
   var o = new core.List<api.DataSourceParameter>();
   o.add(buildDataSourceParameter());
   o.add(buildDataSourceParameter());
   return o;
 }
 
-checkUnnamed691(core.List<api.DataSourceParameter> o) {
+checkUnnamed695(core.List<api.DataSourceParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataSourceParameter(o[0]);
   checkDataSourceParameter(o[1]);
@@ -194,10 +194,10 @@
   var o = new api.DataSourceParameter();
   buildCounterDataSourceParameter++;
   if (buildCounterDataSourceParameter < 3) {
-    o.allowedValues = buildUnnamed690();
+    o.allowedValues = buildUnnamed694();
     o.description = "foo";
     o.displayName = "foo";
-    o.fields = buildUnnamed691();
+    o.fields = buildUnnamed695();
     o.immutable = true;
     o.maxValue = 42.0;
     o.minValue = 42.0;
@@ -217,10 +217,10 @@
 checkDataSourceParameter(api.DataSourceParameter o) {
   buildCounterDataSourceParameter++;
   if (buildCounterDataSourceParameter < 3) {
-    checkUnnamed690(o.allowedValues);
+    checkUnnamed694(o.allowedValues);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed691(o.fields);
+    checkUnnamed695(o.fields);
     unittest.expect(o.immutable, unittest.isTrue);
     unittest.expect(o.maxValue, unittest.equals(42.0));
     unittest.expect(o.minValue, unittest.equals(42.0));
@@ -251,14 +251,14 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed692() {
+buildUnnamed696() {
   var o = new core.List<api.DataSource>();
   o.add(buildDataSource());
   o.add(buildDataSource());
   return o;
 }
 
-checkUnnamed692(core.List<api.DataSource> o) {
+checkUnnamed696(core.List<api.DataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataSource(o[0]);
   checkDataSource(o[1]);
@@ -269,7 +269,7 @@
   var o = new api.ListDataSourcesResponse();
   buildCounterListDataSourcesResponse++;
   if (buildCounterListDataSourcesResponse < 3) {
-    o.dataSources = buildUnnamed692();
+    o.dataSources = buildUnnamed696();
     o.nextPageToken = "foo";
   }
   buildCounterListDataSourcesResponse--;
@@ -279,20 +279,20 @@
 checkListDataSourcesResponse(api.ListDataSourcesResponse o) {
   buildCounterListDataSourcesResponse++;
   if (buildCounterListDataSourcesResponse < 3) {
-    checkUnnamed692(o.dataSources);
+    checkUnnamed696(o.dataSources);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDataSourcesResponse--;
 }
 
-buildUnnamed693() {
+buildUnnamed697() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed693(core.List<api.Location> o) {
+checkUnnamed697(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
@@ -303,7 +303,7 @@
   var o = new api.ListLocationsResponse();
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    o.locations = buildUnnamed693();
+    o.locations = buildUnnamed697();
     o.nextPageToken = "foo";
   }
   buildCounterListLocationsResponse--;
@@ -313,20 +313,20 @@
 checkListLocationsResponse(api.ListLocationsResponse o) {
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    checkUnnamed693(o.locations);
+    checkUnnamed697(o.locations);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListLocationsResponse--;
 }
 
-buildUnnamed694() {
+buildUnnamed698() {
   var o = new core.List<api.TransferConfig>();
   o.add(buildTransferConfig());
   o.add(buildTransferConfig());
   return o;
 }
 
-checkUnnamed694(core.List<api.TransferConfig> o) {
+checkUnnamed698(core.List<api.TransferConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTransferConfig(o[0]);
   checkTransferConfig(o[1]);
@@ -338,7 +338,7 @@
   buildCounterListTransferConfigsResponse++;
   if (buildCounterListTransferConfigsResponse < 3) {
     o.nextPageToken = "foo";
-    o.transferConfigs = buildUnnamed694();
+    o.transferConfigs = buildUnnamed698();
   }
   buildCounterListTransferConfigsResponse--;
   return o;
@@ -348,19 +348,19 @@
   buildCounterListTransferConfigsResponse++;
   if (buildCounterListTransferConfigsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed694(o.transferConfigs);
+    checkUnnamed698(o.transferConfigs);
   }
   buildCounterListTransferConfigsResponse--;
 }
 
-buildUnnamed695() {
+buildUnnamed699() {
   var o = new core.List<api.TransferMessage>();
   o.add(buildTransferMessage());
   o.add(buildTransferMessage());
   return o;
 }
 
-checkUnnamed695(core.List<api.TransferMessage> o) {
+checkUnnamed699(core.List<api.TransferMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTransferMessage(o[0]);
   checkTransferMessage(o[1]);
@@ -372,7 +372,7 @@
   buildCounterListTransferLogsResponse++;
   if (buildCounterListTransferLogsResponse < 3) {
     o.nextPageToken = "foo";
-    o.transferMessages = buildUnnamed695();
+    o.transferMessages = buildUnnamed699();
   }
   buildCounterListTransferLogsResponse--;
   return o;
@@ -382,19 +382,19 @@
   buildCounterListTransferLogsResponse++;
   if (buildCounterListTransferLogsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed695(o.transferMessages);
+    checkUnnamed699(o.transferMessages);
   }
   buildCounterListTransferLogsResponse--;
 }
 
-buildUnnamed696() {
+buildUnnamed700() {
   var o = new core.List<api.TransferRun>();
   o.add(buildTransferRun());
   o.add(buildTransferRun());
   return o;
 }
 
-checkUnnamed696(core.List<api.TransferRun> o) {
+checkUnnamed700(core.List<api.TransferRun> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTransferRun(o[0]);
   checkTransferRun(o[1]);
@@ -406,7 +406,7 @@
   buildCounterListTransferRunsResponse++;
   if (buildCounterListTransferRunsResponse < 3) {
     o.nextPageToken = "foo";
-    o.transferRuns = buildUnnamed696();
+    o.transferRuns = buildUnnamed700();
   }
   buildCounterListTransferRunsResponse--;
   return o;
@@ -416,25 +416,25 @@
   buildCounterListTransferRunsResponse++;
   if (buildCounterListTransferRunsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed696(o.transferRuns);
+    checkUnnamed700(o.transferRuns);
   }
   buildCounterListTransferRunsResponse--;
 }
 
-buildUnnamed697() {
+buildUnnamed701() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed697(core.Map<core.String, core.String> o) {
+checkUnnamed701(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'));
 }
 
-buildUnnamed698() {
+buildUnnamed702() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -449,7 +449,7 @@
   return o;
 }
 
-checkUnnamed698(core.Map<core.String, core.Object> o) {
+checkUnnamed702(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));
@@ -468,9 +468,9 @@
   var o = new api.Location();
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    o.labels = buildUnnamed697();
+    o.labels = buildUnnamed701();
     o.locationId = "foo";
-    o.metadata = buildUnnamed698();
+    o.metadata = buildUnnamed702();
     o.name = "foo";
   }
   buildCounterLocation--;
@@ -480,9 +480,9 @@
 checkLocation(api.Location o) {
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    checkUnnamed697(o.labels);
+    checkUnnamed701(o.labels);
     unittest.expect(o.locationId, unittest.equals('foo'));
-    checkUnnamed698(o.metadata);
+    checkUnnamed702(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterLocation--;
@@ -509,14 +509,14 @@
   buildCounterScheduleTransferRunsRequest--;
 }
 
-buildUnnamed699() {
+buildUnnamed703() {
   var o = new core.List<api.TransferRun>();
   o.add(buildTransferRun());
   o.add(buildTransferRun());
   return o;
 }
 
-checkUnnamed699(core.List<api.TransferRun> o) {
+checkUnnamed703(core.List<api.TransferRun> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTransferRun(o[0]);
   checkTransferRun(o[1]);
@@ -527,7 +527,7 @@
   var o = new api.ScheduleTransferRunsResponse();
   buildCounterScheduleTransferRunsResponse++;
   if (buildCounterScheduleTransferRunsResponse < 3) {
-    o.runs = buildUnnamed699();
+    o.runs = buildUnnamed703();
   }
   buildCounterScheduleTransferRunsResponse--;
   return o;
@@ -536,12 +536,12 @@
 checkScheduleTransferRunsResponse(api.ScheduleTransferRunsResponse o) {
   buildCounterScheduleTransferRunsResponse++;
   if (buildCounterScheduleTransferRunsResponse < 3) {
-    checkUnnamed699(o.runs);
+    checkUnnamed703(o.runs);
   }
   buildCounterScheduleTransferRunsResponse--;
 }
 
-buildUnnamed700() {
+buildUnnamed704() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -556,7 +556,7 @@
   return o;
 }
 
-checkUnnamed700(core.Map<core.String, core.Object> o) {
+checkUnnamed704(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -570,17 +570,17 @@
   unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed701() {
+buildUnnamed705() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed700());
-  o.add(buildUnnamed700());
+  o.add(buildUnnamed704());
+  o.add(buildUnnamed704());
   return o;
 }
 
-checkUnnamed701(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed705(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed700(o[0]);
-  checkUnnamed700(o[1]);
+  checkUnnamed704(o[0]);
+  checkUnnamed704(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -589,7 +589,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed701();
+    o.details = buildUnnamed705();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -600,13 +600,13 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed701(o.details);
+    checkUnnamed705(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-buildUnnamed702() {
+buildUnnamed706() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -621,7 +621,7 @@
   return o;
 }
 
-checkUnnamed702(core.Map<core.String, core.Object> o) {
+checkUnnamed706(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -648,7 +648,7 @@
     o.displayName = "foo";
     o.name = "foo";
     o.nextRunTime = "foo";
-    o.params = buildUnnamed702();
+    o.params = buildUnnamed706();
     o.schedule = "foo";
     o.state = "foo";
     o.updateTime = "foo";
@@ -669,7 +669,7 @@
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nextRunTime, unittest.equals('foo'));
-    checkUnnamed702(o.params);
+    checkUnnamed706(o.params);
     unittest.expect(o.schedule, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
@@ -701,7 +701,7 @@
   buildCounterTransferMessage--;
 }
 
-buildUnnamed703() {
+buildUnnamed707() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -716,7 +716,7 @@
   return o;
 }
 
-checkUnnamed703(core.Map<core.String, core.Object> o) {
+checkUnnamed707(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o["x"]) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -740,7 +740,7 @@
     o.endTime = "foo";
     o.errorStatus = buildStatus();
     o.name = "foo";
-    o.params = buildUnnamed703();
+    o.params = buildUnnamed707();
     o.runTime = "foo";
     o.schedule = "foo";
     o.scheduleTime = "foo";
@@ -761,7 +761,7 @@
     unittest.expect(o.endTime, unittest.equals('foo'));
     checkStatus(o.errorStatus);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed703(o.params);
+    checkUnnamed707(o.params);
     unittest.expect(o.runTime, unittest.equals('foo'));
     unittest.expect(o.schedule, unittest.equals('foo'));
     unittest.expect(o.scheduleTime, unittest.equals('foo'));
@@ -773,58 +773,6 @@
   buildCounterTransferRun--;
 }
 
-buildUnnamed704() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed704(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed705() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed705(core.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() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return 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'));
-}
-
-buildUnnamed707() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return 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'));
-}
-
 buildUnnamed708() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -851,6 +799,58 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed710() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+buildUnnamed711() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed711(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed712() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed712(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed713() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed713(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 main() {
   unittest.group("obj-schema-CheckValidCredsRequest", () {
     unittest.test("to-json--from-json", () {
@@ -1217,9 +1217,9 @@
       api.ProjectsLocationsResourceApi res =
           new api.BigquerydatatransferApi(mock).projects.locations;
       var arg_name = "foo";
+      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_filter = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1252,11 +1252,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1267,9 +1267,9 @@
       }), true);
       res
           .list(arg_name,
+              filter: arg_filter,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
-              filter: arg_filter,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListLocationsResponse response) {
         checkListLocationsResponse(response);
@@ -1630,9 +1630,9 @@
               .locations
               .transferConfigs;
       var arg_parent = "foo";
-      var arg_dataSourceIds = buildUnnamed704();
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_dataSourceIds = buildUnnamed708();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1666,11 +1666,11 @@
           }
         }
         unittest.expect(
-            queryMap["dataSourceIds"], unittest.equals(arg_dataSourceIds));
-        unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["dataSourceIds"], unittest.equals(arg_dataSourceIds));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1681,9 +1681,9 @@
       }), true);
       res
           .list(arg_parent,
-              dataSourceIds: arg_dataSourceIds,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              dataSourceIds: arg_dataSourceIds,
               $fields: arg_$fields)
           .then(unittest
               .expectAsync1(((api.ListTransferConfigsResponse response) {
@@ -1700,8 +1700,8 @@
               .transferConfigs;
       var arg_request = buildTransferConfig();
       var arg_name = "foo";
-      var arg_updateMask = "foo";
       var arg_authorizationCode = "foo";
+      var arg_updateMask = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.TransferConfig.fromJson(json);
@@ -1737,10 +1737,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
         unittest.expect(queryMap["authorizationCode"].first,
             unittest.equals(arg_authorizationCode));
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1751,8 +1751,8 @@
       }), true);
       res
           .patch(arg_request, arg_name,
-              updateMask: arg_updateMask,
               authorizationCode: arg_authorizationCode,
+              updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.TransferConfig response) {
         checkTransferConfig(response);
@@ -1941,10 +1941,10 @@
               .transferConfigs
               .runs;
       var arg_parent = "foo";
-      var arg_pageToken = "foo";
-      var arg_states = buildUnnamed705();
-      var arg_pageSize = 42;
       var arg_runAttempt = "foo";
+      var arg_pageToken = "foo";
+      var arg_states = buildUnnamed709();
+      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1978,12 +1978,12 @@
           }
         }
         unittest.expect(
+            queryMap["runAttempt"].first, unittest.equals(arg_runAttempt));
+        unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["states"], unittest.equals(arg_states));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
-        unittest.expect(
-            queryMap["runAttempt"].first, unittest.equals(arg_runAttempt));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1994,10 +1994,10 @@
       }), true);
       res
           .list(arg_parent,
+              runAttempt: arg_runAttempt,
               pageToken: arg_pageToken,
               states: arg_states,
               pageSize: arg_pageSize,
-              runAttempt: arg_runAttempt,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListTransferRunsResponse response) {
         checkListTransferRunsResponse(response);
@@ -2020,7 +2020,7 @@
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_messageTypes = buildUnnamed706();
+      var arg_messageTypes = buildUnnamed710();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2251,7 +2251,7 @@
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_dataSourceIds = buildUnnamed707();
+      var arg_dataSourceIds = buildUnnamed711();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2541,10 +2541,10 @@
       api.ProjectsTransferConfigsRunsResourceApi res =
           new api.BigquerydatatransferApi(mock).projects.transferConfigs.runs;
       var arg_parent = "foo";
-      var arg_pageToken = "foo";
-      var arg_states = buildUnnamed708();
-      var arg_pageSize = 42;
       var arg_runAttempt = "foo";
+      var arg_pageToken = "foo";
+      var arg_states = buildUnnamed712();
+      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2578,12 +2578,12 @@
           }
         }
         unittest.expect(
+            queryMap["runAttempt"].first, unittest.equals(arg_runAttempt));
+        unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["states"], unittest.equals(arg_states));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
-        unittest.expect(
-            queryMap["runAttempt"].first, unittest.equals(arg_runAttempt));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2594,10 +2594,10 @@
       }), true);
       res
           .list(arg_parent,
+              runAttempt: arg_runAttempt,
               pageToken: arg_pageToken,
               states: arg_states,
               pageSize: arg_pageSize,
-              runAttempt: arg_runAttempt,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListTransferRunsResponse response) {
         checkListTransferRunsResponse(response);
@@ -2618,7 +2618,7 @@
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_messageTypes = buildUnnamed709();
+      var arg_messageTypes = buildUnnamed713();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/blogger/v3_test.dart b/generated/googleapis/test/blogger/v3_test.dart
index fab2cfd..26ef68b 100644
--- a/generated/googleapis/test/blogger/v3_test.dart
+++ b/generated/googleapis/test/blogger/v3_test.dart
@@ -94,14 +94,14 @@
   buildCounterBlogPages--;
 }
 
-buildUnnamed1329() {
+buildUnnamed1345() {
   var o = new core.List<api.Post>();
   o.add(buildPost());
   o.add(buildPost());
   return o;
 }
 
-checkUnnamed1329(core.List<api.Post> o) {
+checkUnnamed1345(core.List<api.Post> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPost(o[0]);
   checkPost(o[1]);
@@ -112,7 +112,7 @@
   var o = new api.BlogPosts();
   buildCounterBlogPosts++;
   if (buildCounterBlogPosts < 3) {
-    o.items = buildUnnamed1329();
+    o.items = buildUnnamed1345();
     o.selfLink = "foo";
     o.totalItems = 42;
   }
@@ -123,7 +123,7 @@
 checkBlogPosts(api.BlogPosts o) {
   buildCounterBlogPosts++;
   if (buildCounterBlogPosts < 3) {
-    checkUnnamed1329(o.items);
+    checkUnnamed1345(o.items);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
@@ -175,27 +175,27 @@
   buildCounterBlog--;
 }
 
-buildUnnamed1330() {
+buildUnnamed1346() {
   var o = new core.List<api.BlogUserInfo>();
   o.add(buildBlogUserInfo());
   o.add(buildBlogUserInfo());
   return o;
 }
 
-checkUnnamed1330(core.List<api.BlogUserInfo> o) {
+checkUnnamed1346(core.List<api.BlogUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBlogUserInfo(o[0]);
   checkBlogUserInfo(o[1]);
 }
 
-buildUnnamed1331() {
+buildUnnamed1347() {
   var o = new core.List<api.Blog>();
   o.add(buildBlog());
   o.add(buildBlog());
   return o;
 }
 
-checkUnnamed1331(core.List<api.Blog> o) {
+checkUnnamed1347(core.List<api.Blog> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBlog(o[0]);
   checkBlog(o[1]);
@@ -206,8 +206,8 @@
   var o = new api.BlogList();
   buildCounterBlogList++;
   if (buildCounterBlogList < 3) {
-    o.blogUserInfos = buildUnnamed1330();
-    o.items = buildUnnamed1331();
+    o.blogUserInfos = buildUnnamed1346();
+    o.items = buildUnnamed1347();
     o.kind = "foo";
   }
   buildCounterBlogList--;
@@ -217,8 +217,8 @@
 checkBlogList(api.BlogList o) {
   buildCounterBlogList++;
   if (buildCounterBlogList < 3) {
-    checkUnnamed1330(o.blogUserInfos);
-    checkUnnamed1331(o.items);
+    checkUnnamed1346(o.blogUserInfos);
+    checkUnnamed1347(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBlogList--;
@@ -418,14 +418,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed1332() {
+buildUnnamed1348() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed1332(core.List<api.Comment> o) {
+checkUnnamed1348(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -437,7 +437,7 @@
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1332();
+    o.items = buildUnnamed1348();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.prevPageToken = "foo";
@@ -450,7 +450,7 @@
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1332(o.items);
+    checkUnnamed1348(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
@@ -564,14 +564,14 @@
   buildCounterPage--;
 }
 
-buildUnnamed1333() {
+buildUnnamed1349() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1333(core.List<api.Page> o) {
+checkUnnamed1349(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
@@ -583,7 +583,7 @@
   buildCounterPageList++;
   if (buildCounterPageList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1333();
+    o.items = buildUnnamed1349();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -595,7 +595,7 @@
   buildCounterPageList++;
   if (buildCounterPageList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1333(o.items);
+    checkUnnamed1349(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -623,14 +623,14 @@
   buildCounterPageviewsCounts--;
 }
 
-buildUnnamed1334() {
+buildUnnamed1350() {
   var o = new core.List<api.PageviewsCounts>();
   o.add(buildPageviewsCounts());
   o.add(buildPageviewsCounts());
   return o;
 }
 
-checkUnnamed1334(core.List<api.PageviewsCounts> o) {
+checkUnnamed1350(core.List<api.PageviewsCounts> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPageviewsCounts(o[0]);
   checkPageviewsCounts(o[1]);
@@ -642,7 +642,7 @@
   buildCounterPageviews++;
   if (buildCounterPageviews < 3) {
     o.blogId = "foo";
-    o.counts = buildUnnamed1334();
+    o.counts = buildUnnamed1350();
     o.kind = "foo";
   }
   buildCounterPageviews--;
@@ -653,7 +653,7 @@
   buildCounterPageviews++;
   if (buildCounterPageviews < 3) {
     unittest.expect(o.blogId, unittest.equals('foo'));
-    checkUnnamed1334(o.counts);
+    checkUnnamed1350(o.counts);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPageviews--;
@@ -741,27 +741,27 @@
   buildCounterPostImages--;
 }
 
-buildUnnamed1335() {
+buildUnnamed1351() {
   var o = new core.List<api.PostImages>();
   o.add(buildPostImages());
   o.add(buildPostImages());
   return o;
 }
 
-checkUnnamed1335(core.List<api.PostImages> o) {
+checkUnnamed1351(core.List<api.PostImages> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostImages(o[0]);
   checkPostImages(o[1]);
 }
 
-buildUnnamed1336() {
+buildUnnamed1352() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1336(core.List<core.String> o) {
+checkUnnamed1352(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -792,14 +792,14 @@
   buildCounterPostLocation--;
 }
 
-buildUnnamed1337() {
+buildUnnamed1353() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed1337(core.List<api.Comment> o) {
+checkUnnamed1353(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -810,7 +810,7 @@
   var o = new api.PostReplies();
   buildCounterPostReplies++;
   if (buildCounterPostReplies < 3) {
-    o.items = buildUnnamed1337();
+    o.items = buildUnnamed1353();
     o.selfLink = "foo";
     o.totalItems = "foo";
   }
@@ -821,7 +821,7 @@
 checkPostReplies(api.PostReplies o) {
   buildCounterPostReplies++;
   if (buildCounterPostReplies < 3) {
-    checkUnnamed1337(o.items);
+    checkUnnamed1353(o.items);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals('foo'));
   }
@@ -839,9 +839,9 @@
     o.customMetaData = "foo";
     o.etag = "foo";
     o.id = "foo";
-    o.images = buildUnnamed1335();
+    o.images = buildUnnamed1351();
     o.kind = "foo";
-    o.labels = buildUnnamed1336();
+    o.labels = buildUnnamed1352();
     o.location = buildPostLocation();
     o.published = core.DateTime.parse("2002-02-27T14:01:02");
     o.readerComments = "foo";
@@ -866,9 +866,9 @@
     unittest.expect(o.customMetaData, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1335(o.images);
+    checkUnnamed1351(o.images);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1336(o.labels);
+    checkUnnamed1352(o.labels);
     checkPostLocation(o.location);
     unittest.expect(o.published,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -885,14 +885,14 @@
   buildCounterPost--;
 }
 
-buildUnnamed1338() {
+buildUnnamed1354() {
   var o = new core.List<api.Post>();
   o.add(buildPost());
   o.add(buildPost());
   return o;
 }
 
-checkUnnamed1338(core.List<api.Post> o) {
+checkUnnamed1354(core.List<api.Post> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPost(o[0]);
   checkPost(o[1]);
@@ -904,7 +904,7 @@
   buildCounterPostList++;
   if (buildCounterPostList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1338();
+    o.items = buildUnnamed1354();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -916,7 +916,7 @@
   buildCounterPostList++;
   if (buildCounterPostList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1338(o.items);
+    checkUnnamed1354(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -973,14 +973,14 @@
   buildCounterPostUserInfo--;
 }
 
-buildUnnamed1339() {
+buildUnnamed1355() {
   var o = new core.List<api.PostUserInfo>();
   o.add(buildPostUserInfo());
   o.add(buildPostUserInfo());
   return o;
 }
 
-checkUnnamed1339(core.List<api.PostUserInfo> o) {
+checkUnnamed1355(core.List<api.PostUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostUserInfo(o[0]);
   checkPostUserInfo(o[1]);
@@ -991,7 +991,7 @@
   var o = new api.PostUserInfosList();
   buildCounterPostUserInfosList++;
   if (buildCounterPostUserInfosList < 3) {
-    o.items = buildUnnamed1339();
+    o.items = buildUnnamed1355();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1002,7 +1002,7 @@
 checkPostUserInfosList(api.PostUserInfosList o) {
   buildCounterPostUserInfosList++;
   if (buildCounterPostUserInfosList < 3) {
-    checkUnnamed1339(o.items);
+    checkUnnamed1355(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1087,105 +1087,105 @@
   buildCounterUser--;
 }
 
-buildUnnamed1340() {
+buildUnnamed1356() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1340(core.List<core.String> o) {
+checkUnnamed1356(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1341() {
+buildUnnamed1357() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1341(core.List<core.String> o) {
+checkUnnamed1357(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1342() {
+buildUnnamed1358() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1342(core.List<core.String> o) {
+checkUnnamed1358(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1343() {
+buildUnnamed1359() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1343(core.List<core.String> o) {
+checkUnnamed1359(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1344() {
+buildUnnamed1360() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1344(core.List<core.String> o) {
+checkUnnamed1360(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1345() {
+buildUnnamed1361() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1345(core.List<core.String> o) {
+checkUnnamed1361(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1346() {
+buildUnnamed1362() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1346(core.List<core.String> o) {
+checkUnnamed1362(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1347() {
+buildUnnamed1363() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1347(core.List<core.String> o) {
+checkUnnamed1363(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1668,8 +1668,8 @@
       api.BlogsResourceApi res = new api.BloggerApi(mock).blogs;
       var arg_userId = "foo";
       var arg_fetchUserInfo = true;
-      var arg_role = buildUnnamed1340();
-      var arg_status = buildUnnamed1341();
+      var arg_role = buildUnnamed1356();
+      var arg_status = buildUnnamed1357();
       var arg_view = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1986,7 +1986,7 @@
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed1342();
+      var arg_status = buildUnnamed1358();
       var arg_view = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2084,7 +2084,7 @@
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed1343();
+      var arg_status = buildUnnamed1359();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2333,7 +2333,7 @@
       var mock = new HttpServerMock();
       api.PageViewsResourceApi res = new api.BloggerApi(mock).pageViews;
       var arg_blogId = "foo";
-      var arg_range = buildUnnamed1344();
+      var arg_range = buildUnnamed1360();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2604,7 +2604,7 @@
       var arg_fetchBodies = true;
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
-      var arg_status = buildUnnamed1345();
+      var arg_status = buildUnnamed1361();
       var arg_view = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3074,7 +3074,7 @@
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed1346();
+      var arg_status = buildUnnamed1362();
       var arg_view = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3479,7 +3479,7 @@
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed1347();
+      var arg_status = buildUnnamed1363();
       var arg_view = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
diff --git a/generated/googleapis/test/books/v1_test.dart b/generated/googleapis/test/books/v1_test.dart
index bcc40b8..7c1dba1 100644
--- a/generated/googleapis/test/books/v1_test.dart
+++ b/generated/googleapis/test/books/v1_test.dart
@@ -127,14 +127,14 @@
   buildCounterAnnotationLayerSummary--;
 }
 
-buildUnnamed947() {
+buildUnnamed956() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed947(core.List<core.String> o) {
+checkUnnamed956(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -157,7 +157,7 @@
     o.kind = "foo";
     o.layerId = "foo";
     o.layerSummary = buildAnnotationLayerSummary();
-    o.pageIds = buildUnnamed947();
+    o.pageIds = buildUnnamed956();
     o.selectedText = "foo";
     o.selfLink = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -183,7 +183,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.layerId, unittest.equals('foo'));
     checkAnnotationLayerSummary(o.layerSummary);
-    checkUnnamed947(o.pageIds);
+    checkUnnamed956(o.pageIds);
     unittest.expect(o.selectedText, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(
@@ -237,14 +237,14 @@
   buildCounterAnnotationdata--;
 }
 
-buildUnnamed948() {
+buildUnnamed957() {
   var o = new core.List<api.Annotation>();
   o.add(buildAnnotation());
   o.add(buildAnnotation());
   return o;
 }
 
-checkUnnamed948(core.List<api.Annotation> o) {
+checkUnnamed957(core.List<api.Annotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotation(o[0]);
   checkAnnotation(o[1]);
@@ -255,7 +255,7 @@
   var o = new api.Annotations();
   buildCounterAnnotations++;
   if (buildCounterAnnotations < 3) {
-    o.items = buildUnnamed948();
+    o.items = buildUnnamed957();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -267,7 +267,7 @@
 checkAnnotations(api.Annotations o) {
   buildCounterAnnotations++;
   if (buildCounterAnnotations < 3) {
-    checkUnnamed948(o.items);
+    checkUnnamed957(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -303,14 +303,14 @@
   buildCounterAnnotationsSummaryLayers--;
 }
 
-buildUnnamed949() {
+buildUnnamed958() {
   var o = new core.List<api.AnnotationsSummaryLayers>();
   o.add(buildAnnotationsSummaryLayers());
   o.add(buildAnnotationsSummaryLayers());
   return o;
 }
 
-checkUnnamed949(core.List<api.AnnotationsSummaryLayers> o) {
+checkUnnamed958(core.List<api.AnnotationsSummaryLayers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotationsSummaryLayers(o[0]);
   checkAnnotationsSummaryLayers(o[1]);
@@ -322,7 +322,7 @@
   buildCounterAnnotationsSummary++;
   if (buildCounterAnnotationsSummary < 3) {
     o.kind = "foo";
-    o.layers = buildUnnamed949();
+    o.layers = buildUnnamed958();
   }
   buildCounterAnnotationsSummary--;
   return o;
@@ -332,19 +332,19 @@
   buildCounterAnnotationsSummary++;
   if (buildCounterAnnotationsSummary < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed949(o.layers);
+    checkUnnamed958(o.layers);
   }
   buildCounterAnnotationsSummary--;
 }
 
-buildUnnamed950() {
+buildUnnamed959() {
   var o = new core.List<api.Annotationdata>();
   o.add(buildAnnotationdata());
   o.add(buildAnnotationdata());
   return o;
 }
 
-checkUnnamed950(core.List<api.Annotationdata> o) {
+checkUnnamed959(core.List<api.Annotationdata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotationdata(o[0]);
   checkAnnotationdata(o[1]);
@@ -355,7 +355,7 @@
   var o = new api.Annotationsdata();
   buildCounterAnnotationsdata++;
   if (buildCounterAnnotationsdata < 3) {
-    o.items = buildUnnamed950();
+    o.items = buildUnnamed959();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -367,7 +367,7 @@
 checkAnnotationsdata(api.Annotationsdata o) {
   buildCounterAnnotationsdata++;
   if (buildCounterAnnotationsdata < 3) {
-    checkUnnamed950(o.items);
+    checkUnnamed959(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -485,14 +485,14 @@
   buildCounterBookshelf--;
 }
 
-buildUnnamed951() {
+buildUnnamed960() {
   var o = new core.List<api.Bookshelf>();
   o.add(buildBookshelf());
   o.add(buildBookshelf());
   return o;
 }
 
-checkUnnamed951(core.List<api.Bookshelf> o) {
+checkUnnamed960(core.List<api.Bookshelf> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBookshelf(o[0]);
   checkBookshelf(o[1]);
@@ -503,7 +503,7 @@
   var o = new api.Bookshelves();
   buildCounterBookshelves++;
   if (buildCounterBookshelves < 3) {
-    o.items = buildUnnamed951();
+    o.items = buildUnnamed960();
     o.kind = "foo";
   }
   buildCounterBookshelves--;
@@ -513,7 +513,7 @@
 checkBookshelves(api.Bookshelves o) {
   buildCounterBookshelves++;
   if (buildCounterBookshelves < 3) {
-    checkUnnamed951(o.items);
+    checkUnnamed960(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBookshelves--;
@@ -542,14 +542,14 @@
   buildCounterCategoryItems--;
 }
 
-buildUnnamed952() {
+buildUnnamed961() {
   var o = new core.List<api.CategoryItems>();
   o.add(buildCategoryItems());
   o.add(buildCategoryItems());
   return o;
 }
 
-checkUnnamed952(core.List<api.CategoryItems> o) {
+checkUnnamed961(core.List<api.CategoryItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCategoryItems(o[0]);
   checkCategoryItems(o[1]);
@@ -560,7 +560,7 @@
   var o = new api.Category();
   buildCounterCategory++;
   if (buildCounterCategory < 3) {
-    o.items = buildUnnamed952();
+    o.items = buildUnnamed961();
     o.kind = "foo";
   }
   buildCounterCategory--;
@@ -570,7 +570,7 @@
 checkCategory(api.Category o) {
   buildCounterCategory++;
   if (buildCounterCategory < 3) {
-    checkUnnamed952(o.items);
+    checkUnnamed961(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCategory--;
@@ -699,14 +699,14 @@
   buildCounterDictlayerdataDictWordsDerivatives--;
 }
 
-buildUnnamed953() {
+buildUnnamed962() {
   var o = new core.List<api.DictlayerdataDictWordsDerivatives>();
   o.add(buildDictlayerdataDictWordsDerivatives());
   o.add(buildDictlayerdataDictWordsDerivatives());
   return o;
 }
 
-checkUnnamed953(core.List<api.DictlayerdataDictWordsDerivatives> o) {
+checkUnnamed962(core.List<api.DictlayerdataDictWordsDerivatives> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsDerivatives(o[0]);
   checkDictlayerdataDictWordsDerivatives(o[1]);
@@ -755,14 +755,14 @@
   buildCounterDictlayerdataDictWordsExamples--;
 }
 
-buildUnnamed954() {
+buildUnnamed963() {
   var o = new core.List<api.DictlayerdataDictWordsExamples>();
   o.add(buildDictlayerdataDictWordsExamples());
   o.add(buildDictlayerdataDictWordsExamples());
   return o;
 }
 
-checkUnnamed954(core.List<api.DictlayerdataDictWordsExamples> o) {
+checkUnnamed963(core.List<api.DictlayerdataDictWordsExamples> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsExamples(o[0]);
   checkDictlayerdataDictWordsExamples(o[1]);
@@ -790,14 +790,14 @@
   buildCounterDictlayerdataDictWordsSensesConjugations--;
 }
 
-buildUnnamed955() {
+buildUnnamed964() {
   var o = new core.List<api.DictlayerdataDictWordsSensesConjugations>();
   o.add(buildDictlayerdataDictWordsSensesConjugations());
   o.add(buildDictlayerdataDictWordsSensesConjugations());
   return o;
 }
 
-checkUnnamed955(core.List<api.DictlayerdataDictWordsSensesConjugations> o) {
+checkUnnamed964(core.List<api.DictlayerdataDictWordsSensesConjugations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesConjugations(o[0]);
   checkDictlayerdataDictWordsSensesConjugations(o[1]);
@@ -847,14 +847,14 @@
   buildCounterDictlayerdataDictWordsSensesDefinitionsExamples--;
 }
 
-buildUnnamed956() {
+buildUnnamed965() {
   var o = new core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples>();
   o.add(buildDictlayerdataDictWordsSensesDefinitionsExamples());
   o.add(buildDictlayerdataDictWordsSensesDefinitionsExamples());
   return o;
 }
 
-checkUnnamed956(
+checkUnnamed965(
     core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesDefinitionsExamples(o[0]);
@@ -867,7 +867,7 @@
   buildCounterDictlayerdataDictWordsSensesDefinitions++;
   if (buildCounterDictlayerdataDictWordsSensesDefinitions < 3) {
     o.definition = "foo";
-    o.examples = buildUnnamed956();
+    o.examples = buildUnnamed965();
   }
   buildCounterDictlayerdataDictWordsSensesDefinitions--;
   return o;
@@ -878,19 +878,19 @@
   buildCounterDictlayerdataDictWordsSensesDefinitions++;
   if (buildCounterDictlayerdataDictWordsSensesDefinitions < 3) {
     unittest.expect(o.definition, unittest.equals('foo'));
-    checkUnnamed956(o.examples);
+    checkUnnamed965(o.examples);
   }
   buildCounterDictlayerdataDictWordsSensesDefinitions--;
 }
 
-buildUnnamed957() {
+buildUnnamed966() {
   var o = new core.List<api.DictlayerdataDictWordsSensesDefinitions>();
   o.add(buildDictlayerdataDictWordsSensesDefinitions());
   o.add(buildDictlayerdataDictWordsSensesDefinitions());
   return o;
 }
 
-checkUnnamed957(core.List<api.DictlayerdataDictWordsSensesDefinitions> o) {
+checkUnnamed966(core.List<api.DictlayerdataDictWordsSensesDefinitions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesDefinitions(o[0]);
   checkDictlayerdataDictWordsSensesDefinitions(o[1]);
@@ -962,14 +962,14 @@
   buildCounterDictlayerdataDictWordsSensesSynonyms--;
 }
 
-buildUnnamed958() {
+buildUnnamed967() {
   var o = new core.List<api.DictlayerdataDictWordsSensesSynonyms>();
   o.add(buildDictlayerdataDictWordsSensesSynonyms());
   o.add(buildDictlayerdataDictWordsSensesSynonyms());
   return o;
 }
 
-checkUnnamed958(core.List<api.DictlayerdataDictWordsSensesSynonyms> o) {
+checkUnnamed967(core.List<api.DictlayerdataDictWordsSensesSynonyms> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesSynonyms(o[0]);
   checkDictlayerdataDictWordsSensesSynonyms(o[1]);
@@ -980,14 +980,14 @@
   var o = new api.DictlayerdataDictWordsSenses();
   buildCounterDictlayerdataDictWordsSenses++;
   if (buildCounterDictlayerdataDictWordsSenses < 3) {
-    o.conjugations = buildUnnamed955();
-    o.definitions = buildUnnamed957();
+    o.conjugations = buildUnnamed964();
+    o.definitions = buildUnnamed966();
     o.partOfSpeech = "foo";
     o.pronunciation = "foo";
     o.pronunciationUrl = "foo";
     o.source = buildDictlayerdataDictWordsSensesSource();
     o.syllabification = "foo";
-    o.synonyms = buildUnnamed958();
+    o.synonyms = buildUnnamed967();
   }
   buildCounterDictlayerdataDictWordsSenses--;
   return o;
@@ -996,26 +996,26 @@
 checkDictlayerdataDictWordsSenses(api.DictlayerdataDictWordsSenses o) {
   buildCounterDictlayerdataDictWordsSenses++;
   if (buildCounterDictlayerdataDictWordsSenses < 3) {
-    checkUnnamed955(o.conjugations);
-    checkUnnamed957(o.definitions);
+    checkUnnamed964(o.conjugations);
+    checkUnnamed966(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);
+    checkUnnamed967(o.synonyms);
   }
   buildCounterDictlayerdataDictWordsSenses--;
 }
 
-buildUnnamed959() {
+buildUnnamed968() {
   var o = new core.List<api.DictlayerdataDictWordsSenses>();
   o.add(buildDictlayerdataDictWordsSenses());
   o.add(buildDictlayerdataDictWordsSenses());
   return o;
 }
 
-checkUnnamed959(core.List<api.DictlayerdataDictWordsSenses> o) {
+checkUnnamed968(core.List<api.DictlayerdataDictWordsSenses> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSenses(o[0]);
   checkDictlayerdataDictWordsSenses(o[1]);
@@ -1047,9 +1047,9 @@
   var o = new api.DictlayerdataDictWords();
   buildCounterDictlayerdataDictWords++;
   if (buildCounterDictlayerdataDictWords < 3) {
-    o.derivatives = buildUnnamed953();
-    o.examples = buildUnnamed954();
-    o.senses = buildUnnamed959();
+    o.derivatives = buildUnnamed962();
+    o.examples = buildUnnamed963();
+    o.senses = buildUnnamed968();
     o.source = buildDictlayerdataDictWordsSource();
   }
   buildCounterDictlayerdataDictWords--;
@@ -1059,22 +1059,22 @@
 checkDictlayerdataDictWords(api.DictlayerdataDictWords o) {
   buildCounterDictlayerdataDictWords++;
   if (buildCounterDictlayerdataDictWords < 3) {
-    checkUnnamed953(o.derivatives);
-    checkUnnamed954(o.examples);
-    checkUnnamed959(o.senses);
+    checkUnnamed962(o.derivatives);
+    checkUnnamed963(o.examples);
+    checkUnnamed968(o.senses);
     checkDictlayerdataDictWordsSource(o.source);
   }
   buildCounterDictlayerdataDictWords--;
 }
 
-buildUnnamed960() {
+buildUnnamed969() {
   var o = new core.List<api.DictlayerdataDictWords>();
   o.add(buildDictlayerdataDictWords());
   o.add(buildDictlayerdataDictWords());
   return o;
 }
 
-checkUnnamed960(core.List<api.DictlayerdataDictWords> o) {
+checkUnnamed969(core.List<api.DictlayerdataDictWords> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWords(o[0]);
   checkDictlayerdataDictWords(o[1]);
@@ -1086,7 +1086,7 @@
   buildCounterDictlayerdataDict++;
   if (buildCounterDictlayerdataDict < 3) {
     o.source = buildDictlayerdataDictSource();
-    o.words = buildUnnamed960();
+    o.words = buildUnnamed969();
   }
   buildCounterDictlayerdataDict--;
   return o;
@@ -1096,7 +1096,7 @@
   buildCounterDictlayerdataDict++;
   if (buildCounterDictlayerdataDict < 3) {
     checkDictlayerdataDictSource(o.source);
-    checkUnnamed960(o.words);
+    checkUnnamed969(o.words);
   }
   buildCounterDictlayerdataDict--;
 }
@@ -1154,14 +1154,14 @@
   buildCounterDiscoveryclustersClustersBannerWithContentContainer--;
 }
 
-buildUnnamed961() {
+buildUnnamed970() {
   var o = new core.List<api.Volume>();
   o.add(buildVolume());
   o.add(buildVolume());
   return o;
 }
 
-checkUnnamed961(core.List<api.Volume> o) {
+checkUnnamed970(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolume(o[0]);
   checkVolume(o[1]);
@@ -1178,7 +1178,7 @@
     o.title = "foo";
     o.totalVolumes = 42;
     o.uid = "foo";
-    o.volumes = buildUnnamed961();
+    o.volumes = buildUnnamed970();
   }
   buildCounterDiscoveryclustersClusters--;
   return o;
@@ -1193,19 +1193,19 @@
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.totalVolumes, unittest.equals(42));
     unittest.expect(o.uid, unittest.equals('foo'));
-    checkUnnamed961(o.volumes);
+    checkUnnamed970(o.volumes);
   }
   buildCounterDiscoveryclustersClusters--;
 }
 
-buildUnnamed962() {
+buildUnnamed971() {
   var o = new core.List<api.DiscoveryclustersClusters>();
   o.add(buildDiscoveryclustersClusters());
   o.add(buildDiscoveryclustersClusters());
   return o;
 }
 
-checkUnnamed962(core.List<api.DiscoveryclustersClusters> o) {
+checkUnnamed971(core.List<api.DiscoveryclustersClusters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiscoveryclustersClusters(o[0]);
   checkDiscoveryclustersClusters(o[1]);
@@ -1216,7 +1216,7 @@
   var o = new api.Discoveryclusters();
   buildCounterDiscoveryclusters++;
   if (buildCounterDiscoveryclusters < 3) {
-    o.clusters = buildUnnamed962();
+    o.clusters = buildUnnamed971();
     o.kind = "foo";
     o.totalClusters = 42;
   }
@@ -1227,7 +1227,7 @@
 checkDiscoveryclusters(api.Discoveryclusters o) {
   buildCounterDiscoveryclusters++;
   if (buildCounterDiscoveryclusters < 3) {
-    checkUnnamed962(o.clusters);
+    checkUnnamed971(o.clusters);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalClusters, unittest.equals(42));
   }
@@ -1275,14 +1275,14 @@
   buildCounterDownloadAccessRestriction--;
 }
 
-buildUnnamed963() {
+buildUnnamed972() {
   var o = new core.List<api.DownloadAccessRestriction>();
   o.add(buildDownloadAccessRestriction());
   o.add(buildDownloadAccessRestriction());
   return o;
 }
 
-checkUnnamed963(core.List<api.DownloadAccessRestriction> o) {
+checkUnnamed972(core.List<api.DownloadAccessRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDownloadAccessRestriction(o[0]);
   checkDownloadAccessRestriction(o[1]);
@@ -1293,7 +1293,7 @@
   var o = new api.DownloadAccesses();
   buildCounterDownloadAccesses++;
   if (buildCounterDownloadAccesses < 3) {
-    o.downloadAccessList = buildUnnamed963();
+    o.downloadAccessList = buildUnnamed972();
     o.kind = "foo";
   }
   buildCounterDownloadAccesses--;
@@ -1303,7 +1303,7 @@
 checkDownloadAccesses(api.DownloadAccesses o) {
   buildCounterDownloadAccesses++;
   if (buildCounterDownloadAccesses < 3) {
-    checkUnnamed963(o.downloadAccessList);
+    checkUnnamed972(o.downloadAccessList);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDownloadAccesses--;
@@ -1357,30 +1357,30 @@
   buildCounterGeolayerdataGeoBoundary--;
 }
 
-buildUnnamed964() {
+buildUnnamed973() {
   var o = new core.List<api.GeolayerdataGeoBoundary>();
   o.add(buildGeolayerdataGeoBoundary());
   o.add(buildGeolayerdataGeoBoundary());
   return o;
 }
 
-checkUnnamed964(core.List<api.GeolayerdataGeoBoundary> o) {
+checkUnnamed973(core.List<api.GeolayerdataGeoBoundary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeolayerdataGeoBoundary(o[0]);
   checkGeolayerdataGeoBoundary(o[1]);
 }
 
-buildUnnamed965() {
+buildUnnamed974() {
   var o = new core.List<core.List<api.GeolayerdataGeoBoundary>>();
-  o.add(buildUnnamed964());
-  o.add(buildUnnamed964());
+  o.add(buildUnnamed973());
+  o.add(buildUnnamed973());
   return o;
 }
 
-checkUnnamed965(core.List<core.List<api.GeolayerdataGeoBoundary>> o) {
+checkUnnamed974(core.List<core.List<api.GeolayerdataGeoBoundary>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed964(o[0]);
-  checkUnnamed964(o[1]);
+  checkUnnamed973(o[0]);
+  checkUnnamed973(o[1]);
 }
 
 core.int buildCounterGeolayerdataGeoViewportHi = 0;
@@ -1451,7 +1451,7 @@
   var o = new api.GeolayerdataGeo();
   buildCounterGeolayerdataGeo++;
   if (buildCounterGeolayerdataGeo < 3) {
-    o.boundary = buildUnnamed965();
+    o.boundary = buildUnnamed974();
     o.cachePolicy = "foo";
     o.countryCode = "foo";
     o.latitude = 42.0;
@@ -1467,7 +1467,7 @@
 checkGeolayerdataGeo(api.GeolayerdataGeo o) {
   buildCounterGeolayerdataGeo++;
   if (buildCounterGeolayerdataGeo < 3) {
-    checkUnnamed965(o.boundary);
+    checkUnnamed974(o.boundary);
     unittest.expect(o.cachePolicy, unittest.equals('foo'));
     unittest.expect(o.countryCode, unittest.equals('foo'));
     unittest.expect(o.latitude, unittest.equals(42.0));
@@ -1502,14 +1502,14 @@
   buildCounterGeolayerdata--;
 }
 
-buildUnnamed966() {
+buildUnnamed975() {
   var o = new core.List<api.Layersummary>();
   o.add(buildLayersummary());
   o.add(buildLayersummary());
   return o;
 }
 
-checkUnnamed966(core.List<api.Layersummary> o) {
+checkUnnamed975(core.List<api.Layersummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLayersummary(o[0]);
   checkLayersummary(o[1]);
@@ -1520,7 +1520,7 @@
   var o = new api.Layersummaries();
   buildCounterLayersummaries++;
   if (buildCounterLayersummaries < 3) {
-    o.items = buildUnnamed966();
+    o.items = buildUnnamed975();
     o.kind = "foo";
     o.totalItems = 42;
   }
@@ -1531,21 +1531,21 @@
 checkLayersummaries(api.Layersummaries o) {
   buildCounterLayersummaries++;
   if (buildCounterLayersummaries < 3) {
-    checkUnnamed966(o.items);
+    checkUnnamed975(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterLayersummaries--;
 }
 
-buildUnnamed967() {
+buildUnnamed976() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed967(core.List<core.String> o) {
+checkUnnamed976(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1557,7 +1557,7 @@
   buildCounterLayersummary++;
   if (buildCounterLayersummary < 3) {
     o.annotationCount = 42;
-    o.annotationTypes = buildUnnamed967();
+    o.annotationTypes = buildUnnamed976();
     o.annotationsDataLink = "foo";
     o.annotationsLink = "foo";
     o.contentVersion = "foo";
@@ -1578,7 +1578,7 @@
   buildCounterLayersummary++;
   if (buildCounterLayersummary < 3) {
     unittest.expect(o.annotationCount, unittest.equals(42));
-    checkUnnamed967(o.annotationTypes);
+    checkUnnamed976(o.annotationTypes);
     unittest.expect(o.annotationsDataLink, unittest.equals('foo'));
     unittest.expect(o.annotationsLink, unittest.equals('foo'));
     unittest.expect(o.contentVersion, unittest.equals('foo'));
@@ -1622,14 +1622,14 @@
   buildCounterMetadataItems--;
 }
 
-buildUnnamed968() {
+buildUnnamed977() {
   var o = new core.List<api.MetadataItems>();
   o.add(buildMetadataItems());
   o.add(buildMetadataItems());
   return o;
 }
 
-checkUnnamed968(core.List<api.MetadataItems> o) {
+checkUnnamed977(core.List<api.MetadataItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataItems(o[0]);
   checkMetadataItems(o[1]);
@@ -1640,7 +1640,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed968();
+    o.items = buildUnnamed977();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -1650,20 +1650,20 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed968(o.items);
+    checkUnnamed977(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
 }
 
-buildUnnamed969() {
+buildUnnamed978() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed969(core.List<core.String> o) {
+checkUnnamed978(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1675,7 +1675,7 @@
   buildCounterNotification++;
   if (buildCounterNotification < 3) {
     o.body = "foo";
-    o.crmExperimentIds = buildUnnamed969();
+    o.crmExperimentIds = buildUnnamed978();
     o.docId = "foo";
     o.docType = "foo";
     o.dontShowNotification = true;
@@ -1697,7 +1697,7 @@
   buildCounterNotification++;
   if (buildCounterNotification < 3) {
     unittest.expect(o.body, unittest.equals('foo'));
-    checkUnnamed969(o.crmExperimentIds);
+    checkUnnamed978(o.crmExperimentIds);
     unittest.expect(o.docId, unittest.equals('foo'));
     unittest.expect(o.docType, unittest.equals('foo'));
     unittest.expect(o.dontShowNotification, unittest.isTrue);
@@ -1743,14 +1743,14 @@
   buildCounterOffersItemsItems--;
 }
 
-buildUnnamed970() {
+buildUnnamed979() {
   var o = new core.List<api.OffersItemsItems>();
   o.add(buildOffersItemsItems());
   o.add(buildOffersItemsItems());
   return o;
 }
 
-checkUnnamed970(core.List<api.OffersItemsItems> o) {
+checkUnnamed979(core.List<api.OffersItemsItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffersItemsItems(o[0]);
   checkOffersItemsItems(o[1]);
@@ -1764,7 +1764,7 @@
     o.artUrl = "foo";
     o.gservicesKey = "foo";
     o.id = "foo";
-    o.items = buildUnnamed970();
+    o.items = buildUnnamed979();
   }
   buildCounterOffersItems--;
   return o;
@@ -1776,19 +1776,19 @@
     unittest.expect(o.artUrl, unittest.equals('foo'));
     unittest.expect(o.gservicesKey, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed970(o.items);
+    checkUnnamed979(o.items);
   }
   buildCounterOffersItems--;
 }
 
-buildUnnamed971() {
+buildUnnamed980() {
   var o = new core.List<api.OffersItems>();
   o.add(buildOffersItems());
   o.add(buildOffersItems());
   return o;
 }
 
-checkUnnamed971(core.List<api.OffersItems> o) {
+checkUnnamed980(core.List<api.OffersItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffersItems(o[0]);
   checkOffersItems(o[1]);
@@ -1799,7 +1799,7 @@
   var o = new api.Offers();
   buildCounterOffers++;
   if (buildCounterOffers < 3) {
-    o.items = buildUnnamed971();
+    o.items = buildUnnamed980();
     o.kind = "foo";
   }
   buildCounterOffers--;
@@ -1809,7 +1809,7 @@
 checkOffers(api.Offers o) {
   buildCounterOffers++;
   if (buildCounterOffers < 3) {
-    checkUnnamed971(o.items);
+    checkUnnamed980(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterOffers--;
@@ -1976,14 +1976,14 @@
   buildCounterSeriesSeries--;
 }
 
-buildUnnamed972() {
+buildUnnamed981() {
   var o = new core.List<api.SeriesSeries>();
   o.add(buildSeriesSeries());
   o.add(buildSeriesSeries());
   return o;
 }
 
-checkUnnamed972(core.List<api.SeriesSeries> o) {
+checkUnnamed981(core.List<api.SeriesSeries> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSeriesSeries(o[0]);
   checkSeriesSeries(o[1]);
@@ -1995,7 +1995,7 @@
   buildCounterSeries++;
   if (buildCounterSeries < 3) {
     o.kind = "foo";
-    o.series = buildUnnamed972();
+    o.series = buildUnnamed981();
   }
   buildCounterSeries--;
   return o;
@@ -2005,19 +2005,19 @@
   buildCounterSeries++;
   if (buildCounterSeries < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed972(o.series);
+    checkUnnamed981(o.series);
   }
   buildCounterSeries--;
 }
 
-buildUnnamed973() {
+buildUnnamed982() {
   var o = new core.List<api.Volume>();
   o.add(buildVolume());
   o.add(buildVolume());
   return o;
 }
 
-checkUnnamed973(core.List<api.Volume> o) {
+checkUnnamed982(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolume(o[0]);
   checkVolume(o[1]);
@@ -2029,7 +2029,7 @@
   buildCounterSeriesmembership++;
   if (buildCounterSeriesmembership < 3) {
     o.kind = "foo";
-    o.member = buildUnnamed973();
+    o.member = buildUnnamed982();
     o.nextPageToken = "foo";
   }
   buildCounterSeriesmembership--;
@@ -2040,7 +2040,7 @@
   buildCounterSeriesmembership++;
   if (buildCounterSeriesmembership < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed973(o.member);
+    checkUnnamed982(o.member);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSeriesmembership--;
@@ -2285,14 +2285,14 @@
   buildCounterVolumeLayerInfoLayers--;
 }
 
-buildUnnamed974() {
+buildUnnamed983() {
   var o = new core.List<api.VolumeLayerInfoLayers>();
   o.add(buildVolumeLayerInfoLayers());
   o.add(buildVolumeLayerInfoLayers());
   return o;
 }
 
-checkUnnamed974(core.List<api.VolumeLayerInfoLayers> o) {
+checkUnnamed983(core.List<api.VolumeLayerInfoLayers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeLayerInfoLayers(o[0]);
   checkVolumeLayerInfoLayers(o[1]);
@@ -2303,7 +2303,7 @@
   var o = new api.VolumeLayerInfo();
   buildCounterVolumeLayerInfo++;
   if (buildCounterVolumeLayerInfo < 3) {
-    o.layers = buildUnnamed974();
+    o.layers = buildUnnamed983();
   }
   buildCounterVolumeLayerInfo--;
   return o;
@@ -2312,7 +2312,7 @@
 checkVolumeLayerInfo(api.VolumeLayerInfo o) {
   buildCounterVolumeLayerInfo++;
   if (buildCounterVolumeLayerInfo < 3) {
-    checkUnnamed974(o.layers);
+    checkUnnamed983(o.layers);
   }
   buildCounterVolumeLayerInfo--;
 }
@@ -2448,14 +2448,14 @@
   buildCounterVolumeSaleInfoOffers--;
 }
 
-buildUnnamed975() {
+buildUnnamed984() {
   var o = new core.List<api.VolumeSaleInfoOffers>();
   o.add(buildVolumeSaleInfoOffers());
   o.add(buildVolumeSaleInfoOffers());
   return o;
 }
 
-checkUnnamed975(core.List<api.VolumeSaleInfoOffers> o) {
+checkUnnamed984(core.List<api.VolumeSaleInfoOffers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeSaleInfoOffers(o[0]);
   checkVolumeSaleInfoOffers(o[1]);
@@ -2491,7 +2491,7 @@
     o.country = "foo";
     o.isEbook = true;
     o.listPrice = buildVolumeSaleInfoListPrice();
-    o.offers = buildUnnamed975();
+    o.offers = buildUnnamed984();
     o.onSaleDate = core.DateTime.parse("2002-02-27T14:01:02");
     o.retailPrice = buildVolumeSaleInfoRetailPrice();
     o.saleability = "foo";
@@ -2507,7 +2507,7 @@
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.isEbook, unittest.isTrue);
     checkVolumeSaleInfoListPrice(o.listPrice);
-    checkUnnamed975(o.offers);
+    checkUnnamed984(o.offers);
     unittest.expect(o.onSaleDate,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkVolumeSaleInfoRetailPrice(o.retailPrice);
@@ -2682,27 +2682,27 @@
   buildCounterVolumeUserInfo--;
 }
 
-buildUnnamed976() {
+buildUnnamed985() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed976(core.List<core.String> o) {
+checkUnnamed985(core.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() {
+buildUnnamed986() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed977(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'));
@@ -2782,14 +2782,14 @@
   buildCounterVolumeVolumeInfoIndustryIdentifiers--;
 }
 
-buildUnnamed978() {
+buildUnnamed987() {
   var o = new core.List<api.VolumeVolumeInfoIndustryIdentifiers>();
   o.add(buildVolumeVolumeInfoIndustryIdentifiers());
   o.add(buildVolumeVolumeInfoIndustryIdentifiers());
   return o;
 }
 
-checkUnnamed978(core.List<api.VolumeVolumeInfoIndustryIdentifiers> o) {
+checkUnnamed987(core.List<api.VolumeVolumeInfoIndustryIdentifiers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeVolumeInfoIndustryIdentifiers(o[0]);
   checkVolumeVolumeInfoIndustryIdentifiers(o[1]);
@@ -2827,15 +2827,15 @@
   buildCounterVolumeVolumeInfo++;
   if (buildCounterVolumeVolumeInfo < 3) {
     o.allowAnonLogging = true;
-    o.authors = buildUnnamed976();
+    o.authors = buildUnnamed985();
     o.averageRating = 42.0;
     o.canonicalVolumeLink = "foo";
-    o.categories = buildUnnamed977();
+    o.categories = buildUnnamed986();
     o.contentVersion = "foo";
     o.description = "foo";
     o.dimensions = buildVolumeVolumeInfoDimensions();
     o.imageLinks = buildVolumeVolumeInfoImageLinks();
-    o.industryIdentifiers = buildUnnamed978();
+    o.industryIdentifiers = buildUnnamed987();
     o.infoLink = "foo";
     o.language = "foo";
     o.mainCategory = "foo";
@@ -2866,15 +2866,15 @@
   buildCounterVolumeVolumeInfo++;
   if (buildCounterVolumeVolumeInfo < 3) {
     unittest.expect(o.allowAnonLogging, unittest.isTrue);
-    checkUnnamed976(o.authors);
+    checkUnnamed985(o.authors);
     unittest.expect(o.averageRating, unittest.equals(42.0));
     unittest.expect(o.canonicalVolumeLink, unittest.equals('foo'));
-    checkUnnamed977(o.categories);
+    checkUnnamed986(o.categories);
     unittest.expect(o.contentVersion, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     checkVolumeVolumeInfoDimensions(o.dimensions);
     checkVolumeVolumeInfoImageLinks(o.imageLinks);
-    checkUnnamed978(o.industryIdentifiers);
+    checkUnnamed987(o.industryIdentifiers);
     unittest.expect(o.infoLink, unittest.equals('foo'));
     unittest.expect(o.language, unittest.equals('foo'));
     unittest.expect(o.mainCategory, unittest.equals('foo'));
@@ -2939,14 +2939,14 @@
   buildCounterVolume--;
 }
 
-buildUnnamed979() {
+buildUnnamed988() {
   var o = new core.List<api.Volume>();
   o.add(buildVolume());
   o.add(buildVolume());
   return o;
 }
 
-checkUnnamed979(core.List<api.Volume> o) {
+checkUnnamed988(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolume(o[0]);
   checkVolume(o[1]);
@@ -2957,7 +2957,7 @@
   var o = new api.Volume2();
   buildCounterVolume2++;
   if (buildCounterVolume2 < 3) {
-    o.items = buildUnnamed979();
+    o.items = buildUnnamed988();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2968,7 +2968,7 @@
 checkVolume2(api.Volume2 o) {
   buildCounterVolume2++;
   if (buildCounterVolume2 < 3) {
-    checkUnnamed979(o.items);
+    checkUnnamed988(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -3000,14 +3000,14 @@
   buildCounterVolumeannotationContentRanges--;
 }
 
-buildUnnamed980() {
+buildUnnamed989() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed980(core.List<core.String> o) {
+checkUnnamed989(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3027,7 +3027,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.layerId = "foo";
-    o.pageIds = buildUnnamed980();
+    o.pageIds = buildUnnamed989();
     o.selectedText = "foo";
     o.selfLink = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -3049,7 +3049,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.layerId, unittest.equals('foo'));
-    checkUnnamed980(o.pageIds);
+    checkUnnamed989(o.pageIds);
     unittest.expect(o.selectedText, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(
@@ -3059,14 +3059,14 @@
   buildCounterVolumeannotation--;
 }
 
-buildUnnamed981() {
+buildUnnamed990() {
   var o = new core.List<api.Volumeannotation>();
   o.add(buildVolumeannotation());
   o.add(buildVolumeannotation());
   return o;
 }
 
-checkUnnamed981(core.List<api.Volumeannotation> o) {
+checkUnnamed990(core.List<api.Volumeannotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeannotation(o[0]);
   checkVolumeannotation(o[1]);
@@ -3077,7 +3077,7 @@
   var o = new api.Volumeannotations();
   buildCounterVolumeannotations++;
   if (buildCounterVolumeannotations < 3) {
-    o.items = buildUnnamed981();
+    o.items = buildUnnamed990();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -3090,7 +3090,7 @@
 checkVolumeannotations(api.Volumeannotations o) {
   buildCounterVolumeannotations++;
   if (buildCounterVolumeannotations < 3) {
-    checkUnnamed981(o.items);
+    checkUnnamed990(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -3099,14 +3099,14 @@
   buildCounterVolumeannotations--;
 }
 
-buildUnnamed982() {
+buildUnnamed991() {
   var o = new core.List<api.Volume>();
   o.add(buildVolume());
   o.add(buildVolume());
   return o;
 }
 
-checkUnnamed982(core.List<api.Volume> o) {
+checkUnnamed991(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolume(o[0]);
   checkVolume(o[1]);
@@ -3117,7 +3117,7 @@
   var o = new api.Volumes();
   buildCounterVolumes++;
   if (buildCounterVolumes < 3) {
-    o.items = buildUnnamed982();
+    o.items = buildUnnamed991();
     o.kind = "foo";
     o.totalItems = 42;
   }
@@ -3128,7 +3128,7 @@
 checkVolumes(api.Volumes o) {
   buildCounterVolumes++;
   if (buildCounterVolumes < 3) {
-    checkUnnamed982(o.items);
+    checkUnnamed991(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
@@ -3157,14 +3157,14 @@
   buildCounterVolumeseriesinfoVolumeSeriesIssue--;
 }
 
-buildUnnamed983() {
+buildUnnamed992() {
   var o = new core.List<api.VolumeseriesinfoVolumeSeriesIssue>();
   o.add(buildVolumeseriesinfoVolumeSeriesIssue());
   o.add(buildVolumeseriesinfoVolumeSeriesIssue());
   return o;
 }
 
-checkUnnamed983(core.List<api.VolumeseriesinfoVolumeSeriesIssue> o) {
+checkUnnamed992(core.List<api.VolumeseriesinfoVolumeSeriesIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeseriesinfoVolumeSeriesIssue(o[0]);
   checkVolumeseriesinfoVolumeSeriesIssue(o[1]);
@@ -3175,7 +3175,7 @@
   var o = new api.VolumeseriesinfoVolumeSeries();
   buildCounterVolumeseriesinfoVolumeSeries++;
   if (buildCounterVolumeseriesinfoVolumeSeries < 3) {
-    o.issue = buildUnnamed983();
+    o.issue = buildUnnamed992();
     o.orderNumber = 42;
     o.seriesBookType = "foo";
     o.seriesId = "foo";
@@ -3187,7 +3187,7 @@
 checkVolumeseriesinfoVolumeSeries(api.VolumeseriesinfoVolumeSeries o) {
   buildCounterVolumeseriesinfoVolumeSeries++;
   if (buildCounterVolumeseriesinfoVolumeSeries < 3) {
-    checkUnnamed983(o.issue);
+    checkUnnamed992(o.issue);
     unittest.expect(o.orderNumber, unittest.equals(42));
     unittest.expect(o.seriesBookType, unittest.equals('foo'));
     unittest.expect(o.seriesId, unittest.equals('foo'));
@@ -3195,14 +3195,14 @@
   buildCounterVolumeseriesinfoVolumeSeries--;
 }
 
-buildUnnamed984() {
+buildUnnamed993() {
   var o = new core.List<api.VolumeseriesinfoVolumeSeries>();
   o.add(buildVolumeseriesinfoVolumeSeries());
   o.add(buildVolumeseriesinfoVolumeSeries());
   return o;
 }
 
-checkUnnamed984(core.List<api.VolumeseriesinfoVolumeSeries> o) {
+checkUnnamed993(core.List<api.VolumeseriesinfoVolumeSeries> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeseriesinfoVolumeSeries(o[0]);
   checkVolumeseriesinfoVolumeSeries(o[1]);
@@ -3216,7 +3216,7 @@
     o.bookDisplayNumber = "foo";
     o.kind = "foo";
     o.shortSeriesBookTitle = "foo";
-    o.volumeSeries = buildUnnamed984();
+    o.volumeSeries = buildUnnamed993();
   }
   buildCounterVolumeseriesinfo--;
   return o;
@@ -3228,128 +3228,11 @@
     unittest.expect(o.bookDisplayNumber, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.shortSeriesBookTitle, unittest.equals('foo'));
-    checkUnnamed984(o.volumeSeries);
+    checkUnnamed993(o.volumeSeries);
   }
   buildCounterVolumeseriesinfo--;
 }
 
-buildUnnamed985() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed985(core.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() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return 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'));
-}
-
-buildUnnamed987() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return 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'));
-}
-
-buildUnnamed988() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed988(core.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() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed989(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed990() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return 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'));
-}
-
-buildUnnamed991() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed991(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed992() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return 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'));
-}
-
-buildUnnamed993() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed993(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed994() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -3389,6 +3272,123 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed997() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed997(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed998() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed998(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed999() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed999(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1000() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+buildUnnamed1001() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+buildUnnamed1002() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+buildUnnamed1003() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1003(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1004() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1004(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1005() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1005(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 main() {
   unittest.group("obj-schema-AnnotationClientVersionRanges", () {
     unittest.test("to-json--from-json", () {
@@ -4951,7 +4951,7 @@
       var arg_volumeId = "foo";
       var arg_layerId = "foo";
       var arg_contentVersion = "foo";
-      var arg_annotationDataId = buildUnnamed985();
+      var arg_annotationDataId = buildUnnamed994();
       var arg_h = 42;
       var arg_locale = "foo";
       var arg_maxResults = 42;
@@ -5317,7 +5317,7 @@
     unittest.test("method--releaseDownloadAccess", () {
       var mock = new HttpServerMock();
       api.MyconfigResourceApi res = new api.BooksApi(mock).myconfig;
-      var arg_volumeIds = buildUnnamed986();
+      var arg_volumeIds = buildUnnamed995();
       var arg_cpksver = "foo";
       var arg_locale = "foo";
       var arg_source = "foo";
@@ -5452,11 +5452,11 @@
       var arg_source = "foo";
       var arg_nonce = "foo";
       var arg_cpksver = "foo";
-      var arg_features = buildUnnamed987();
+      var arg_features = buildUnnamed996();
       var arg_includeNonComicsSeries = true;
       var arg_locale = "foo";
       var arg_showPreorders = true;
-      var arg_volumeIds = buildUnnamed988();
+      var arg_volumeIds = buildUnnamed997();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -5717,7 +5717,7 @@
           new api.BooksApi(mock).mylibrary.annotations;
       var arg_contentVersion = "foo";
       var arg_layerId = "foo";
-      var arg_layerIds = buildUnnamed989();
+      var arg_layerIds = buildUnnamed998();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_showDeleted = true;
@@ -5807,7 +5807,7 @@
       var mock = new HttpServerMock();
       api.MylibraryAnnotationsResourceApi res =
           new api.BooksApi(mock).mylibrary.annotations;
-      var arg_layerIds = buildUnnamed990();
+      var arg_layerIds = buildUnnamed999();
       var arg_volumeId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6674,7 +6674,7 @@
     unittest.test("method--listCategoryVolumes", () {
       var mock = new HttpServerMock();
       api.OnboardingResourceApi res = new api.BooksApi(mock).onboarding;
-      var arg_categoryId = buildUnnamed991();
+      var arg_categoryId = buildUnnamed1000();
       var arg_locale = "foo";
       var arg_maxAllowedMaturityRating = "foo";
       var arg_pageSize = 42;
@@ -7046,7 +7046,7 @@
     unittest.test("method--get", () {
       var mock = new HttpServerMock();
       api.SeriesResourceApi res = new api.BooksApi(mock).series;
-      var arg_seriesId = buildUnnamed992();
+      var arg_seriesId = buildUnnamed1001();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -7437,11 +7437,11 @@
       var mock = new HttpServerMock();
       api.VolumesMybooksResourceApi res =
           new api.BooksApi(mock).volumes.mybooks;
-      var arg_acquireMethod = buildUnnamed993();
+      var arg_acquireMethod = buildUnnamed1002();
       var arg_country = "foo";
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_processingState = buildUnnamed994();
+      var arg_processingState = buildUnnamed1003();
       var arg_source = "foo";
       var arg_startIndex = 42;
       var arg_$fields = "foo";
@@ -7652,10 +7652,10 @@
           new api.BooksApi(mock).volumes.useruploaded;
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_processingState = buildUnnamed995();
+      var arg_processingState = buildUnnamed1004();
       var arg_source = "foo";
       var arg_startIndex = 42;
-      var arg_volumeId = buildUnnamed996();
+      var arg_volumeId = buildUnnamed1005();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/calendar/v3_test.dart b/generated/googleapis/test/calendar/v3_test.dart
index 4c718c2..51cbc7d 100644
--- a/generated/googleapis/test/calendar/v3_test.dart
+++ b/generated/googleapis/test/calendar/v3_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1159() {
+buildUnnamed1170() {
   var o = new core.List<api.AclRule>();
   o.add(buildAclRule());
   o.add(buildAclRule());
   return o;
 }
 
-checkUnnamed1159(core.List<api.AclRule> o) {
+checkUnnamed1170(core.List<api.AclRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAclRule(o[0]);
   checkAclRule(o[1]);
@@ -69,7 +69,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1159();
+    o.items = buildUnnamed1170();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -82,7 +82,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1159(o.items);
+    checkUnnamed1170(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -143,6 +143,7 @@
   var o = new api.Calendar();
   buildCounterCalendar++;
   if (buildCounterCalendar < 3) {
+    o.conferenceProperties = buildConferenceProperties();
     o.description = "foo";
     o.etag = "foo";
     o.id = "foo";
@@ -158,6 +159,7 @@
 checkCalendar(api.Calendar o) {
   buildCounterCalendar++;
   if (buildCounterCalendar < 3) {
+    checkConferenceProperties(o.conferenceProperties);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -169,14 +171,14 @@
   buildCounterCalendar--;
 }
 
-buildUnnamed1160() {
+buildUnnamed1171() {
   var o = new core.List<api.CalendarListEntry>();
   o.add(buildCalendarListEntry());
   o.add(buildCalendarListEntry());
   return o;
 }
 
-checkUnnamed1160(core.List<api.CalendarListEntry> o) {
+checkUnnamed1171(core.List<api.CalendarListEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCalendarListEntry(o[0]);
   checkCalendarListEntry(o[1]);
@@ -188,7 +190,7 @@
   buildCounterCalendarList++;
   if (buildCounterCalendarList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1160();
+    o.items = buildUnnamed1171();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -201,7 +203,7 @@
   buildCounterCalendarList++;
   if (buildCounterCalendarList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1160(o.items);
+    checkUnnamed1171(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -209,27 +211,27 @@
   buildCounterCalendarList--;
 }
 
-buildUnnamed1161() {
+buildUnnamed1172() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed1161(core.List<api.EventReminder> o) {
+checkUnnamed1172(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
 }
 
-buildUnnamed1162() {
+buildUnnamed1173() {
   var o = new core.List<api.CalendarNotification>();
   o.add(buildCalendarNotification());
   o.add(buildCalendarNotification());
   return o;
 }
 
-checkUnnamed1162(core.List<api.CalendarNotification> o) {
+checkUnnamed1173(core.List<api.CalendarNotification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCalendarNotification(o[0]);
   checkCalendarNotification(o[1]);
@@ -240,7 +242,7 @@
   var o = new api.CalendarListEntryNotificationSettings();
   buildCounterCalendarListEntryNotificationSettings++;
   if (buildCounterCalendarListEntryNotificationSettings < 3) {
-    o.notifications = buildUnnamed1162();
+    o.notifications = buildUnnamed1173();
   }
   buildCounterCalendarListEntryNotificationSettings--;
   return o;
@@ -250,7 +252,7 @@
     api.CalendarListEntryNotificationSettings o) {
   buildCounterCalendarListEntryNotificationSettings++;
   if (buildCounterCalendarListEntryNotificationSettings < 3) {
-    checkUnnamed1162(o.notifications);
+    checkUnnamed1173(o.notifications);
   }
   buildCounterCalendarListEntryNotificationSettings--;
 }
@@ -263,7 +265,8 @@
     o.accessRole = "foo";
     o.backgroundColor = "foo";
     o.colorId = "foo";
-    o.defaultReminders = buildUnnamed1161();
+    o.conferenceProperties = buildConferenceProperties();
+    o.defaultReminders = buildUnnamed1172();
     o.deleted = true;
     o.description = "foo";
     o.etag = "foo";
@@ -289,7 +292,8 @@
     unittest.expect(o.accessRole, unittest.equals('foo'));
     unittest.expect(o.backgroundColor, unittest.equals('foo'));
     unittest.expect(o.colorId, unittest.equals('foo'));
-    checkUnnamed1161(o.defaultReminders);
+    checkConferenceProperties(o.conferenceProperties);
+    checkUnnamed1172(o.defaultReminders);
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
@@ -329,14 +333,14 @@
   buildCounterCalendarNotification--;
 }
 
-buildUnnamed1163() {
+buildUnnamed1174() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1163(core.Map<core.String, core.String> o) {
+checkUnnamed1174(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'));
@@ -351,7 +355,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed1163();
+    o.params = buildUnnamed1174();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -369,7 +373,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1163(o.params);
+    checkUnnamed1174(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -400,27 +404,27 @@
   buildCounterColorDefinition--;
 }
 
-buildUnnamed1164() {
+buildUnnamed1175() {
   var o = new core.Map<core.String, api.ColorDefinition>();
   o["x"] = buildColorDefinition();
   o["y"] = buildColorDefinition();
   return o;
 }
 
-checkUnnamed1164(core.Map<core.String, api.ColorDefinition> o) {
+checkUnnamed1175(core.Map<core.String, api.ColorDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorDefinition(o["x"]);
   checkColorDefinition(o["y"]);
 }
 
-buildUnnamed1165() {
+buildUnnamed1176() {
   var o = new core.Map<core.String, api.ColorDefinition>();
   o["x"] = buildColorDefinition();
   o["y"] = buildColorDefinition();
   return o;
 }
 
-checkUnnamed1165(core.Map<core.String, api.ColorDefinition> o) {
+checkUnnamed1176(core.Map<core.String, api.ColorDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorDefinition(o["x"]);
   checkColorDefinition(o["y"]);
@@ -431,8 +435,8 @@
   var o = new api.Colors();
   buildCounterColors++;
   if (buildCounterColors < 3) {
-    o.calendar = buildUnnamed1164();
-    o.event = buildUnnamed1165();
+    o.calendar = buildUnnamed1175();
+    o.event = buildUnnamed1176();
     o.kind = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
   }
@@ -443,8 +447,8 @@
 checkColors(api.Colors o) {
   buildCounterColors++;
   if (buildCounterColors < 3) {
-    checkUnnamed1164(o.calendar);
-    checkUnnamed1165(o.event);
+    checkUnnamed1175(o.calendar);
+    checkUnnamed1176(o.event);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(
         o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -452,6 +456,197 @@
   buildCounterColors--;
 }
 
+buildUnnamed1177() {
+  var o = new core.List<api.EntryPoint>();
+  o.add(buildEntryPoint());
+  o.add(buildEntryPoint());
+  return o;
+}
+
+checkUnnamed1177(core.List<api.EntryPoint> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkEntryPoint(o[0]);
+  checkEntryPoint(o[1]);
+}
+
+core.int buildCounterConferenceData = 0;
+buildConferenceData() {
+  var o = new api.ConferenceData();
+  buildCounterConferenceData++;
+  if (buildCounterConferenceData < 3) {
+    o.conferenceId = "foo";
+    o.conferenceSolution = buildConferenceSolution();
+    o.createRequest = buildCreateConferenceRequest();
+    o.entryPoints = buildUnnamed1177();
+    o.notes = "foo";
+    o.signature = "foo";
+  }
+  buildCounterConferenceData--;
+  return o;
+}
+
+checkConferenceData(api.ConferenceData o) {
+  buildCounterConferenceData++;
+  if (buildCounterConferenceData < 3) {
+    unittest.expect(o.conferenceId, unittest.equals('foo'));
+    checkConferenceSolution(o.conferenceSolution);
+    checkCreateConferenceRequest(o.createRequest);
+    checkUnnamed1177(o.entryPoints);
+    unittest.expect(o.notes, unittest.equals('foo'));
+    unittest.expect(o.signature, unittest.equals('foo'));
+  }
+  buildCounterConferenceData--;
+}
+
+buildUnnamed1178() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+core.int buildCounterConferenceProperties = 0;
+buildConferenceProperties() {
+  var o = new api.ConferenceProperties();
+  buildCounterConferenceProperties++;
+  if (buildCounterConferenceProperties < 3) {
+    o.allowedConferenceSolutionTypes = buildUnnamed1178();
+  }
+  buildCounterConferenceProperties--;
+  return o;
+}
+
+checkConferenceProperties(api.ConferenceProperties o) {
+  buildCounterConferenceProperties++;
+  if (buildCounterConferenceProperties < 3) {
+    checkUnnamed1178(o.allowedConferenceSolutionTypes);
+  }
+  buildCounterConferenceProperties--;
+}
+
+core.int buildCounterConferenceRequestStatus = 0;
+buildConferenceRequestStatus() {
+  var o = new api.ConferenceRequestStatus();
+  buildCounterConferenceRequestStatus++;
+  if (buildCounterConferenceRequestStatus < 3) {
+    o.statusCode = "foo";
+  }
+  buildCounterConferenceRequestStatus--;
+  return o;
+}
+
+checkConferenceRequestStatus(api.ConferenceRequestStatus o) {
+  buildCounterConferenceRequestStatus++;
+  if (buildCounterConferenceRequestStatus < 3) {
+    unittest.expect(o.statusCode, unittest.equals('foo'));
+  }
+  buildCounterConferenceRequestStatus--;
+}
+
+core.int buildCounterConferenceSolution = 0;
+buildConferenceSolution() {
+  var o = new api.ConferenceSolution();
+  buildCounterConferenceSolution++;
+  if (buildCounterConferenceSolution < 3) {
+    o.iconUri = "foo";
+    o.key = buildConferenceSolutionKey();
+    o.name = "foo";
+  }
+  buildCounterConferenceSolution--;
+  return o;
+}
+
+checkConferenceSolution(api.ConferenceSolution o) {
+  buildCounterConferenceSolution++;
+  if (buildCounterConferenceSolution < 3) {
+    unittest.expect(o.iconUri, unittest.equals('foo'));
+    checkConferenceSolutionKey(o.key);
+    unittest.expect(o.name, unittest.equals('foo'));
+  }
+  buildCounterConferenceSolution--;
+}
+
+core.int buildCounterConferenceSolutionKey = 0;
+buildConferenceSolutionKey() {
+  var o = new api.ConferenceSolutionKey();
+  buildCounterConferenceSolutionKey++;
+  if (buildCounterConferenceSolutionKey < 3) {
+    o.type = "foo";
+  }
+  buildCounterConferenceSolutionKey--;
+  return o;
+}
+
+checkConferenceSolutionKey(api.ConferenceSolutionKey o) {
+  buildCounterConferenceSolutionKey++;
+  if (buildCounterConferenceSolutionKey < 3) {
+    unittest.expect(o.type, unittest.equals('foo'));
+  }
+  buildCounterConferenceSolutionKey--;
+}
+
+core.int buildCounterCreateConferenceRequest = 0;
+buildCreateConferenceRequest() {
+  var o = new api.CreateConferenceRequest();
+  buildCounterCreateConferenceRequest++;
+  if (buildCounterCreateConferenceRequest < 3) {
+    o.conferenceSolutionKey = buildConferenceSolutionKey();
+    o.requestId = "foo";
+    o.status = buildConferenceRequestStatus();
+  }
+  buildCounterCreateConferenceRequest--;
+  return o;
+}
+
+checkCreateConferenceRequest(api.CreateConferenceRequest o) {
+  buildCounterCreateConferenceRequest++;
+  if (buildCounterCreateConferenceRequest < 3) {
+    checkConferenceSolutionKey(o.conferenceSolutionKey);
+    unittest.expect(o.requestId, unittest.equals('foo'));
+    checkConferenceRequestStatus(o.status);
+  }
+  buildCounterCreateConferenceRequest--;
+}
+
+core.int buildCounterEntryPoint = 0;
+buildEntryPoint() {
+  var o = new api.EntryPoint();
+  buildCounterEntryPoint++;
+  if (buildCounterEntryPoint < 3) {
+    o.accessCode = "foo";
+    o.entryPointType = "foo";
+    o.label = "foo";
+    o.meetingCode = "foo";
+    o.passcode = "foo";
+    o.password = "foo";
+    o.pin = "foo";
+    o.uri = "foo";
+  }
+  buildCounterEntryPoint--;
+  return o;
+}
+
+checkEntryPoint(api.EntryPoint o) {
+  buildCounterEntryPoint++;
+  if (buildCounterEntryPoint < 3) {
+    unittest.expect(o.accessCode, unittest.equals('foo'));
+    unittest.expect(o.entryPointType, unittest.equals('foo'));
+    unittest.expect(o.label, unittest.equals('foo'));
+    unittest.expect(o.meetingCode, unittest.equals('foo'));
+    unittest.expect(o.passcode, unittest.equals('foo'));
+    unittest.expect(o.password, unittest.equals('foo'));
+    unittest.expect(o.pin, unittest.equals('foo'));
+    unittest.expect(o.uri, unittest.equals('foo'));
+  }
+  buildCounterEntryPoint--;
+}
+
 core.int buildCounterError = 0;
 buildError() {
   var o = new api.Error();
@@ -473,27 +668,27 @@
   buildCounterError--;
 }
 
-buildUnnamed1166() {
+buildUnnamed1179() {
   var o = new core.List<api.EventAttachment>();
   o.add(buildEventAttachment());
   o.add(buildEventAttachment());
   return o;
 }
 
-checkUnnamed1166(core.List<api.EventAttachment> o) {
+checkUnnamed1179(core.List<api.EventAttachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventAttachment(o[0]);
   checkEventAttachment(o[1]);
 }
 
-buildUnnamed1167() {
+buildUnnamed1180() {
   var o = new core.List<api.EventAttendee>();
   o.add(buildEventAttendee());
   o.add(buildEventAttendee());
   return o;
 }
 
-checkUnnamed1167(core.List<api.EventAttendee> o) {
+checkUnnamed1180(core.List<api.EventAttendee> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventAttendee(o[0]);
   checkEventAttendee(o[1]);
@@ -524,27 +719,27 @@
   buildCounterEventCreator--;
 }
 
-buildUnnamed1168() {
+buildUnnamed1181() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1168(core.Map<core.String, core.String> o) {
+checkUnnamed1181(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'));
 }
 
-buildUnnamed1169() {
+buildUnnamed1182() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1169(core.Map<core.String, core.String> o) {
+checkUnnamed1182(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'));
@@ -555,8 +750,8 @@
   var o = new api.EventExtendedProperties();
   buildCounterEventExtendedProperties++;
   if (buildCounterEventExtendedProperties < 3) {
-    o.private = buildUnnamed1168();
-    o.shared = buildUnnamed1169();
+    o.private = buildUnnamed1181();
+    o.shared = buildUnnamed1182();
   }
   buildCounterEventExtendedProperties--;
   return o;
@@ -565,20 +760,20 @@
 checkEventExtendedProperties(api.EventExtendedProperties o) {
   buildCounterEventExtendedProperties++;
   if (buildCounterEventExtendedProperties < 3) {
-    checkUnnamed1168(o.private);
-    checkUnnamed1169(o.shared);
+    checkUnnamed1181(o.private);
+    checkUnnamed1182(o.shared);
   }
   buildCounterEventExtendedProperties--;
 }
 
-buildUnnamed1170() {
+buildUnnamed1183() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1170(core.Map<core.String, core.String> o) {
+checkUnnamed1183(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'));
@@ -593,7 +788,7 @@
     o.height = 42;
     o.iconLink = "foo";
     o.link = "foo";
-    o.preferences = buildUnnamed1170();
+    o.preferences = buildUnnamed1183();
     o.title = "foo";
     o.type = "foo";
     o.width = 42;
@@ -609,7 +804,7 @@
     unittest.expect(o.height, unittest.equals(42));
     unittest.expect(o.iconLink, unittest.equals('foo'));
     unittest.expect(o.link, unittest.equals('foo'));
-    checkUnnamed1170(o.preferences);
+    checkUnnamed1183(o.preferences);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.width, unittest.equals(42));
@@ -642,27 +837,27 @@
   buildCounterEventOrganizer--;
 }
 
-buildUnnamed1171() {
+buildUnnamed1184() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1171(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'));
 }
 
-buildUnnamed1172() {
+buildUnnamed1185() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed1172(core.List<api.EventReminder> o) {
+checkUnnamed1185(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
@@ -673,7 +868,7 @@
   var o = new api.EventReminders();
   buildCounterEventReminders++;
   if (buildCounterEventReminders < 3) {
-    o.overrides = buildUnnamed1172();
+    o.overrides = buildUnnamed1185();
     o.useDefault = true;
   }
   buildCounterEventReminders--;
@@ -683,7 +878,7 @@
 checkEventReminders(api.EventReminders o) {
   buildCounterEventReminders++;
   if (buildCounterEventReminders < 3) {
-    checkUnnamed1172(o.overrides);
+    checkUnnamed1185(o.overrides);
     unittest.expect(o.useDefault, unittest.isTrue);
   }
   buildCounterEventReminders--;
@@ -716,10 +911,11 @@
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
     o.anyoneCanAddSelf = true;
-    o.attachments = buildUnnamed1166();
-    o.attendees = buildUnnamed1167();
+    o.attachments = buildUnnamed1179();
+    o.attendees = buildUnnamed1180();
     o.attendeesOmitted = true;
     o.colorId = "foo";
+    o.conferenceData = buildConferenceData();
     o.created = core.DateTime.parse("2002-02-27T14:01:02");
     o.creator = buildEventCreator();
     o.description = "foo";
@@ -741,7 +937,7 @@
     o.organizer = buildEventOrganizer();
     o.originalStartTime = buildEventDateTime();
     o.privateCopy = true;
-    o.recurrence = buildUnnamed1171();
+    o.recurrence = buildUnnamed1184();
     o.recurringEventId = "foo";
     o.reminders = buildEventReminders();
     o.sequence = 42;
@@ -761,10 +957,11 @@
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
     unittest.expect(o.anyoneCanAddSelf, unittest.isTrue);
-    checkUnnamed1166(o.attachments);
-    checkUnnamed1167(o.attendees);
+    checkUnnamed1179(o.attachments);
+    checkUnnamed1180(o.attendees);
     unittest.expect(o.attendeesOmitted, unittest.isTrue);
     unittest.expect(o.colorId, unittest.equals('foo'));
+    checkConferenceData(o.conferenceData);
     unittest.expect(
         o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkEventCreator(o.creator);
@@ -787,7 +984,7 @@
     checkEventOrganizer(o.organizer);
     checkEventDateTime(o.originalStartTime);
     unittest.expect(o.privateCopy, unittest.isTrue);
-    checkUnnamed1171(o.recurrence);
+    checkUnnamed1184(o.recurrence);
     unittest.expect(o.recurringEventId, unittest.equals('foo'));
     checkEventReminders(o.reminders);
     unittest.expect(o.sequence, unittest.equals(42));
@@ -913,27 +1110,27 @@
   buildCounterEventReminder--;
 }
 
-buildUnnamed1173() {
+buildUnnamed1186() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed1173(core.List<api.EventReminder> o) {
+checkUnnamed1186(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
 }
 
-buildUnnamed1174() {
+buildUnnamed1187() {
   var o = new core.List<api.Event>();
   o.add(buildEvent());
   o.add(buildEvent());
   return o;
 }
 
-checkUnnamed1174(core.List<api.Event> o) {
+checkUnnamed1187(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEvent(o[0]);
   checkEvent(o[1]);
@@ -945,10 +1142,10 @@
   buildCounterEvents++;
   if (buildCounterEvents < 3) {
     o.accessRole = "foo";
-    o.defaultReminders = buildUnnamed1173();
+    o.defaultReminders = buildUnnamed1186();
     o.description = "foo";
     o.etag = "foo";
-    o.items = buildUnnamed1174();
+    o.items = buildUnnamed1187();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -964,10 +1161,10 @@
   buildCounterEvents++;
   if (buildCounterEvents < 3) {
     unittest.expect(o.accessRole, unittest.equals('foo'));
-    checkUnnamed1173(o.defaultReminders);
+    checkUnnamed1186(o.defaultReminders);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1174(o.items);
+    checkUnnamed1187(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -979,27 +1176,27 @@
   buildCounterEvents--;
 }
 
-buildUnnamed1175() {
+buildUnnamed1188() {
   var o = new core.List<api.TimePeriod>();
   o.add(buildTimePeriod());
   o.add(buildTimePeriod());
   return o;
 }
 
-checkUnnamed1175(core.List<api.TimePeriod> o) {
+checkUnnamed1188(core.List<api.TimePeriod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimePeriod(o[0]);
   checkTimePeriod(o[1]);
 }
 
-buildUnnamed1176() {
+buildUnnamed1189() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed1176(core.List<api.Error> o) {
+checkUnnamed1189(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -1010,8 +1207,8 @@
   var o = new api.FreeBusyCalendar();
   buildCounterFreeBusyCalendar++;
   if (buildCounterFreeBusyCalendar < 3) {
-    o.busy = buildUnnamed1175();
-    o.errors = buildUnnamed1176();
+    o.busy = buildUnnamed1188();
+    o.errors = buildUnnamed1189();
   }
   buildCounterFreeBusyCalendar--;
   return o;
@@ -1020,33 +1217,33 @@
 checkFreeBusyCalendar(api.FreeBusyCalendar o) {
   buildCounterFreeBusyCalendar++;
   if (buildCounterFreeBusyCalendar < 3) {
-    checkUnnamed1175(o.busy);
-    checkUnnamed1176(o.errors);
+    checkUnnamed1188(o.busy);
+    checkUnnamed1189(o.errors);
   }
   buildCounterFreeBusyCalendar--;
 }
 
-buildUnnamed1177() {
+buildUnnamed1190() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1177(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'));
 }
 
-buildUnnamed1178() {
+buildUnnamed1191() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed1178(core.List<api.Error> o) {
+checkUnnamed1191(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -1057,8 +1254,8 @@
   var o = new api.FreeBusyGroup();
   buildCounterFreeBusyGroup++;
   if (buildCounterFreeBusyGroup < 3) {
-    o.calendars = buildUnnamed1177();
-    o.errors = buildUnnamed1178();
+    o.calendars = buildUnnamed1190();
+    o.errors = buildUnnamed1191();
   }
   buildCounterFreeBusyGroup--;
   return o;
@@ -1067,20 +1264,20 @@
 checkFreeBusyGroup(api.FreeBusyGroup o) {
   buildCounterFreeBusyGroup++;
   if (buildCounterFreeBusyGroup < 3) {
-    checkUnnamed1177(o.calendars);
-    checkUnnamed1178(o.errors);
+    checkUnnamed1190(o.calendars);
+    checkUnnamed1191(o.errors);
   }
   buildCounterFreeBusyGroup--;
 }
 
-buildUnnamed1179() {
+buildUnnamed1192() {
   var o = new core.List<api.FreeBusyRequestItem>();
   o.add(buildFreeBusyRequestItem());
   o.add(buildFreeBusyRequestItem());
   return o;
 }
 
-checkUnnamed1179(core.List<api.FreeBusyRequestItem> o) {
+checkUnnamed1192(core.List<api.FreeBusyRequestItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyRequestItem(o[0]);
   checkFreeBusyRequestItem(o[1]);
@@ -1093,7 +1290,7 @@
   if (buildCounterFreeBusyRequest < 3) {
     o.calendarExpansionMax = 42;
     o.groupExpansionMax = 42;
-    o.items = buildUnnamed1179();
+    o.items = buildUnnamed1192();
     o.timeMax = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeMin = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeZone = "foo";
@@ -1107,7 +1304,7 @@
   if (buildCounterFreeBusyRequest < 3) {
     unittest.expect(o.calendarExpansionMax, unittest.equals(42));
     unittest.expect(o.groupExpansionMax, unittest.equals(42));
-    checkUnnamed1179(o.items);
+    checkUnnamed1192(o.items);
     unittest.expect(
         o.timeMax, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(
@@ -1136,27 +1333,27 @@
   buildCounterFreeBusyRequestItem--;
 }
 
-buildUnnamed1180() {
+buildUnnamed1193() {
   var o = new core.Map<core.String, api.FreeBusyCalendar>();
   o["x"] = buildFreeBusyCalendar();
   o["y"] = buildFreeBusyCalendar();
   return o;
 }
 
-checkUnnamed1180(core.Map<core.String, api.FreeBusyCalendar> o) {
+checkUnnamed1193(core.Map<core.String, api.FreeBusyCalendar> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyCalendar(o["x"]);
   checkFreeBusyCalendar(o["y"]);
 }
 
-buildUnnamed1181() {
+buildUnnamed1194() {
   var o = new core.Map<core.String, api.FreeBusyGroup>();
   o["x"] = buildFreeBusyGroup();
   o["y"] = buildFreeBusyGroup();
   return o;
 }
 
-checkUnnamed1181(core.Map<core.String, api.FreeBusyGroup> o) {
+checkUnnamed1194(core.Map<core.String, api.FreeBusyGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyGroup(o["x"]);
   checkFreeBusyGroup(o["y"]);
@@ -1167,8 +1364,8 @@
   var o = new api.FreeBusyResponse();
   buildCounterFreeBusyResponse++;
   if (buildCounterFreeBusyResponse < 3) {
-    o.calendars = buildUnnamed1180();
-    o.groups = buildUnnamed1181();
+    o.calendars = buildUnnamed1193();
+    o.groups = buildUnnamed1194();
     o.kind = "foo";
     o.timeMax = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeMin = core.DateTime.parse("2002-02-27T14:01:02");
@@ -1180,8 +1377,8 @@
 checkFreeBusyResponse(api.FreeBusyResponse o) {
   buildCounterFreeBusyResponse++;
   if (buildCounterFreeBusyResponse < 3) {
-    checkUnnamed1180(o.calendars);
-    checkUnnamed1181(o.groups);
+    checkUnnamed1193(o.calendars);
+    checkUnnamed1194(o.groups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(
         o.timeMax, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -1216,14 +1413,14 @@
   buildCounterSetting--;
 }
 
-buildUnnamed1182() {
+buildUnnamed1195() {
   var o = new core.List<api.Setting>();
   o.add(buildSetting());
   o.add(buildSetting());
   return o;
 }
 
-checkUnnamed1182(core.List<api.Setting> o) {
+checkUnnamed1195(core.List<api.Setting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSetting(o[0]);
   checkSetting(o[1]);
@@ -1235,7 +1432,7 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1182();
+    o.items = buildUnnamed1195();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -1248,7 +1445,7 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1182(o.items);
+    checkUnnamed1195(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -1279,53 +1476,53 @@
   buildCounterTimePeriod--;
 }
 
-buildUnnamed1183() {
+buildUnnamed1196() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1183(core.List<core.String> o) {
+checkUnnamed1196(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1184() {
+buildUnnamed1197() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1184(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'));
 }
 
-buildUnnamed1185() {
+buildUnnamed1198() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1185(core.List<core.String> o) {
+checkUnnamed1198(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1186() {
+buildUnnamed1199() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1186(core.List<core.String> o) {
+checkUnnamed1199(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1421,6 +1618,62 @@
     });
   });
 
+  unittest.group("obj-schema-ConferenceData", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildConferenceData();
+      var od = new api.ConferenceData.fromJson(o.toJson());
+      checkConferenceData(od);
+    });
+  });
+
+  unittest.group("obj-schema-ConferenceProperties", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildConferenceProperties();
+      var od = new api.ConferenceProperties.fromJson(o.toJson());
+      checkConferenceProperties(od);
+    });
+  });
+
+  unittest.group("obj-schema-ConferenceRequestStatus", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildConferenceRequestStatus();
+      var od = new api.ConferenceRequestStatus.fromJson(o.toJson());
+      checkConferenceRequestStatus(od);
+    });
+  });
+
+  unittest.group("obj-schema-ConferenceSolution", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildConferenceSolution();
+      var od = new api.ConferenceSolution.fromJson(o.toJson());
+      checkConferenceSolution(od);
+    });
+  });
+
+  unittest.group("obj-schema-ConferenceSolutionKey", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildConferenceSolutionKey();
+      var od = new api.ConferenceSolutionKey.fromJson(o.toJson());
+      checkConferenceSolutionKey(od);
+    });
+  });
+
+  unittest.group("obj-schema-CreateConferenceRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCreateConferenceRequest();
+      var od = new api.CreateConferenceRequest.fromJson(o.toJson());
+      checkCreateConferenceRequest(od);
+    });
+  });
+
+  unittest.group("obj-schema-EntryPoint", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildEntryPoint();
+      var od = new api.EntryPoint.fromJson(o.toJson());
+      checkEntryPoint(od);
+    });
+  });
+
   unittest.group("obj-schema-Error", () {
     unittest.test("to-json--from-json", () {
       var o = buildError();
@@ -3170,6 +3423,7 @@
       api.EventsResourceApi res = new api.CalendarApi(mock).events;
       var arg_request = buildEvent();
       var arg_calendarId = "foo";
+      var arg_conferenceDataVersion = 42;
       var arg_supportsAttachments = true;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3217,6 +3471,8 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(core.int.parse(queryMap["conferenceDataVersion"].first),
+            unittest.equals(arg_conferenceDataVersion));
         unittest.expect(queryMap["supportsAttachments"].first,
             unittest.equals("$arg_supportsAttachments"));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
@@ -3229,6 +3485,7 @@
       }), true);
       res
           .import(arg_request, arg_calendarId,
+              conferenceDataVersion: arg_conferenceDataVersion,
               supportsAttachments: arg_supportsAttachments,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.Event response) {
@@ -3241,6 +3498,7 @@
       api.EventsResourceApi res = new api.CalendarApi(mock).events;
       var arg_request = buildEvent();
       var arg_calendarId = "foo";
+      var arg_conferenceDataVersion = 42;
       var arg_maxAttendees = 42;
       var arg_sendNotifications = true;
       var arg_supportsAttachments = true;
@@ -3290,6 +3548,8 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(core.int.parse(queryMap["conferenceDataVersion"].first),
+            unittest.equals(arg_conferenceDataVersion));
         unittest.expect(core.int.parse(queryMap["maxAttendees"].first),
             unittest.equals(arg_maxAttendees));
         unittest.expect(queryMap["sendNotifications"].first,
@@ -3306,6 +3566,7 @@
       }), true);
       res
           .insert(arg_request, arg_calendarId,
+              conferenceDataVersion: arg_conferenceDataVersion,
               maxAttendees: arg_maxAttendees,
               sendNotifications: arg_sendNotifications,
               supportsAttachments: arg_supportsAttachments,
@@ -3434,9 +3695,9 @@
       var arg_maxResults = 42;
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
-      var arg_privateExtendedProperty = buildUnnamed1183();
+      var arg_privateExtendedProperty = buildUnnamed1196();
       var arg_q = "foo";
-      var arg_sharedExtendedProperty = buildUnnamed1184();
+      var arg_sharedExtendedProperty = buildUnnamed1197();
       var arg_showDeleted = true;
       var arg_showHiddenInvitations = true;
       var arg_singleEvents = true;
@@ -3640,6 +3901,7 @@
       var arg_calendarId = "foo";
       var arg_eventId = "foo";
       var arg_alwaysIncludeEmail = true;
+      var arg_conferenceDataVersion = 42;
       var arg_maxAttendees = 42;
       var arg_sendNotifications = true;
       var arg_supportsAttachments = true;
@@ -3694,6 +3956,8 @@
         }
         unittest.expect(queryMap["alwaysIncludeEmail"].first,
             unittest.equals("$arg_alwaysIncludeEmail"));
+        unittest.expect(core.int.parse(queryMap["conferenceDataVersion"].first),
+            unittest.equals(arg_conferenceDataVersion));
         unittest.expect(core.int.parse(queryMap["maxAttendees"].first),
             unittest.equals(arg_maxAttendees));
         unittest.expect(queryMap["sendNotifications"].first,
@@ -3711,6 +3975,7 @@
       res
           .patch(arg_request, arg_calendarId, arg_eventId,
               alwaysIncludeEmail: arg_alwaysIncludeEmail,
+              conferenceDataVersion: arg_conferenceDataVersion,
               maxAttendees: arg_maxAttendees,
               sendNotifications: arg_sendNotifications,
               supportsAttachments: arg_supportsAttachments,
@@ -3795,6 +4060,7 @@
       var arg_calendarId = "foo";
       var arg_eventId = "foo";
       var arg_alwaysIncludeEmail = true;
+      var arg_conferenceDataVersion = 42;
       var arg_maxAttendees = 42;
       var arg_sendNotifications = true;
       var arg_supportsAttachments = true;
@@ -3849,6 +4115,8 @@
         }
         unittest.expect(queryMap["alwaysIncludeEmail"].first,
             unittest.equals("$arg_alwaysIncludeEmail"));
+        unittest.expect(core.int.parse(queryMap["conferenceDataVersion"].first),
+            unittest.equals(arg_conferenceDataVersion));
         unittest.expect(core.int.parse(queryMap["maxAttendees"].first),
             unittest.equals(arg_maxAttendees));
         unittest.expect(queryMap["sendNotifications"].first,
@@ -3866,6 +4134,7 @@
       res
           .update(arg_request, arg_calendarId, arg_eventId,
               alwaysIncludeEmail: arg_alwaysIncludeEmail,
+              conferenceDataVersion: arg_conferenceDataVersion,
               maxAttendees: arg_maxAttendees,
               sendNotifications: arg_sendNotifications,
               supportsAttachments: arg_supportsAttachments,
@@ -3886,9 +4155,9 @@
       var arg_maxResults = 42;
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
-      var arg_privateExtendedProperty = buildUnnamed1185();
+      var arg_privateExtendedProperty = buildUnnamed1198();
       var arg_q = "foo";
-      var arg_sharedExtendedProperty = buildUnnamed1186();
+      var arg_sharedExtendedProperty = buildUnnamed1199();
       var arg_showDeleted = true;
       var arg_showHiddenInvitations = true;
       var arg_singleEvents = true;
diff --git a/generated/googleapis/test/civicinfo/v2_test.dart b/generated/googleapis/test/civicinfo/v2_test.dart
index b5117d6..e25c2e0 100644
--- a/generated/googleapis/test/civicinfo/v2_test.dart
+++ b/generated/googleapis/test/civicinfo/v2_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed2626() {
+buildUnnamed2651() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed2626(core.List<api.Source> o) {
+checkUnnamed2651(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -72,7 +72,7 @@
     o.id = "foo";
     o.localJurisdiction = buildAdministrationRegion();
     o.name = "foo";
-    o.sources = buildUnnamed2626();
+    o.sources = buildUnnamed2651();
   }
   buildCounterAdministrationRegion--;
   return o;
@@ -85,45 +85,45 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkAdministrationRegion(o.localJurisdiction);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2626(o.sources);
+    checkUnnamed2651(o.sources);
   }
   buildCounterAdministrationRegion--;
 }
 
-buildUnnamed2627() {
+buildUnnamed2652() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2627(core.List<core.String> o) {
+checkUnnamed2652(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2628() {
+buildUnnamed2653() {
   var o = new core.List<api.ElectionOfficial>();
   o.add(buildElectionOfficial());
   o.add(buildElectionOfficial());
   return o;
 }
 
-checkUnnamed2628(core.List<api.ElectionOfficial> o) {
+checkUnnamed2653(core.List<api.ElectionOfficial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElectionOfficial(o[0]);
   checkElectionOfficial(o[1]);
 }
 
-buildUnnamed2629() {
+buildUnnamed2654() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2629(core.List<core.String> o) {
+checkUnnamed2654(core.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,18 +135,18 @@
   buildCounterAdministrativeBody++;
   if (buildCounterAdministrativeBody < 3) {
     o.absenteeVotingInfoUrl = "foo";
-    o.addressLines = buildUnnamed2627();
+    o.addressLines = buildUnnamed2652();
     o.ballotInfoUrl = "foo";
     o.correspondenceAddress = buildSimpleAddressType();
     o.electionInfoUrl = "foo";
-    o.electionOfficials = buildUnnamed2628();
+    o.electionOfficials = buildUnnamed2653();
     o.electionRegistrationConfirmationUrl = "foo";
     o.electionRegistrationUrl = "foo";
     o.electionRulesUrl = "foo";
     o.hoursOfOperation = "foo";
     o.name = "foo";
     o.physicalAddress = buildSimpleAddressType();
-    o.voterServices = buildUnnamed2629();
+    o.voterServices = buildUnnamed2654();
     o.votingLocationFinderUrl = "foo";
   }
   buildCounterAdministrativeBody--;
@@ -157,11 +157,11 @@
   buildCounterAdministrativeBody++;
   if (buildCounterAdministrativeBody < 3) {
     unittest.expect(o.absenteeVotingInfoUrl, unittest.equals('foo'));
-    checkUnnamed2627(o.addressLines);
+    checkUnnamed2652(o.addressLines);
     unittest.expect(o.ballotInfoUrl, unittest.equals('foo'));
     checkSimpleAddressType(o.correspondenceAddress);
     unittest.expect(o.electionInfoUrl, unittest.equals('foo'));
-    checkUnnamed2628(o.electionOfficials);
+    checkUnnamed2653(o.electionOfficials);
     unittest.expect(
         o.electionRegistrationConfirmationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRegistrationUrl, unittest.equals('foo'));
@@ -169,20 +169,20 @@
     unittest.expect(o.hoursOfOperation, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkSimpleAddressType(o.physicalAddress);
-    checkUnnamed2629(o.voterServices);
+    checkUnnamed2654(o.voterServices);
     unittest.expect(o.votingLocationFinderUrl, unittest.equals('foo'));
   }
   buildCounterAdministrativeBody--;
 }
 
-buildUnnamed2630() {
+buildUnnamed2655() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed2630(core.List<api.Channel> o) {
+checkUnnamed2655(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -194,7 +194,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     o.candidateUrl = "foo";
-    o.channels = buildUnnamed2630();
+    o.channels = buildUnnamed2655();
     o.email = "foo";
     o.name = "foo";
     o.orderOnBallot = "foo";
@@ -210,7 +210,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     unittest.expect(o.candidateUrl, unittest.equals('foo'));
-    checkUnnamed2630(o.channels);
+    checkUnnamed2655(o.channels);
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.orderOnBallot, unittest.equals('foo'));
@@ -242,66 +242,66 @@
   buildCounterChannel--;
 }
 
-buildUnnamed2631() {
+buildUnnamed2656() {
   var o = new core.List<api.Candidate>();
   o.add(buildCandidate());
   o.add(buildCandidate());
   return o;
 }
 
-checkUnnamed2631(core.List<api.Candidate> o) {
+checkUnnamed2656(core.List<api.Candidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCandidate(o[0]);
   checkCandidate(o[1]);
 }
 
-buildUnnamed2632() {
+buildUnnamed2657() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2632(core.List<core.String> o) {
+checkUnnamed2657(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2633() {
+buildUnnamed2658() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2633(core.List<core.String> o) {
+checkUnnamed2658(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2634() {
+buildUnnamed2659() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2634(core.List<core.String> o) {
+checkUnnamed2659(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2635() {
+buildUnnamed2660() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed2635(core.List<api.Source> o) {
+checkUnnamed2660(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -313,16 +313,16 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     o.ballotPlacement = "foo";
-    o.candidates = buildUnnamed2631();
+    o.candidates = buildUnnamed2656();
     o.district = buildElectoralDistrict();
     o.electorateSpecifications = "foo";
     o.id = "foo";
-    o.level = buildUnnamed2632();
+    o.level = buildUnnamed2657();
     o.numberElected = "foo";
     o.numberVotingFor = "foo";
     o.office = "foo";
     o.primaryParty = "foo";
-    o.referendumBallotResponses = buildUnnamed2633();
+    o.referendumBallotResponses = buildUnnamed2658();
     o.referendumBrief = "foo";
     o.referendumConStatement = "foo";
     o.referendumEffectOfAbstain = "foo";
@@ -332,8 +332,8 @@
     o.referendumText = "foo";
     o.referendumTitle = "foo";
     o.referendumUrl = "foo";
-    o.roles = buildUnnamed2634();
-    o.sources = buildUnnamed2635();
+    o.roles = buildUnnamed2659();
+    o.sources = buildUnnamed2660();
     o.special = "foo";
     o.type = "foo";
   }
@@ -345,16 +345,16 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     unittest.expect(o.ballotPlacement, unittest.equals('foo'));
-    checkUnnamed2631(o.candidates);
+    checkUnnamed2656(o.candidates);
     checkElectoralDistrict(o.district);
     unittest.expect(o.electorateSpecifications, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2632(o.level);
+    checkUnnamed2657(o.level);
     unittest.expect(o.numberElected, unittest.equals('foo'));
     unittest.expect(o.numberVotingFor, unittest.equals('foo'));
     unittest.expect(o.office, unittest.equals('foo'));
     unittest.expect(o.primaryParty, unittest.equals('foo'));
-    checkUnnamed2633(o.referendumBallotResponses);
+    checkUnnamed2658(o.referendumBallotResponses);
     unittest.expect(o.referendumBrief, unittest.equals('foo'));
     unittest.expect(o.referendumConStatement, unittest.equals('foo'));
     unittest.expect(o.referendumEffectOfAbstain, unittest.equals('foo'));
@@ -364,8 +364,8 @@
     unittest.expect(o.referendumText, unittest.equals('foo'));
     unittest.expect(o.referendumTitle, unittest.equals('foo'));
     unittest.expect(o.referendumUrl, unittest.equals('foo'));
-    checkUnnamed2634(o.roles);
-    checkUnnamed2635(o.sources);
+    checkUnnamed2659(o.roles);
+    checkUnnamed2660(o.sources);
     unittest.expect(o.special, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -430,14 +430,14 @@
   buildCounterDivisionSearchRequest--;
 }
 
-buildUnnamed2636() {
+buildUnnamed2661() {
   var o = new core.List<api.DivisionSearchResult>();
   o.add(buildDivisionSearchResult());
   o.add(buildDivisionSearchResult());
   return o;
 }
 
-checkUnnamed2636(core.List<api.DivisionSearchResult> o) {
+checkUnnamed2661(core.List<api.DivisionSearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDivisionSearchResult(o[0]);
   checkDivisionSearchResult(o[1]);
@@ -449,7 +449,7 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed2636();
+    o.results = buildUnnamed2661();
   }
   buildCounterDivisionSearchResponse--;
   return o;
@@ -459,19 +459,19 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2636(o.results);
+    checkUnnamed2661(o.results);
   }
   buildCounterDivisionSearchResponse--;
 }
 
-buildUnnamed2637() {
+buildUnnamed2662() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2637(core.List<core.String> o) {
+checkUnnamed2662(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -482,7 +482,7 @@
   var o = new api.DivisionSearchResult();
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    o.aliases = buildUnnamed2637();
+    o.aliases = buildUnnamed2662();
     o.name = "foo";
     o.ocdId = "foo";
   }
@@ -493,7 +493,7 @@
 checkDivisionSearchResult(api.DivisionSearchResult o) {
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    checkUnnamed2637(o.aliases);
+    checkUnnamed2662(o.aliases);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ocdId, unittest.equals('foo'));
   }
@@ -571,14 +571,14 @@
   buildCounterElectionsQueryRequest--;
 }
 
-buildUnnamed2638() {
+buildUnnamed2663() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed2638(core.List<api.Election> o) {
+checkUnnamed2663(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
@@ -589,7 +589,7 @@
   var o = new api.ElectionsQueryResponse();
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    o.elections = buildUnnamed2638();
+    o.elections = buildUnnamed2663();
     o.kind = "foo";
   }
   buildCounterElectionsQueryResponse--;
@@ -599,7 +599,7 @@
 checkElectionsQueryResponse(api.ElectionsQueryResponse o) {
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    checkUnnamed2638(o.elections);
+    checkUnnamed2663(o.elections);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterElectionsQueryResponse--;
@@ -630,27 +630,27 @@
   buildCounterElectoralDistrict--;
 }
 
-buildUnnamed2639() {
+buildUnnamed2664() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2639(core.List<core.String> o) {
+checkUnnamed2664(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2640() {
+buildUnnamed2665() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2640(core.List<core.int> o) {
+checkUnnamed2665(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));
@@ -661,9 +661,9 @@
   var o = new api.GeographicDivision();
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    o.alsoKnownAs = buildUnnamed2639();
+    o.alsoKnownAs = buildUnnamed2664();
     o.name = "foo";
-    o.officeIndices = buildUnnamed2640();
+    o.officeIndices = buildUnnamed2665();
   }
   buildCounterGeographicDivision--;
   return o;
@@ -672,60 +672,60 @@
 checkGeographicDivision(api.GeographicDivision o) {
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    checkUnnamed2639(o.alsoKnownAs);
+    checkUnnamed2664(o.alsoKnownAs);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2640(o.officeIndices);
+    checkUnnamed2665(o.officeIndices);
   }
   buildCounterGeographicDivision--;
 }
 
-buildUnnamed2641() {
+buildUnnamed2666() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2641(core.List<core.String> o) {
+checkUnnamed2666(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2642() {
+buildUnnamed2667() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2642(core.List<core.int> o) {
+checkUnnamed2667(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));
 }
 
-buildUnnamed2643() {
+buildUnnamed2668() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2643(core.List<core.String> o) {
+checkUnnamed2668(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2644() {
+buildUnnamed2669() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed2644(core.List<api.Source> o) {
+checkUnnamed2669(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -737,11 +737,11 @@
   buildCounterOffice++;
   if (buildCounterOffice < 3) {
     o.divisionId = "foo";
-    o.levels = buildUnnamed2641();
+    o.levels = buildUnnamed2666();
     o.name = "foo";
-    o.officialIndices = buildUnnamed2642();
-    o.roles = buildUnnamed2643();
-    o.sources = buildUnnamed2644();
+    o.officialIndices = buildUnnamed2667();
+    o.roles = buildUnnamed2668();
+    o.sources = buildUnnamed2669();
   }
   buildCounterOffice--;
   return o;
@@ -751,75 +751,75 @@
   buildCounterOffice++;
   if (buildCounterOffice < 3) {
     unittest.expect(o.divisionId, unittest.equals('foo'));
-    checkUnnamed2641(o.levels);
+    checkUnnamed2666(o.levels);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2642(o.officialIndices);
-    checkUnnamed2643(o.roles);
-    checkUnnamed2644(o.sources);
+    checkUnnamed2667(o.officialIndices);
+    checkUnnamed2668(o.roles);
+    checkUnnamed2669(o.sources);
   }
   buildCounterOffice--;
 }
 
-buildUnnamed2645() {
+buildUnnamed2670() {
   var o = new core.List<api.SimpleAddressType>();
   o.add(buildSimpleAddressType());
   o.add(buildSimpleAddressType());
   return o;
 }
 
-checkUnnamed2645(core.List<api.SimpleAddressType> o) {
+checkUnnamed2670(core.List<api.SimpleAddressType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSimpleAddressType(o[0]);
   checkSimpleAddressType(o[1]);
 }
 
-buildUnnamed2646() {
+buildUnnamed2671() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed2646(core.List<api.Channel> o) {
+checkUnnamed2671(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
 }
 
-buildUnnamed2647() {
+buildUnnamed2672() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2647(core.List<core.String> o) {
+checkUnnamed2672(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2648() {
+buildUnnamed2673() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2648(core.List<core.String> o) {
+checkUnnamed2673(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2649() {
+buildUnnamed2674() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2649(core.List<core.String> o) {
+checkUnnamed2674(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -830,14 +830,14 @@
   var o = new api.Official();
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    o.address = buildUnnamed2645();
-    o.channels = buildUnnamed2646();
-    o.emails = buildUnnamed2647();
+    o.address = buildUnnamed2670();
+    o.channels = buildUnnamed2671();
+    o.emails = buildUnnamed2672();
     o.name = "foo";
     o.party = "foo";
-    o.phones = buildUnnamed2648();
+    o.phones = buildUnnamed2673();
     o.photoUrl = "foo";
-    o.urls = buildUnnamed2649();
+    o.urls = buildUnnamed2674();
   }
   buildCounterOfficial--;
   return o;
@@ -846,26 +846,26 @@
 checkOfficial(api.Official o) {
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    checkUnnamed2645(o.address);
-    checkUnnamed2646(o.channels);
-    checkUnnamed2647(o.emails);
+    checkUnnamed2670(o.address);
+    checkUnnamed2671(o.channels);
+    checkUnnamed2672(o.emails);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.party, unittest.equals('foo'));
-    checkUnnamed2648(o.phones);
+    checkUnnamed2673(o.phones);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed2649(o.urls);
+    checkUnnamed2674(o.urls);
   }
   buildCounterOfficial--;
 }
 
-buildUnnamed2650() {
+buildUnnamed2675() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed2650(core.List<api.Source> o) {
+checkUnnamed2675(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -882,7 +882,7 @@
     o.name = "foo";
     o.notes = "foo";
     o.pollingHours = "foo";
-    o.sources = buildUnnamed2650();
+    o.sources = buildUnnamed2675();
     o.startDate = "foo";
     o.voterServices = "foo";
   }
@@ -899,21 +899,21 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.pollingHours, unittest.equals('foo'));
-    checkUnnamed2650(o.sources);
+    checkUnnamed2675(o.sources);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.voterServices, unittest.equals('foo'));
   }
   buildCounterPollingLocation--;
 }
 
-buildUnnamed2651() {
+buildUnnamed2676() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2651(core.List<core.String> o) {
+checkUnnamed2676(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -924,7 +924,7 @@
   var o = new api.PostalAddress();
   buildCounterPostalAddress++;
   if (buildCounterPostalAddress < 3) {
-    o.addressLines = buildUnnamed2651();
+    o.addressLines = buildUnnamed2676();
     o.administrativeAreaName = "foo";
     o.countryName = "foo";
     o.countryNameCode = "foo";
@@ -963,7 +963,7 @@
 checkPostalAddress(api.PostalAddress o) {
   buildCounterPostalAddress++;
   if (buildCounterPostalAddress < 3) {
-    checkUnnamed2651(o.addressLines);
+    checkUnnamed2676(o.addressLines);
     unittest.expect(o.administrativeAreaName, unittest.equals('foo'));
     unittest.expect(o.countryName, unittest.equals('foo'));
     unittest.expect(o.countryNameCode, unittest.equals('foo'));
@@ -1001,40 +1001,40 @@
   buildCounterPostalAddress--;
 }
 
-buildUnnamed2652() {
+buildUnnamed2677() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed2652(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed2677(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed2653() {
+buildUnnamed2678() {
   var o = new core.List<api.Office>();
   o.add(buildOffice());
   o.add(buildOffice());
   return o;
 }
 
-checkUnnamed2653(core.List<api.Office> o) {
+checkUnnamed2678(core.List<api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o[0]);
   checkOffice(o[1]);
 }
 
-buildUnnamed2654() {
+buildUnnamed2679() {
   var o = new core.List<api.Official>();
   o.add(buildOfficial());
   o.add(buildOfficial());
   return o;
 }
 
-checkUnnamed2654(core.List<api.Official> o) {
+checkUnnamed2679(core.List<api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o[0]);
   checkOfficial(o[1]);
@@ -1045,9 +1045,9 @@
   var o = new api.RepresentativeInfoData();
   buildCounterRepresentativeInfoData++;
   if (buildCounterRepresentativeInfoData < 3) {
-    o.divisions = buildUnnamed2652();
-    o.offices = buildUnnamed2653();
-    o.officials = buildUnnamed2654();
+    o.divisions = buildUnnamed2677();
+    o.offices = buildUnnamed2678();
+    o.officials = buildUnnamed2679();
   }
   buildCounterRepresentativeInfoData--;
   return o;
@@ -1056,9 +1056,9 @@
 checkRepresentativeInfoData(api.RepresentativeInfoData o) {
   buildCounterRepresentativeInfoData++;
   if (buildCounterRepresentativeInfoData < 3) {
-    checkUnnamed2652(o.divisions);
-    checkUnnamed2653(o.offices);
-    checkUnnamed2654(o.officials);
+    checkUnnamed2677(o.divisions);
+    checkUnnamed2678(o.offices);
+    checkUnnamed2679(o.officials);
   }
   buildCounterRepresentativeInfoData--;
 }
@@ -1082,40 +1082,40 @@
   buildCounterRepresentativeInfoRequest--;
 }
 
-buildUnnamed2655() {
+buildUnnamed2680() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed2655(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed2680(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed2656() {
+buildUnnamed2681() {
   var o = new core.List<api.Office>();
   o.add(buildOffice());
   o.add(buildOffice());
   return o;
 }
 
-checkUnnamed2656(core.List<api.Office> o) {
+checkUnnamed2681(core.List<api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o[0]);
   checkOffice(o[1]);
 }
 
-buildUnnamed2657() {
+buildUnnamed2682() {
   var o = new core.List<api.Official>();
   o.add(buildOfficial());
   o.add(buildOfficial());
   return o;
 }
 
-checkUnnamed2657(core.List<api.Official> o) {
+checkUnnamed2682(core.List<api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o[0]);
   checkOfficial(o[1]);
@@ -1126,11 +1126,11 @@
   var o = new api.RepresentativeInfoResponse();
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    o.divisions = buildUnnamed2655();
+    o.divisions = buildUnnamed2680();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.offices = buildUnnamed2656();
-    o.officials = buildUnnamed2657();
+    o.offices = buildUnnamed2681();
+    o.officials = buildUnnamed2682();
   }
   buildCounterRepresentativeInfoResponse--;
   return o;
@@ -1139,11 +1139,11 @@
 checkRepresentativeInfoResponse(api.RepresentativeInfoResponse o) {
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    checkUnnamed2655(o.divisions);
+    checkUnnamed2680(o.divisions);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed2656(o.offices);
-    checkUnnamed2657(o.officials);
+    checkUnnamed2681(o.offices);
+    checkUnnamed2682(o.officials);
   }
   buildCounterRepresentativeInfoResponse--;
 }
@@ -1221,79 +1221,79 @@
   buildCounterVoterInfoRequest--;
 }
 
-buildUnnamed2658() {
+buildUnnamed2683() {
   var o = new core.List<api.Contest>();
   o.add(buildContest());
   o.add(buildContest());
   return o;
 }
 
-checkUnnamed2658(core.List<api.Contest> o) {
+checkUnnamed2683(core.List<api.Contest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContest(o[0]);
   checkContest(o[1]);
 }
 
-buildUnnamed2659() {
+buildUnnamed2684() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed2659(core.List<api.PollingLocation> o) {
+checkUnnamed2684(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed2660() {
+buildUnnamed2685() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed2660(core.List<api.PollingLocation> o) {
+checkUnnamed2685(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed2661() {
+buildUnnamed2686() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed2661(core.List<api.Election> o) {
+checkUnnamed2686(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
 }
 
-buildUnnamed2662() {
+buildUnnamed2687() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed2662(core.List<api.PollingLocation> o) {
+checkUnnamed2687(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed2663() {
+buildUnnamed2688() {
   var o = new core.List<api.AdministrationRegion>();
   o.add(buildAdministrationRegion());
   o.add(buildAdministrationRegion());
   return o;
 }
 
-checkUnnamed2663(core.List<api.AdministrationRegion> o) {
+checkUnnamed2688(core.List<api.AdministrationRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdministrationRegion(o[0]);
   checkAdministrationRegion(o[1]);
@@ -1304,17 +1304,17 @@
   var o = new api.VoterInfoResponse();
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    o.contests = buildUnnamed2658();
-    o.dropOffLocations = buildUnnamed2659();
-    o.earlyVoteSites = buildUnnamed2660();
+    o.contests = buildUnnamed2683();
+    o.dropOffLocations = buildUnnamed2684();
+    o.earlyVoteSites = buildUnnamed2685();
     o.election = buildElection();
     o.kind = "foo";
     o.mailOnly = true;
     o.normalizedInput = buildSimpleAddressType();
-    o.otherElections = buildUnnamed2661();
-    o.pollingLocations = buildUnnamed2662();
+    o.otherElections = buildUnnamed2686();
+    o.pollingLocations = buildUnnamed2687();
     o.precinctId = "foo";
-    o.state = buildUnnamed2663();
+    o.state = buildUnnamed2688();
   }
   buildCounterVoterInfoResponse--;
   return o;
@@ -1323,17 +1323,17 @@
 checkVoterInfoResponse(api.VoterInfoResponse o) {
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    checkUnnamed2658(o.contests);
-    checkUnnamed2659(o.dropOffLocations);
-    checkUnnamed2660(o.earlyVoteSites);
+    checkUnnamed2683(o.contests);
+    checkUnnamed2684(o.dropOffLocations);
+    checkUnnamed2685(o.earlyVoteSites);
     checkElection(o.election);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.mailOnly, unittest.isTrue);
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed2661(o.otherElections);
-    checkUnnamed2662(o.pollingLocations);
+    checkUnnamed2686(o.otherElections);
+    checkUnnamed2687(o.pollingLocations);
     unittest.expect(o.precinctId, unittest.equals('foo'));
-    checkUnnamed2663(o.state);
+    checkUnnamed2688(o.state);
   }
   buildCounterVoterInfoResponse--;
 }
@@ -1363,53 +1363,53 @@
   buildCounterVoterInfoSegmentResult--;
 }
 
-buildUnnamed2664() {
+buildUnnamed2689() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2664(core.List<core.String> o) {
+checkUnnamed2689(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2665() {
+buildUnnamed2690() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2665(core.List<core.String> o) {
+checkUnnamed2690(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2666() {
+buildUnnamed2691() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2666(core.List<core.String> o) {
+checkUnnamed2691(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2667() {
+buildUnnamed2692() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2667(core.List<core.String> o) {
+checkUnnamed2692(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1838,8 +1838,8 @@
       var arg_request = buildRepresentativeInfoRequest();
       var arg_address = "foo";
       var arg_includeOffices = true;
-      var arg_levels = buildUnnamed2664();
-      var arg_roles = buildUnnamed2665();
+      var arg_levels = buildUnnamed2689();
+      var arg_roles = buildUnnamed2690();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.RepresentativeInfoRequest.fromJson(json);
@@ -1910,9 +1910,9 @@
           new api.CivicinfoApi(mock).representatives;
       var arg_request = buildDivisionRepresentativeInfoRequest();
       var arg_ocdId = "foo";
-      var arg_levels = buildUnnamed2666();
+      var arg_levels = buildUnnamed2691();
       var arg_recursive = true;
-      var arg_roles = buildUnnamed2667();
+      var arg_roles = buildUnnamed2692();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.DivisionRepresentativeInfoRequest.fromJson(json);
diff --git a/generated/googleapis/test/classroom/v1_test.dart b/generated/googleapis/test/classroom/v1_test.dart
index e754312..2075be4 100644
--- a/generated/googleapis/test/classroom/v1_test.dart
+++ b/generated/googleapis/test/classroom/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed804() {
+buildUnnamed808() {
   var o = new core.List<api.Material>();
   o.add(buildMaterial());
   o.add(buildMaterial());
   return o;
 }
 
-checkUnnamed804(core.List<api.Material> o) {
+checkUnnamed808(core.List<api.Material> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMaterial(o[0]);
   checkMaterial(o[1]);
@@ -75,7 +75,7 @@
     o.creatorUserId = "foo";
     o.id = "foo";
     o.individualStudentsOptions = buildIndividualStudentsOptions();
-    o.materials = buildUnnamed804();
+    o.materials = buildUnnamed808();
     o.scheduledTime = "foo";
     o.state = "foo";
     o.text = "foo";
@@ -95,7 +95,7 @@
     unittest.expect(o.creatorUserId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkIndividualStudentsOptions(o.individualStudentsOptions);
-    checkUnnamed804(o.materials);
+    checkUnnamed808(o.materials);
     unittest.expect(o.scheduledTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.text, unittest.equals('foo'));
@@ -123,14 +123,14 @@
   buildCounterAssignment--;
 }
 
-buildUnnamed805() {
+buildUnnamed809() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed805(core.List<api.Attachment> o) {
+checkUnnamed809(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
@@ -141,7 +141,7 @@
   var o = new api.AssignmentSubmission();
   buildCounterAssignmentSubmission++;
   if (buildCounterAssignmentSubmission < 3) {
-    o.attachments = buildUnnamed805();
+    o.attachments = buildUnnamed809();
   }
   buildCounterAssignmentSubmission--;
   return o;
@@ -150,7 +150,7 @@
 checkAssignmentSubmission(api.AssignmentSubmission o) {
   buildCounterAssignmentSubmission++;
   if (buildCounterAssignmentSubmission < 3) {
-    checkUnnamed805(o.attachments);
+    checkUnnamed809(o.attachments);
   }
   buildCounterAssignmentSubmission--;
 }
@@ -199,14 +199,14 @@
   buildCounterCloudPubsubTopic--;
 }
 
-buildUnnamed806() {
+buildUnnamed810() {
   var o = new core.List<api.CourseMaterialSet>();
   o.add(buildCourseMaterialSet());
   o.add(buildCourseMaterialSet());
   return o;
 }
 
-checkUnnamed806(core.List<api.CourseMaterialSet> o) {
+checkUnnamed810(core.List<api.CourseMaterialSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCourseMaterialSet(o[0]);
   checkCourseMaterialSet(o[1]);
@@ -220,7 +220,7 @@
     o.alternateLink = "foo";
     o.calendarId = "foo";
     o.courseGroupEmail = "foo";
-    o.courseMaterialSets = buildUnnamed806();
+    o.courseMaterialSets = buildUnnamed810();
     o.courseState = "foo";
     o.creationTime = "foo";
     o.description = "foo";
@@ -246,7 +246,7 @@
     unittest.expect(o.alternateLink, unittest.equals('foo'));
     unittest.expect(o.calendarId, unittest.equals('foo'));
     unittest.expect(o.courseGroupEmail, unittest.equals('foo'));
-    checkUnnamed806(o.courseMaterialSets);
+    checkUnnamed810(o.courseMaterialSets);
     unittest.expect(o.courseState, unittest.equals('foo'));
     unittest.expect(o.creationTime, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
@@ -309,14 +309,14 @@
   buildCounterCourseMaterial--;
 }
 
-buildUnnamed807() {
+buildUnnamed811() {
   var o = new core.List<api.CourseMaterial>();
   o.add(buildCourseMaterial());
   o.add(buildCourseMaterial());
   return o;
 }
 
-checkUnnamed807(core.List<api.CourseMaterial> o) {
+checkUnnamed811(core.List<api.CourseMaterial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCourseMaterial(o[0]);
   checkCourseMaterial(o[1]);
@@ -327,7 +327,7 @@
   var o = new api.CourseMaterialSet();
   buildCounterCourseMaterialSet++;
   if (buildCounterCourseMaterialSet < 3) {
-    o.materials = buildUnnamed807();
+    o.materials = buildUnnamed811();
     o.title = "foo";
   }
   buildCounterCourseMaterialSet--;
@@ -337,7 +337,7 @@
 checkCourseMaterialSet(api.CourseMaterialSet o) {
   buildCounterCourseMaterialSet++;
   if (buildCounterCourseMaterialSet < 3) {
-    checkUnnamed807(o.materials);
+    checkUnnamed811(o.materials);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterCourseMaterialSet--;
@@ -362,14 +362,14 @@
   buildCounterCourseRosterChangesInfo--;
 }
 
-buildUnnamed808() {
+buildUnnamed812() {
   var o = new core.List<api.Material>();
   o.add(buildMaterial());
   o.add(buildMaterial());
   return o;
 }
 
-checkUnnamed808(core.List<api.Material> o) {
+checkUnnamed812(core.List<api.Material> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMaterial(o[0]);
   checkMaterial(o[1]);
@@ -392,7 +392,7 @@
     o.dueTime = buildTimeOfDay();
     o.id = "foo";
     o.individualStudentsOptions = buildIndividualStudentsOptions();
-    o.materials = buildUnnamed808();
+    o.materials = buildUnnamed812();
     o.maxPoints = 42.0;
     o.multipleChoiceQuestion = buildMultipleChoiceQuestion();
     o.scheduledTime = "foo";
@@ -421,7 +421,7 @@
     checkTimeOfDay(o.dueTime);
     unittest.expect(o.id, unittest.equals('foo'));
     checkIndividualStudentsOptions(o.individualStudentsOptions);
-    checkUnnamed808(o.materials);
+    checkUnnamed812(o.materials);
     unittest.expect(o.maxPoints, unittest.equals(42.0));
     checkMultipleChoiceQuestion(o.multipleChoiceQuestion);
     unittest.expect(o.scheduledTime, unittest.equals('foo'));
@@ -664,14 +664,14 @@
   buildCounterGuardianInvitation--;
 }
 
-buildUnnamed809() {
+buildUnnamed813() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed809(core.List<core.String> o) {
+checkUnnamed813(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -682,7 +682,7 @@
   var o = new api.IndividualStudentsOptions();
   buildCounterIndividualStudentsOptions++;
   if (buildCounterIndividualStudentsOptions < 3) {
-    o.studentIds = buildUnnamed809();
+    o.studentIds = buildUnnamed813();
   }
   buildCounterIndividualStudentsOptions--;
   return o;
@@ -691,7 +691,7 @@
 checkIndividualStudentsOptions(api.IndividualStudentsOptions o) {
   buildCounterIndividualStudentsOptions++;
   if (buildCounterIndividualStudentsOptions < 3) {
-    checkUnnamed809(o.studentIds);
+    checkUnnamed813(o.studentIds);
   }
   buildCounterIndividualStudentsOptions--;
 }
@@ -744,14 +744,14 @@
   buildCounterLink--;
 }
 
-buildUnnamed810() {
+buildUnnamed814() {
   var o = new core.List<api.Announcement>();
   o.add(buildAnnouncement());
   o.add(buildAnnouncement());
   return o;
 }
 
-checkUnnamed810(core.List<api.Announcement> o) {
+checkUnnamed814(core.List<api.Announcement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnouncement(o[0]);
   checkAnnouncement(o[1]);
@@ -762,7 +762,7 @@
   var o = new api.ListAnnouncementsResponse();
   buildCounterListAnnouncementsResponse++;
   if (buildCounterListAnnouncementsResponse < 3) {
-    o.announcements = buildUnnamed810();
+    o.announcements = buildUnnamed814();
     o.nextPageToken = "foo";
   }
   buildCounterListAnnouncementsResponse--;
@@ -772,20 +772,20 @@
 checkListAnnouncementsResponse(api.ListAnnouncementsResponse o) {
   buildCounterListAnnouncementsResponse++;
   if (buildCounterListAnnouncementsResponse < 3) {
-    checkUnnamed810(o.announcements);
+    checkUnnamed814(o.announcements);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListAnnouncementsResponse--;
 }
 
-buildUnnamed811() {
+buildUnnamed815() {
   var o = new core.List<api.CourseAlias>();
   o.add(buildCourseAlias());
   o.add(buildCourseAlias());
   return o;
 }
 
-checkUnnamed811(core.List<api.CourseAlias> o) {
+checkUnnamed815(core.List<api.CourseAlias> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCourseAlias(o[0]);
   checkCourseAlias(o[1]);
@@ -796,7 +796,7 @@
   var o = new api.ListCourseAliasesResponse();
   buildCounterListCourseAliasesResponse++;
   if (buildCounterListCourseAliasesResponse < 3) {
-    o.aliases = buildUnnamed811();
+    o.aliases = buildUnnamed815();
     o.nextPageToken = "foo";
   }
   buildCounterListCourseAliasesResponse--;
@@ -806,20 +806,20 @@
 checkListCourseAliasesResponse(api.ListCourseAliasesResponse o) {
   buildCounterListCourseAliasesResponse++;
   if (buildCounterListCourseAliasesResponse < 3) {
-    checkUnnamed811(o.aliases);
+    checkUnnamed815(o.aliases);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListCourseAliasesResponse--;
 }
 
-buildUnnamed812() {
+buildUnnamed816() {
   var o = new core.List<api.CourseWork>();
   o.add(buildCourseWork());
   o.add(buildCourseWork());
   return o;
 }
 
-checkUnnamed812(core.List<api.CourseWork> o) {
+checkUnnamed816(core.List<api.CourseWork> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCourseWork(o[0]);
   checkCourseWork(o[1]);
@@ -830,7 +830,7 @@
   var o = new api.ListCourseWorkResponse();
   buildCounterListCourseWorkResponse++;
   if (buildCounterListCourseWorkResponse < 3) {
-    o.courseWork = buildUnnamed812();
+    o.courseWork = buildUnnamed816();
     o.nextPageToken = "foo";
   }
   buildCounterListCourseWorkResponse--;
@@ -840,20 +840,20 @@
 checkListCourseWorkResponse(api.ListCourseWorkResponse o) {
   buildCounterListCourseWorkResponse++;
   if (buildCounterListCourseWorkResponse < 3) {
-    checkUnnamed812(o.courseWork);
+    checkUnnamed816(o.courseWork);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListCourseWorkResponse--;
 }
 
-buildUnnamed813() {
+buildUnnamed817() {
   var o = new core.List<api.Course>();
   o.add(buildCourse());
   o.add(buildCourse());
   return o;
 }
 
-checkUnnamed813(core.List<api.Course> o) {
+checkUnnamed817(core.List<api.Course> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCourse(o[0]);
   checkCourse(o[1]);
@@ -864,7 +864,7 @@
   var o = new api.ListCoursesResponse();
   buildCounterListCoursesResponse++;
   if (buildCounterListCoursesResponse < 3) {
-    o.courses = buildUnnamed813();
+    o.courses = buildUnnamed817();
     o.nextPageToken = "foo";
   }
   buildCounterListCoursesResponse--;
@@ -874,20 +874,20 @@
 checkListCoursesResponse(api.ListCoursesResponse o) {
   buildCounterListCoursesResponse++;
   if (buildCounterListCoursesResponse < 3) {
-    checkUnnamed813(o.courses);
+    checkUnnamed817(o.courses);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListCoursesResponse--;
 }
 
-buildUnnamed814() {
+buildUnnamed818() {
   var o = new core.List<api.GuardianInvitation>();
   o.add(buildGuardianInvitation());
   o.add(buildGuardianInvitation());
   return o;
 }
 
-checkUnnamed814(core.List<api.GuardianInvitation> o) {
+checkUnnamed818(core.List<api.GuardianInvitation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGuardianInvitation(o[0]);
   checkGuardianInvitation(o[1]);
@@ -898,7 +898,7 @@
   var o = new api.ListGuardianInvitationsResponse();
   buildCounterListGuardianInvitationsResponse++;
   if (buildCounterListGuardianInvitationsResponse < 3) {
-    o.guardianInvitations = buildUnnamed814();
+    o.guardianInvitations = buildUnnamed818();
     o.nextPageToken = "foo";
   }
   buildCounterListGuardianInvitationsResponse--;
@@ -908,20 +908,20 @@
 checkListGuardianInvitationsResponse(api.ListGuardianInvitationsResponse o) {
   buildCounterListGuardianInvitationsResponse++;
   if (buildCounterListGuardianInvitationsResponse < 3) {
-    checkUnnamed814(o.guardianInvitations);
+    checkUnnamed818(o.guardianInvitations);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListGuardianInvitationsResponse--;
 }
 
-buildUnnamed815() {
+buildUnnamed819() {
   var o = new core.List<api.Guardian>();
   o.add(buildGuardian());
   o.add(buildGuardian());
   return o;
 }
 
-checkUnnamed815(core.List<api.Guardian> o) {
+checkUnnamed819(core.List<api.Guardian> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGuardian(o[0]);
   checkGuardian(o[1]);
@@ -932,7 +932,7 @@
   var o = new api.ListGuardiansResponse();
   buildCounterListGuardiansResponse++;
   if (buildCounterListGuardiansResponse < 3) {
-    o.guardians = buildUnnamed815();
+    o.guardians = buildUnnamed819();
     o.nextPageToken = "foo";
   }
   buildCounterListGuardiansResponse--;
@@ -942,20 +942,20 @@
 checkListGuardiansResponse(api.ListGuardiansResponse o) {
   buildCounterListGuardiansResponse++;
   if (buildCounterListGuardiansResponse < 3) {
-    checkUnnamed815(o.guardians);
+    checkUnnamed819(o.guardians);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListGuardiansResponse--;
 }
 
-buildUnnamed816() {
+buildUnnamed820() {
   var o = new core.List<api.Invitation>();
   o.add(buildInvitation());
   o.add(buildInvitation());
   return o;
 }
 
-checkUnnamed816(core.List<api.Invitation> o) {
+checkUnnamed820(core.List<api.Invitation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInvitation(o[0]);
   checkInvitation(o[1]);
@@ -966,7 +966,7 @@
   var o = new api.ListInvitationsResponse();
   buildCounterListInvitationsResponse++;
   if (buildCounterListInvitationsResponse < 3) {
-    o.invitations = buildUnnamed816();
+    o.invitations = buildUnnamed820();
     o.nextPageToken = "foo";
   }
   buildCounterListInvitationsResponse--;
@@ -976,20 +976,20 @@
 checkListInvitationsResponse(api.ListInvitationsResponse o) {
   buildCounterListInvitationsResponse++;
   if (buildCounterListInvitationsResponse < 3) {
-    checkUnnamed816(o.invitations);
+    checkUnnamed820(o.invitations);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListInvitationsResponse--;
 }
 
-buildUnnamed817() {
+buildUnnamed821() {
   var o = new core.List<api.StudentSubmission>();
   o.add(buildStudentSubmission());
   o.add(buildStudentSubmission());
   return o;
 }
 
-checkUnnamed817(core.List<api.StudentSubmission> o) {
+checkUnnamed821(core.List<api.StudentSubmission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStudentSubmission(o[0]);
   checkStudentSubmission(o[1]);
@@ -1001,7 +1001,7 @@
   buildCounterListStudentSubmissionsResponse++;
   if (buildCounterListStudentSubmissionsResponse < 3) {
     o.nextPageToken = "foo";
-    o.studentSubmissions = buildUnnamed817();
+    o.studentSubmissions = buildUnnamed821();
   }
   buildCounterListStudentSubmissionsResponse--;
   return o;
@@ -1011,19 +1011,19 @@
   buildCounterListStudentSubmissionsResponse++;
   if (buildCounterListStudentSubmissionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed817(o.studentSubmissions);
+    checkUnnamed821(o.studentSubmissions);
   }
   buildCounterListStudentSubmissionsResponse--;
 }
 
-buildUnnamed818() {
+buildUnnamed822() {
   var o = new core.List<api.Student>();
   o.add(buildStudent());
   o.add(buildStudent());
   return o;
 }
 
-checkUnnamed818(core.List<api.Student> o) {
+checkUnnamed822(core.List<api.Student> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStudent(o[0]);
   checkStudent(o[1]);
@@ -1035,7 +1035,7 @@
   buildCounterListStudentsResponse++;
   if (buildCounterListStudentsResponse < 3) {
     o.nextPageToken = "foo";
-    o.students = buildUnnamed818();
+    o.students = buildUnnamed822();
   }
   buildCounterListStudentsResponse--;
   return o;
@@ -1045,19 +1045,19 @@
   buildCounterListStudentsResponse++;
   if (buildCounterListStudentsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed818(o.students);
+    checkUnnamed822(o.students);
   }
   buildCounterListStudentsResponse--;
 }
 
-buildUnnamed819() {
+buildUnnamed823() {
   var o = new core.List<api.Teacher>();
   o.add(buildTeacher());
   o.add(buildTeacher());
   return o;
 }
 
-checkUnnamed819(core.List<api.Teacher> o) {
+checkUnnamed823(core.List<api.Teacher> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTeacher(o[0]);
   checkTeacher(o[1]);
@@ -1069,7 +1069,7 @@
   buildCounterListTeachersResponse++;
   if (buildCounterListTeachersResponse < 3) {
     o.nextPageToken = "foo";
-    o.teachers = buildUnnamed819();
+    o.teachers = buildUnnamed823();
   }
   buildCounterListTeachersResponse--;
   return o;
@@ -1079,11 +1079,45 @@
   buildCounterListTeachersResponse++;
   if (buildCounterListTeachersResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed819(o.teachers);
+    checkUnnamed823(o.teachers);
   }
   buildCounterListTeachersResponse--;
 }
 
+buildUnnamed824() {
+  var o = new core.List<api.Topic>();
+  o.add(buildTopic());
+  o.add(buildTopic());
+  return o;
+}
+
+checkUnnamed824(core.List<api.Topic> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkTopic(o[0]);
+  checkTopic(o[1]);
+}
+
+core.int buildCounterListTopicResponse = 0;
+buildListTopicResponse() {
+  var o = new api.ListTopicResponse();
+  buildCounterListTopicResponse++;
+  if (buildCounterListTopicResponse < 3) {
+    o.nextPageToken = "foo";
+    o.topic = buildUnnamed824();
+  }
+  buildCounterListTopicResponse--;
+  return o;
+}
+
+checkListTopicResponse(api.ListTopicResponse o) {
+  buildCounterListTopicResponse++;
+  if (buildCounterListTopicResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed824(o.topic);
+  }
+  buildCounterListTopicResponse--;
+}
+
 core.int buildCounterMaterial = 0;
 buildMaterial() {
   var o = new api.Material();
@@ -1131,14 +1165,14 @@
   buildCounterModifyAnnouncementAssigneesRequest--;
 }
 
-buildUnnamed820() {
+buildUnnamed825() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed820(core.List<api.Attachment> o) {
+checkUnnamed825(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
@@ -1149,7 +1183,7 @@
   var o = new api.ModifyAttachmentsRequest();
   buildCounterModifyAttachmentsRequest++;
   if (buildCounterModifyAttachmentsRequest < 3) {
-    o.addAttachments = buildUnnamed820();
+    o.addAttachments = buildUnnamed825();
   }
   buildCounterModifyAttachmentsRequest--;
   return o;
@@ -1158,7 +1192,7 @@
 checkModifyAttachmentsRequest(api.ModifyAttachmentsRequest o) {
   buildCounterModifyAttachmentsRequest++;
   if (buildCounterModifyAttachmentsRequest < 3) {
-    checkUnnamed820(o.addAttachments);
+    checkUnnamed825(o.addAttachments);
   }
   buildCounterModifyAttachmentsRequest--;
 }
@@ -1184,27 +1218,27 @@
   buildCounterModifyCourseWorkAssigneesRequest--;
 }
 
-buildUnnamed821() {
+buildUnnamed826() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed821(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'));
 }
 
-buildUnnamed822() {
+buildUnnamed827() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed822(core.List<core.String> o) {
+checkUnnamed827(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1215,8 +1249,8 @@
   var o = new api.ModifyIndividualStudentsOptions();
   buildCounterModifyIndividualStudentsOptions++;
   if (buildCounterModifyIndividualStudentsOptions < 3) {
-    o.addStudentIds = buildUnnamed821();
-    o.removeStudentIds = buildUnnamed822();
+    o.addStudentIds = buildUnnamed826();
+    o.removeStudentIds = buildUnnamed827();
   }
   buildCounterModifyIndividualStudentsOptions--;
   return o;
@@ -1225,20 +1259,20 @@
 checkModifyIndividualStudentsOptions(api.ModifyIndividualStudentsOptions o) {
   buildCounterModifyIndividualStudentsOptions++;
   if (buildCounterModifyIndividualStudentsOptions < 3) {
-    checkUnnamed821(o.addStudentIds);
-    checkUnnamed822(o.removeStudentIds);
+    checkUnnamed826(o.addStudentIds);
+    checkUnnamed827(o.removeStudentIds);
   }
   buildCounterModifyIndividualStudentsOptions--;
 }
 
-buildUnnamed823() {
+buildUnnamed828() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed823(core.List<core.String> o) {
+checkUnnamed828(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1249,7 +1283,7 @@
   var o = new api.MultipleChoiceQuestion();
   buildCounterMultipleChoiceQuestion++;
   if (buildCounterMultipleChoiceQuestion < 3) {
-    o.choices = buildUnnamed823();
+    o.choices = buildUnnamed828();
   }
   buildCounterMultipleChoiceQuestion--;
   return o;
@@ -1258,7 +1292,7 @@
 checkMultipleChoiceQuestion(api.MultipleChoiceQuestion o) {
   buildCounterMultipleChoiceQuestion++;
   if (buildCounterMultipleChoiceQuestion < 3) {
-    checkUnnamed823(o.choices);
+    checkUnnamed828(o.choices);
   }
   buildCounterMultipleChoiceQuestion--;
 }
@@ -1448,14 +1482,14 @@
   buildCounterStudent--;
 }
 
-buildUnnamed824() {
+buildUnnamed829() {
   var o = new core.List<api.SubmissionHistory>();
   o.add(buildSubmissionHistory());
   o.add(buildSubmissionHistory());
   return o;
 }
 
-checkUnnamed824(core.List<api.SubmissionHistory> o) {
+checkUnnamed829(core.List<api.SubmissionHistory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubmissionHistory(o[0]);
   checkSubmissionHistory(o[1]);
@@ -1480,7 +1514,7 @@
     o.multipleChoiceSubmission = buildMultipleChoiceSubmission();
     o.shortAnswerSubmission = buildShortAnswerSubmission();
     o.state = "foo";
-    o.submissionHistory = buildUnnamed824();
+    o.submissionHistory = buildUnnamed829();
     o.updateTime = "foo";
     o.userId = "foo";
   }
@@ -1505,7 +1539,7 @@
     checkMultipleChoiceSubmission(o.multipleChoiceSubmission);
     checkShortAnswerSubmission(o.shortAnswerSubmission);
     unittest.expect(o.state, unittest.equals('foo'));
-    checkUnnamed824(o.submissionHistory);
+    checkUnnamed829(o.submissionHistory);
     unittest.expect(o.updateTime, unittest.equals('foo'));
     unittest.expect(o.userId, unittest.equals('foo'));
   }
@@ -1581,6 +1615,31 @@
   buildCounterTimeOfDay--;
 }
 
+core.int buildCounterTopic = 0;
+buildTopic() {
+  var o = new api.Topic();
+  buildCounterTopic++;
+  if (buildCounterTopic < 3) {
+    o.courseId = "foo";
+    o.name = "foo";
+    o.topicId = "foo";
+    o.updateTime = "foo";
+  }
+  buildCounterTopic--;
+  return o;
+}
+
+checkTopic(api.Topic o) {
+  buildCounterTopic++;
+  if (buildCounterTopic < 3) {
+    unittest.expect(o.courseId, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.topicId, unittest.equals('foo'));
+    unittest.expect(o.updateTime, unittest.equals('foo'));
+  }
+  buildCounterTopic--;
+}
+
 core.int buildCounterTurnInStudentSubmissionRequest = 0;
 buildTurnInStudentSubmissionRequest() {
   var o = new api.TurnInStudentSubmissionRequest();
@@ -1596,14 +1655,14 @@
   buildCounterTurnInStudentSubmissionRequest--;
 }
 
-buildUnnamed825() {
+buildUnnamed830() {
   var o = new core.List<api.GlobalPermission>();
   o.add(buildGlobalPermission());
   o.add(buildGlobalPermission());
   return o;
 }
 
-checkUnnamed825(core.List<api.GlobalPermission> o) {
+checkUnnamed830(core.List<api.GlobalPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGlobalPermission(o[0]);
   checkGlobalPermission(o[1]);
@@ -1617,7 +1676,7 @@
     o.emailAddress = "foo";
     o.id = "foo";
     o.name = buildName();
-    o.permissions = buildUnnamed825();
+    o.permissions = buildUnnamed830();
     o.photoUrl = "foo";
     o.verifiedTeacher = true;
   }
@@ -1631,7 +1690,7 @@
     unittest.expect(o.emailAddress, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkName(o.name);
-    checkUnnamed825(o.permissions);
+    checkUnnamed830(o.permissions);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
     unittest.expect(o.verifiedTeacher, unittest.isTrue);
   }
@@ -1663,66 +1722,66 @@
   buildCounterYouTubeVideo--;
 }
 
-buildUnnamed826() {
+buildUnnamed831() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed826(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'));
 }
 
-buildUnnamed827() {
+buildUnnamed832() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed827(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'));
 }
 
-buildUnnamed828() {
+buildUnnamed833() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed828(core.List<core.String> o) {
+checkUnnamed833(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed829() {
+buildUnnamed834() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed829(core.List<core.String> o) {
+checkUnnamed834(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed830() {
+buildUnnamed835() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed830(core.List<core.String> o) {
+checkUnnamed835(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2001,6 +2060,14 @@
     });
   });
 
+  unittest.group("obj-schema-ListTopicResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListTopicResponse();
+      var od = new api.ListTopicResponse.fromJson(o.toJson());
+      checkListTopicResponse(od);
+    });
+  });
+
   unittest.group("obj-schema-Material", () {
     unittest.test("to-json--from-json", () {
       var o = buildMaterial();
@@ -2153,6 +2220,14 @@
     });
   });
 
+  unittest.group("obj-schema-Topic", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildTopic();
+      var od = new api.Topic.fromJson(o.toJson());
+      checkTopic(od);
+    });
+  });
+
   unittest.group("obj-schema-TurnInStudentSubmissionRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTurnInStudentSubmissionRequest();
@@ -2343,7 +2418,7 @@
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_teacherId = "foo";
-      var arg_courseStates = buildUnnamed826();
+      var arg_courseStates = buildUnnamed831();
       var arg_studentId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2924,10 +2999,10 @@
       api.CoursesAnnouncementsResourceApi res =
           new api.ClassroomApi(mock).courses.announcements;
       var arg_courseId = "foo";
-      var arg_pageSize = 42;
-      var arg_announcementStates = buildUnnamed827();
+      var arg_announcementStates = buildUnnamed832();
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2968,14 +3043,14 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["announcementStates"],
             unittest.equals(arg_announcementStates));
         unittest.expect(
             queryMap["orderBy"].first, unittest.equals(arg_orderBy));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2986,10 +3061,10 @@
       }), true);
       res
           .list(arg_courseId,
-              pageSize: arg_pageSize,
               announcementStates: arg_announcementStates,
               orderBy: arg_orderBy,
               pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(
               unittest.expectAsync1(((api.ListAnnouncementsResponse response) {
@@ -3346,7 +3421,7 @@
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_courseWorkStates = buildUnnamed828();
+      var arg_courseWorkStates = buildUnnamed833();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3644,11 +3719,11 @@
           new api.ClassroomApi(mock).courses.courseWork.studentSubmissions;
       var arg_courseId = "foo";
       var arg_courseWorkId = "foo";
-      var arg_userId = "foo";
       var arg_late = "foo";
       var arg_pageToken = "foo";
-      var arg_states = buildUnnamed829();
+      var arg_states = buildUnnamed834();
       var arg_pageSize = 42;
+      var arg_userId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3698,13 +3773,13 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["userId"].first, unittest.equals(arg_userId));
         unittest.expect(queryMap["late"].first, unittest.equals(arg_late));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["states"], unittest.equals(arg_states));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["userId"].first, unittest.equals(arg_userId));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3715,11 +3790,11 @@
       }), true);
       res
           .list(arg_courseId, arg_courseWorkId,
-              userId: arg_userId,
               late: arg_late,
               pageToken: arg_pageToken,
               states: arg_states,
               pageSize: arg_pageSize,
+              userId: arg_userId,
               $fields: arg_$fields)
           .then(unittest
               .expectAsync1(((api.ListStudentSubmissionsResponse response) {
@@ -4681,6 +4756,141 @@
     });
   });
 
+  unittest.group("resource-CoursesTopicsResourceApi", () {
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.CoursesTopicsResourceApi res =
+          new api.ClassroomApi(mock).courses.topics;
+      var arg_courseId = "foo";
+      var arg_id = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 11),
+            unittest.equals("v1/courses/"));
+        pathOffset += 11;
+        index = path.indexOf("/topics/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_courseId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/topics/"));
+        pathOffset += 8;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildTopic());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_courseId, arg_id, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Topic response) {
+        checkTopic(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.CoursesTopicsResourceApi res =
+          new api.ClassroomApi(mock).courses.topics;
+      var arg_courseId = "foo";
+      var arg_pageToken = "foo";
+      var arg_pageSize = 42;
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 11),
+            unittest.equals("v1/courses/"));
+        pathOffset += 11;
+        index = path.indexOf("/topics", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_courseId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/topics"));
+        pathOffset += 7;
+
+        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]));
+          }
+        }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListTopicResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_courseId,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.ListTopicResponse response) {
+        checkListTopicResponse(response);
+      })));
+    });
+  });
+
   unittest.group("resource-InvitationsResourceApi", () {
     unittest.test("method--accept", () {
       var mock = new HttpServerMock();
@@ -4903,10 +5113,10 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.InvitationsResourceApi res = new api.ClassroomApi(mock).invitations;
-      var arg_courseId = "foo";
       var arg_userId = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_courseId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -4938,13 +5148,13 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["courseId"].first, unittest.equals(arg_courseId));
         unittest.expect(queryMap["userId"].first, unittest.equals(arg_userId));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["courseId"].first, unittest.equals(arg_courseId));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -4955,10 +5165,10 @@
       }), true);
       res
           .list(
-              courseId: arg_courseId,
               userId: arg_userId,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              courseId: arg_courseId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListInvitationsResponse response) {
         checkListInvitationsResponse(response);
@@ -5267,7 +5477,7 @@
       var arg_studentId = "foo";
       var arg_pageToken = "foo";
       var arg_invitedEmailAddress = "foo";
-      var arg_states = buildUnnamed830();
+      var arg_states = buildUnnamed835();
       var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5544,9 +5754,9 @@
       api.UserProfilesGuardiansResourceApi res =
           new api.ClassroomApi(mock).userProfiles.guardians;
       var arg_studentId = "foo";
+      var arg_pageToken = "foo";
       var arg_invitedEmailAddress = "foo";
       var arg_pageSize = 42;
-      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -5587,12 +5797,12 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["invitedEmailAddress"].first,
             unittest.equals(arg_invitedEmailAddress));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -5603,9 +5813,9 @@
       }), true);
       res
           .list(arg_studentId,
+              pageToken: arg_pageToken,
               invitedEmailAddress: arg_invitedEmailAddress,
               pageSize: arg_pageSize,
-              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListGuardiansResponse response) {
         checkListGuardiansResponse(response);
diff --git a/generated/googleapis/test/cloudbilling/v1_test.dart b/generated/googleapis/test/cloudbilling/v1_test.dart
index d871150..473f68c 100644
--- a/generated/googleapis/test/cloudbilling/v1_test.dart
+++ b/generated/googleapis/test/cloudbilling/v1_test.dart
@@ -121,14 +121,14 @@
   buildCounterCategory--;
 }
 
-buildUnnamed48() {
+buildUnnamed55() {
   var o = new core.List<api.BillingAccount>();
   o.add(buildBillingAccount());
   o.add(buildBillingAccount());
   return o;
 }
 
-checkUnnamed48(core.List<api.BillingAccount> o) {
+checkUnnamed55(core.List<api.BillingAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBillingAccount(o[0]);
   checkBillingAccount(o[1]);
@@ -139,7 +139,7 @@
   var o = new api.ListBillingAccountsResponse();
   buildCounterListBillingAccountsResponse++;
   if (buildCounterListBillingAccountsResponse < 3) {
-    o.billingAccounts = buildUnnamed48();
+    o.billingAccounts = buildUnnamed55();
     o.nextPageToken = "foo";
   }
   buildCounterListBillingAccountsResponse--;
@@ -149,20 +149,20 @@
 checkListBillingAccountsResponse(api.ListBillingAccountsResponse o) {
   buildCounterListBillingAccountsResponse++;
   if (buildCounterListBillingAccountsResponse < 3) {
-    checkUnnamed48(o.billingAccounts);
+    checkUnnamed55(o.billingAccounts);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListBillingAccountsResponse--;
 }
 
-buildUnnamed49() {
+buildUnnamed56() {
   var o = new core.List<api.ProjectBillingInfo>();
   o.add(buildProjectBillingInfo());
   o.add(buildProjectBillingInfo());
   return o;
 }
 
-checkUnnamed49(core.List<api.ProjectBillingInfo> o) {
+checkUnnamed56(core.List<api.ProjectBillingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProjectBillingInfo(o[0]);
   checkProjectBillingInfo(o[1]);
@@ -174,7 +174,7 @@
   buildCounterListProjectBillingInfoResponse++;
   if (buildCounterListProjectBillingInfoResponse < 3) {
     o.nextPageToken = "foo";
-    o.projectBillingInfo = buildUnnamed49();
+    o.projectBillingInfo = buildUnnamed56();
   }
   buildCounterListProjectBillingInfoResponse--;
   return o;
@@ -184,19 +184,19 @@
   buildCounterListProjectBillingInfoResponse++;
   if (buildCounterListProjectBillingInfoResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed49(o.projectBillingInfo);
+    checkUnnamed56(o.projectBillingInfo);
   }
   buildCounterListProjectBillingInfoResponse--;
 }
 
-buildUnnamed50() {
+buildUnnamed57() {
   var o = new core.List<api.Service>();
   o.add(buildService());
   o.add(buildService());
   return o;
 }
 
-checkUnnamed50(core.List<api.Service> o) {
+checkUnnamed57(core.List<api.Service> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkService(o[0]);
   checkService(o[1]);
@@ -208,7 +208,7 @@
   buildCounterListServicesResponse++;
   if (buildCounterListServicesResponse < 3) {
     o.nextPageToken = "foo";
-    o.services = buildUnnamed50();
+    o.services = buildUnnamed57();
   }
   buildCounterListServicesResponse--;
   return o;
@@ -218,19 +218,19 @@
   buildCounterListServicesResponse++;
   if (buildCounterListServicesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed50(o.services);
+    checkUnnamed57(o.services);
   }
   buildCounterListServicesResponse--;
 }
 
-buildUnnamed51() {
+buildUnnamed58() {
   var o = new core.List<api.Sku>();
   o.add(buildSku());
   o.add(buildSku());
   return o;
 }
 
-checkUnnamed51(core.List<api.Sku> o) {
+checkUnnamed58(core.List<api.Sku> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSku(o[0]);
   checkSku(o[1]);
@@ -242,7 +242,7 @@
   buildCounterListSkusResponse++;
   if (buildCounterListSkusResponse < 3) {
     o.nextPageToken = "foo";
-    o.skus = buildUnnamed51();
+    o.skus = buildUnnamed58();
   }
   buildCounterListSkusResponse--;
   return o;
@@ -252,7 +252,7 @@
   buildCounterListSkusResponse++;
   if (buildCounterListSkusResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed51(o.skus);
+    checkUnnamed58(o.skus);
   }
   buildCounterListSkusResponse--;
 }
@@ -280,14 +280,14 @@
   buildCounterMoney--;
 }
 
-buildUnnamed52() {
+buildUnnamed59() {
   var o = new core.List<api.TierRate>();
   o.add(buildTierRate());
   o.add(buildTierRate());
   return o;
 }
 
-checkUnnamed52(core.List<api.TierRate> o) {
+checkUnnamed59(core.List<api.TierRate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTierRate(o[0]);
   checkTierRate(o[1]);
@@ -302,7 +302,7 @@
     o.baseUnitConversionFactor = 42.0;
     o.baseUnitDescription = "foo";
     o.displayQuantity = 42.0;
-    o.tieredRates = buildUnnamed52();
+    o.tieredRates = buildUnnamed59();
     o.usageUnit = "foo";
     o.usageUnitDescription = "foo";
   }
@@ -317,7 +317,7 @@
     unittest.expect(o.baseUnitConversionFactor, unittest.equals(42.0));
     unittest.expect(o.baseUnitDescription, unittest.equals('foo'));
     unittest.expect(o.displayQuantity, unittest.equals(42.0));
-    checkUnnamed52(o.tieredRates);
+    checkUnnamed59(o.tieredRates);
     unittest.expect(o.usageUnit, unittest.equals('foo'));
     unittest.expect(o.usageUnitDescription, unittest.equals('foo'));
   }
@@ -399,27 +399,27 @@
   buildCounterService--;
 }
 
-buildUnnamed53() {
+buildUnnamed60() {
   var o = new core.List<api.PricingInfo>();
   o.add(buildPricingInfo());
   o.add(buildPricingInfo());
   return o;
 }
 
-checkUnnamed53(core.List<api.PricingInfo> o) {
+checkUnnamed60(core.List<api.PricingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPricingInfo(o[0]);
   checkPricingInfo(o[1]);
 }
 
-buildUnnamed54() {
+buildUnnamed61() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed54(core.List<core.String> o) {
+checkUnnamed61(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -433,9 +433,9 @@
     o.category = buildCategory();
     o.description = "foo";
     o.name = "foo";
-    o.pricingInfo = buildUnnamed53();
+    o.pricingInfo = buildUnnamed60();
     o.serviceProviderName = "foo";
-    o.serviceRegions = buildUnnamed54();
+    o.serviceRegions = buildUnnamed61();
     o.skuId = "foo";
   }
   buildCounterSku--;
@@ -448,9 +448,9 @@
     checkCategory(o.category);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed53(o.pricingInfo);
+    checkUnnamed60(o.pricingInfo);
     unittest.expect(o.serviceProviderName, unittest.equals('foo'));
-    checkUnnamed54(o.serviceRegions);
+    checkUnnamed61(o.serviceRegions);
     unittest.expect(o.skuId, unittest.equals('foo'));
   }
   buildCounterSku--;
diff --git a/generated/googleapis/test/cloudbuild/v1_test.dart b/generated/googleapis/test/cloudbuild/v1_test.dart
index f142632..e2f666f 100644
--- a/generated/googleapis/test/cloudbuild/v1_test.dart
+++ b/generated/googleapis/test/cloudbuild/v1_test.dart
@@ -50,71 +50,84 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1461() {
+buildUnnamed1477() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1461(core.List<core.String> o) {
+checkUnnamed1477(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1462() {
+buildUnnamed1478() {
   var o = new core.List<api.Secret>();
   o.add(buildSecret());
   o.add(buildSecret());
   return o;
 }
 
-checkUnnamed1462(core.List<api.Secret> o) {
+checkUnnamed1478(core.List<api.Secret> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSecret(o[0]);
   checkSecret(o[1]);
 }
 
-buildUnnamed1463() {
+buildUnnamed1479() {
   var o = new core.List<api.BuildStep>();
   o.add(buildBuildStep());
   o.add(buildBuildStep());
   return o;
 }
 
-checkUnnamed1463(core.List<api.BuildStep> o) {
+checkUnnamed1479(core.List<api.BuildStep> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBuildStep(o[0]);
   checkBuildStep(o[1]);
 }
 
-buildUnnamed1464() {
+buildUnnamed1480() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1464(core.Map<core.String, core.String> o) {
+checkUnnamed1480(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'));
 }
 
-buildUnnamed1465() {
+buildUnnamed1481() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1465(core.List<core.String> o) {
+checkUnnamed1481(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed1482() {
+  var o = new core.Map<core.String, api.TimeSpan>();
+  o["x"] = buildTimeSpan();
+  o["y"] = buildTimeSpan();
+  return o;
+}
+
+checkUnnamed1482(core.Map<core.String, api.TimeSpan> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkTimeSpan(o["x"]);
+  checkTimeSpan(o["y"]);
+}
+
 core.int buildCounterBuild = 0;
 buildBuild() {
   var o = new api.Build();
@@ -124,22 +137,23 @@
     o.createTime = "foo";
     o.finishTime = "foo";
     o.id = "foo";
-    o.images = buildUnnamed1461();
+    o.images = buildUnnamed1477();
     o.logUrl = "foo";
     o.logsBucket = "foo";
     o.options = buildBuildOptions();
     o.projectId = "foo";
     o.results = buildResults();
-    o.secrets = buildUnnamed1462();
+    o.secrets = buildUnnamed1478();
     o.source = buildSource();
     o.sourceProvenance = buildSourceProvenance();
     o.startTime = "foo";
     o.status = "foo";
     o.statusDetail = "foo";
-    o.steps = buildUnnamed1463();
-    o.substitutions = buildUnnamed1464();
-    o.tags = buildUnnamed1465();
+    o.steps = buildUnnamed1479();
+    o.substitutions = buildUnnamed1480();
+    o.tags = buildUnnamed1481();
     o.timeout = "foo";
+    o.timing = buildUnnamed1482();
   }
   buildCounterBuild--;
   return o;
@@ -152,22 +166,23 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.finishTime, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1461(o.images);
+    checkUnnamed1477(o.images);
     unittest.expect(o.logUrl, unittest.equals('foo'));
     unittest.expect(o.logsBucket, unittest.equals('foo'));
     checkBuildOptions(o.options);
     unittest.expect(o.projectId, unittest.equals('foo'));
     checkResults(o.results);
-    checkUnnamed1462(o.secrets);
+    checkUnnamed1478(o.secrets);
     checkSource(o.source);
     checkSourceProvenance(o.sourceProvenance);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusDetail, unittest.equals('foo'));
-    checkUnnamed1463(o.steps);
-    checkUnnamed1464(o.substitutions);
-    checkUnnamed1465(o.tags);
+    checkUnnamed1479(o.steps);
+    checkUnnamed1480(o.substitutions);
+    checkUnnamed1481(o.tags);
     unittest.expect(o.timeout, unittest.equals('foo'));
+    checkUnnamed1482(o.timing);
   }
   buildCounterBuild--;
 }
@@ -191,14 +206,14 @@
   buildCounterBuildOperationMetadata--;
 }
 
-buildUnnamed1466() {
+buildUnnamed1483() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1466(core.List<core.String> o) {
+checkUnnamed1483(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -213,7 +228,7 @@
     o.logStreamingOption = "foo";
     o.machineType = "foo";
     o.requestedVerifyOption = "foo";
-    o.sourceProvenanceHash = buildUnnamed1466();
+    o.sourceProvenanceHash = buildUnnamed1483();
     o.substitutionOption = "foo";
   }
   buildCounterBuildOptions--;
@@ -227,72 +242,72 @@
     unittest.expect(o.logStreamingOption, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
     unittest.expect(o.requestedVerifyOption, unittest.equals('foo'));
-    checkUnnamed1466(o.sourceProvenanceHash);
+    checkUnnamed1483(o.sourceProvenanceHash);
     unittest.expect(o.substitutionOption, unittest.equals('foo'));
   }
   buildCounterBuildOptions--;
 }
 
-buildUnnamed1467() {
+buildUnnamed1484() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1467(core.List<core.String> o) {
+checkUnnamed1484(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1468() {
+buildUnnamed1485() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1468(core.List<core.String> o) {
+checkUnnamed1485(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1469() {
+buildUnnamed1486() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1469(core.List<core.String> o) {
+checkUnnamed1486(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1470() {
+buildUnnamed1487() {
   var o = new core.List<api.Volume>();
   o.add(buildVolume());
   o.add(buildVolume());
   return o;
 }
 
-checkUnnamed1470(core.List<api.Volume> o) {
+checkUnnamed1487(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolume(o[0]);
   checkVolume(o[1]);
 }
 
-buildUnnamed1471() {
+buildUnnamed1488() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1471(core.List<core.String> o) {
+checkUnnamed1488(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -303,15 +318,16 @@
   var o = new api.BuildStep();
   buildCounterBuildStep++;
   if (buildCounterBuildStep < 3) {
-    o.args = buildUnnamed1467();
+    o.args = buildUnnamed1484();
     o.dir = "foo";
     o.entrypoint = "foo";
-    o.env = buildUnnamed1468();
+    o.env = buildUnnamed1485();
     o.id = "foo";
     o.name = "foo";
-    o.secretEnv = buildUnnamed1469();
-    o.volumes = buildUnnamed1470();
-    o.waitFor = buildUnnamed1471();
+    o.secretEnv = buildUnnamed1486();
+    o.timing = buildTimeSpan();
+    o.volumes = buildUnnamed1487();
+    o.waitFor = buildUnnamed1488();
   }
   buildCounterBuildStep--;
   return o;
@@ -320,27 +336,28 @@
 checkBuildStep(api.BuildStep o) {
   buildCounterBuildStep++;
   if (buildCounterBuildStep < 3) {
-    checkUnnamed1467(o.args);
+    checkUnnamed1484(o.args);
     unittest.expect(o.dir, unittest.equals('foo'));
     unittest.expect(o.entrypoint, unittest.equals('foo'));
-    checkUnnamed1468(o.env);
+    checkUnnamed1485(o.env);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1469(o.secretEnv);
-    checkUnnamed1470(o.volumes);
-    checkUnnamed1471(o.waitFor);
+    checkUnnamed1486(o.secretEnv);
+    checkTimeSpan(o.timing);
+    checkUnnamed1487(o.volumes);
+    checkUnnamed1488(o.waitFor);
   }
   buildCounterBuildStep--;
 }
 
-buildUnnamed1472() {
+buildUnnamed1489() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1472(core.Map<core.String, core.String> o) {
+checkUnnamed1489(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'));
@@ -357,7 +374,7 @@
     o.disabled = true;
     o.filename = "foo";
     o.id = "foo";
-    o.substitutions = buildUnnamed1472();
+    o.substitutions = buildUnnamed1489();
     o.triggerTemplate = buildRepoSource();
   }
   buildCounterBuildTrigger--;
@@ -373,7 +390,7 @@
     unittest.expect(o.disabled, unittest.isTrue);
     unittest.expect(o.filename, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1472(o.substitutions);
+    checkUnnamed1489(o.substitutions);
     checkRepoSource(o.triggerTemplate);
   }
   buildCounterBuildTrigger--;
@@ -386,6 +403,7 @@
   if (buildCounterBuiltImage < 3) {
     o.digest = "foo";
     o.name = "foo";
+    o.pushTiming = buildTimeSpan();
   }
   buildCounterBuiltImage--;
   return o;
@@ -396,6 +414,7 @@
   if (buildCounterBuiltImage < 3) {
     unittest.expect(o.digest, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
+    checkTimeSpan(o.pushTiming);
   }
   buildCounterBuiltImage--;
 }
@@ -445,14 +464,14 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed1473() {
+buildUnnamed1490() {
   var o = new core.List<api.Hash>();
   o.add(buildHash());
   o.add(buildHash());
   return o;
 }
 
-checkUnnamed1473(core.List<api.Hash> o) {
+checkUnnamed1490(core.List<api.Hash> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHash(o[0]);
   checkHash(o[1]);
@@ -463,7 +482,7 @@
   var o = new api.FileHashes();
   buildCounterFileHashes++;
   if (buildCounterFileHashes < 3) {
-    o.fileHash = buildUnnamed1473();
+    o.fileHash = buildUnnamed1490();
   }
   buildCounterFileHashes--;
   return o;
@@ -472,7 +491,7 @@
 checkFileHashes(api.FileHashes o) {
   buildCounterFileHashes++;
   if (buildCounterFileHashes < 3) {
-    checkUnnamed1473(o.fileHash);
+    checkUnnamed1490(o.fileHash);
   }
   buildCounterFileHashes--;
 }
@@ -498,14 +517,14 @@
   buildCounterHash--;
 }
 
-buildUnnamed1474() {
+buildUnnamed1491() {
   var o = new core.List<api.BuildTrigger>();
   o.add(buildBuildTrigger());
   o.add(buildBuildTrigger());
   return o;
 }
 
-checkUnnamed1474(core.List<api.BuildTrigger> o) {
+checkUnnamed1491(core.List<api.BuildTrigger> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBuildTrigger(o[0]);
   checkBuildTrigger(o[1]);
@@ -516,7 +535,7 @@
   var o = new api.ListBuildTriggersResponse();
   buildCounterListBuildTriggersResponse++;
   if (buildCounterListBuildTriggersResponse < 3) {
-    o.triggers = buildUnnamed1474();
+    o.triggers = buildUnnamed1491();
   }
   buildCounterListBuildTriggersResponse--;
   return o;
@@ -525,19 +544,19 @@
 checkListBuildTriggersResponse(api.ListBuildTriggersResponse o) {
   buildCounterListBuildTriggersResponse++;
   if (buildCounterListBuildTriggersResponse < 3) {
-    checkUnnamed1474(o.triggers);
+    checkUnnamed1491(o.triggers);
   }
   buildCounterListBuildTriggersResponse--;
 }
 
-buildUnnamed1475() {
+buildUnnamed1492() {
   var o = new core.List<api.Build>();
   o.add(buildBuild());
   o.add(buildBuild());
   return o;
 }
 
-checkUnnamed1475(core.List<api.Build> o) {
+checkUnnamed1492(core.List<api.Build> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBuild(o[0]);
   checkBuild(o[1]);
@@ -548,7 +567,7 @@
   var o = new api.ListBuildsResponse();
   buildCounterListBuildsResponse++;
   if (buildCounterListBuildsResponse < 3) {
-    o.builds = buildUnnamed1475();
+    o.builds = buildUnnamed1492();
     o.nextPageToken = "foo";
   }
   buildCounterListBuildsResponse--;
@@ -558,20 +577,20 @@
 checkListBuildsResponse(api.ListBuildsResponse o) {
   buildCounterListBuildsResponse++;
   if (buildCounterListBuildsResponse < 3) {
-    checkUnnamed1475(o.builds);
+    checkUnnamed1492(o.builds);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListBuildsResponse--;
 }
 
-buildUnnamed1476() {
+buildUnnamed1493() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1476(core.List<api.Operation> o) {
+checkUnnamed1493(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -583,7 +602,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed1476();
+    o.operations = buildUnnamed1493();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -593,12 +612,12 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1476(o.operations);
+    checkUnnamed1493(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed1477() {
+buildUnnamed1494() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -613,7 +632,7 @@
   return o;
 }
 
-checkUnnamed1477(core.Map<core.String, core.Object> o) {
+checkUnnamed1494(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));
@@ -627,7 +646,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1478() {
+buildUnnamed1495() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -642,7 +661,7 @@
   return o;
 }
 
-checkUnnamed1478(core.Map<core.String, core.Object> o) {
+checkUnnamed1495(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -663,9 +682,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed1477();
+    o.metadata = buildUnnamed1494();
     o.name = "foo";
-    o.response = buildUnnamed1478();
+    o.response = buildUnnamed1495();
   }
   buildCounterOperation--;
   return o;
@@ -676,9 +695,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed1477(o.metadata);
+    checkUnnamed1494(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1478(o.response);
+    checkUnnamed1495(o.response);
   }
   buildCounterOperation--;
 }
@@ -712,27 +731,27 @@
   buildCounterRepoSource--;
 }
 
-buildUnnamed1479() {
+buildUnnamed1496() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1479(core.List<core.String> o) {
+checkUnnamed1496(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1480() {
+buildUnnamed1497() {
   var o = new core.List<api.BuiltImage>();
   o.add(buildBuiltImage());
   o.add(buildBuiltImage());
   return o;
 }
 
-checkUnnamed1480(core.List<api.BuiltImage> o) {
+checkUnnamed1497(core.List<api.BuiltImage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBuiltImage(o[0]);
   checkBuiltImage(o[1]);
@@ -743,8 +762,8 @@
   var o = new api.Results();
   buildCounterResults++;
   if (buildCounterResults < 3) {
-    o.buildStepImages = buildUnnamed1479();
-    o.images = buildUnnamed1480();
+    o.buildStepImages = buildUnnamed1496();
+    o.images = buildUnnamed1497();
   }
   buildCounterResults--;
   return o;
@@ -753,8 +772,8 @@
 checkResults(api.Results o) {
   buildCounterResults++;
   if (buildCounterResults < 3) {
-    checkUnnamed1479(o.buildStepImages);
-    checkUnnamed1480(o.images);
+    checkUnnamed1496(o.buildStepImages);
+    checkUnnamed1497(o.images);
   }
   buildCounterResults--;
 }
@@ -774,14 +793,14 @@
   buildCounterRetryBuildRequest--;
 }
 
-buildUnnamed1481() {
+buildUnnamed1498() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1481(core.Map<core.String, core.String> o) {
+checkUnnamed1498(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'));
@@ -793,7 +812,7 @@
   buildCounterSecret++;
   if (buildCounterSecret < 3) {
     o.kmsKeyName = "foo";
-    o.secretEnv = buildUnnamed1481();
+    o.secretEnv = buildUnnamed1498();
   }
   buildCounterSecret--;
   return o;
@@ -803,7 +822,7 @@
   buildCounterSecret++;
   if (buildCounterSecret < 3) {
     unittest.expect(o.kmsKeyName, unittest.equals('foo'));
-    checkUnnamed1481(o.secretEnv);
+    checkUnnamed1498(o.secretEnv);
   }
   buildCounterSecret--;
 }
@@ -829,14 +848,14 @@
   buildCounterSource--;
 }
 
-buildUnnamed1482() {
+buildUnnamed1499() {
   var o = new core.Map<core.String, api.FileHashes>();
   o["x"] = buildFileHashes();
   o["y"] = buildFileHashes();
   return o;
 }
 
-checkUnnamed1482(core.Map<core.String, api.FileHashes> o) {
+checkUnnamed1499(core.Map<core.String, api.FileHashes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFileHashes(o["x"]);
   checkFileHashes(o["y"]);
@@ -847,7 +866,7 @@
   var o = new api.SourceProvenance();
   buildCounterSourceProvenance++;
   if (buildCounterSourceProvenance < 3) {
-    o.fileHashes = buildUnnamed1482();
+    o.fileHashes = buildUnnamed1499();
     o.resolvedRepoSource = buildRepoSource();
     o.resolvedStorageSource = buildStorageSource();
   }
@@ -858,14 +877,14 @@
 checkSourceProvenance(api.SourceProvenance o) {
   buildCounterSourceProvenance++;
   if (buildCounterSourceProvenance < 3) {
-    checkUnnamed1482(o.fileHashes);
+    checkUnnamed1499(o.fileHashes);
     checkRepoSource(o.resolvedRepoSource);
     checkStorageSource(o.resolvedStorageSource);
   }
   buildCounterSourceProvenance--;
 }
 
-buildUnnamed1483() {
+buildUnnamed1500() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -880,7 +899,7 @@
   return o;
 }
 
-checkUnnamed1483(core.Map<core.String, core.Object> o) {
+checkUnnamed1500(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -894,17 +913,17 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1484() {
+buildUnnamed1501() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1483());
-  o.add(buildUnnamed1483());
+  o.add(buildUnnamed1500());
+  o.add(buildUnnamed1500());
   return o;
 }
 
-checkUnnamed1484(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1501(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1483(o[0]);
-  checkUnnamed1483(o[1]);
+  checkUnnamed1500(o[0]);
+  checkUnnamed1500(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -913,7 +932,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1484();
+    o.details = buildUnnamed1501();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -924,7 +943,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1484(o.details);
+    checkUnnamed1501(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -953,6 +972,27 @@
   buildCounterStorageSource--;
 }
 
+core.int buildCounterTimeSpan = 0;
+buildTimeSpan() {
+  var o = new api.TimeSpan();
+  buildCounterTimeSpan++;
+  if (buildCounterTimeSpan < 3) {
+    o.endTime = "foo";
+    o.startTime = "foo";
+  }
+  buildCounterTimeSpan--;
+  return o;
+}
+
+checkTimeSpan(api.TimeSpan o) {
+  buildCounterTimeSpan++;
+  if (buildCounterTimeSpan < 3) {
+    unittest.expect(o.endTime, unittest.equals('foo'));
+    unittest.expect(o.startTime, unittest.equals('foo'));
+  }
+  buildCounterTimeSpan--;
+}
+
 core.int buildCounterVolume = 0;
 buildVolume() {
   var o = new api.Volume();
@@ -1159,6 +1199,14 @@
     });
   });
 
+  unittest.group("obj-schema-TimeSpan", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildTimeSpan();
+      var od = new api.TimeSpan.fromJson(o.toJson());
+      checkTimeSpan(od);
+    });
+  });
+
   unittest.group("obj-schema-Volume", () {
     unittest.test("to-json--from-json", () {
       var o = buildVolume();
@@ -1546,9 +1594,9 @@
       api.ProjectsBuildsResourceApi res =
           new api.CloudbuildApi(mock).projects.builds;
       var arg_projectId = "foo";
+      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_filter = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1589,11 +1637,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1604,9 +1652,9 @@
       }), true);
       res
           .list(arg_projectId,
+              filter: arg_filter,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
-              filter: arg_filter,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListBuildsResponse response) {
         checkListBuildsResponse(response);
diff --git a/generated/googleapis/test/clouddebugger/v2_test.dart b/generated/googleapis/test/clouddebugger/v2_test.dart
index bf9cc17..5fbd81a 100644
--- a/generated/googleapis/test/clouddebugger/v2_test.dart
+++ b/generated/googleapis/test/clouddebugger/v2_test.dart
@@ -71,66 +71,66 @@
   buildCounterAliasContext--;
 }
 
-buildUnnamed931() {
+buildUnnamed940() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed931(core.List<api.Variable> o) {
+checkUnnamed940(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
 }
 
-buildUnnamed932() {
+buildUnnamed941() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed932(core.List<core.String> o) {
+checkUnnamed941(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed933() {
+buildUnnamed942() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed933(core.Map<core.String, core.String> o) {
+checkUnnamed942(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'));
 }
 
-buildUnnamed934() {
+buildUnnamed943() {
   var o = new core.List<api.StackFrame>();
   o.add(buildStackFrame());
   o.add(buildStackFrame());
   return o;
 }
 
-checkUnnamed934(core.List<api.StackFrame> o) {
+checkUnnamed943(core.List<api.StackFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStackFrame(o[0]);
   checkStackFrame(o[1]);
 }
 
-buildUnnamed935() {
+buildUnnamed944() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed935(core.List<api.Variable> o) {
+checkUnnamed944(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
@@ -144,19 +144,19 @@
     o.action = "foo";
     o.condition = "foo";
     o.createTime = "foo";
-    o.evaluatedExpressions = buildUnnamed931();
-    o.expressions = buildUnnamed932();
+    o.evaluatedExpressions = buildUnnamed940();
+    o.expressions = buildUnnamed941();
     o.finalTime = "foo";
     o.id = "foo";
     o.isFinalState = true;
-    o.labels = buildUnnamed933();
+    o.labels = buildUnnamed942();
     o.location = buildSourceLocation();
     o.logLevel = "foo";
     o.logMessageFormat = "foo";
-    o.stackFrames = buildUnnamed934();
+    o.stackFrames = buildUnnamed943();
     o.status = buildStatusMessage();
     o.userEmail = "foo";
-    o.variableTable = buildUnnamed935();
+    o.variableTable = buildUnnamed944();
   }
   buildCounterBreakpoint--;
   return o;
@@ -168,19 +168,19 @@
     unittest.expect(o.action, unittest.equals('foo'));
     unittest.expect(o.condition, unittest.equals('foo'));
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkUnnamed931(o.evaluatedExpressions);
-    checkUnnamed932(o.expressions);
+    checkUnnamed940(o.evaluatedExpressions);
+    checkUnnamed941(o.expressions);
     unittest.expect(o.finalTime, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.isFinalState, unittest.isTrue);
-    checkUnnamed933(o.labels);
+    checkUnnamed942(o.labels);
     checkSourceLocation(o.location);
     unittest.expect(o.logLevel, unittest.equals('foo'));
     unittest.expect(o.logMessageFormat, unittest.equals('foo'));
-    checkUnnamed934(o.stackFrames);
+    checkUnnamed943(o.stackFrames);
     checkStatusMessage(o.status);
     unittest.expect(o.userEmail, unittest.equals('foo'));
-    checkUnnamed935(o.variableTable);
+    checkUnnamed944(o.variableTable);
   }
   buildCounterBreakpoint--;
 }
@@ -252,40 +252,40 @@
   buildCounterCloudWorkspaceSourceContext--;
 }
 
-buildUnnamed936() {
+buildUnnamed945() {
   var o = new core.List<api.ExtendedSourceContext>();
   o.add(buildExtendedSourceContext());
   o.add(buildExtendedSourceContext());
   return o;
 }
 
-checkUnnamed936(core.List<api.ExtendedSourceContext> o) {
+checkUnnamed945(core.List<api.ExtendedSourceContext> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExtendedSourceContext(o[0]);
   checkExtendedSourceContext(o[1]);
 }
 
-buildUnnamed937() {
+buildUnnamed946() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed937(core.Map<core.String, core.String> o) {
+checkUnnamed946(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'));
 }
 
-buildUnnamed938() {
+buildUnnamed947() {
   var o = new core.List<api.SourceContext>();
   o.add(buildSourceContext());
   o.add(buildSourceContext());
   return o;
 }
 
-checkUnnamed938(core.List<api.SourceContext> o) {
+checkUnnamed947(core.List<api.SourceContext> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSourceContext(o[0]);
   checkSourceContext(o[1]);
@@ -298,13 +298,13 @@
   if (buildCounterDebuggee < 3) {
     o.agentVersion = "foo";
     o.description = "foo";
-    o.extSourceContexts = buildUnnamed936();
+    o.extSourceContexts = buildUnnamed945();
     o.id = "foo";
     o.isDisabled = true;
     o.isInactive = true;
-    o.labels = buildUnnamed937();
+    o.labels = buildUnnamed946();
     o.project = "foo";
-    o.sourceContexts = buildUnnamed938();
+    o.sourceContexts = buildUnnamed947();
     o.status = buildStatusMessage();
     o.uniquifier = "foo";
   }
@@ -317,13 +317,13 @@
   if (buildCounterDebuggee < 3) {
     unittest.expect(o.agentVersion, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed936(o.extSourceContexts);
+    checkUnnamed945(o.extSourceContexts);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.isDisabled, unittest.isTrue);
     unittest.expect(o.isInactive, unittest.isTrue);
-    checkUnnamed937(o.labels);
+    checkUnnamed946(o.labels);
     unittest.expect(o.project, unittest.equals('foo'));
-    checkUnnamed938(o.sourceContexts);
+    checkUnnamed947(o.sourceContexts);
     checkStatusMessage(o.status);
     unittest.expect(o.uniquifier, unittest.equals('foo'));
   }
@@ -345,14 +345,14 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed939() {
+buildUnnamed948() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed939(core.Map<core.String, core.String> o) {
+checkUnnamed948(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'));
@@ -364,7 +364,7 @@
   buildCounterExtendedSourceContext++;
   if (buildCounterExtendedSourceContext < 3) {
     o.context = buildSourceContext();
-    o.labels = buildUnnamed939();
+    o.labels = buildUnnamed948();
   }
   buildCounterExtendedSourceContext--;
   return o;
@@ -374,19 +374,19 @@
   buildCounterExtendedSourceContext++;
   if (buildCounterExtendedSourceContext < 3) {
     checkSourceContext(o.context);
-    checkUnnamed939(o.labels);
+    checkUnnamed948(o.labels);
   }
   buildCounterExtendedSourceContext--;
 }
 
-buildUnnamed940() {
+buildUnnamed949() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed940(core.List<core.String> o) {
+checkUnnamed949(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -398,7 +398,7 @@
   buildCounterFormatMessage++;
   if (buildCounterFormatMessage < 3) {
     o.format = "foo";
-    o.parameters = buildUnnamed940();
+    o.parameters = buildUnnamed949();
   }
   buildCounterFormatMessage--;
   return o;
@@ -408,7 +408,7 @@
   buildCounterFormatMessage++;
   if (buildCounterFormatMessage < 3) {
     unittest.expect(o.format, unittest.equals('foo'));
-    checkUnnamed940(o.parameters);
+    checkUnnamed949(o.parameters);
   }
   buildCounterFormatMessage--;
 }
@@ -480,14 +480,14 @@
   buildCounterGitSourceContext--;
 }
 
-buildUnnamed941() {
+buildUnnamed950() {
   var o = new core.List<api.Breakpoint>();
   o.add(buildBreakpoint());
   o.add(buildBreakpoint());
   return o;
 }
 
-checkUnnamed941(core.List<api.Breakpoint> o) {
+checkUnnamed950(core.List<api.Breakpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBreakpoint(o[0]);
   checkBreakpoint(o[1]);
@@ -498,7 +498,7 @@
   var o = new api.ListActiveBreakpointsResponse();
   buildCounterListActiveBreakpointsResponse++;
   if (buildCounterListActiveBreakpointsResponse < 3) {
-    o.breakpoints = buildUnnamed941();
+    o.breakpoints = buildUnnamed950();
     o.nextWaitToken = "foo";
     o.waitExpired = true;
   }
@@ -509,21 +509,21 @@
 checkListActiveBreakpointsResponse(api.ListActiveBreakpointsResponse o) {
   buildCounterListActiveBreakpointsResponse++;
   if (buildCounterListActiveBreakpointsResponse < 3) {
-    checkUnnamed941(o.breakpoints);
+    checkUnnamed950(o.breakpoints);
     unittest.expect(o.nextWaitToken, unittest.equals('foo'));
     unittest.expect(o.waitExpired, unittest.isTrue);
   }
   buildCounterListActiveBreakpointsResponse--;
 }
 
-buildUnnamed942() {
+buildUnnamed951() {
   var o = new core.List<api.Breakpoint>();
   o.add(buildBreakpoint());
   o.add(buildBreakpoint());
   return o;
 }
 
-checkUnnamed942(core.List<api.Breakpoint> o) {
+checkUnnamed951(core.List<api.Breakpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBreakpoint(o[0]);
   checkBreakpoint(o[1]);
@@ -534,7 +534,7 @@
   var o = new api.ListBreakpointsResponse();
   buildCounterListBreakpointsResponse++;
   if (buildCounterListBreakpointsResponse < 3) {
-    o.breakpoints = buildUnnamed942();
+    o.breakpoints = buildUnnamed951();
     o.nextWaitToken = "foo";
   }
   buildCounterListBreakpointsResponse--;
@@ -544,20 +544,20 @@
 checkListBreakpointsResponse(api.ListBreakpointsResponse o) {
   buildCounterListBreakpointsResponse++;
   if (buildCounterListBreakpointsResponse < 3) {
-    checkUnnamed942(o.breakpoints);
+    checkUnnamed951(o.breakpoints);
     unittest.expect(o.nextWaitToken, unittest.equals('foo'));
   }
   buildCounterListBreakpointsResponse--;
 }
 
-buildUnnamed943() {
+buildUnnamed952() {
   var o = new core.List<api.Debuggee>();
   o.add(buildDebuggee());
   o.add(buildDebuggee());
   return o;
 }
 
-checkUnnamed943(core.List<api.Debuggee> o) {
+checkUnnamed952(core.List<api.Debuggee> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDebuggee(o[0]);
   checkDebuggee(o[1]);
@@ -568,7 +568,7 @@
   var o = new api.ListDebuggeesResponse();
   buildCounterListDebuggeesResponse++;
   if (buildCounterListDebuggeesResponse < 3) {
-    o.debuggees = buildUnnamed943();
+    o.debuggees = buildUnnamed952();
   }
   buildCounterListDebuggeesResponse--;
   return o;
@@ -577,7 +577,7 @@
 checkListDebuggeesResponse(api.ListDebuggeesResponse o) {
   buildCounterListDebuggeesResponse++;
   if (buildCounterListDebuggeesResponse < 3) {
-    checkUnnamed943(o.debuggees);
+    checkUnnamed952(o.debuggees);
   }
   buildCounterListDebuggeesResponse--;
 }
@@ -727,27 +727,27 @@
   buildCounterSourceLocation--;
 }
 
-buildUnnamed944() {
+buildUnnamed953() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed944(core.List<api.Variable> o) {
+checkUnnamed953(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
 }
 
-buildUnnamed945() {
+buildUnnamed954() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed945(core.List<api.Variable> o) {
+checkUnnamed954(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
@@ -758,9 +758,9 @@
   var o = new api.StackFrame();
   buildCounterStackFrame++;
   if (buildCounterStackFrame < 3) {
-    o.arguments = buildUnnamed944();
+    o.arguments = buildUnnamed953();
     o.function = "foo";
-    o.locals = buildUnnamed945();
+    o.locals = buildUnnamed954();
     o.location = buildSourceLocation();
   }
   buildCounterStackFrame--;
@@ -770,9 +770,9 @@
 checkStackFrame(api.StackFrame o) {
   buildCounterStackFrame++;
   if (buildCounterStackFrame < 3) {
-    checkUnnamed944(o.arguments);
+    checkUnnamed953(o.arguments);
     unittest.expect(o.function, unittest.equals('foo'));
-    checkUnnamed945(o.locals);
+    checkUnnamed954(o.locals);
     checkSourceLocation(o.location);
   }
   buildCounterStackFrame--;
@@ -835,14 +835,14 @@
   buildCounterUpdateActiveBreakpointResponse--;
 }
 
-buildUnnamed946() {
+buildUnnamed955() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed946(core.List<api.Variable> o) {
+checkUnnamed955(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
@@ -853,7 +853,7 @@
   var o = new api.Variable();
   buildCounterVariable++;
   if (buildCounterVariable < 3) {
-    o.members = buildUnnamed946();
+    o.members = buildUnnamed955();
     o.name = "foo";
     o.status = buildStatusMessage();
     o.type = "foo";
@@ -867,7 +867,7 @@
 checkVariable(api.Variable o) {
   buildCounterVariable++;
   if (buildCounterVariable < 3) {
-    checkUnnamed946(o.members);
+    checkUnnamed955(o.members);
     unittest.expect(o.name, unittest.equals('foo'));
     checkStatusMessage(o.status);
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1296,9 +1296,9 @@
       var mock = new HttpServerMock();
       api.DebuggerDebuggeesResourceApi res =
           new api.ClouddebuggerApi(mock).debugger.debuggees;
+      var arg_includeInactive = true;
       var arg_project = "foo";
       var arg_clientVersion = "foo";
-      var arg_includeInactive = true;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1330,12 +1330,12 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["includeInactive"].first,
+            unittest.equals("$arg_includeInactive"));
         unittest.expect(
             queryMap["project"].first, unittest.equals(arg_project));
         unittest.expect(queryMap["clientVersion"].first,
             unittest.equals(arg_clientVersion));
-        unittest.expect(queryMap["includeInactive"].first,
-            unittest.equals("$arg_includeInactive"));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1346,9 +1346,9 @@
       }), true);
       res
           .list(
+              includeInactive: arg_includeInactive,
               project: arg_project,
               clientVersion: arg_clientVersion,
-              includeInactive: arg_includeInactive,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListDebuggeesResponse response) {
         checkListDebuggeesResponse(response);
@@ -1498,12 +1498,12 @@
       api.DebuggerDebuggeesBreakpointsResourceApi res =
           new api.ClouddebuggerApi(mock).debugger.debuggees.breakpoints;
       var arg_debuggeeId = "foo";
+      var arg_waitToken = "foo";
       var arg_clientVersion = "foo";
       var arg_action_value = "foo";
       var arg_includeInactive = true;
       var arg_includeAllUsers = true;
       var arg_stripResults = true;
-      var arg_waitToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1544,6 +1544,8 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(
+            queryMap["waitToken"].first, unittest.equals(arg_waitToken));
         unittest.expect(queryMap["clientVersion"].first,
             unittest.equals(arg_clientVersion));
         unittest.expect(
@@ -1554,8 +1556,6 @@
             unittest.equals("$arg_includeAllUsers"));
         unittest.expect(queryMap["stripResults"].first,
             unittest.equals("$arg_stripResults"));
-        unittest.expect(
-            queryMap["waitToken"].first, unittest.equals(arg_waitToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1566,12 +1566,12 @@
       }), true);
       res
           .list(arg_debuggeeId,
+              waitToken: arg_waitToken,
               clientVersion: arg_clientVersion,
               action_value: arg_action_value,
               includeInactive: arg_includeInactive,
               includeAllUsers: arg_includeAllUsers,
               stripResults: arg_stripResults,
-              waitToken: arg_waitToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListBreakpointsResponse response) {
         checkListBreakpointsResponse(response);
diff --git a/generated/googleapis/test/cloudfunctions/v1_test.dart b/generated/googleapis/test/cloudfunctions/v1_test.dart
index 7d8e03f..39a35ac 100644
--- a/generated/googleapis/test/cloudfunctions/v1_test.dart
+++ b/generated/googleapis/test/cloudfunctions/v1_test.dart
@@ -92,14 +92,14 @@
   buildCounterCallFunctionResponse--;
 }
 
-buildUnnamed126() {
+buildUnnamed120() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed126(core.Map<core.String, core.String> o) {
+checkUnnamed120(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'));
@@ -115,7 +115,7 @@
     o.entryPoint = "foo";
     o.eventTrigger = buildEventTrigger();
     o.httpsTrigger = buildHttpsTrigger();
-    o.labels = buildUnnamed126();
+    o.labels = buildUnnamed120();
     o.name = "foo";
     o.serviceAccountEmail = "foo";
     o.sourceArchiveUrl = "foo";
@@ -138,7 +138,7 @@
     unittest.expect(o.entryPoint, unittest.equals('foo'));
     checkEventTrigger(o.eventTrigger);
     checkHttpsTrigger(o.httpsTrigger);
-    checkUnnamed126(o.labels);
+    checkUnnamed120(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.serviceAccountEmail, unittest.equals('foo'));
     unittest.expect(o.sourceArchiveUrl, unittest.equals('foo'));
@@ -287,14 +287,14 @@
   buildCounterHttpsTrigger--;
 }
 
-buildUnnamed127() {
+buildUnnamed121() {
   var o = new core.List<api.CloudFunction>();
   o.add(buildCloudFunction());
   o.add(buildCloudFunction());
   return o;
 }
 
-checkUnnamed127(core.List<api.CloudFunction> o) {
+checkUnnamed121(core.List<api.CloudFunction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCloudFunction(o[0]);
   checkCloudFunction(o[1]);
@@ -305,7 +305,7 @@
   var o = new api.ListFunctionsResponse();
   buildCounterListFunctionsResponse++;
   if (buildCounterListFunctionsResponse < 3) {
-    o.functions = buildUnnamed127();
+    o.functions = buildUnnamed121();
     o.nextPageToken = "foo";
   }
   buildCounterListFunctionsResponse--;
@@ -315,20 +315,20 @@
 checkListFunctionsResponse(api.ListFunctionsResponse o) {
   buildCounterListFunctionsResponse++;
   if (buildCounterListFunctionsResponse < 3) {
-    checkUnnamed127(o.functions);
+    checkUnnamed121(o.functions);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListFunctionsResponse--;
 }
 
-buildUnnamed128() {
+buildUnnamed122() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed128(core.List<api.Location> o) {
+checkUnnamed122(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
@@ -339,7 +339,7 @@
   var o = new api.ListLocationsResponse();
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    o.locations = buildUnnamed128();
+    o.locations = buildUnnamed122();
     o.nextPageToken = "foo";
   }
   buildCounterListLocationsResponse--;
@@ -349,20 +349,20 @@
 checkListLocationsResponse(api.ListLocationsResponse o) {
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    checkUnnamed128(o.locations);
+    checkUnnamed122(o.locations);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListLocationsResponse--;
 }
 
-buildUnnamed129() {
+buildUnnamed123() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed129(core.List<api.Operation> o) {
+checkUnnamed123(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -374,7 +374,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed129();
+    o.operations = buildUnnamed123();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -384,25 +384,25 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed129(o.operations);
+    checkUnnamed123(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed130() {
+buildUnnamed124() {
   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) {
+checkUnnamed124(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'));
 }
 
-buildUnnamed131() {
+buildUnnamed125() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -417,7 +417,7 @@
   return o;
 }
 
-checkUnnamed131(core.Map<core.String, core.Object> o) {
+checkUnnamed125(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));
@@ -436,9 +436,9 @@
   var o = new api.Location();
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    o.labels = buildUnnamed130();
+    o.labels = buildUnnamed124();
     o.locationId = "foo";
-    o.metadata = buildUnnamed131();
+    o.metadata = buildUnnamed125();
     o.name = "foo";
   }
   buildCounterLocation--;
@@ -448,15 +448,15 @@
 checkLocation(api.Location o) {
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    checkUnnamed130(o.labels);
+    checkUnnamed124(o.labels);
     unittest.expect(o.locationId, unittest.equals('foo'));
-    checkUnnamed131(o.metadata);
+    checkUnnamed125(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterLocation--;
 }
 
-buildUnnamed132() {
+buildUnnamed126() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -471,7 +471,7 @@
   return o;
 }
 
-checkUnnamed132(core.Map<core.String, core.Object> o) {
+checkUnnamed126(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -485,7 +485,7 @@
   unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed133() {
+buildUnnamed127() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -500,7 +500,7 @@
   return o;
 }
 
-checkUnnamed133(core.Map<core.String, core.Object> o) {
+checkUnnamed127(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -521,9 +521,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed132();
+    o.metadata = buildUnnamed126();
     o.name = "foo";
-    o.response = buildUnnamed133();
+    o.response = buildUnnamed127();
   }
   buildCounterOperation--;
   return o;
@@ -534,14 +534,14 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed132(o.metadata);
+    checkUnnamed126(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed133(o.response);
+    checkUnnamed127(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed134() {
+buildUnnamed128() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -556,7 +556,7 @@
   return o;
 }
 
-checkUnnamed134(core.Map<core.String, core.Object> o) {
+checkUnnamed128(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o["x"]) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -575,7 +575,7 @@
   var o = new api.OperationMetadataV1();
   buildCounterOperationMetadataV1++;
   if (buildCounterOperationMetadataV1 < 3) {
-    o.request = buildUnnamed134();
+    o.request = buildUnnamed128();
     o.target = "foo";
     o.type = "foo";
     o.updateTime = "foo";
@@ -588,7 +588,7 @@
 checkOperationMetadataV1(api.OperationMetadataV1 o) {
   buildCounterOperationMetadataV1++;
   if (buildCounterOperationMetadataV1 < 3) {
-    checkUnnamed134(o.request);
+    checkUnnamed128(o.request);
     unittest.expect(o.target, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
@@ -597,7 +597,7 @@
   buildCounterOperationMetadataV1--;
 }
 
-buildUnnamed135() {
+buildUnnamed129() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -612,7 +612,7 @@
   return o;
 }
 
-checkUnnamed135(core.Map<core.String, core.Object> o) {
+checkUnnamed129(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted9 = (o["x"]) as core.Map;
   unittest.expect(casted9, unittest.hasLength(3));
@@ -631,7 +631,7 @@
   var o = new api.OperationMetadataV1Beta2();
   buildCounterOperationMetadataV1Beta2++;
   if (buildCounterOperationMetadataV1Beta2 < 3) {
-    o.request = buildUnnamed135();
+    o.request = buildUnnamed129();
     o.target = "foo";
     o.type = "foo";
     o.updateTime = "foo";
@@ -644,7 +644,7 @@
 checkOperationMetadataV1Beta2(api.OperationMetadataV1Beta2 o) {
   buildCounterOperationMetadataV1Beta2++;
   if (buildCounterOperationMetadataV1Beta2 < 3) {
-    checkUnnamed135(o.request);
+    checkUnnamed129(o.request);
     unittest.expect(o.target, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
@@ -689,7 +689,7 @@
   buildCounterSourceRepository--;
 }
 
-buildUnnamed136() {
+buildUnnamed130() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -704,7 +704,7 @@
   return o;
 }
 
-checkUnnamed136(core.Map<core.String, core.Object> o) {
+checkUnnamed130(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted11 = (o["x"]) as core.Map;
   unittest.expect(casted11, unittest.hasLength(3));
@@ -718,17 +718,17 @@
   unittest.expect(casted12["string"], unittest.equals('foo'));
 }
 
-buildUnnamed137() {
+buildUnnamed131() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed136());
-  o.add(buildUnnamed136());
+  o.add(buildUnnamed130());
+  o.add(buildUnnamed130());
   return o;
 }
 
-checkUnnamed137(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed131(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed136(o[0]);
-  checkUnnamed136(o[1]);
+  checkUnnamed130(o[0]);
+  checkUnnamed130(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -737,7 +737,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed137();
+    o.details = buildUnnamed131();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -748,7 +748,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed137(o.details);
+    checkUnnamed131(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -972,10 +972,10 @@
       var mock = new HttpServerMock();
       api.OperationsResourceApi res =
           new api.CloudfunctionsApi(mock).operations;
+      var arg_filter = "foo";
       var arg_name = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_filter = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1007,12 +1007,12 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(queryMap["name"].first, unittest.equals(arg_name));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1023,10 +1023,10 @@
       }), true);
       res
           .list(
+              filter: arg_filter,
               name: arg_name,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
-              filter: arg_filter,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
@@ -1040,9 +1040,9 @@
       api.ProjectsLocationsResourceApi res =
           new api.CloudfunctionsApi(mock).projects.locations;
       var arg_name = "foo";
-      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_filter = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1075,11 +1075,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1090,9 +1090,9 @@
       }), true);
       res
           .list(arg_name,
-              filter: arg_filter,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              filter: arg_filter,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListLocationsResponse response) {
         checkListLocationsResponse(response);
diff --git a/generated/googleapis/test/cloudiot/v1_test.dart b/generated/googleapis/test/cloudiot/v1_test.dart
index 413d83e..39a4913 100644
--- a/generated/googleapis/test/cloudiot/v1_test.dart
+++ b/generated/googleapis/test/cloudiot/v1_test.dart
@@ -50,27 +50,27 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed263() {
+buildUnnamed257() {
   var o = new core.List<api.AuditLogConfig>();
   o.add(buildAuditLogConfig());
   o.add(buildAuditLogConfig());
   return o;
 }
 
-checkUnnamed263(core.List<api.AuditLogConfig> o) {
+checkUnnamed257(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditLogConfig(o[0]);
   checkAuditLogConfig(o[1]);
 }
 
-buildUnnamed264() {
+buildUnnamed258() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed264(core.List<core.String> o) {
+checkUnnamed258(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -81,8 +81,8 @@
   var o = new api.AuditConfig();
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed263();
-    o.exemptedMembers = buildUnnamed264();
+    o.auditLogConfigs = buildUnnamed257();
+    o.exemptedMembers = buildUnnamed258();
     o.service = "foo";
   }
   buildCounterAuditConfig--;
@@ -92,21 +92,21 @@
 checkAuditConfig(api.AuditConfig o) {
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    checkUnnamed263(o.auditLogConfigs);
-    checkUnnamed264(o.exemptedMembers);
+    checkUnnamed257(o.auditLogConfigs);
+    checkUnnamed258(o.exemptedMembers);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterAuditConfig--;
 }
 
-buildUnnamed265() {
+buildUnnamed259() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed265(core.List<core.String> o) {
+checkUnnamed259(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -117,7 +117,7 @@
   var o = new api.AuditLogConfig();
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed265();
+    o.exemptedMembers = buildUnnamed259();
     o.logType = "foo";
   }
   buildCounterAuditLogConfig--;
@@ -127,20 +127,20 @@
 checkAuditLogConfig(api.AuditLogConfig o) {
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed265(o.exemptedMembers);
+    checkUnnamed259(o.exemptedMembers);
     unittest.expect(o.logType, unittest.equals('foo'));
   }
   buildCounterAuditLogConfig--;
 }
 
-buildUnnamed266() {
+buildUnnamed260() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed266(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'));
@@ -152,7 +152,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     o.condition = buildExpr();
-    o.members = buildUnnamed266();
+    o.members = buildUnnamed260();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -163,33 +163,33 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     checkExpr(o.condition);
-    checkUnnamed266(o.members);
+    checkUnnamed260(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
 }
 
-buildUnnamed267() {
+buildUnnamed261() {
   var o = new core.List<api.DeviceCredential>();
   o.add(buildDeviceCredential());
   o.add(buildDeviceCredential());
   return o;
 }
 
-checkUnnamed267(core.List<api.DeviceCredential> o) {
+checkUnnamed261(core.List<api.DeviceCredential> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeviceCredential(o[0]);
   checkDeviceCredential(o[1]);
 }
 
-buildUnnamed268() {
+buildUnnamed262() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed268(core.Map<core.String, core.String> o) {
+checkUnnamed262(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'));
@@ -202,7 +202,7 @@
   if (buildCounterDevice < 3) {
     o.blocked = true;
     o.config = buildDeviceConfig();
-    o.credentials = buildUnnamed267();
+    o.credentials = buildUnnamed261();
     o.id = "foo";
     o.lastConfigAckTime = "foo";
     o.lastConfigSendTime = "foo";
@@ -211,7 +211,7 @@
     o.lastEventTime = "foo";
     o.lastHeartbeatTime = "foo";
     o.lastStateTime = "foo";
-    o.metadata = buildUnnamed268();
+    o.metadata = buildUnnamed262();
     o.name = "foo";
     o.numId = "foo";
     o.state = buildDeviceState();
@@ -225,7 +225,7 @@
   if (buildCounterDevice < 3) {
     unittest.expect(o.blocked, unittest.isTrue);
     checkDeviceConfig(o.config);
-    checkUnnamed267(o.credentials);
+    checkUnnamed261(o.credentials);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastConfigAckTime, unittest.equals('foo'));
     unittest.expect(o.lastConfigSendTime, unittest.equals('foo'));
@@ -234,7 +234,7 @@
     unittest.expect(o.lastEventTime, unittest.equals('foo'));
     unittest.expect(o.lastHeartbeatTime, unittest.equals('foo'));
     unittest.expect(o.lastStateTime, unittest.equals('foo'));
-    checkUnnamed268(o.metadata);
+    checkUnnamed262(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.numId, unittest.equals('foo'));
     checkDeviceState(o.state);
@@ -288,27 +288,27 @@
   buildCounterDeviceCredential--;
 }
 
-buildUnnamed269() {
+buildUnnamed263() {
   var o = new core.List<api.RegistryCredential>();
   o.add(buildRegistryCredential());
   o.add(buildRegistryCredential());
   return o;
 }
 
-checkUnnamed269(core.List<api.RegistryCredential> o) {
+checkUnnamed263(core.List<api.RegistryCredential> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegistryCredential(o[0]);
   checkRegistryCredential(o[1]);
 }
 
-buildUnnamed270() {
+buildUnnamed264() {
   var o = new core.List<api.EventNotificationConfig>();
   o.add(buildEventNotificationConfig());
   o.add(buildEventNotificationConfig());
   return o;
 }
 
-checkUnnamed270(core.List<api.EventNotificationConfig> o) {
+checkUnnamed264(core.List<api.EventNotificationConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventNotificationConfig(o[0]);
   checkEventNotificationConfig(o[1]);
@@ -319,8 +319,8 @@
   var o = new api.DeviceRegistry();
   buildCounterDeviceRegistry++;
   if (buildCounterDeviceRegistry < 3) {
-    o.credentials = buildUnnamed269();
-    o.eventNotificationConfigs = buildUnnamed270();
+    o.credentials = buildUnnamed263();
+    o.eventNotificationConfigs = buildUnnamed264();
     o.httpConfig = buildHttpConfig();
     o.id = "foo";
     o.mqttConfig = buildMqttConfig();
@@ -334,8 +334,8 @@
 checkDeviceRegistry(api.DeviceRegistry o) {
   buildCounterDeviceRegistry++;
   if (buildCounterDeviceRegistry < 3) {
-    checkUnnamed269(o.credentials);
-    checkUnnamed270(o.eventNotificationConfigs);
+    checkUnnamed263(o.credentials);
+    checkUnnamed264(o.eventNotificationConfigs);
     checkHttpConfig(o.httpConfig);
     unittest.expect(o.id, unittest.equals('foo'));
     checkMqttConfig(o.mqttConfig);
@@ -459,14 +459,14 @@
   buildCounterHttpConfig--;
 }
 
-buildUnnamed271() {
+buildUnnamed265() {
   var o = new core.List<api.DeviceConfig>();
   o.add(buildDeviceConfig());
   o.add(buildDeviceConfig());
   return o;
 }
 
-checkUnnamed271(core.List<api.DeviceConfig> o) {
+checkUnnamed265(core.List<api.DeviceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeviceConfig(o[0]);
   checkDeviceConfig(o[1]);
@@ -477,7 +477,7 @@
   var o = new api.ListDeviceConfigVersionsResponse();
   buildCounterListDeviceConfigVersionsResponse++;
   if (buildCounterListDeviceConfigVersionsResponse < 3) {
-    o.deviceConfigs = buildUnnamed271();
+    o.deviceConfigs = buildUnnamed265();
   }
   buildCounterListDeviceConfigVersionsResponse--;
   return o;
@@ -486,19 +486,19 @@
 checkListDeviceConfigVersionsResponse(api.ListDeviceConfigVersionsResponse o) {
   buildCounterListDeviceConfigVersionsResponse++;
   if (buildCounterListDeviceConfigVersionsResponse < 3) {
-    checkUnnamed271(o.deviceConfigs);
+    checkUnnamed265(o.deviceConfigs);
   }
   buildCounterListDeviceConfigVersionsResponse--;
 }
 
-buildUnnamed272() {
+buildUnnamed266() {
   var o = new core.List<api.DeviceRegistry>();
   o.add(buildDeviceRegistry());
   o.add(buildDeviceRegistry());
   return o;
 }
 
-checkUnnamed272(core.List<api.DeviceRegistry> o) {
+checkUnnamed266(core.List<api.DeviceRegistry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeviceRegistry(o[0]);
   checkDeviceRegistry(o[1]);
@@ -509,7 +509,7 @@
   var o = new api.ListDeviceRegistriesResponse();
   buildCounterListDeviceRegistriesResponse++;
   if (buildCounterListDeviceRegistriesResponse < 3) {
-    o.deviceRegistries = buildUnnamed272();
+    o.deviceRegistries = buildUnnamed266();
     o.nextPageToken = "foo";
   }
   buildCounterListDeviceRegistriesResponse--;
@@ -519,20 +519,20 @@
 checkListDeviceRegistriesResponse(api.ListDeviceRegistriesResponse o) {
   buildCounterListDeviceRegistriesResponse++;
   if (buildCounterListDeviceRegistriesResponse < 3) {
-    checkUnnamed272(o.deviceRegistries);
+    checkUnnamed266(o.deviceRegistries);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDeviceRegistriesResponse--;
 }
 
-buildUnnamed273() {
+buildUnnamed267() {
   var o = new core.List<api.DeviceState>();
   o.add(buildDeviceState());
   o.add(buildDeviceState());
   return o;
 }
 
-checkUnnamed273(core.List<api.DeviceState> o) {
+checkUnnamed267(core.List<api.DeviceState> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeviceState(o[0]);
   checkDeviceState(o[1]);
@@ -543,7 +543,7 @@
   var o = new api.ListDeviceStatesResponse();
   buildCounterListDeviceStatesResponse++;
   if (buildCounterListDeviceStatesResponse < 3) {
-    o.deviceStates = buildUnnamed273();
+    o.deviceStates = buildUnnamed267();
   }
   buildCounterListDeviceStatesResponse--;
   return o;
@@ -552,19 +552,19 @@
 checkListDeviceStatesResponse(api.ListDeviceStatesResponse o) {
   buildCounterListDeviceStatesResponse++;
   if (buildCounterListDeviceStatesResponse < 3) {
-    checkUnnamed273(o.deviceStates);
+    checkUnnamed267(o.deviceStates);
   }
   buildCounterListDeviceStatesResponse--;
 }
 
-buildUnnamed274() {
+buildUnnamed268() {
   var o = new core.List<api.Device>();
   o.add(buildDevice());
   o.add(buildDevice());
   return o;
 }
 
-checkUnnamed274(core.List<api.Device> o) {
+checkUnnamed268(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDevice(o[0]);
   checkDevice(o[1]);
@@ -575,7 +575,7 @@
   var o = new api.ListDevicesResponse();
   buildCounterListDevicesResponse++;
   if (buildCounterListDevicesResponse < 3) {
-    o.devices = buildUnnamed274();
+    o.devices = buildUnnamed268();
     o.nextPageToken = "foo";
   }
   buildCounterListDevicesResponse--;
@@ -585,7 +585,7 @@
 checkListDevicesResponse(api.ListDevicesResponse o) {
   buildCounterListDevicesResponse++;
   if (buildCounterListDevicesResponse < 3) {
-    checkUnnamed274(o.devices);
+    checkUnnamed268(o.devices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDevicesResponse--;
@@ -631,27 +631,27 @@
   buildCounterMqttConfig--;
 }
 
-buildUnnamed275() {
+buildUnnamed269() {
   var o = new core.List<api.AuditConfig>();
   o.add(buildAuditConfig());
   o.add(buildAuditConfig());
   return o;
 }
 
-checkUnnamed275(core.List<api.AuditConfig> o) {
+checkUnnamed269(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditConfig(o[0]);
   checkAuditConfig(o[1]);
 }
 
-buildUnnamed276() {
+buildUnnamed270() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed276(core.List<api.Binding> o) {
+checkUnnamed270(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -662,8 +662,8 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed275();
-    o.bindings = buildUnnamed276();
+    o.auditConfigs = buildUnnamed269();
+    o.bindings = buildUnnamed270();
     o.etag = "foo";
     o.iamOwned = true;
     o.version = 42;
@@ -675,8 +675,8 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed275(o.auditConfigs);
-    checkUnnamed276(o.bindings);
+    checkUnnamed269(o.auditConfigs);
+    checkUnnamed270(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.iamOwned, unittest.isTrue);
     unittest.expect(o.version, unittest.equals(42));
@@ -787,7 +787,7 @@
   buildCounterStateNotificationConfig--;
 }
 
-buildUnnamed277() {
+buildUnnamed271() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -802,7 +802,7 @@
   return o;
 }
 
-checkUnnamed277(core.Map<core.String, core.Object> o) {
+checkUnnamed271(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));
@@ -816,17 +816,17 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed278() {
+buildUnnamed272() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed277());
-  o.add(buildUnnamed277());
+  o.add(buildUnnamed271());
+  o.add(buildUnnamed271());
   return o;
 }
 
-checkUnnamed278(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed272(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed277(o[0]);
-  checkUnnamed277(o[1]);
+  checkUnnamed271(o[0]);
+  checkUnnamed271(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -835,7 +835,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed278();
+    o.details = buildUnnamed272();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -846,20 +846,20 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed278(o.details);
+    checkUnnamed272(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-buildUnnamed279() {
+buildUnnamed273() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed279(core.List<core.String> o) {
+checkUnnamed273(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -870,7 +870,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed279();
+    o.permissions = buildUnnamed273();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -879,19 +879,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed279(o.permissions);
+    checkUnnamed273(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed280() {
+buildUnnamed274() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed280(core.List<core.String> o) {
+checkUnnamed274(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -902,7 +902,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed280();
+    o.permissions = buildUnnamed274();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -911,7 +911,7 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed280(o.permissions);
+    checkUnnamed274(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
@@ -945,27 +945,27 @@
   buildCounterX509CertificateDetails--;
 }
 
-buildUnnamed281() {
+buildUnnamed275() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed281(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'));
 }
 
-buildUnnamed282() {
+buildUnnamed276() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed282(core.List<core.String> o) {
+checkUnnamed276(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1826,11 +1826,11 @@
       api.ProjectsLocationsRegistriesDevicesResourceApi res =
           new api.CloudiotApi(mock).projects.locations.registries.devices;
       var arg_parent = "foo";
-      var arg_deviceIds = buildUnnamed281();
-      var arg_deviceNumIds = buildUnnamed282();
       var arg_pageToken = "foo";
       var arg_fieldMask = "foo";
       var arg_pageSize = 42;
+      var arg_deviceIds = buildUnnamed275();
+      var arg_deviceNumIds = buildUnnamed276();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1863,15 +1863,15 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["deviceIds"], unittest.equals(arg_deviceIds));
-        unittest.expect(
-            queryMap["deviceNumIds"], unittest.equals(arg_deviceNumIds));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(
             queryMap["fieldMask"].first, unittest.equals(arg_fieldMask));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["deviceIds"], unittest.equals(arg_deviceIds));
+        unittest.expect(
+            queryMap["deviceNumIds"], unittest.equals(arg_deviceNumIds));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1882,11 +1882,11 @@
       }), true);
       res
           .list(arg_parent,
-              deviceIds: arg_deviceIds,
-              deviceNumIds: arg_deviceNumIds,
               pageToken: arg_pageToken,
               fieldMask: arg_fieldMask,
               pageSize: arg_pageSize,
+              deviceIds: arg_deviceIds,
+              deviceNumIds: arg_deviceNumIds,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListDevicesResponse response) {
         checkListDevicesResponse(response);
diff --git a/generated/googleapis/test/cloudkms/v1_test.dart b/generated/googleapis/test/cloudkms/v1_test.dart
index 28077b1..4e59fdb 100644
--- a/generated/googleapis/test/cloudkms/v1_test.dart
+++ b/generated/googleapis/test/cloudkms/v1_test.dart
@@ -50,27 +50,27 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1435() {
+buildUnnamed1451() {
   var o = new core.List<api.AuditLogConfig>();
   o.add(buildAuditLogConfig());
   o.add(buildAuditLogConfig());
   return o;
 }
 
-checkUnnamed1435(core.List<api.AuditLogConfig> o) {
+checkUnnamed1451(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditLogConfig(o[0]);
   checkAuditLogConfig(o[1]);
 }
 
-buildUnnamed1436() {
+buildUnnamed1452() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1436(core.List<core.String> o) {
+checkUnnamed1452(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -81,8 +81,8 @@
   var o = new api.AuditConfig();
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed1435();
-    o.exemptedMembers = buildUnnamed1436();
+    o.auditLogConfigs = buildUnnamed1451();
+    o.exemptedMembers = buildUnnamed1452();
     o.service = "foo";
   }
   buildCounterAuditConfig--;
@@ -92,21 +92,21 @@
 checkAuditConfig(api.AuditConfig o) {
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    checkUnnamed1435(o.auditLogConfigs);
-    checkUnnamed1436(o.exemptedMembers);
+    checkUnnamed1451(o.auditLogConfigs);
+    checkUnnamed1452(o.exemptedMembers);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterAuditConfig--;
 }
 
-buildUnnamed1437() {
+buildUnnamed1453() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1437(core.List<core.String> o) {
+checkUnnamed1453(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -117,7 +117,7 @@
   var o = new api.AuditLogConfig();
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed1437();
+    o.exemptedMembers = buildUnnamed1453();
     o.logType = "foo";
   }
   buildCounterAuditLogConfig--;
@@ -127,20 +127,20 @@
 checkAuditLogConfig(api.AuditLogConfig o) {
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed1437(o.exemptedMembers);
+    checkUnnamed1453(o.exemptedMembers);
     unittest.expect(o.logType, unittest.equals('foo'));
   }
   buildCounterAuditLogConfig--;
 }
 
-buildUnnamed1438() {
+buildUnnamed1454() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1438(core.List<core.String> o) {
+checkUnnamed1454(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -152,7 +152,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     o.condition = buildExpr();
-    o.members = buildUnnamed1438();
+    o.members = buildUnnamed1454();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -163,20 +163,20 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     checkExpr(o.condition);
-    checkUnnamed1438(o.members);
+    checkUnnamed1454(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
 }
 
-buildUnnamed1439() {
+buildUnnamed1455() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1439(core.Map<core.String, core.String> o) {
+checkUnnamed1455(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'));
@@ -188,7 +188,7 @@
   buildCounterCryptoKey++;
   if (buildCounterCryptoKey < 3) {
     o.createTime = "foo";
-    o.labels = buildUnnamed1439();
+    o.labels = buildUnnamed1455();
     o.name = "foo";
     o.nextRotationTime = "foo";
     o.primary = buildCryptoKeyVersion();
@@ -203,7 +203,7 @@
   buildCounterCryptoKey++;
   if (buildCounterCryptoKey < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkUnnamed1439(o.labels);
+    checkUnnamed1455(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nextRotationTime, unittest.equals('foo'));
     checkCryptoKeyVersion(o.primary);
@@ -383,14 +383,14 @@
   buildCounterKeyRing--;
 }
 
-buildUnnamed1440() {
+buildUnnamed1456() {
   var o = new core.List<api.CryptoKeyVersion>();
   o.add(buildCryptoKeyVersion());
   o.add(buildCryptoKeyVersion());
   return o;
 }
 
-checkUnnamed1440(core.List<api.CryptoKeyVersion> o) {
+checkUnnamed1456(core.List<api.CryptoKeyVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCryptoKeyVersion(o[0]);
   checkCryptoKeyVersion(o[1]);
@@ -401,7 +401,7 @@
   var o = new api.ListCryptoKeyVersionsResponse();
   buildCounterListCryptoKeyVersionsResponse++;
   if (buildCounterListCryptoKeyVersionsResponse < 3) {
-    o.cryptoKeyVersions = buildUnnamed1440();
+    o.cryptoKeyVersions = buildUnnamed1456();
     o.nextPageToken = "foo";
     o.totalSize = 42;
   }
@@ -412,21 +412,21 @@
 checkListCryptoKeyVersionsResponse(api.ListCryptoKeyVersionsResponse o) {
   buildCounterListCryptoKeyVersionsResponse++;
   if (buildCounterListCryptoKeyVersionsResponse < 3) {
-    checkUnnamed1440(o.cryptoKeyVersions);
+    checkUnnamed1456(o.cryptoKeyVersions);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterListCryptoKeyVersionsResponse--;
 }
 
-buildUnnamed1441() {
+buildUnnamed1457() {
   var o = new core.List<api.CryptoKey>();
   o.add(buildCryptoKey());
   o.add(buildCryptoKey());
   return o;
 }
 
-checkUnnamed1441(core.List<api.CryptoKey> o) {
+checkUnnamed1457(core.List<api.CryptoKey> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCryptoKey(o[0]);
   checkCryptoKey(o[1]);
@@ -437,7 +437,7 @@
   var o = new api.ListCryptoKeysResponse();
   buildCounterListCryptoKeysResponse++;
   if (buildCounterListCryptoKeysResponse < 3) {
-    o.cryptoKeys = buildUnnamed1441();
+    o.cryptoKeys = buildUnnamed1457();
     o.nextPageToken = "foo";
     o.totalSize = 42;
   }
@@ -448,21 +448,21 @@
 checkListCryptoKeysResponse(api.ListCryptoKeysResponse o) {
   buildCounterListCryptoKeysResponse++;
   if (buildCounterListCryptoKeysResponse < 3) {
-    checkUnnamed1441(o.cryptoKeys);
+    checkUnnamed1457(o.cryptoKeys);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterListCryptoKeysResponse--;
 }
 
-buildUnnamed1442() {
+buildUnnamed1458() {
   var o = new core.List<api.KeyRing>();
   o.add(buildKeyRing());
   o.add(buildKeyRing());
   return o;
 }
 
-checkUnnamed1442(core.List<api.KeyRing> o) {
+checkUnnamed1458(core.List<api.KeyRing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKeyRing(o[0]);
   checkKeyRing(o[1]);
@@ -473,7 +473,7 @@
   var o = new api.ListKeyRingsResponse();
   buildCounterListKeyRingsResponse++;
   if (buildCounterListKeyRingsResponse < 3) {
-    o.keyRings = buildUnnamed1442();
+    o.keyRings = buildUnnamed1458();
     o.nextPageToken = "foo";
     o.totalSize = 42;
   }
@@ -484,21 +484,21 @@
 checkListKeyRingsResponse(api.ListKeyRingsResponse o) {
   buildCounterListKeyRingsResponse++;
   if (buildCounterListKeyRingsResponse < 3) {
-    checkUnnamed1442(o.keyRings);
+    checkUnnamed1458(o.keyRings);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterListKeyRingsResponse--;
 }
 
-buildUnnamed1443() {
+buildUnnamed1459() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed1443(core.List<api.Location> o) {
+checkUnnamed1459(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
@@ -509,7 +509,7 @@
   var o = new api.ListLocationsResponse();
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    o.locations = buildUnnamed1443();
+    o.locations = buildUnnamed1459();
     o.nextPageToken = "foo";
   }
   buildCounterListLocationsResponse--;
@@ -519,26 +519,26 @@
 checkListLocationsResponse(api.ListLocationsResponse o) {
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    checkUnnamed1443(o.locations);
+    checkUnnamed1459(o.locations);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListLocationsResponse--;
 }
 
-buildUnnamed1444() {
+buildUnnamed1460() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1444(core.Map<core.String, core.String> o) {
+checkUnnamed1460(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'));
 }
 
-buildUnnamed1445() {
+buildUnnamed1461() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -553,7 +553,7 @@
   return o;
 }
 
-checkUnnamed1445(core.Map<core.String, core.Object> o) {
+checkUnnamed1461(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));
@@ -572,9 +572,9 @@
   var o = new api.Location();
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    o.labels = buildUnnamed1444();
+    o.labels = buildUnnamed1460();
     o.locationId = "foo";
-    o.metadata = buildUnnamed1445();
+    o.metadata = buildUnnamed1461();
     o.name = "foo";
   }
   buildCounterLocation--;
@@ -584,35 +584,35 @@
 checkLocation(api.Location o) {
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    checkUnnamed1444(o.labels);
+    checkUnnamed1460(o.labels);
     unittest.expect(o.locationId, unittest.equals('foo'));
-    checkUnnamed1445(o.metadata);
+    checkUnnamed1461(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterLocation--;
 }
 
-buildUnnamed1446() {
+buildUnnamed1462() {
   var o = new core.List<api.AuditConfig>();
   o.add(buildAuditConfig());
   o.add(buildAuditConfig());
   return o;
 }
 
-checkUnnamed1446(core.List<api.AuditConfig> o) {
+checkUnnamed1462(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditConfig(o[0]);
   checkAuditConfig(o[1]);
 }
 
-buildUnnamed1447() {
+buildUnnamed1463() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed1447(core.List<api.Binding> o) {
+checkUnnamed1463(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -623,8 +623,8 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed1446();
-    o.bindings = buildUnnamed1447();
+    o.auditConfigs = buildUnnamed1462();
+    o.bindings = buildUnnamed1463();
     o.etag = "foo";
     o.iamOwned = true;
     o.version = 42;
@@ -636,8 +636,8 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed1446(o.auditConfigs);
-    checkUnnamed1447(o.bindings);
+    checkUnnamed1462(o.auditConfigs);
+    checkUnnamed1463(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.iamOwned, unittest.isTrue);
     unittest.expect(o.version, unittest.equals(42));
@@ -681,14 +681,14 @@
   buildCounterSetIamPolicyRequest--;
 }
 
-buildUnnamed1448() {
+buildUnnamed1464() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1448(core.List<core.String> o) {
+checkUnnamed1464(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -699,7 +699,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed1448();
+    o.permissions = buildUnnamed1464();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -708,19 +708,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed1448(o.permissions);
+    checkUnnamed1464(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed1449() {
+buildUnnamed1465() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1449(core.List<core.String> o) {
+checkUnnamed1465(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -731,7 +731,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed1449();
+    o.permissions = buildUnnamed1465();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -740,7 +740,7 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed1449(o.permissions);
+    checkUnnamed1465(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
@@ -1009,9 +1009,9 @@
       api.ProjectsLocationsResourceApi res =
           new api.CloudkmsApi(mock).projects.locations;
       var arg_name = "foo";
+      var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_filter = "foo";
-      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1044,11 +1044,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1059,9 +1059,9 @@
       }), true);
       res
           .list(arg_name,
+              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
               filter: arg_filter,
-              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListLocationsResponse response) {
         checkListLocationsResponse(response);
@@ -1691,8 +1691,8 @@
       api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res =
           new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
       var arg_parent = "foo";
-      var arg_pageSize = 42;
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1725,10 +1725,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1739,8 +1739,8 @@
       }), true);
       res
           .list(arg_parent,
-              pageSize: arg_pageSize,
               pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListCryptoKeysResponse response) {
         checkListCryptoKeysResponse(response);
diff --git a/generated/googleapis/test/cloudresourcemanager/v1_test.dart b/generated/googleapis/test/cloudresourcemanager/v1_test.dart
index b725501..f94e01e 100644
--- a/generated/googleapis/test/cloudresourcemanager/v1_test.dart
+++ b/generated/googleapis/test/cloudresourcemanager/v1_test.dart
@@ -69,14 +69,14 @@
   buildCounterAncestor--;
 }
 
-buildUnnamed1914() {
+buildUnnamed1936() {
   var o = new core.List<api.AuditLogConfig>();
   o.add(buildAuditLogConfig());
   o.add(buildAuditLogConfig());
   return o;
 }
 
-checkUnnamed1914(core.List<api.AuditLogConfig> o) {
+checkUnnamed1936(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditLogConfig(o[0]);
   checkAuditLogConfig(o[1]);
@@ -87,7 +87,7 @@
   var o = new api.AuditConfig();
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed1914();
+    o.auditLogConfigs = buildUnnamed1936();
     o.service = "foo";
   }
   buildCounterAuditConfig--;
@@ -97,20 +97,20 @@
 checkAuditConfig(api.AuditConfig o) {
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    checkUnnamed1914(o.auditLogConfigs);
+    checkUnnamed1936(o.auditLogConfigs);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterAuditConfig--;
 }
 
-buildUnnamed1915() {
+buildUnnamed1937() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1915(core.List<core.String> o) {
+checkUnnamed1937(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -121,7 +121,7 @@
   var o = new api.AuditLogConfig();
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed1915();
+    o.exemptedMembers = buildUnnamed1937();
     o.logType = "foo";
   }
   buildCounterAuditLogConfig--;
@@ -131,20 +131,20 @@
 checkAuditLogConfig(api.AuditLogConfig o) {
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed1915(o.exemptedMembers);
+    checkUnnamed1937(o.exemptedMembers);
     unittest.expect(o.logType, unittest.equals('foo'));
   }
   buildCounterAuditLogConfig--;
 }
 
-buildUnnamed1916() {
+buildUnnamed1938() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1916(core.List<core.String> o) {
+checkUnnamed1938(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -155,7 +155,7 @@
   var o = new api.Binding();
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    o.members = buildUnnamed1916();
+    o.members = buildUnnamed1938();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -165,7 +165,7 @@
 checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkUnnamed1916(o.members);
+    checkUnnamed1938(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
@@ -331,14 +331,14 @@
   buildCounterGetAncestryRequest--;
 }
 
-buildUnnamed1917() {
+buildUnnamed1939() {
   var o = new core.List<api.Ancestor>();
   o.add(buildAncestor());
   o.add(buildAncestor());
   return o;
 }
 
-checkUnnamed1917(core.List<api.Ancestor> o) {
+checkUnnamed1939(core.List<api.Ancestor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAncestor(o[0]);
   checkAncestor(o[1]);
@@ -349,7 +349,7 @@
   var o = new api.GetAncestryResponse();
   buildCounterGetAncestryResponse++;
   if (buildCounterGetAncestryResponse < 3) {
-    o.ancestor = buildUnnamed1917();
+    o.ancestor = buildUnnamed1939();
   }
   buildCounterGetAncestryResponse--;
   return o;
@@ -358,7 +358,7 @@
 checkGetAncestryResponse(api.GetAncestryResponse o) {
   buildCounterGetAncestryResponse++;
   if (buildCounterGetAncestryResponse < 3) {
-    checkUnnamed1917(o.ancestor);
+    checkUnnamed1939(o.ancestor);
   }
   buildCounterGetAncestryResponse--;
 }
@@ -416,14 +416,14 @@
   buildCounterGetOrgPolicyRequest--;
 }
 
-buildUnnamed1918() {
+buildUnnamed1940() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1918(core.List<core.String> o) {
+checkUnnamed1940(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -439,7 +439,7 @@
     o.origin = "foo";
     o.parent = "foo";
     o.reason = "foo";
-    o.restrictions = buildUnnamed1918();
+    o.restrictions = buildUnnamed1940();
   }
   buildCounterLien--;
   return o;
@@ -453,7 +453,7 @@
     unittest.expect(o.origin, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
     unittest.expect(o.reason, unittest.equals('foo'));
-    checkUnnamed1918(o.restrictions);
+    checkUnnamed1940(o.restrictions);
   }
   buildCounterLien--;
 }
@@ -480,14 +480,14 @@
   buildCounterListAvailableOrgPolicyConstraintsRequest--;
 }
 
-buildUnnamed1919() {
+buildUnnamed1941() {
   var o = new core.List<api.Constraint>();
   o.add(buildConstraint());
   o.add(buildConstraint());
   return o;
 }
 
-checkUnnamed1919(core.List<api.Constraint> o) {
+checkUnnamed1941(core.List<api.Constraint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConstraint(o[0]);
   checkConstraint(o[1]);
@@ -498,7 +498,7 @@
   var o = new api.ListAvailableOrgPolicyConstraintsResponse();
   buildCounterListAvailableOrgPolicyConstraintsResponse++;
   if (buildCounterListAvailableOrgPolicyConstraintsResponse < 3) {
-    o.constraints = buildUnnamed1919();
+    o.constraints = buildUnnamed1941();
     o.nextPageToken = "foo";
   }
   buildCounterListAvailableOrgPolicyConstraintsResponse--;
@@ -509,7 +509,7 @@
     api.ListAvailableOrgPolicyConstraintsResponse o) {
   buildCounterListAvailableOrgPolicyConstraintsResponse++;
   if (buildCounterListAvailableOrgPolicyConstraintsResponse < 3) {
-    checkUnnamed1919(o.constraints);
+    checkUnnamed1941(o.constraints);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListAvailableOrgPolicyConstraintsResponse--;
@@ -534,14 +534,14 @@
   buildCounterListConstraint--;
 }
 
-buildUnnamed1920() {
+buildUnnamed1942() {
   var o = new core.List<api.Lien>();
   o.add(buildLien());
   o.add(buildLien());
   return o;
 }
 
-checkUnnamed1920(core.List<api.Lien> o) {
+checkUnnamed1942(core.List<api.Lien> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLien(o[0]);
   checkLien(o[1]);
@@ -552,7 +552,7 @@
   var o = new api.ListLiensResponse();
   buildCounterListLiensResponse++;
   if (buildCounterListLiensResponse < 3) {
-    o.liens = buildUnnamed1920();
+    o.liens = buildUnnamed1942();
     o.nextPageToken = "foo";
   }
   buildCounterListLiensResponse--;
@@ -562,7 +562,7 @@
 checkListLiensResponse(api.ListLiensResponse o) {
   buildCounterListLiensResponse++;
   if (buildCounterListLiensResponse < 3) {
-    checkUnnamed1920(o.liens);
+    checkUnnamed1942(o.liens);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListLiensResponse--;
@@ -589,14 +589,14 @@
   buildCounterListOrgPoliciesRequest--;
 }
 
-buildUnnamed1921() {
+buildUnnamed1943() {
   var o = new core.List<api.OrgPolicy>();
   o.add(buildOrgPolicy());
   o.add(buildOrgPolicy());
   return o;
 }
 
-checkUnnamed1921(core.List<api.OrgPolicy> o) {
+checkUnnamed1943(core.List<api.OrgPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrgPolicy(o[0]);
   checkOrgPolicy(o[1]);
@@ -608,7 +608,7 @@
   buildCounterListOrgPoliciesResponse++;
   if (buildCounterListOrgPoliciesResponse < 3) {
     o.nextPageToken = "foo";
-    o.policies = buildUnnamed1921();
+    o.policies = buildUnnamed1943();
   }
   buildCounterListOrgPoliciesResponse--;
   return o;
@@ -618,32 +618,32 @@
   buildCounterListOrgPoliciesResponse++;
   if (buildCounterListOrgPoliciesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1921(o.policies);
+    checkUnnamed1943(o.policies);
   }
   buildCounterListOrgPoliciesResponse--;
 }
 
-buildUnnamed1922() {
+buildUnnamed1944() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1922(core.List<core.String> o) {
+checkUnnamed1944(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1923() {
+buildUnnamed1945() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1923(core.List<core.String> o) {
+checkUnnamed1945(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -655,8 +655,8 @@
   buildCounterListPolicy++;
   if (buildCounterListPolicy < 3) {
     o.allValues = "foo";
-    o.allowedValues = buildUnnamed1922();
-    o.deniedValues = buildUnnamed1923();
+    o.allowedValues = buildUnnamed1944();
+    o.deniedValues = buildUnnamed1945();
     o.inheritFromParent = true;
     o.suggestedValue = "foo";
   }
@@ -668,22 +668,22 @@
   buildCounterListPolicy++;
   if (buildCounterListPolicy < 3) {
     unittest.expect(o.allValues, unittest.equals('foo'));
-    checkUnnamed1922(o.allowedValues);
-    checkUnnamed1923(o.deniedValues);
+    checkUnnamed1944(o.allowedValues);
+    checkUnnamed1945(o.deniedValues);
     unittest.expect(o.inheritFromParent, unittest.isTrue);
     unittest.expect(o.suggestedValue, unittest.equals('foo'));
   }
   buildCounterListPolicy--;
 }
 
-buildUnnamed1924() {
+buildUnnamed1946() {
   var o = new core.List<api.Project>();
   o.add(buildProject());
   o.add(buildProject());
   return o;
 }
 
-checkUnnamed1924(core.List<api.Project> o) {
+checkUnnamed1946(core.List<api.Project> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProject(o[0]);
   checkProject(o[1]);
@@ -695,7 +695,7 @@
   buildCounterListProjectsResponse++;
   if (buildCounterListProjectsResponse < 3) {
     o.nextPageToken = "foo";
-    o.projects = buildUnnamed1924();
+    o.projects = buildUnnamed1946();
   }
   buildCounterListProjectsResponse--;
   return o;
@@ -705,12 +705,12 @@
   buildCounterListProjectsResponse++;
   if (buildCounterListProjectsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1924(o.projects);
+    checkUnnamed1946(o.projects);
   }
   buildCounterListProjectsResponse--;
 }
 
-buildUnnamed1925() {
+buildUnnamed1947() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -725,7 +725,7 @@
   return o;
 }
 
-checkUnnamed1925(core.Map<core.String, core.Object> o) {
+checkUnnamed1947(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));
@@ -739,7 +739,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1926() {
+buildUnnamed1948() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -754,7 +754,7 @@
   return o;
 }
 
-checkUnnamed1926(core.Map<core.String, core.Object> o) {
+checkUnnamed1948(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -775,9 +775,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed1925();
+    o.metadata = buildUnnamed1947();
     o.name = "foo";
-    o.response = buildUnnamed1926();
+    o.response = buildUnnamed1948();
   }
   buildCounterOperation--;
   return o;
@@ -788,9 +788,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed1925(o.metadata);
+    checkUnnamed1947(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1926(o.response);
+    checkUnnamed1948(o.response);
   }
   buildCounterOperation--;
 }
@@ -872,27 +872,27 @@
   buildCounterOrganizationOwner--;
 }
 
-buildUnnamed1927() {
+buildUnnamed1949() {
   var o = new core.List<api.AuditConfig>();
   o.add(buildAuditConfig());
   o.add(buildAuditConfig());
   return o;
 }
 
-checkUnnamed1927(core.List<api.AuditConfig> o) {
+checkUnnamed1949(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditConfig(o[0]);
   checkAuditConfig(o[1]);
 }
 
-buildUnnamed1928() {
+buildUnnamed1950() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed1928(core.List<api.Binding> o) {
+checkUnnamed1950(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -903,8 +903,8 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed1927();
-    o.bindings = buildUnnamed1928();
+    o.auditConfigs = buildUnnamed1949();
+    o.bindings = buildUnnamed1950();
     o.etag = "foo";
     o.version = 42;
   }
@@ -915,22 +915,22 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed1927(o.auditConfigs);
-    checkUnnamed1928(o.bindings);
+    checkUnnamed1949(o.auditConfigs);
+    checkUnnamed1950(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterPolicy--;
 }
 
-buildUnnamed1929() {
+buildUnnamed1951() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1929(core.Map<core.String, core.String> o) {
+checkUnnamed1951(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'));
@@ -942,7 +942,7 @@
   buildCounterProject++;
   if (buildCounterProject < 3) {
     o.createTime = "foo";
-    o.labels = buildUnnamed1929();
+    o.labels = buildUnnamed1951();
     o.lifecycleState = "foo";
     o.name = "foo";
     o.parent = buildResourceId();
@@ -957,7 +957,7 @@
   buildCounterProject++;
   if (buildCounterProject < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkUnnamed1929(o.labels);
+    checkUnnamed1951(o.labels);
     unittest.expect(o.lifecycleState, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkResourceId(o.parent);
@@ -1049,14 +1049,14 @@
   buildCounterSearchOrganizationsRequest--;
 }
 
-buildUnnamed1930() {
+buildUnnamed1952() {
   var o = new core.List<api.Organization>();
   o.add(buildOrganization());
   o.add(buildOrganization());
   return o;
 }
 
-checkUnnamed1930(core.List<api.Organization> o) {
+checkUnnamed1952(core.List<api.Organization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrganization(o[0]);
   checkOrganization(o[1]);
@@ -1068,7 +1068,7 @@
   buildCounterSearchOrganizationsResponse++;
   if (buildCounterSearchOrganizationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.organizations = buildUnnamed1930();
+    o.organizations = buildUnnamed1952();
   }
   buildCounterSearchOrganizationsResponse--;
   return o;
@@ -1078,7 +1078,7 @@
   buildCounterSearchOrganizationsResponse++;
   if (buildCounterSearchOrganizationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1930(o.organizations);
+    checkUnnamed1952(o.organizations);
   }
   buildCounterSearchOrganizationsResponse--;
 }
@@ -1123,7 +1123,7 @@
   buildCounterSetOrgPolicyRequest--;
 }
 
-buildUnnamed1931() {
+buildUnnamed1953() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1138,7 +1138,7 @@
   return o;
 }
 
-checkUnnamed1931(core.Map<core.String, core.Object> o) {
+checkUnnamed1953(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -1152,17 +1152,17 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1932() {
+buildUnnamed1954() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1931());
-  o.add(buildUnnamed1931());
+  o.add(buildUnnamed1953());
+  o.add(buildUnnamed1953());
   return o;
 }
 
-checkUnnamed1932(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1954(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1931(o[0]);
-  checkUnnamed1931(o[1]);
+  checkUnnamed1953(o[0]);
+  checkUnnamed1953(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1171,7 +1171,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1932();
+    o.details = buildUnnamed1954();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1182,20 +1182,20 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1932(o.details);
+    checkUnnamed1954(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-buildUnnamed1933() {
+buildUnnamed1955() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1933(core.List<core.String> o) {
+checkUnnamed1955(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1206,7 +1206,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed1933();
+    o.permissions = buildUnnamed1955();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -1215,19 +1215,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed1933(o.permissions);
+    checkUnnamed1955(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed1934() {
+buildUnnamed1956() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1934(core.List<core.String> o) {
+checkUnnamed1956(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1238,7 +1238,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed1934();
+    o.permissions = buildUnnamed1956();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -1247,7 +1247,7 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed1934(o.permissions);
+    checkUnnamed1956(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
@@ -3251,9 +3251,9 @@
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res =
           new api.CloudresourcemanagerApi(mock).projects;
+      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_filter = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3285,11 +3285,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3300,9 +3300,9 @@
       }), true);
       res
           .list(
+              filter: arg_filter,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
-              filter: arg_filter,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListProjectsResponse response) {
         checkListProjectsResponse(response);
diff --git a/generated/googleapis/test/cloudresourcemanager/v2beta1_test.dart b/generated/googleapis/test/cloudresourcemanager/v2beta1_test.dart
index f5f14b5..0d7ebe8 100644
--- a/generated/googleapis/test/cloudresourcemanager/v2beta1_test.dart
+++ b/generated/googleapis/test/cloudresourcemanager/v2beta1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed68() {
+buildUnnamed62() {
   var o = new core.List<api.AuditLogConfig>();
   o.add(buildAuditLogConfig());
   o.add(buildAuditLogConfig());
   return o;
 }
 
-checkUnnamed68(core.List<api.AuditLogConfig> o) {
+checkUnnamed62(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditLogConfig(o[0]);
   checkAuditLogConfig(o[1]);
@@ -68,7 +68,7 @@
   var o = new api.AuditConfig();
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed68();
+    o.auditLogConfigs = buildUnnamed62();
     o.service = "foo";
   }
   buildCounterAuditConfig--;
@@ -78,20 +78,20 @@
 checkAuditConfig(api.AuditConfig o) {
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    checkUnnamed68(o.auditLogConfigs);
+    checkUnnamed62(o.auditLogConfigs);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterAuditConfig--;
 }
 
-buildUnnamed69() {
+buildUnnamed63() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed69(core.List<core.String> o) {
+checkUnnamed63(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -102,7 +102,7 @@
   var o = new api.AuditLogConfig();
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed69();
+    o.exemptedMembers = buildUnnamed63();
     o.logType = "foo";
   }
   buildCounterAuditLogConfig--;
@@ -112,20 +112,20 @@
 checkAuditLogConfig(api.AuditLogConfig o) {
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed69(o.exemptedMembers);
+    checkUnnamed63(o.exemptedMembers);
     unittest.expect(o.logType, unittest.equals('foo'));
   }
   buildCounterAuditLogConfig--;
 }
 
-buildUnnamed70() {
+buildUnnamed64() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed70(core.List<core.String> o) {
+checkUnnamed64(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -136,7 +136,7 @@
   var o = new api.Binding();
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    o.members = buildUnnamed70();
+    o.members = buildUnnamed64();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -146,7 +146,7 @@
 checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkUnnamed70(o.members);
+    checkUnnamed64(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
@@ -238,14 +238,14 @@
   buildCounterGetIamPolicyRequest--;
 }
 
-buildUnnamed71() {
+buildUnnamed65() {
   var o = new core.List<api.Folder>();
   o.add(buildFolder());
   o.add(buildFolder());
   return o;
 }
 
-checkUnnamed71(core.List<api.Folder> o) {
+checkUnnamed65(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFolder(o[0]);
   checkFolder(o[1]);
@@ -256,7 +256,7 @@
   var o = new api.ListFoldersResponse();
   buildCounterListFoldersResponse++;
   if (buildCounterListFoldersResponse < 3) {
-    o.folders = buildUnnamed71();
+    o.folders = buildUnnamed65();
     o.nextPageToken = "foo";
   }
   buildCounterListFoldersResponse--;
@@ -266,7 +266,7 @@
 checkListFoldersResponse(api.ListFoldersResponse o) {
   buildCounterListFoldersResponse++;
   if (buildCounterListFoldersResponse < 3) {
-    checkUnnamed71(o.folders);
+    checkUnnamed65(o.folders);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListFoldersResponse--;
@@ -291,7 +291,7 @@
   buildCounterMoveFolderRequest--;
 }
 
-buildUnnamed72() {
+buildUnnamed66() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -306,7 +306,7 @@
   return o;
 }
 
-checkUnnamed72(core.Map<core.String, core.Object> o) {
+checkUnnamed66(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));
@@ -320,7 +320,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed73() {
+buildUnnamed67() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -335,7 +335,7 @@
   return o;
 }
 
-checkUnnamed73(core.Map<core.String, core.Object> o) {
+checkUnnamed67(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -356,9 +356,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed72();
+    o.metadata = buildUnnamed66();
     o.name = "foo";
-    o.response = buildUnnamed73();
+    o.response = buildUnnamed67();
   }
   buildCounterOperation--;
   return o;
@@ -369,34 +369,34 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed72(o.metadata);
+    checkUnnamed66(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed73(o.response);
+    checkUnnamed67(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed74() {
+buildUnnamed68() {
   var o = new core.List<api.AuditConfig>();
   o.add(buildAuditConfig());
   o.add(buildAuditConfig());
   return o;
 }
 
-checkUnnamed74(core.List<api.AuditConfig> o) {
+checkUnnamed68(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditConfig(o[0]);
   checkAuditConfig(o[1]);
 }
 
-buildUnnamed75() {
+buildUnnamed69() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed75(core.List<api.Binding> o) {
+checkUnnamed69(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -407,8 +407,8 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed74();
-    o.bindings = buildUnnamed75();
+    o.auditConfigs = buildUnnamed68();
+    o.bindings = buildUnnamed69();
     o.etag = "foo";
     o.version = 42;
   }
@@ -419,8 +419,8 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed74(o.auditConfigs);
-    checkUnnamed75(o.bindings);
+    checkUnnamed68(o.auditConfigs);
+    checkUnnamed69(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
@@ -473,14 +473,14 @@
   buildCounterSearchFoldersRequest--;
 }
 
-buildUnnamed76() {
+buildUnnamed70() {
   var o = new core.List<api.Folder>();
   o.add(buildFolder());
   o.add(buildFolder());
   return o;
 }
 
-checkUnnamed76(core.List<api.Folder> o) {
+checkUnnamed70(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFolder(o[0]);
   checkFolder(o[1]);
@@ -491,7 +491,7 @@
   var o = new api.SearchFoldersResponse();
   buildCounterSearchFoldersResponse++;
   if (buildCounterSearchFoldersResponse < 3) {
-    o.folders = buildUnnamed76();
+    o.folders = buildUnnamed70();
     o.nextPageToken = "foo";
   }
   buildCounterSearchFoldersResponse--;
@@ -501,7 +501,7 @@
 checkSearchFoldersResponse(api.SearchFoldersResponse o) {
   buildCounterSearchFoldersResponse++;
   if (buildCounterSearchFoldersResponse < 3) {
-    checkUnnamed76(o.folders);
+    checkUnnamed70(o.folders);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchFoldersResponse--;
@@ -528,7 +528,7 @@
   buildCounterSetIamPolicyRequest--;
 }
 
-buildUnnamed77() {
+buildUnnamed71() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -543,7 +543,7 @@
   return o;
 }
 
-checkUnnamed77(core.Map<core.String, core.Object> o) {
+checkUnnamed71(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -557,17 +557,17 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed78() {
+buildUnnamed72() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed77());
-  o.add(buildUnnamed77());
+  o.add(buildUnnamed71());
+  o.add(buildUnnamed71());
   return o;
 }
 
-checkUnnamed78(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed72(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed77(o[0]);
-  checkUnnamed77(o[1]);
+  checkUnnamed71(o[0]);
+  checkUnnamed71(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -576,7 +576,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed78();
+    o.details = buildUnnamed72();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -587,20 +587,20 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed78(o.details);
+    checkUnnamed72(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-buildUnnamed79() {
+buildUnnamed73() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed79(core.List<core.String> o) {
+checkUnnamed73(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -611,7 +611,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed79();
+    o.permissions = buildUnnamed73();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -620,19 +620,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed79(o.permissions);
+    checkUnnamed73(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed80() {
+buildUnnamed74() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed80(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'));
@@ -643,7 +643,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed80();
+    o.permissions = buildUnnamed74();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -652,7 +652,7 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed80(o.permissions);
+    checkUnnamed74(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
@@ -1046,10 +1046,10 @@
       var mock = new HttpServerMock();
       api.FoldersResourceApi res =
           new api.CloudresourcemanagerApi(mock).folders;
-      var arg_pageSize = 42;
-      var arg_parent = "foo";
       var arg_showDeleted = true;
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
+      var arg_parent = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1081,13 +1081,13 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["parent"].first, unittest.equals(arg_parent));
         unittest.expect(
             queryMap["showDeleted"].first, unittest.equals("$arg_showDeleted"));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["parent"].first, unittest.equals(arg_parent));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1098,10 +1098,10 @@
       }), true);
       res
           .list(
-              pageSize: arg_pageSize,
-              parent: arg_parent,
               showDeleted: arg_showDeleted,
               pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              parent: arg_parent,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListFoldersResponse response) {
         checkListFoldersResponse(response);
diff --git a/generated/googleapis/test/cloudshell/v1_test.dart b/generated/googleapis/test/cloudshell/v1_test.dart
new file mode 100644
index 0000000..3999eee
--- /dev/null
+++ b/generated/googleapis/test/cloudshell/v1_test.dart
@@ -0,0 +1,668 @@
+library googleapis.cloudshell.v1.test;
+
+import "dart:core" as core;
+import "dart:async" as async;
+import "dart:convert" as convert;
+
+import 'package:http/http.dart' as http;
+import 'package:test/test.dart' as unittest;
+
+import 'package:googleapis/cloudshell/v1.dart' as api;
+
+class HttpServerMock extends http.BaseClient {
+  core.Function _callback;
+  core.bool _expectJson;
+
+  void register(core.Function callback, core.bool expectJson) {
+    _callback = callback;
+    _expectJson = expectJson;
+  }
+
+  async.Future<http.StreamedResponse> send(http.BaseRequest request) {
+    if (_expectJson) {
+      return request
+          .finalize()
+          .transform(convert.UTF8.decoder)
+          .join('')
+          .then((core.String jsonString) {
+        if (jsonString.isEmpty) {
+          return _callback(request, null);
+        } else {
+          return _callback(request, convert.JSON.decode(jsonString));
+        }
+      });
+    } else {
+      var stream = request.finalize();
+      if (stream == null) {
+        return _callback(request, []);
+      } else {
+        return stream.toBytes().then((data) {
+          return _callback(request, data);
+        });
+      }
+    }
+  }
+}
+
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
+  var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
+  return new http.StreamedResponse(stream, status, headers: headers);
+}
+
+core.int buildCounterCancelOperationRequest = 0;
+buildCancelOperationRequest() {
+  var o = new api.CancelOperationRequest();
+  buildCounterCancelOperationRequest++;
+  if (buildCounterCancelOperationRequest < 3) {}
+  buildCounterCancelOperationRequest--;
+  return o;
+}
+
+checkCancelOperationRequest(api.CancelOperationRequest o) {
+  buildCounterCancelOperationRequest++;
+  if (buildCounterCancelOperationRequest < 3) {}
+  buildCounterCancelOperationRequest--;
+}
+
+core.int buildCounterEmpty = 0;
+buildEmpty() {
+  var o = new api.Empty();
+  buildCounterEmpty++;
+  if (buildCounterEmpty < 3) {}
+  buildCounterEmpty--;
+  return o;
+}
+
+checkEmpty(api.Empty o) {
+  buildCounterEmpty++;
+  if (buildCounterEmpty < 3) {}
+  buildCounterEmpty--;
+}
+
+buildUnnamed686() {
+  var o = new core.List<api.PublicKey>();
+  o.add(buildPublicKey());
+  o.add(buildPublicKey());
+  return o;
+}
+
+checkUnnamed686(core.List<api.PublicKey> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkPublicKey(o[0]);
+  checkPublicKey(o[1]);
+}
+
+core.int buildCounterEnvironment = 0;
+buildEnvironment() {
+  var o = new api.Environment();
+  buildCounterEnvironment++;
+  if (buildCounterEnvironment < 3) {
+    o.dockerImage = "foo";
+    o.id = "foo";
+    o.name = "foo";
+    o.publicKeys = buildUnnamed686();
+    o.sshHost = "foo";
+    o.sshPort = 42;
+    o.sshUsername = "foo";
+    o.state = "foo";
+  }
+  buildCounterEnvironment--;
+  return o;
+}
+
+checkEnvironment(api.Environment o) {
+  buildCounterEnvironment++;
+  if (buildCounterEnvironment < 3) {
+    unittest.expect(o.dockerImage, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    checkUnnamed686(o.publicKeys);
+    unittest.expect(o.sshHost, unittest.equals('foo'));
+    unittest.expect(o.sshPort, unittest.equals(42));
+    unittest.expect(o.sshUsername, unittest.equals('foo'));
+    unittest.expect(o.state, unittest.equals('foo'));
+  }
+  buildCounterEnvironment--;
+}
+
+buildUnnamed687() {
+  var o = new core.List<api.Operation>();
+  o.add(buildOperation());
+  o.add(buildOperation());
+  return o;
+}
+
+checkUnnamed687(core.List<api.Operation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOperation(o[0]);
+  checkOperation(o[1]);
+}
+
+core.int buildCounterListOperationsResponse = 0;
+buildListOperationsResponse() {
+  var o = new api.ListOperationsResponse();
+  buildCounterListOperationsResponse++;
+  if (buildCounterListOperationsResponse < 3) {
+    o.nextPageToken = "foo";
+    o.operations = buildUnnamed687();
+  }
+  buildCounterListOperationsResponse--;
+  return o;
+}
+
+checkListOperationsResponse(api.ListOperationsResponse o) {
+  buildCounterListOperationsResponse++;
+  if (buildCounterListOperationsResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed687(o.operations);
+  }
+  buildCounterListOperationsResponse--;
+}
+
+buildUnnamed688() {
+  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;
+}
+
+checkUnnamed688(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'));
+}
+
+buildUnnamed689() {
+  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;
+}
+
+checkUnnamed689(core.Map<core.String, core.Object> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  var casted3 = (o["x"]) 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["y"]) 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'));
+}
+
+core.int buildCounterOperation = 0;
+buildOperation() {
+  var o = new api.Operation();
+  buildCounterOperation++;
+  if (buildCounterOperation < 3) {
+    o.done = true;
+    o.error = buildStatus();
+    o.metadata = buildUnnamed688();
+    o.name = "foo";
+    o.response = buildUnnamed689();
+  }
+  buildCounterOperation--;
+  return o;
+}
+
+checkOperation(api.Operation o) {
+  buildCounterOperation++;
+  if (buildCounterOperation < 3) {
+    unittest.expect(o.done, unittest.isTrue);
+    checkStatus(o.error);
+    checkUnnamed688(o.metadata);
+    unittest.expect(o.name, unittest.equals('foo'));
+    checkUnnamed689(o.response);
+  }
+  buildCounterOperation--;
+}
+
+core.int buildCounterPublicKey = 0;
+buildPublicKey() {
+  var o = new api.PublicKey();
+  buildCounterPublicKey++;
+  if (buildCounterPublicKey < 3) {
+    o.format = "foo";
+    o.key = "foo";
+    o.name = "foo";
+  }
+  buildCounterPublicKey--;
+  return o;
+}
+
+checkPublicKey(api.PublicKey o) {
+  buildCounterPublicKey++;
+  if (buildCounterPublicKey < 3) {
+    unittest.expect(o.format, unittest.equals('foo'));
+    unittest.expect(o.key, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+  }
+  buildCounterPublicKey--;
+}
+
+core.int buildCounterStartEnvironmentMetadata = 0;
+buildStartEnvironmentMetadata() {
+  var o = new api.StartEnvironmentMetadata();
+  buildCounterStartEnvironmentMetadata++;
+  if (buildCounterStartEnvironmentMetadata < 3) {
+    o.state = "foo";
+  }
+  buildCounterStartEnvironmentMetadata--;
+  return o;
+}
+
+checkStartEnvironmentMetadata(api.StartEnvironmentMetadata o) {
+  buildCounterStartEnvironmentMetadata++;
+  if (buildCounterStartEnvironmentMetadata < 3) {
+    unittest.expect(o.state, unittest.equals('foo'));
+  }
+  buildCounterStartEnvironmentMetadata--;
+}
+
+core.int buildCounterStartEnvironmentResponse = 0;
+buildStartEnvironmentResponse() {
+  var o = new api.StartEnvironmentResponse();
+  buildCounterStartEnvironmentResponse++;
+  if (buildCounterStartEnvironmentResponse < 3) {
+    o.environment = buildEnvironment();
+  }
+  buildCounterStartEnvironmentResponse--;
+  return o;
+}
+
+checkStartEnvironmentResponse(api.StartEnvironmentResponse o) {
+  buildCounterStartEnvironmentResponse++;
+  if (buildCounterStartEnvironmentResponse < 3) {
+    checkEnvironment(o.environment);
+  }
+  buildCounterStartEnvironmentResponse--;
+}
+
+buildUnnamed690() {
+  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;
+}
+
+checkUnnamed690(core.Map<core.String, core.Object> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  var casted5 = (o["x"]) 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["y"]) 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'));
+}
+
+buildUnnamed691() {
+  var o = new core.List<core.Map<core.String, core.Object>>();
+  o.add(buildUnnamed690());
+  o.add(buildUnnamed690());
+  return o;
+}
+
+checkUnnamed691(core.List<core.Map<core.String, core.Object>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed690(o[0]);
+  checkUnnamed690(o[1]);
+}
+
+core.int buildCounterStatus = 0;
+buildStatus() {
+  var o = new api.Status();
+  buildCounterStatus++;
+  if (buildCounterStatus < 3) {
+    o.code = 42;
+    o.details = buildUnnamed691();
+    o.message = "foo";
+  }
+  buildCounterStatus--;
+  return o;
+}
+
+checkStatus(api.Status o) {
+  buildCounterStatus++;
+  if (buildCounterStatus < 3) {
+    unittest.expect(o.code, unittest.equals(42));
+    checkUnnamed691(o.details);
+    unittest.expect(o.message, unittest.equals('foo'));
+  }
+  buildCounterStatus--;
+}
+
+main() {
+  unittest.group("obj-schema-CancelOperationRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCancelOperationRequest();
+      var od = new api.CancelOperationRequest.fromJson(o.toJson());
+      checkCancelOperationRequest(od);
+    });
+  });
+
+  unittest.group("obj-schema-Empty", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildEmpty();
+      var od = new api.Empty.fromJson(o.toJson());
+      checkEmpty(od);
+    });
+  });
+
+  unittest.group("obj-schema-Environment", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildEnvironment();
+      var od = new api.Environment.fromJson(o.toJson());
+      checkEnvironment(od);
+    });
+  });
+
+  unittest.group("obj-schema-ListOperationsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListOperationsResponse();
+      var od = new api.ListOperationsResponse.fromJson(o.toJson());
+      checkListOperationsResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-Operation", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOperation();
+      var od = new api.Operation.fromJson(o.toJson());
+      checkOperation(od);
+    });
+  });
+
+  unittest.group("obj-schema-PublicKey", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildPublicKey();
+      var od = new api.PublicKey.fromJson(o.toJson());
+      checkPublicKey(od);
+    });
+  });
+
+  unittest.group("obj-schema-StartEnvironmentMetadata", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildStartEnvironmentMetadata();
+      var od = new api.StartEnvironmentMetadata.fromJson(o.toJson());
+      checkStartEnvironmentMetadata(od);
+    });
+  });
+
+  unittest.group("obj-schema-StartEnvironmentResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildStartEnvironmentResponse();
+      var od = new api.StartEnvironmentResponse.fromJson(o.toJson());
+      checkStartEnvironmentResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-Status", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildStatus();
+      var od = new api.Status.fromJson(o.toJson());
+      checkStatus(od);
+    });
+  });
+
+  unittest.group("resource-OperationsResourceApi", () {
+    unittest.test("method--cancel", () {
+      var mock = new HttpServerMock();
+      api.OperationsResourceApi res = new api.CloudshellApi(mock).operations;
+      var arg_request = buildCancelOperationRequest();
+      var arg_name = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.CancelOperationRequest.fromJson(json);
+        checkCancelOperationRequest(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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildEmpty());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .cancel(arg_request, arg_name, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Empty response) {
+        checkEmpty(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+      var mock = new HttpServerMock();
+      api.OperationsResourceApi res = new api.CloudshellApi(mock).operations;
+      var arg_name = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildEmpty());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .delete(arg_name, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Empty response) {
+        checkEmpty(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.OperationsResourceApi res = new api.CloudshellApi(mock).operations;
+      var arg_name = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildOperation());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_name, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.OperationsResourceApi res = new api.CloudshellApi(mock).operations;
+      var arg_name = "foo";
+      var arg_pageToken = "foo";
+      var arg_pageSize = 42;
+      var arg_filter = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListOperationsResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_name,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              filter: arg_filter,
+              $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+        checkListOperationsResponse(response);
+      })));
+    });
+  });
+}
diff --git a/generated/googleapis/test/cloudtrace/v1_test.dart b/generated/googleapis/test/cloudtrace/v1_test.dart
index 6c898fa..c3234ae 100644
--- a/generated/googleapis/test/cloudtrace/v1_test.dart
+++ b/generated/googleapis/test/cloudtrace/v1_test.dart
@@ -65,14 +65,14 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed193() {
+buildUnnamed187() {
   var o = new core.List<api.Trace>();
   o.add(buildTrace());
   o.add(buildTrace());
   return o;
 }
 
-checkUnnamed193(core.List<api.Trace> o) {
+checkUnnamed187(core.List<api.Trace> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrace(o[0]);
   checkTrace(o[1]);
@@ -84,7 +84,7 @@
   buildCounterListTracesResponse++;
   if (buildCounterListTracesResponse < 3) {
     o.nextPageToken = "foo";
-    o.traces = buildUnnamed193();
+    o.traces = buildUnnamed187();
   }
   buildCounterListTracesResponse--;
   return o;
@@ -94,19 +94,19 @@
   buildCounterListTracesResponse++;
   if (buildCounterListTracesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed193(o.traces);
+    checkUnnamed187(o.traces);
   }
   buildCounterListTracesResponse--;
 }
 
-buildUnnamed194() {
+buildUnnamed188() {
   var o = new core.List<api.TraceSpan>();
   o.add(buildTraceSpan());
   o.add(buildTraceSpan());
   return o;
 }
 
-checkUnnamed194(core.List<api.TraceSpan> o) {
+checkUnnamed188(core.List<api.TraceSpan> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTraceSpan(o[0]);
   checkTraceSpan(o[1]);
@@ -118,7 +118,7 @@
   buildCounterTrace++;
   if (buildCounterTrace < 3) {
     o.projectId = "foo";
-    o.spans = buildUnnamed194();
+    o.spans = buildUnnamed188();
     o.traceId = "foo";
   }
   buildCounterTrace--;
@@ -129,20 +129,20 @@
   buildCounterTrace++;
   if (buildCounterTrace < 3) {
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed194(o.spans);
+    checkUnnamed188(o.spans);
     unittest.expect(o.traceId, unittest.equals('foo'));
   }
   buildCounterTrace--;
 }
 
-buildUnnamed195() {
+buildUnnamed189() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed195(core.Map<core.String, core.String> o) {
+checkUnnamed189(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'));
@@ -155,7 +155,7 @@
   if (buildCounterTraceSpan < 3) {
     o.endTime = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed195();
+    o.labels = buildUnnamed189();
     o.name = "foo";
     o.parentSpanId = "foo";
     o.spanId = "foo";
@@ -170,7 +170,7 @@
   if (buildCounterTraceSpan < 3) {
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed195(o.labels);
+    checkUnnamed189(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parentSpanId, unittest.equals('foo'));
     unittest.expect(o.spanId, unittest.equals('foo'));
@@ -179,14 +179,14 @@
   buildCounterTraceSpan--;
 }
 
-buildUnnamed196() {
+buildUnnamed190() {
   var o = new core.List<api.Trace>();
   o.add(buildTrace());
   o.add(buildTrace());
   return o;
 }
 
-checkUnnamed196(core.List<api.Trace> o) {
+checkUnnamed190(core.List<api.Trace> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrace(o[0]);
   checkTrace(o[1]);
@@ -197,7 +197,7 @@
   var o = new api.Traces();
   buildCounterTraces++;
   if (buildCounterTraces < 3) {
-    o.traces = buildUnnamed196();
+    o.traces = buildUnnamed190();
   }
   buildCounterTraces--;
   return o;
@@ -206,7 +206,7 @@
 checkTraces(api.Traces o) {
   buildCounterTraces++;
   if (buildCounterTraces < 3) {
-    checkUnnamed196(o.traces);
+    checkUnnamed190(o.traces);
   }
   buildCounterTraces--;
 }
diff --git a/generated/googleapis/test/cloudtrace/v2_test.dart b/generated/googleapis/test/cloudtrace/v2_test.dart
index ad1e7b2..94f00ea 100644
--- a/generated/googleapis/test/cloudtrace/v2_test.dart
+++ b/generated/googleapis/test/cloudtrace/v2_test.dart
@@ -94,14 +94,14 @@
   buildCounterAttributeValue--;
 }
 
-buildUnnamed1152() {
+buildUnnamed1163() {
   var o = new core.Map<core.String, api.AttributeValue>();
   o["x"] = buildAttributeValue();
   o["y"] = buildAttributeValue();
   return o;
 }
 
-checkUnnamed1152(core.Map<core.String, api.AttributeValue> o) {
+checkUnnamed1163(core.Map<core.String, api.AttributeValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttributeValue(o["x"]);
   checkAttributeValue(o["y"]);
@@ -112,7 +112,7 @@
   var o = new api.Attributes();
   buildCounterAttributes++;
   if (buildCounterAttributes < 3) {
-    o.attributeMap = buildUnnamed1152();
+    o.attributeMap = buildUnnamed1163();
     o.droppedAttributesCount = 42;
   }
   buildCounterAttributes--;
@@ -122,20 +122,20 @@
 checkAttributes(api.Attributes o) {
   buildCounterAttributes++;
   if (buildCounterAttributes < 3) {
-    checkUnnamed1152(o.attributeMap);
+    checkUnnamed1163(o.attributeMap);
     unittest.expect(o.droppedAttributesCount, unittest.equals(42));
   }
   buildCounterAttributes--;
 }
 
-buildUnnamed1153() {
+buildUnnamed1164() {
   var o = new core.List<api.Span>();
   o.add(buildSpan());
   o.add(buildSpan());
   return o;
 }
 
-checkUnnamed1153(core.List<api.Span> o) {
+checkUnnamed1164(core.List<api.Span> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSpan(o[0]);
   checkSpan(o[1]);
@@ -146,7 +146,7 @@
   var o = new api.BatchWriteSpansRequest();
   buildCounterBatchWriteSpansRequest++;
   if (buildCounterBatchWriteSpansRequest < 3) {
-    o.spans = buildUnnamed1153();
+    o.spans = buildUnnamed1164();
   }
   buildCounterBatchWriteSpansRequest--;
   return o;
@@ -155,7 +155,7 @@
 checkBatchWriteSpansRequest(api.BatchWriteSpansRequest o) {
   buildCounterBatchWriteSpansRequest++;
   if (buildCounterBatchWriteSpansRequest < 3) {
-    checkUnnamed1153(o.spans);
+    checkUnnamed1164(o.spans);
   }
   buildCounterBatchWriteSpansRequest--;
 }
@@ -200,14 +200,14 @@
   buildCounterLink--;
 }
 
-buildUnnamed1154() {
+buildUnnamed1165() {
   var o = new core.List<api.Link>();
   o.add(buildLink());
   o.add(buildLink());
   return o;
 }
 
-checkUnnamed1154(core.List<api.Link> o) {
+checkUnnamed1165(core.List<api.Link> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLink(o[0]);
   checkLink(o[1]);
@@ -219,7 +219,7 @@
   buildCounterLinks++;
   if (buildCounterLinks < 3) {
     o.droppedLinksCount = 42;
-    o.link = buildUnnamed1154();
+    o.link = buildUnnamed1165();
   }
   buildCounterLinks--;
   return o;
@@ -229,7 +229,7 @@
   buildCounterLinks++;
   if (buildCounterLinks < 3) {
     unittest.expect(o.droppedLinksCount, unittest.equals(42));
-    checkUnnamed1154(o.link);
+    checkUnnamed1165(o.link);
   }
   buildCounterLinks--;
 }
@@ -354,14 +354,14 @@
   buildCounterStackFrame--;
 }
 
-buildUnnamed1155() {
+buildUnnamed1166() {
   var o = new core.List<api.StackFrame>();
   o.add(buildStackFrame());
   o.add(buildStackFrame());
   return o;
 }
 
-checkUnnamed1155(core.List<api.StackFrame> o) {
+checkUnnamed1166(core.List<api.StackFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStackFrame(o[0]);
   checkStackFrame(o[1]);
@@ -373,7 +373,7 @@
   buildCounterStackFrames++;
   if (buildCounterStackFrames < 3) {
     o.droppedFramesCount = 42;
-    o.frame = buildUnnamed1155();
+    o.frame = buildUnnamed1166();
   }
   buildCounterStackFrames--;
   return o;
@@ -383,7 +383,7 @@
   buildCounterStackFrames++;
   if (buildCounterStackFrames < 3) {
     unittest.expect(o.droppedFramesCount, unittest.equals(42));
-    checkUnnamed1155(o.frame);
+    checkUnnamed1166(o.frame);
   }
   buildCounterStackFrames--;
 }
@@ -409,7 +409,7 @@
   buildCounterStackTrace--;
 }
 
-buildUnnamed1156() {
+buildUnnamed1167() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -424,7 +424,7 @@
   return o;
 }
 
-checkUnnamed1156(core.Map<core.String, core.Object> o) {
+checkUnnamed1167(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));
@@ -438,17 +438,17 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1157() {
+buildUnnamed1168() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1156());
-  o.add(buildUnnamed1156());
+  o.add(buildUnnamed1167());
+  o.add(buildUnnamed1167());
   return o;
 }
 
-checkUnnamed1157(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1168(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1156(o[0]);
-  checkUnnamed1156(o[1]);
+  checkUnnamed1167(o[0]);
+  checkUnnamed1167(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -457,7 +457,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1157();
+    o.details = buildUnnamed1168();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -468,7 +468,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1157(o.details);
+    checkUnnamed1168(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -497,14 +497,14 @@
   buildCounterTimeEvent--;
 }
 
-buildUnnamed1158() {
+buildUnnamed1169() {
   var o = new core.List<api.TimeEvent>();
   o.add(buildTimeEvent());
   o.add(buildTimeEvent());
   return o;
 }
 
-checkUnnamed1158(core.List<api.TimeEvent> o) {
+checkUnnamed1169(core.List<api.TimeEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimeEvent(o[0]);
   checkTimeEvent(o[1]);
@@ -517,7 +517,7 @@
   if (buildCounterTimeEvents < 3) {
     o.droppedAnnotationsCount = 42;
     o.droppedMessageEventsCount = 42;
-    o.timeEvent = buildUnnamed1158();
+    o.timeEvent = buildUnnamed1169();
   }
   buildCounterTimeEvents--;
   return o;
@@ -528,7 +528,7 @@
   if (buildCounterTimeEvents < 3) {
     unittest.expect(o.droppedAnnotationsCount, unittest.equals(42));
     unittest.expect(o.droppedMessageEventsCount, unittest.equals(42));
-    checkUnnamed1158(o.timeEvent);
+    checkUnnamed1169(o.timeEvent);
   }
   buildCounterTimeEvents--;
 }
@@ -750,7 +750,7 @@
   });
 
   unittest.group("resource-ProjectsTracesSpansResourceApi", () {
-    unittest.test("method--create", () {
+    unittest.test("method--createSpan", () {
       var mock = new HttpServerMock();
       api.ProjectsTracesSpansResourceApi res =
           new api.CloudtraceApi(mock).projects.traces.spans;
@@ -800,7 +800,7 @@
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
       res
-          .create(arg_request, arg_name, $fields: arg_$fields)
+          .createSpan(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.Span response) {
         checkSpan(response);
       })));
diff --git a/generated/googleapis/test/compute/v1_test.dart b/generated/googleapis/test/compute/v1_test.dart
index 12474cd..d53d737 100644
--- a/generated/googleapis/test/compute/v1_test.dart
+++ b/generated/googleapis/test/compute/v1_test.dart
@@ -106,14 +106,14 @@
   buildCounterAcceleratorType--;
 }
 
-buildUnnamed2311() {
+buildUnnamed2336() {
   var o = new core.Map<core.String, api.AcceleratorTypesScopedList>();
   o["x"] = buildAcceleratorTypesScopedList();
   o["y"] = buildAcceleratorTypesScopedList();
   return o;
 }
 
-checkUnnamed2311(core.Map<core.String, api.AcceleratorTypesScopedList> o) {
+checkUnnamed2336(core.Map<core.String, api.AcceleratorTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorTypesScopedList(o["x"]);
   checkAcceleratorTypesScopedList(o["y"]);
@@ -141,14 +141,14 @@
   buildCounterAcceleratorTypeAggregatedListWarningData--;
 }
 
-buildUnnamed2312() {
+buildUnnamed2337() {
   var o = new core.List<api.AcceleratorTypeAggregatedListWarningData>();
   o.add(buildAcceleratorTypeAggregatedListWarningData());
   o.add(buildAcceleratorTypeAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2312(core.List<api.AcceleratorTypeAggregatedListWarningData> o) {
+checkUnnamed2337(core.List<api.AcceleratorTypeAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorTypeAggregatedListWarningData(o[0]);
   checkAcceleratorTypeAggregatedListWarningData(o[1]);
@@ -160,7 +160,7 @@
   buildCounterAcceleratorTypeAggregatedListWarning++;
   if (buildCounterAcceleratorTypeAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2312();
+    o.data = buildUnnamed2337();
     o.message = "foo";
   }
   buildCounterAcceleratorTypeAggregatedListWarning--;
@@ -172,7 +172,7 @@
   buildCounterAcceleratorTypeAggregatedListWarning++;
   if (buildCounterAcceleratorTypeAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2312(o.data);
+    checkUnnamed2337(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAcceleratorTypeAggregatedListWarning--;
@@ -184,7 +184,7 @@
   buildCounterAcceleratorTypeAggregatedList++;
   if (buildCounterAcceleratorTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2311();
+    o.items = buildUnnamed2336();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -198,7 +198,7 @@
   buildCounterAcceleratorTypeAggregatedList++;
   if (buildCounterAcceleratorTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2311(o.items);
+    checkUnnamed2336(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -207,14 +207,14 @@
   buildCounterAcceleratorTypeAggregatedList--;
 }
 
-buildUnnamed2313() {
+buildUnnamed2338() {
   var o = new core.List<api.AcceleratorType>();
   o.add(buildAcceleratorType());
   o.add(buildAcceleratorType());
   return o;
 }
 
-checkUnnamed2313(core.List<api.AcceleratorType> o) {
+checkUnnamed2338(core.List<api.AcceleratorType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorType(o[0]);
   checkAcceleratorType(o[1]);
@@ -241,14 +241,14 @@
   buildCounterAcceleratorTypeListWarningData--;
 }
 
-buildUnnamed2314() {
+buildUnnamed2339() {
   var o = new core.List<api.AcceleratorTypeListWarningData>();
   o.add(buildAcceleratorTypeListWarningData());
   o.add(buildAcceleratorTypeListWarningData());
   return o;
 }
 
-checkUnnamed2314(core.List<api.AcceleratorTypeListWarningData> o) {
+checkUnnamed2339(core.List<api.AcceleratorTypeListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorTypeListWarningData(o[0]);
   checkAcceleratorTypeListWarningData(o[1]);
@@ -260,7 +260,7 @@
   buildCounterAcceleratorTypeListWarning++;
   if (buildCounterAcceleratorTypeListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2314();
+    o.data = buildUnnamed2339();
     o.message = "foo";
   }
   buildCounterAcceleratorTypeListWarning--;
@@ -271,7 +271,7 @@
   buildCounterAcceleratorTypeListWarning++;
   if (buildCounterAcceleratorTypeListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2314(o.data);
+    checkUnnamed2339(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAcceleratorTypeListWarning--;
@@ -283,7 +283,7 @@
   buildCounterAcceleratorTypeList++;
   if (buildCounterAcceleratorTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2313();
+    o.items = buildUnnamed2338();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -297,7 +297,7 @@
   buildCounterAcceleratorTypeList++;
   if (buildCounterAcceleratorTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2313(o.items);
+    checkUnnamed2338(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -306,14 +306,14 @@
   buildCounterAcceleratorTypeList--;
 }
 
-buildUnnamed2315() {
+buildUnnamed2340() {
   var o = new core.List<api.AcceleratorType>();
   o.add(buildAcceleratorType());
   o.add(buildAcceleratorType());
   return o;
 }
 
-checkUnnamed2315(core.List<api.AcceleratorType> o) {
+checkUnnamed2340(core.List<api.AcceleratorType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorType(o[0]);
   checkAcceleratorType(o[1]);
@@ -341,14 +341,14 @@
   buildCounterAcceleratorTypesScopedListWarningData--;
 }
 
-buildUnnamed2316() {
+buildUnnamed2341() {
   var o = new core.List<api.AcceleratorTypesScopedListWarningData>();
   o.add(buildAcceleratorTypesScopedListWarningData());
   o.add(buildAcceleratorTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2316(core.List<api.AcceleratorTypesScopedListWarningData> o) {
+checkUnnamed2341(core.List<api.AcceleratorTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorTypesScopedListWarningData(o[0]);
   checkAcceleratorTypesScopedListWarningData(o[1]);
@@ -360,7 +360,7 @@
   buildCounterAcceleratorTypesScopedListWarning++;
   if (buildCounterAcceleratorTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2316();
+    o.data = buildUnnamed2341();
     o.message = "foo";
   }
   buildCounterAcceleratorTypesScopedListWarning--;
@@ -372,7 +372,7 @@
   buildCounterAcceleratorTypesScopedListWarning++;
   if (buildCounterAcceleratorTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2316(o.data);
+    checkUnnamed2341(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAcceleratorTypesScopedListWarning--;
@@ -383,7 +383,7 @@
   var o = new api.AcceleratorTypesScopedList();
   buildCounterAcceleratorTypesScopedList++;
   if (buildCounterAcceleratorTypesScopedList < 3) {
-    o.acceleratorTypes = buildUnnamed2315();
+    o.acceleratorTypes = buildUnnamed2340();
     o.warning = buildAcceleratorTypesScopedListWarning();
   }
   buildCounterAcceleratorTypesScopedList--;
@@ -393,7 +393,7 @@
 checkAcceleratorTypesScopedList(api.AcceleratorTypesScopedList o) {
   buildCounterAcceleratorTypesScopedList++;
   if (buildCounterAcceleratorTypesScopedList < 3) {
-    checkUnnamed2315(o.acceleratorTypes);
+    checkUnnamed2340(o.acceleratorTypes);
     checkAcceleratorTypesScopedListWarning(o.warning);
   }
   buildCounterAcceleratorTypesScopedList--;
@@ -424,14 +424,14 @@
   buildCounterAccessConfig--;
 }
 
-buildUnnamed2317() {
+buildUnnamed2342() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2317(core.List<core.String> o) {
+checkUnnamed2342(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -454,7 +454,7 @@
     o.selfLink = "foo";
     o.status = "foo";
     o.subnetwork = "foo";
-    o.users = buildUnnamed2317();
+    o.users = buildUnnamed2342();
   }
   buildCounterAddress--;
   return o;
@@ -475,19 +475,19 @@
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.subnetwork, unittest.equals('foo'));
-    checkUnnamed2317(o.users);
+    checkUnnamed2342(o.users);
   }
   buildCounterAddress--;
 }
 
-buildUnnamed2318() {
+buildUnnamed2343() {
   var o = new core.Map<core.String, api.AddressesScopedList>();
   o["x"] = buildAddressesScopedList();
   o["y"] = buildAddressesScopedList();
   return o;
 }
 
-checkUnnamed2318(core.Map<core.String, api.AddressesScopedList> o) {
+checkUnnamed2343(core.Map<core.String, api.AddressesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressesScopedList(o["x"]);
   checkAddressesScopedList(o["y"]);
@@ -514,14 +514,14 @@
   buildCounterAddressAggregatedListWarningData--;
 }
 
-buildUnnamed2319() {
+buildUnnamed2344() {
   var o = new core.List<api.AddressAggregatedListWarningData>();
   o.add(buildAddressAggregatedListWarningData());
   o.add(buildAddressAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2319(core.List<api.AddressAggregatedListWarningData> o) {
+checkUnnamed2344(core.List<api.AddressAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressAggregatedListWarningData(o[0]);
   checkAddressAggregatedListWarningData(o[1]);
@@ -533,7 +533,7 @@
   buildCounterAddressAggregatedListWarning++;
   if (buildCounterAddressAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2319();
+    o.data = buildUnnamed2344();
     o.message = "foo";
   }
   buildCounterAddressAggregatedListWarning--;
@@ -544,7 +544,7 @@
   buildCounterAddressAggregatedListWarning++;
   if (buildCounterAddressAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2319(o.data);
+    checkUnnamed2344(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAddressAggregatedListWarning--;
@@ -556,7 +556,7 @@
   buildCounterAddressAggregatedList++;
   if (buildCounterAddressAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2318();
+    o.items = buildUnnamed2343();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -570,7 +570,7 @@
   buildCounterAddressAggregatedList++;
   if (buildCounterAddressAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2318(o.items);
+    checkUnnamed2343(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -579,14 +579,14 @@
   buildCounterAddressAggregatedList--;
 }
 
-buildUnnamed2320() {
+buildUnnamed2345() {
   var o = new core.List<api.Address>();
   o.add(buildAddress());
   o.add(buildAddress());
   return o;
 }
 
-checkUnnamed2320(core.List<api.Address> o) {
+checkUnnamed2345(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddress(o[0]);
   checkAddress(o[1]);
@@ -613,14 +613,14 @@
   buildCounterAddressListWarningData--;
 }
 
-buildUnnamed2321() {
+buildUnnamed2346() {
   var o = new core.List<api.AddressListWarningData>();
   o.add(buildAddressListWarningData());
   o.add(buildAddressListWarningData());
   return o;
 }
 
-checkUnnamed2321(core.List<api.AddressListWarningData> o) {
+checkUnnamed2346(core.List<api.AddressListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressListWarningData(o[0]);
   checkAddressListWarningData(o[1]);
@@ -632,7 +632,7 @@
   buildCounterAddressListWarning++;
   if (buildCounterAddressListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2321();
+    o.data = buildUnnamed2346();
     o.message = "foo";
   }
   buildCounterAddressListWarning--;
@@ -643,7 +643,7 @@
   buildCounterAddressListWarning++;
   if (buildCounterAddressListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2321(o.data);
+    checkUnnamed2346(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAddressListWarning--;
@@ -655,7 +655,7 @@
   buildCounterAddressList++;
   if (buildCounterAddressList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2320();
+    o.items = buildUnnamed2345();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -669,7 +669,7 @@
   buildCounterAddressList++;
   if (buildCounterAddressList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2320(o.items);
+    checkUnnamed2345(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -678,14 +678,14 @@
   buildCounterAddressList--;
 }
 
-buildUnnamed2322() {
+buildUnnamed2347() {
   var o = new core.List<api.Address>();
   o.add(buildAddress());
   o.add(buildAddress());
   return o;
 }
 
-checkUnnamed2322(core.List<api.Address> o) {
+checkUnnamed2347(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddress(o[0]);
   checkAddress(o[1]);
@@ -712,14 +712,14 @@
   buildCounterAddressesScopedListWarningData--;
 }
 
-buildUnnamed2323() {
+buildUnnamed2348() {
   var o = new core.List<api.AddressesScopedListWarningData>();
   o.add(buildAddressesScopedListWarningData());
   o.add(buildAddressesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2323(core.List<api.AddressesScopedListWarningData> o) {
+checkUnnamed2348(core.List<api.AddressesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressesScopedListWarningData(o[0]);
   checkAddressesScopedListWarningData(o[1]);
@@ -731,7 +731,7 @@
   buildCounterAddressesScopedListWarning++;
   if (buildCounterAddressesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2323();
+    o.data = buildUnnamed2348();
     o.message = "foo";
   }
   buildCounterAddressesScopedListWarning--;
@@ -742,7 +742,7 @@
   buildCounterAddressesScopedListWarning++;
   if (buildCounterAddressesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2323(o.data);
+    checkUnnamed2348(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAddressesScopedListWarning--;
@@ -753,7 +753,7 @@
   var o = new api.AddressesScopedList();
   buildCounterAddressesScopedList++;
   if (buildCounterAddressesScopedList < 3) {
-    o.addresses = buildUnnamed2322();
+    o.addresses = buildUnnamed2347();
     o.warning = buildAddressesScopedListWarning();
   }
   buildCounterAddressesScopedList--;
@@ -763,7 +763,7 @@
 checkAddressesScopedList(api.AddressesScopedList o) {
   buildCounterAddressesScopedList++;
   if (buildCounterAddressesScopedList < 3) {
-    checkUnnamed2322(o.addresses);
+    checkUnnamed2347(o.addresses);
     checkAddressesScopedListWarning(o.warning);
   }
   buildCounterAddressesScopedList--;
@@ -790,14 +790,14 @@
   buildCounterAliasIpRange--;
 }
 
-buildUnnamed2324() {
+buildUnnamed2349() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2324(core.List<core.String> o) {
+checkUnnamed2349(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -816,7 +816,7 @@
     o.initializeParams = buildAttachedDiskInitializeParams();
     o.interface = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed2324();
+    o.licenses = buildUnnamed2349();
     o.mode = "foo";
     o.source = "foo";
     o.type = "foo";
@@ -836,7 +836,7 @@
     checkAttachedDiskInitializeParams(o.initializeParams);
     unittest.expect(o.interface, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2324(o.licenses);
+    checkUnnamed2349(o.licenses);
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -871,14 +871,14 @@
   buildCounterAttachedDiskInitializeParams--;
 }
 
-buildUnnamed2325() {
+buildUnnamed2350() {
   var o = new core.List<api.AutoscalerStatusDetails>();
   o.add(buildAutoscalerStatusDetails());
   o.add(buildAutoscalerStatusDetails());
   return o;
 }
 
-checkUnnamed2325(core.List<api.AutoscalerStatusDetails> o) {
+checkUnnamed2350(core.List<api.AutoscalerStatusDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalerStatusDetails(o[0]);
   checkAutoscalerStatusDetails(o[1]);
@@ -898,7 +898,7 @@
     o.region = "foo";
     o.selfLink = "foo";
     o.status = "foo";
-    o.statusDetails = buildUnnamed2325();
+    o.statusDetails = buildUnnamed2350();
     o.target = "foo";
     o.zone = "foo";
   }
@@ -918,21 +918,21 @@
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed2325(o.statusDetails);
+    checkUnnamed2350(o.statusDetails);
     unittest.expect(o.target, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterAutoscaler--;
 }
 
-buildUnnamed2326() {
+buildUnnamed2351() {
   var o = new core.Map<core.String, api.AutoscalersScopedList>();
   o["x"] = buildAutoscalersScopedList();
   o["y"] = buildAutoscalersScopedList();
   return o;
 }
 
-checkUnnamed2326(core.Map<core.String, api.AutoscalersScopedList> o) {
+checkUnnamed2351(core.Map<core.String, api.AutoscalersScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalersScopedList(o["x"]);
   checkAutoscalersScopedList(o["y"]);
@@ -960,14 +960,14 @@
   buildCounterAutoscalerAggregatedListWarningData--;
 }
 
-buildUnnamed2327() {
+buildUnnamed2352() {
   var o = new core.List<api.AutoscalerAggregatedListWarningData>();
   o.add(buildAutoscalerAggregatedListWarningData());
   o.add(buildAutoscalerAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2327(core.List<api.AutoscalerAggregatedListWarningData> o) {
+checkUnnamed2352(core.List<api.AutoscalerAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalerAggregatedListWarningData(o[0]);
   checkAutoscalerAggregatedListWarningData(o[1]);
@@ -979,7 +979,7 @@
   buildCounterAutoscalerAggregatedListWarning++;
   if (buildCounterAutoscalerAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2327();
+    o.data = buildUnnamed2352();
     o.message = "foo";
   }
   buildCounterAutoscalerAggregatedListWarning--;
@@ -990,7 +990,7 @@
   buildCounterAutoscalerAggregatedListWarning++;
   if (buildCounterAutoscalerAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2327(o.data);
+    checkUnnamed2352(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAutoscalerAggregatedListWarning--;
@@ -1002,7 +1002,7 @@
   buildCounterAutoscalerAggregatedList++;
   if (buildCounterAutoscalerAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2326();
+    o.items = buildUnnamed2351();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1016,7 +1016,7 @@
   buildCounterAutoscalerAggregatedList++;
   if (buildCounterAutoscalerAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2326(o.items);
+    checkUnnamed2351(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1025,14 +1025,14 @@
   buildCounterAutoscalerAggregatedList--;
 }
 
-buildUnnamed2328() {
+buildUnnamed2353() {
   var o = new core.List<api.Autoscaler>();
   o.add(buildAutoscaler());
   o.add(buildAutoscaler());
   return o;
 }
 
-checkUnnamed2328(core.List<api.Autoscaler> o) {
+checkUnnamed2353(core.List<api.Autoscaler> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscaler(o[0]);
   checkAutoscaler(o[1]);
@@ -1059,14 +1059,14 @@
   buildCounterAutoscalerListWarningData--;
 }
 
-buildUnnamed2329() {
+buildUnnamed2354() {
   var o = new core.List<api.AutoscalerListWarningData>();
   o.add(buildAutoscalerListWarningData());
   o.add(buildAutoscalerListWarningData());
   return o;
 }
 
-checkUnnamed2329(core.List<api.AutoscalerListWarningData> o) {
+checkUnnamed2354(core.List<api.AutoscalerListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalerListWarningData(o[0]);
   checkAutoscalerListWarningData(o[1]);
@@ -1078,7 +1078,7 @@
   buildCounterAutoscalerListWarning++;
   if (buildCounterAutoscalerListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2329();
+    o.data = buildUnnamed2354();
     o.message = "foo";
   }
   buildCounterAutoscalerListWarning--;
@@ -1089,7 +1089,7 @@
   buildCounterAutoscalerListWarning++;
   if (buildCounterAutoscalerListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2329(o.data);
+    checkUnnamed2354(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAutoscalerListWarning--;
@@ -1101,7 +1101,7 @@
   buildCounterAutoscalerList++;
   if (buildCounterAutoscalerList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2328();
+    o.items = buildUnnamed2353();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1115,7 +1115,7 @@
   buildCounterAutoscalerList++;
   if (buildCounterAutoscalerList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2328(o.items);
+    checkUnnamed2353(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1145,14 +1145,14 @@
   buildCounterAutoscalerStatusDetails--;
 }
 
-buildUnnamed2330() {
+buildUnnamed2355() {
   var o = new core.List<api.Autoscaler>();
   o.add(buildAutoscaler());
   o.add(buildAutoscaler());
   return o;
 }
 
-checkUnnamed2330(core.List<api.Autoscaler> o) {
+checkUnnamed2355(core.List<api.Autoscaler> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscaler(o[0]);
   checkAutoscaler(o[1]);
@@ -1179,14 +1179,14 @@
   buildCounterAutoscalersScopedListWarningData--;
 }
 
-buildUnnamed2331() {
+buildUnnamed2356() {
   var o = new core.List<api.AutoscalersScopedListWarningData>();
   o.add(buildAutoscalersScopedListWarningData());
   o.add(buildAutoscalersScopedListWarningData());
   return o;
 }
 
-checkUnnamed2331(core.List<api.AutoscalersScopedListWarningData> o) {
+checkUnnamed2356(core.List<api.AutoscalersScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalersScopedListWarningData(o[0]);
   checkAutoscalersScopedListWarningData(o[1]);
@@ -1198,7 +1198,7 @@
   buildCounterAutoscalersScopedListWarning++;
   if (buildCounterAutoscalersScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2331();
+    o.data = buildUnnamed2356();
     o.message = "foo";
   }
   buildCounterAutoscalersScopedListWarning--;
@@ -1209,7 +1209,7 @@
   buildCounterAutoscalersScopedListWarning++;
   if (buildCounterAutoscalersScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2331(o.data);
+    checkUnnamed2356(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAutoscalersScopedListWarning--;
@@ -1220,7 +1220,7 @@
   var o = new api.AutoscalersScopedList();
   buildCounterAutoscalersScopedList++;
   if (buildCounterAutoscalersScopedList < 3) {
-    o.autoscalers = buildUnnamed2330();
+    o.autoscalers = buildUnnamed2355();
     o.warning = buildAutoscalersScopedListWarning();
   }
   buildCounterAutoscalersScopedList--;
@@ -1230,20 +1230,20 @@
 checkAutoscalersScopedList(api.AutoscalersScopedList o) {
   buildCounterAutoscalersScopedList++;
   if (buildCounterAutoscalersScopedList < 3) {
-    checkUnnamed2330(o.autoscalers);
+    checkUnnamed2355(o.autoscalers);
     checkAutoscalersScopedListWarning(o.warning);
   }
   buildCounterAutoscalersScopedList--;
 }
 
-buildUnnamed2332() {
+buildUnnamed2357() {
   var o = new core.List<api.AutoscalingPolicyCustomMetricUtilization>();
   o.add(buildAutoscalingPolicyCustomMetricUtilization());
   o.add(buildAutoscalingPolicyCustomMetricUtilization());
   return o;
 }
 
-checkUnnamed2332(core.List<api.AutoscalingPolicyCustomMetricUtilization> o) {
+checkUnnamed2357(core.List<api.AutoscalingPolicyCustomMetricUtilization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalingPolicyCustomMetricUtilization(o[0]);
   checkAutoscalingPolicyCustomMetricUtilization(o[1]);
@@ -1256,7 +1256,7 @@
   if (buildCounterAutoscalingPolicy < 3) {
     o.coolDownPeriodSec = 42;
     o.cpuUtilization = buildAutoscalingPolicyCpuUtilization();
-    o.customMetricUtilizations = buildUnnamed2332();
+    o.customMetricUtilizations = buildUnnamed2357();
     o.loadBalancingUtilization =
         buildAutoscalingPolicyLoadBalancingUtilization();
     o.maxNumReplicas = 42;
@@ -1271,7 +1271,7 @@
   if (buildCounterAutoscalingPolicy < 3) {
     unittest.expect(o.coolDownPeriodSec, unittest.equals(42));
     checkAutoscalingPolicyCpuUtilization(o.cpuUtilization);
-    checkUnnamed2332(o.customMetricUtilizations);
+    checkUnnamed2357(o.customMetricUtilizations);
     checkAutoscalingPolicyLoadBalancingUtilization(o.loadBalancingUtilization);
     unittest.expect(o.maxNumReplicas, unittest.equals(42));
     unittest.expect(o.minNumReplicas, unittest.equals(42));
@@ -1410,14 +1410,14 @@
   buildCounterBackendBucket--;
 }
 
-buildUnnamed2333() {
+buildUnnamed2358() {
   var o = new core.List<api.BackendBucket>();
   o.add(buildBackendBucket());
   o.add(buildBackendBucket());
   return o;
 }
 
-checkUnnamed2333(core.List<api.BackendBucket> o) {
+checkUnnamed2358(core.List<api.BackendBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendBucket(o[0]);
   checkBackendBucket(o[1]);
@@ -1444,14 +1444,14 @@
   buildCounterBackendBucketListWarningData--;
 }
 
-buildUnnamed2334() {
+buildUnnamed2359() {
   var o = new core.List<api.BackendBucketListWarningData>();
   o.add(buildBackendBucketListWarningData());
   o.add(buildBackendBucketListWarningData());
   return o;
 }
 
-checkUnnamed2334(core.List<api.BackendBucketListWarningData> o) {
+checkUnnamed2359(core.List<api.BackendBucketListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendBucketListWarningData(o[0]);
   checkBackendBucketListWarningData(o[1]);
@@ -1463,7 +1463,7 @@
   buildCounterBackendBucketListWarning++;
   if (buildCounterBackendBucketListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2334();
+    o.data = buildUnnamed2359();
     o.message = "foo";
   }
   buildCounterBackendBucketListWarning--;
@@ -1474,7 +1474,7 @@
   buildCounterBackendBucketListWarning++;
   if (buildCounterBackendBucketListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2334(o.data);
+    checkUnnamed2359(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterBackendBucketListWarning--;
@@ -1486,7 +1486,7 @@
   buildCounterBackendBucketList++;
   if (buildCounterBackendBucketList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2333();
+    o.items = buildUnnamed2358();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1500,7 +1500,7 @@
   buildCounterBackendBucketList++;
   if (buildCounterBackendBucketList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2333(o.items);
+    checkUnnamed2358(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1509,27 +1509,27 @@
   buildCounterBackendBucketList--;
 }
 
-buildUnnamed2335() {
+buildUnnamed2360() {
   var o = new core.List<api.Backend>();
   o.add(buildBackend());
   o.add(buildBackend());
   return o;
 }
 
-checkUnnamed2335(core.List<api.Backend> o) {
+checkUnnamed2360(core.List<api.Backend> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackend(o[0]);
   checkBackend(o[1]);
 }
 
-buildUnnamed2336() {
+buildUnnamed2361() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2336(core.List<core.String> o) {
+checkUnnamed2361(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1541,14 +1541,14 @@
   buildCounterBackendService++;
   if (buildCounterBackendService < 3) {
     o.affinityCookieTtlSec = 42;
-    o.backends = buildUnnamed2335();
+    o.backends = buildUnnamed2360();
     o.cdnPolicy = buildBackendServiceCdnPolicy();
     o.connectionDraining = buildConnectionDraining();
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.enableCDN = true;
     o.fingerprint = "foo";
-    o.healthChecks = buildUnnamed2336();
+    o.healthChecks = buildUnnamed2361();
     o.iap = buildBackendServiceIAP();
     o.id = "foo";
     o.kind = "foo";
@@ -1570,14 +1570,14 @@
   buildCounterBackendService++;
   if (buildCounterBackendService < 3) {
     unittest.expect(o.affinityCookieTtlSec, unittest.equals(42));
-    checkUnnamed2335(o.backends);
+    checkUnnamed2360(o.backends);
     checkBackendServiceCdnPolicy(o.cdnPolicy);
     checkConnectionDraining(o.connectionDraining);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.enableCDN, unittest.isTrue);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2336(o.healthChecks);
+    checkUnnamed2361(o.healthChecks);
     checkBackendServiceIAP(o.iap);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1594,14 +1594,14 @@
   buildCounterBackendService--;
 }
 
-buildUnnamed2337() {
+buildUnnamed2362() {
   var o = new core.Map<core.String, api.BackendServicesScopedList>();
   o["x"] = buildBackendServicesScopedList();
   o["y"] = buildBackendServicesScopedList();
   return o;
 }
 
-checkUnnamed2337(core.Map<core.String, api.BackendServicesScopedList> o) {
+checkUnnamed2362(core.Map<core.String, api.BackendServicesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendServicesScopedList(o["x"]);
   checkBackendServicesScopedList(o["y"]);
@@ -1629,14 +1629,14 @@
   buildCounterBackendServiceAggregatedListWarningData--;
 }
 
-buildUnnamed2338() {
+buildUnnamed2363() {
   var o = new core.List<api.BackendServiceAggregatedListWarningData>();
   o.add(buildBackendServiceAggregatedListWarningData());
   o.add(buildBackendServiceAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2338(core.List<api.BackendServiceAggregatedListWarningData> o) {
+checkUnnamed2363(core.List<api.BackendServiceAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendServiceAggregatedListWarningData(o[0]);
   checkBackendServiceAggregatedListWarningData(o[1]);
@@ -1648,7 +1648,7 @@
   buildCounterBackendServiceAggregatedListWarning++;
   if (buildCounterBackendServiceAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2338();
+    o.data = buildUnnamed2363();
     o.message = "foo";
   }
   buildCounterBackendServiceAggregatedListWarning--;
@@ -1660,7 +1660,7 @@
   buildCounterBackendServiceAggregatedListWarning++;
   if (buildCounterBackendServiceAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2338(o.data);
+    checkUnnamed2363(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterBackendServiceAggregatedListWarning--;
@@ -1672,7 +1672,7 @@
   buildCounterBackendServiceAggregatedList++;
   if (buildCounterBackendServiceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2337();
+    o.items = buildUnnamed2362();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1686,7 +1686,7 @@
   buildCounterBackendServiceAggregatedList++;
   if (buildCounterBackendServiceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2337(o.items);
+    checkUnnamed2362(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1714,14 +1714,14 @@
   buildCounterBackendServiceCdnPolicy--;
 }
 
-buildUnnamed2339() {
+buildUnnamed2364() {
   var o = new core.List<api.HealthStatus>();
   o.add(buildHealthStatus());
   o.add(buildHealthStatus());
   return o;
 }
 
-checkUnnamed2339(core.List<api.HealthStatus> o) {
+checkUnnamed2364(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthStatus(o[0]);
   checkHealthStatus(o[1]);
@@ -1732,7 +1732,7 @@
   var o = new api.BackendServiceGroupHealth();
   buildCounterBackendServiceGroupHealth++;
   if (buildCounterBackendServiceGroupHealth < 3) {
-    o.healthStatus = buildUnnamed2339();
+    o.healthStatus = buildUnnamed2364();
     o.kind = "foo";
   }
   buildCounterBackendServiceGroupHealth--;
@@ -1742,7 +1742,7 @@
 checkBackendServiceGroupHealth(api.BackendServiceGroupHealth o) {
   buildCounterBackendServiceGroupHealth++;
   if (buildCounterBackendServiceGroupHealth < 3) {
-    checkUnnamed2339(o.healthStatus);
+    checkUnnamed2364(o.healthStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBackendServiceGroupHealth--;
@@ -1773,14 +1773,14 @@
   buildCounterBackendServiceIAP--;
 }
 
-buildUnnamed2340() {
+buildUnnamed2365() {
   var o = new core.List<api.BackendService>();
   o.add(buildBackendService());
   o.add(buildBackendService());
   return o;
 }
 
-checkUnnamed2340(core.List<api.BackendService> o) {
+checkUnnamed2365(core.List<api.BackendService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendService(o[0]);
   checkBackendService(o[1]);
@@ -1807,14 +1807,14 @@
   buildCounterBackendServiceListWarningData--;
 }
 
-buildUnnamed2341() {
+buildUnnamed2366() {
   var o = new core.List<api.BackendServiceListWarningData>();
   o.add(buildBackendServiceListWarningData());
   o.add(buildBackendServiceListWarningData());
   return o;
 }
 
-checkUnnamed2341(core.List<api.BackendServiceListWarningData> o) {
+checkUnnamed2366(core.List<api.BackendServiceListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendServiceListWarningData(o[0]);
   checkBackendServiceListWarningData(o[1]);
@@ -1826,7 +1826,7 @@
   buildCounterBackendServiceListWarning++;
   if (buildCounterBackendServiceListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2341();
+    o.data = buildUnnamed2366();
     o.message = "foo";
   }
   buildCounterBackendServiceListWarning--;
@@ -1837,7 +1837,7 @@
   buildCounterBackendServiceListWarning++;
   if (buildCounterBackendServiceListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2341(o.data);
+    checkUnnamed2366(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterBackendServiceListWarning--;
@@ -1849,7 +1849,7 @@
   buildCounterBackendServiceList++;
   if (buildCounterBackendServiceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2340();
+    o.items = buildUnnamed2365();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1863,7 +1863,7 @@
   buildCounterBackendServiceList++;
   if (buildCounterBackendServiceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2340(o.items);
+    checkUnnamed2365(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1872,14 +1872,14 @@
   buildCounterBackendServiceList--;
 }
 
-buildUnnamed2342() {
+buildUnnamed2367() {
   var o = new core.List<api.BackendService>();
   o.add(buildBackendService());
   o.add(buildBackendService());
   return o;
 }
 
-checkUnnamed2342(core.List<api.BackendService> o) {
+checkUnnamed2367(core.List<api.BackendService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendService(o[0]);
   checkBackendService(o[1]);
@@ -1907,14 +1907,14 @@
   buildCounterBackendServicesScopedListWarningData--;
 }
 
-buildUnnamed2343() {
+buildUnnamed2368() {
   var o = new core.List<api.BackendServicesScopedListWarningData>();
   o.add(buildBackendServicesScopedListWarningData());
   o.add(buildBackendServicesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2343(core.List<api.BackendServicesScopedListWarningData> o) {
+checkUnnamed2368(core.List<api.BackendServicesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendServicesScopedListWarningData(o[0]);
   checkBackendServicesScopedListWarningData(o[1]);
@@ -1926,7 +1926,7 @@
   buildCounterBackendServicesScopedListWarning++;
   if (buildCounterBackendServicesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2343();
+    o.data = buildUnnamed2368();
     o.message = "foo";
   }
   buildCounterBackendServicesScopedListWarning--;
@@ -1937,7 +1937,7 @@
   buildCounterBackendServicesScopedListWarning++;
   if (buildCounterBackendServicesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2343(o.data);
+    checkUnnamed2368(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterBackendServicesScopedListWarning--;
@@ -1948,7 +1948,7 @@
   var o = new api.BackendServicesScopedList();
   buildCounterBackendServicesScopedList++;
   if (buildCounterBackendServicesScopedList < 3) {
-    o.backendServices = buildUnnamed2342();
+    o.backendServices = buildUnnamed2367();
     o.warning = buildBackendServicesScopedListWarning();
   }
   buildCounterBackendServicesScopedList--;
@@ -1958,7 +1958,7 @@
 checkBackendServicesScopedList(api.BackendServicesScopedList o) {
   buildCounterBackendServicesScopedList++;
   if (buildCounterBackendServicesScopedList < 3) {
-    checkUnnamed2342(o.backendServices);
+    checkUnnamed2367(o.backendServices);
     checkBackendServicesScopedListWarning(o.warning);
   }
   buildCounterBackendServicesScopedList--;
@@ -1985,27 +1985,27 @@
   buildCounterCacheInvalidationRule--;
 }
 
-buildUnnamed2344() {
+buildUnnamed2369() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2344(core.List<core.String> o) {
+checkUnnamed2369(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2345() {
+buildUnnamed2370() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2345(core.List<core.String> o) {
+checkUnnamed2370(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2019,8 +2019,8 @@
     o.includeHost = true;
     o.includeProtocol = true;
     o.includeQueryString = true;
-    o.queryStringBlacklist = buildUnnamed2344();
-    o.queryStringWhitelist = buildUnnamed2345();
+    o.queryStringBlacklist = buildUnnamed2369();
+    o.queryStringWhitelist = buildUnnamed2370();
   }
   buildCounterCacheKeyPolicy--;
   return o;
@@ -2032,20 +2032,20 @@
     unittest.expect(o.includeHost, unittest.isTrue);
     unittest.expect(o.includeProtocol, unittest.isTrue);
     unittest.expect(o.includeQueryString, unittest.isTrue);
-    checkUnnamed2344(o.queryStringBlacklist);
-    checkUnnamed2345(o.queryStringWhitelist);
+    checkUnnamed2369(o.queryStringBlacklist);
+    checkUnnamed2370(o.queryStringWhitelist);
   }
   buildCounterCacheKeyPolicy--;
 }
 
-buildUnnamed2346() {
+buildUnnamed2371() {
   var o = new core.List<api.ResourceCommitment>();
   o.add(buildResourceCommitment());
   o.add(buildResourceCommitment());
   return o;
 }
 
-checkUnnamed2346(core.List<api.ResourceCommitment> o) {
+checkUnnamed2371(core.List<api.ResourceCommitment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceCommitment(o[0]);
   checkResourceCommitment(o[1]);
@@ -2064,7 +2064,7 @@
     o.name = "foo";
     o.plan = "foo";
     o.region = "foo";
-    o.resources = buildUnnamed2346();
+    o.resources = buildUnnamed2371();
     o.selfLink = "foo";
     o.startTimestamp = "foo";
     o.status = "foo";
@@ -2085,7 +2085,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.plan, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed2346(o.resources);
+    checkUnnamed2371(o.resources);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.startTimestamp, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -2094,14 +2094,14 @@
   buildCounterCommitment--;
 }
 
-buildUnnamed2347() {
+buildUnnamed2372() {
   var o = new core.Map<core.String, api.CommitmentsScopedList>();
   o["x"] = buildCommitmentsScopedList();
   o["y"] = buildCommitmentsScopedList();
   return o;
 }
 
-checkUnnamed2347(core.Map<core.String, api.CommitmentsScopedList> o) {
+checkUnnamed2372(core.Map<core.String, api.CommitmentsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommitmentsScopedList(o["x"]);
   checkCommitmentsScopedList(o["y"]);
@@ -2129,14 +2129,14 @@
   buildCounterCommitmentAggregatedListWarningData--;
 }
 
-buildUnnamed2348() {
+buildUnnamed2373() {
   var o = new core.List<api.CommitmentAggregatedListWarningData>();
   o.add(buildCommitmentAggregatedListWarningData());
   o.add(buildCommitmentAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2348(core.List<api.CommitmentAggregatedListWarningData> o) {
+checkUnnamed2373(core.List<api.CommitmentAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommitmentAggregatedListWarningData(o[0]);
   checkCommitmentAggregatedListWarningData(o[1]);
@@ -2148,7 +2148,7 @@
   buildCounterCommitmentAggregatedListWarning++;
   if (buildCounterCommitmentAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2348();
+    o.data = buildUnnamed2373();
     o.message = "foo";
   }
   buildCounterCommitmentAggregatedListWarning--;
@@ -2159,7 +2159,7 @@
   buildCounterCommitmentAggregatedListWarning++;
   if (buildCounterCommitmentAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2348(o.data);
+    checkUnnamed2373(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterCommitmentAggregatedListWarning--;
@@ -2171,7 +2171,7 @@
   buildCounterCommitmentAggregatedList++;
   if (buildCounterCommitmentAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2347();
+    o.items = buildUnnamed2372();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2185,7 +2185,7 @@
   buildCounterCommitmentAggregatedList++;
   if (buildCounterCommitmentAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2347(o.items);
+    checkUnnamed2372(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2194,14 +2194,14 @@
   buildCounterCommitmentAggregatedList--;
 }
 
-buildUnnamed2349() {
+buildUnnamed2374() {
   var o = new core.List<api.Commitment>();
   o.add(buildCommitment());
   o.add(buildCommitment());
   return o;
 }
 
-checkUnnamed2349(core.List<api.Commitment> o) {
+checkUnnamed2374(core.List<api.Commitment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommitment(o[0]);
   checkCommitment(o[1]);
@@ -2228,14 +2228,14 @@
   buildCounterCommitmentListWarningData--;
 }
 
-buildUnnamed2350() {
+buildUnnamed2375() {
   var o = new core.List<api.CommitmentListWarningData>();
   o.add(buildCommitmentListWarningData());
   o.add(buildCommitmentListWarningData());
   return o;
 }
 
-checkUnnamed2350(core.List<api.CommitmentListWarningData> o) {
+checkUnnamed2375(core.List<api.CommitmentListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommitmentListWarningData(o[0]);
   checkCommitmentListWarningData(o[1]);
@@ -2247,7 +2247,7 @@
   buildCounterCommitmentListWarning++;
   if (buildCounterCommitmentListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2350();
+    o.data = buildUnnamed2375();
     o.message = "foo";
   }
   buildCounterCommitmentListWarning--;
@@ -2258,7 +2258,7 @@
   buildCounterCommitmentListWarning++;
   if (buildCounterCommitmentListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2350(o.data);
+    checkUnnamed2375(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterCommitmentListWarning--;
@@ -2270,7 +2270,7 @@
   buildCounterCommitmentList++;
   if (buildCounterCommitmentList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2349();
+    o.items = buildUnnamed2374();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2284,7 +2284,7 @@
   buildCounterCommitmentList++;
   if (buildCounterCommitmentList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2349(o.items);
+    checkUnnamed2374(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2293,14 +2293,14 @@
   buildCounterCommitmentList--;
 }
 
-buildUnnamed2351() {
+buildUnnamed2376() {
   var o = new core.List<api.Commitment>();
   o.add(buildCommitment());
   o.add(buildCommitment());
   return o;
 }
 
-checkUnnamed2351(core.List<api.Commitment> o) {
+checkUnnamed2376(core.List<api.Commitment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommitment(o[0]);
   checkCommitment(o[1]);
@@ -2327,14 +2327,14 @@
   buildCounterCommitmentsScopedListWarningData--;
 }
 
-buildUnnamed2352() {
+buildUnnamed2377() {
   var o = new core.List<api.CommitmentsScopedListWarningData>();
   o.add(buildCommitmentsScopedListWarningData());
   o.add(buildCommitmentsScopedListWarningData());
   return o;
 }
 
-checkUnnamed2352(core.List<api.CommitmentsScopedListWarningData> o) {
+checkUnnamed2377(core.List<api.CommitmentsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommitmentsScopedListWarningData(o[0]);
   checkCommitmentsScopedListWarningData(o[1]);
@@ -2346,7 +2346,7 @@
   buildCounterCommitmentsScopedListWarning++;
   if (buildCounterCommitmentsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2352();
+    o.data = buildUnnamed2377();
     o.message = "foo";
   }
   buildCounterCommitmentsScopedListWarning--;
@@ -2357,7 +2357,7 @@
   buildCounterCommitmentsScopedListWarning++;
   if (buildCounterCommitmentsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2352(o.data);
+    checkUnnamed2377(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterCommitmentsScopedListWarning--;
@@ -2368,7 +2368,7 @@
   var o = new api.CommitmentsScopedList();
   buildCounterCommitmentsScopedList++;
   if (buildCounterCommitmentsScopedList < 3) {
-    o.commitments = buildUnnamed2351();
+    o.commitments = buildUnnamed2376();
     o.warning = buildCommitmentsScopedListWarning();
   }
   buildCounterCommitmentsScopedList--;
@@ -2378,7 +2378,7 @@
 checkCommitmentsScopedList(api.CommitmentsScopedList o) {
   buildCounterCommitmentsScopedList++;
   if (buildCounterCommitmentsScopedList < 3) {
-    checkUnnamed2351(o.commitments);
+    checkUnnamed2376(o.commitments);
     checkCommitmentsScopedListWarning(o.warning);
   }
   buildCounterCommitmentsScopedList--;
@@ -2473,40 +2473,40 @@
   buildCounterDeprecationStatus--;
 }
 
-buildUnnamed2353() {
+buildUnnamed2378() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2353(core.Map<core.String, core.String> o) {
+checkUnnamed2378(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'));
 }
 
-buildUnnamed2354() {
+buildUnnamed2379() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2354(core.List<core.String> o) {
+checkUnnamed2379(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2355() {
+buildUnnamed2380() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2355(core.List<core.String> o) {
+checkUnnamed2380(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2523,10 +2523,10 @@
     o.id = "foo";
     o.kind = "foo";
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2353();
+    o.labels = buildUnnamed2378();
     o.lastAttachTimestamp = "foo";
     o.lastDetachTimestamp = "foo";
-    o.licenses = buildUnnamed2354();
+    o.licenses = buildUnnamed2379();
     o.name = "foo";
     o.options = "foo";
     o.selfLink = "foo";
@@ -2539,7 +2539,7 @@
     o.sourceSnapshotId = "foo";
     o.status = "foo";
     o.type = "foo";
-    o.users = buildUnnamed2355();
+    o.users = buildUnnamed2380();
     o.zone = "foo";
   }
   buildCounterDisk--;
@@ -2555,10 +2555,10 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2353(o.labels);
+    checkUnnamed2378(o.labels);
     unittest.expect(o.lastAttachTimestamp, unittest.equals('foo'));
     unittest.expect(o.lastDetachTimestamp, unittest.equals('foo'));
-    checkUnnamed2354(o.licenses);
+    checkUnnamed2379(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.options, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2571,20 +2571,20 @@
     unittest.expect(o.sourceSnapshotId, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    checkUnnamed2355(o.users);
+    checkUnnamed2380(o.users);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterDisk--;
 }
 
-buildUnnamed2356() {
+buildUnnamed2381() {
   var o = new core.Map<core.String, api.DisksScopedList>();
   o["x"] = buildDisksScopedList();
   o["y"] = buildDisksScopedList();
   return o;
 }
 
-checkUnnamed2356(core.Map<core.String, api.DisksScopedList> o) {
+checkUnnamed2381(core.Map<core.String, api.DisksScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisksScopedList(o["x"]);
   checkDisksScopedList(o["y"]);
@@ -2611,14 +2611,14 @@
   buildCounterDiskAggregatedListWarningData--;
 }
 
-buildUnnamed2357() {
+buildUnnamed2382() {
   var o = new core.List<api.DiskAggregatedListWarningData>();
   o.add(buildDiskAggregatedListWarningData());
   o.add(buildDiskAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2357(core.List<api.DiskAggregatedListWarningData> o) {
+checkUnnamed2382(core.List<api.DiskAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskAggregatedListWarningData(o[0]);
   checkDiskAggregatedListWarningData(o[1]);
@@ -2630,7 +2630,7 @@
   buildCounterDiskAggregatedListWarning++;
   if (buildCounterDiskAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2357();
+    o.data = buildUnnamed2382();
     o.message = "foo";
   }
   buildCounterDiskAggregatedListWarning--;
@@ -2641,7 +2641,7 @@
   buildCounterDiskAggregatedListWarning++;
   if (buildCounterDiskAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2357(o.data);
+    checkUnnamed2382(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDiskAggregatedListWarning--;
@@ -2653,7 +2653,7 @@
   buildCounterDiskAggregatedList++;
   if (buildCounterDiskAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2356();
+    o.items = buildUnnamed2381();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2667,7 +2667,7 @@
   buildCounterDiskAggregatedList++;
   if (buildCounterDiskAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2356(o.items);
+    checkUnnamed2381(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2676,14 +2676,14 @@
   buildCounterDiskAggregatedList--;
 }
 
-buildUnnamed2358() {
+buildUnnamed2383() {
   var o = new core.List<api.Disk>();
   o.add(buildDisk());
   o.add(buildDisk());
   return o;
 }
 
-checkUnnamed2358(core.List<api.Disk> o) {
+checkUnnamed2383(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisk(o[0]);
   checkDisk(o[1]);
@@ -2710,14 +2710,14 @@
   buildCounterDiskListWarningData--;
 }
 
-buildUnnamed2359() {
+buildUnnamed2384() {
   var o = new core.List<api.DiskListWarningData>();
   o.add(buildDiskListWarningData());
   o.add(buildDiskListWarningData());
   return o;
 }
 
-checkUnnamed2359(core.List<api.DiskListWarningData> o) {
+checkUnnamed2384(core.List<api.DiskListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskListWarningData(o[0]);
   checkDiskListWarningData(o[1]);
@@ -2729,7 +2729,7 @@
   buildCounterDiskListWarning++;
   if (buildCounterDiskListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2359();
+    o.data = buildUnnamed2384();
     o.message = "foo";
   }
   buildCounterDiskListWarning--;
@@ -2740,7 +2740,7 @@
   buildCounterDiskListWarning++;
   if (buildCounterDiskListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2359(o.data);
+    checkUnnamed2384(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDiskListWarning--;
@@ -2752,7 +2752,7 @@
   buildCounterDiskList++;
   if (buildCounterDiskList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2358();
+    o.items = buildUnnamed2383();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2766,7 +2766,7 @@
   buildCounterDiskList++;
   if (buildCounterDiskList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2358(o.items);
+    checkUnnamed2383(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2833,14 +2833,14 @@
   buildCounterDiskType--;
 }
 
-buildUnnamed2360() {
+buildUnnamed2385() {
   var o = new core.Map<core.String, api.DiskTypesScopedList>();
   o["x"] = buildDiskTypesScopedList();
   o["y"] = buildDiskTypesScopedList();
   return o;
 }
 
-checkUnnamed2360(core.Map<core.String, api.DiskTypesScopedList> o) {
+checkUnnamed2385(core.Map<core.String, api.DiskTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypesScopedList(o["x"]);
   checkDiskTypesScopedList(o["y"]);
@@ -2868,14 +2868,14 @@
   buildCounterDiskTypeAggregatedListWarningData--;
 }
 
-buildUnnamed2361() {
+buildUnnamed2386() {
   var o = new core.List<api.DiskTypeAggregatedListWarningData>();
   o.add(buildDiskTypeAggregatedListWarningData());
   o.add(buildDiskTypeAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2361(core.List<api.DiskTypeAggregatedListWarningData> o) {
+checkUnnamed2386(core.List<api.DiskTypeAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypeAggregatedListWarningData(o[0]);
   checkDiskTypeAggregatedListWarningData(o[1]);
@@ -2887,7 +2887,7 @@
   buildCounterDiskTypeAggregatedListWarning++;
   if (buildCounterDiskTypeAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2361();
+    o.data = buildUnnamed2386();
     o.message = "foo";
   }
   buildCounterDiskTypeAggregatedListWarning--;
@@ -2898,7 +2898,7 @@
   buildCounterDiskTypeAggregatedListWarning++;
   if (buildCounterDiskTypeAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2361(o.data);
+    checkUnnamed2386(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDiskTypeAggregatedListWarning--;
@@ -2910,7 +2910,7 @@
   buildCounterDiskTypeAggregatedList++;
   if (buildCounterDiskTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2360();
+    o.items = buildUnnamed2385();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2924,7 +2924,7 @@
   buildCounterDiskTypeAggregatedList++;
   if (buildCounterDiskTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2360(o.items);
+    checkUnnamed2385(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2933,14 +2933,14 @@
   buildCounterDiskTypeAggregatedList--;
 }
 
-buildUnnamed2362() {
+buildUnnamed2387() {
   var o = new core.List<api.DiskType>();
   o.add(buildDiskType());
   o.add(buildDiskType());
   return o;
 }
 
-checkUnnamed2362(core.List<api.DiskType> o) {
+checkUnnamed2387(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskType(o[0]);
   checkDiskType(o[1]);
@@ -2967,14 +2967,14 @@
   buildCounterDiskTypeListWarningData--;
 }
 
-buildUnnamed2363() {
+buildUnnamed2388() {
   var o = new core.List<api.DiskTypeListWarningData>();
   o.add(buildDiskTypeListWarningData());
   o.add(buildDiskTypeListWarningData());
   return o;
 }
 
-checkUnnamed2363(core.List<api.DiskTypeListWarningData> o) {
+checkUnnamed2388(core.List<api.DiskTypeListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypeListWarningData(o[0]);
   checkDiskTypeListWarningData(o[1]);
@@ -2986,7 +2986,7 @@
   buildCounterDiskTypeListWarning++;
   if (buildCounterDiskTypeListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2363();
+    o.data = buildUnnamed2388();
     o.message = "foo";
   }
   buildCounterDiskTypeListWarning--;
@@ -2997,7 +2997,7 @@
   buildCounterDiskTypeListWarning++;
   if (buildCounterDiskTypeListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2363(o.data);
+    checkUnnamed2388(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDiskTypeListWarning--;
@@ -3009,7 +3009,7 @@
   buildCounterDiskTypeList++;
   if (buildCounterDiskTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2362();
+    o.items = buildUnnamed2387();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3023,7 +3023,7 @@
   buildCounterDiskTypeList++;
   if (buildCounterDiskTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2362(o.items);
+    checkUnnamed2387(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3032,14 +3032,14 @@
   buildCounterDiskTypeList--;
 }
 
-buildUnnamed2364() {
+buildUnnamed2389() {
   var o = new core.List<api.DiskType>();
   o.add(buildDiskType());
   o.add(buildDiskType());
   return o;
 }
 
-checkUnnamed2364(core.List<api.DiskType> o) {
+checkUnnamed2389(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskType(o[0]);
   checkDiskType(o[1]);
@@ -3066,14 +3066,14 @@
   buildCounterDiskTypesScopedListWarningData--;
 }
 
-buildUnnamed2365() {
+buildUnnamed2390() {
   var o = new core.List<api.DiskTypesScopedListWarningData>();
   o.add(buildDiskTypesScopedListWarningData());
   o.add(buildDiskTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2365(core.List<api.DiskTypesScopedListWarningData> o) {
+checkUnnamed2390(core.List<api.DiskTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypesScopedListWarningData(o[0]);
   checkDiskTypesScopedListWarningData(o[1]);
@@ -3085,7 +3085,7 @@
   buildCounterDiskTypesScopedListWarning++;
   if (buildCounterDiskTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2365();
+    o.data = buildUnnamed2390();
     o.message = "foo";
   }
   buildCounterDiskTypesScopedListWarning--;
@@ -3096,7 +3096,7 @@
   buildCounterDiskTypesScopedListWarning++;
   if (buildCounterDiskTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2365(o.data);
+    checkUnnamed2390(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDiskTypesScopedListWarning--;
@@ -3107,7 +3107,7 @@
   var o = new api.DiskTypesScopedList();
   buildCounterDiskTypesScopedList++;
   if (buildCounterDiskTypesScopedList < 3) {
-    o.diskTypes = buildUnnamed2364();
+    o.diskTypes = buildUnnamed2389();
     o.warning = buildDiskTypesScopedListWarning();
   }
   buildCounterDiskTypesScopedList--;
@@ -3117,7 +3117,7 @@
 checkDiskTypesScopedList(api.DiskTypesScopedList o) {
   buildCounterDiskTypesScopedList++;
   if (buildCounterDiskTypesScopedList < 3) {
-    checkUnnamed2364(o.diskTypes);
+    checkUnnamed2389(o.diskTypes);
     checkDiskTypesScopedListWarning(o.warning);
   }
   buildCounterDiskTypesScopedList--;
@@ -3142,14 +3142,14 @@
   buildCounterDisksResizeRequest--;
 }
 
-buildUnnamed2366() {
+buildUnnamed2391() {
   var o = new core.List<api.Disk>();
   o.add(buildDisk());
   o.add(buildDisk());
   return o;
 }
 
-checkUnnamed2366(core.List<api.Disk> o) {
+checkUnnamed2391(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisk(o[0]);
   checkDisk(o[1]);
@@ -3176,14 +3176,14 @@
   buildCounterDisksScopedListWarningData--;
 }
 
-buildUnnamed2367() {
+buildUnnamed2392() {
   var o = new core.List<api.DisksScopedListWarningData>();
   o.add(buildDisksScopedListWarningData());
   o.add(buildDisksScopedListWarningData());
   return o;
 }
 
-checkUnnamed2367(core.List<api.DisksScopedListWarningData> o) {
+checkUnnamed2392(core.List<api.DisksScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisksScopedListWarningData(o[0]);
   checkDisksScopedListWarningData(o[1]);
@@ -3195,7 +3195,7 @@
   buildCounterDisksScopedListWarning++;
   if (buildCounterDisksScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2367();
+    o.data = buildUnnamed2392();
     o.message = "foo";
   }
   buildCounterDisksScopedListWarning--;
@@ -3206,7 +3206,7 @@
   buildCounterDisksScopedListWarning++;
   if (buildCounterDisksScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2367(o.data);
+    checkUnnamed2392(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDisksScopedListWarning--;
@@ -3217,7 +3217,7 @@
   var o = new api.DisksScopedList();
   buildCounterDisksScopedList++;
   if (buildCounterDisksScopedList < 3) {
-    o.disks = buildUnnamed2366();
+    o.disks = buildUnnamed2391();
     o.warning = buildDisksScopedListWarning();
   }
   buildCounterDisksScopedList--;
@@ -3227,20 +3227,20 @@
 checkDisksScopedList(api.DisksScopedList o) {
   buildCounterDisksScopedList++;
   if (buildCounterDisksScopedList < 3) {
-    checkUnnamed2366(o.disks);
+    checkUnnamed2391(o.disks);
     checkDisksScopedListWarning(o.warning);
   }
   buildCounterDisksScopedList--;
 }
 
-buildUnnamed2368() {
+buildUnnamed2393() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2368(core.List<core.String> o) {
+checkUnnamed2393(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3252,7 +3252,7 @@
   buildCounterFirewallAllowed++;
   if (buildCounterFirewallAllowed < 3) {
     o.IPProtocol = "foo";
-    o.ports = buildUnnamed2368();
+    o.ports = buildUnnamed2393();
   }
   buildCounterFirewallAllowed--;
   return o;
@@ -3262,32 +3262,32 @@
   buildCounterFirewallAllowed++;
   if (buildCounterFirewallAllowed < 3) {
     unittest.expect(o.IPProtocol, unittest.equals('foo'));
-    checkUnnamed2368(o.ports);
+    checkUnnamed2393(o.ports);
   }
   buildCounterFirewallAllowed--;
 }
 
-buildUnnamed2369() {
+buildUnnamed2394() {
   var o = new core.List<api.FirewallAllowed>();
   o.add(buildFirewallAllowed());
   o.add(buildFirewallAllowed());
   return o;
 }
 
-checkUnnamed2369(core.List<api.FirewallAllowed> o) {
+checkUnnamed2394(core.List<api.FirewallAllowed> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewallAllowed(o[0]);
   checkFirewallAllowed(o[1]);
 }
 
-buildUnnamed2370() {
+buildUnnamed2395() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2370(core.List<core.String> o) {
+checkUnnamed2395(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3299,7 +3299,7 @@
   buildCounterFirewallDenied++;
   if (buildCounterFirewallDenied < 3) {
     o.IPProtocol = "foo";
-    o.ports = buildUnnamed2370();
+    o.ports = buildUnnamed2395();
   }
   buildCounterFirewallDenied--;
   return o;
@@ -3309,97 +3309,97 @@
   buildCounterFirewallDenied++;
   if (buildCounterFirewallDenied < 3) {
     unittest.expect(o.IPProtocol, unittest.equals('foo'));
-    checkUnnamed2370(o.ports);
+    checkUnnamed2395(o.ports);
   }
   buildCounterFirewallDenied--;
 }
 
-buildUnnamed2371() {
+buildUnnamed2396() {
   var o = new core.List<api.FirewallDenied>();
   o.add(buildFirewallDenied());
   o.add(buildFirewallDenied());
   return o;
 }
 
-checkUnnamed2371(core.List<api.FirewallDenied> o) {
+checkUnnamed2396(core.List<api.FirewallDenied> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewallDenied(o[0]);
   checkFirewallDenied(o[1]);
 }
 
-buildUnnamed2372() {
+buildUnnamed2397() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2372(core.List<core.String> o) {
+checkUnnamed2397(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2373() {
+buildUnnamed2398() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2373(core.List<core.String> o) {
+checkUnnamed2398(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2374() {
+buildUnnamed2399() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2374(core.List<core.String> o) {
+checkUnnamed2399(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2375() {
+buildUnnamed2400() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2375(core.List<core.String> o) {
+checkUnnamed2400(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2376() {
+buildUnnamed2401() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2376(core.List<core.String> o) {
+checkUnnamed2401(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2377() {
+buildUnnamed2402() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2377(core.List<core.String> o) {
+checkUnnamed2402(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3410,11 +3410,11 @@
   var o = new api.Firewall();
   buildCounterFirewall++;
   if (buildCounterFirewall < 3) {
-    o.allowed = buildUnnamed2369();
+    o.allowed = buildUnnamed2394();
     o.creationTimestamp = "foo";
-    o.denied = buildUnnamed2371();
+    o.denied = buildUnnamed2396();
     o.description = "foo";
-    o.destinationRanges = buildUnnamed2372();
+    o.destinationRanges = buildUnnamed2397();
     o.direction = "foo";
     o.id = "foo";
     o.kind = "foo";
@@ -3422,11 +3422,11 @@
     o.network = "foo";
     o.priority = 42;
     o.selfLink = "foo";
-    o.sourceRanges = buildUnnamed2373();
-    o.sourceServiceAccounts = buildUnnamed2374();
-    o.sourceTags = buildUnnamed2375();
-    o.targetServiceAccounts = buildUnnamed2376();
-    o.targetTags = buildUnnamed2377();
+    o.sourceRanges = buildUnnamed2398();
+    o.sourceServiceAccounts = buildUnnamed2399();
+    o.sourceTags = buildUnnamed2400();
+    o.targetServiceAccounts = buildUnnamed2401();
+    o.targetTags = buildUnnamed2402();
   }
   buildCounterFirewall--;
   return o;
@@ -3435,11 +3435,11 @@
 checkFirewall(api.Firewall o) {
   buildCounterFirewall++;
   if (buildCounterFirewall < 3) {
-    checkUnnamed2369(o.allowed);
+    checkUnnamed2394(o.allowed);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
-    checkUnnamed2371(o.denied);
+    checkUnnamed2396(o.denied);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2372(o.destinationRanges);
+    checkUnnamed2397(o.destinationRanges);
     unittest.expect(o.direction, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -3447,23 +3447,23 @@
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2373(o.sourceRanges);
-    checkUnnamed2374(o.sourceServiceAccounts);
-    checkUnnamed2375(o.sourceTags);
-    checkUnnamed2376(o.targetServiceAccounts);
-    checkUnnamed2377(o.targetTags);
+    checkUnnamed2398(o.sourceRanges);
+    checkUnnamed2399(o.sourceServiceAccounts);
+    checkUnnamed2400(o.sourceTags);
+    checkUnnamed2401(o.targetServiceAccounts);
+    checkUnnamed2402(o.targetTags);
   }
   buildCounterFirewall--;
 }
 
-buildUnnamed2378() {
+buildUnnamed2403() {
   var o = new core.List<api.Firewall>();
   o.add(buildFirewall());
   o.add(buildFirewall());
   return o;
 }
 
-checkUnnamed2378(core.List<api.Firewall> o) {
+checkUnnamed2403(core.List<api.Firewall> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewall(o[0]);
   checkFirewall(o[1]);
@@ -3490,14 +3490,14 @@
   buildCounterFirewallListWarningData--;
 }
 
-buildUnnamed2379() {
+buildUnnamed2404() {
   var o = new core.List<api.FirewallListWarningData>();
   o.add(buildFirewallListWarningData());
   o.add(buildFirewallListWarningData());
   return o;
 }
 
-checkUnnamed2379(core.List<api.FirewallListWarningData> o) {
+checkUnnamed2404(core.List<api.FirewallListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewallListWarningData(o[0]);
   checkFirewallListWarningData(o[1]);
@@ -3509,7 +3509,7 @@
   buildCounterFirewallListWarning++;
   if (buildCounterFirewallListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2379();
+    o.data = buildUnnamed2404();
     o.message = "foo";
   }
   buildCounterFirewallListWarning--;
@@ -3520,7 +3520,7 @@
   buildCounterFirewallListWarning++;
   if (buildCounterFirewallListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2379(o.data);
+    checkUnnamed2404(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterFirewallListWarning--;
@@ -3532,7 +3532,7 @@
   buildCounterFirewallList++;
   if (buildCounterFirewallList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2378();
+    o.items = buildUnnamed2403();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3546,7 +3546,7 @@
   buildCounterFirewallList++;
   if (buildCounterFirewallList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2378(o.items);
+    checkUnnamed2403(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3555,14 +3555,14 @@
   buildCounterFirewallList--;
 }
 
-buildUnnamed2380() {
+buildUnnamed2405() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2380(core.List<core.String> o) {
+checkUnnamed2405(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3585,7 +3585,7 @@
     o.name = "foo";
     o.network = "foo";
     o.portRange = "foo";
-    o.ports = buildUnnamed2380();
+    o.ports = buildUnnamed2405();
     o.region = "foo";
     o.selfLink = "foo";
     o.subnetwork = "foo";
@@ -3610,7 +3610,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.portRange, unittest.equals('foo'));
-    checkUnnamed2380(o.ports);
+    checkUnnamed2405(o.ports);
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.subnetwork, unittest.equals('foo'));
@@ -3619,14 +3619,14 @@
   buildCounterForwardingRule--;
 }
 
-buildUnnamed2381() {
+buildUnnamed2406() {
   var o = new core.Map<core.String, api.ForwardingRulesScopedList>();
   o["x"] = buildForwardingRulesScopedList();
   o["y"] = buildForwardingRulesScopedList();
   return o;
 }
 
-checkUnnamed2381(core.Map<core.String, api.ForwardingRulesScopedList> o) {
+checkUnnamed2406(core.Map<core.String, api.ForwardingRulesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRulesScopedList(o["x"]);
   checkForwardingRulesScopedList(o["y"]);
@@ -3654,14 +3654,14 @@
   buildCounterForwardingRuleAggregatedListWarningData--;
 }
 
-buildUnnamed2382() {
+buildUnnamed2407() {
   var o = new core.List<api.ForwardingRuleAggregatedListWarningData>();
   o.add(buildForwardingRuleAggregatedListWarningData());
   o.add(buildForwardingRuleAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2382(core.List<api.ForwardingRuleAggregatedListWarningData> o) {
+checkUnnamed2407(core.List<api.ForwardingRuleAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRuleAggregatedListWarningData(o[0]);
   checkForwardingRuleAggregatedListWarningData(o[1]);
@@ -3673,7 +3673,7 @@
   buildCounterForwardingRuleAggregatedListWarning++;
   if (buildCounterForwardingRuleAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2382();
+    o.data = buildUnnamed2407();
     o.message = "foo";
   }
   buildCounterForwardingRuleAggregatedListWarning--;
@@ -3685,7 +3685,7 @@
   buildCounterForwardingRuleAggregatedListWarning++;
   if (buildCounterForwardingRuleAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2382(o.data);
+    checkUnnamed2407(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterForwardingRuleAggregatedListWarning--;
@@ -3697,7 +3697,7 @@
   buildCounterForwardingRuleAggregatedList++;
   if (buildCounterForwardingRuleAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2381();
+    o.items = buildUnnamed2406();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3711,7 +3711,7 @@
   buildCounterForwardingRuleAggregatedList++;
   if (buildCounterForwardingRuleAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2381(o.items);
+    checkUnnamed2406(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3720,14 +3720,14 @@
   buildCounterForwardingRuleAggregatedList--;
 }
 
-buildUnnamed2383() {
+buildUnnamed2408() {
   var o = new core.List<api.ForwardingRule>();
   o.add(buildForwardingRule());
   o.add(buildForwardingRule());
   return o;
 }
 
-checkUnnamed2383(core.List<api.ForwardingRule> o) {
+checkUnnamed2408(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRule(o[0]);
   checkForwardingRule(o[1]);
@@ -3754,14 +3754,14 @@
   buildCounterForwardingRuleListWarningData--;
 }
 
-buildUnnamed2384() {
+buildUnnamed2409() {
   var o = new core.List<api.ForwardingRuleListWarningData>();
   o.add(buildForwardingRuleListWarningData());
   o.add(buildForwardingRuleListWarningData());
   return o;
 }
 
-checkUnnamed2384(core.List<api.ForwardingRuleListWarningData> o) {
+checkUnnamed2409(core.List<api.ForwardingRuleListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRuleListWarningData(o[0]);
   checkForwardingRuleListWarningData(o[1]);
@@ -3773,7 +3773,7 @@
   buildCounterForwardingRuleListWarning++;
   if (buildCounterForwardingRuleListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2384();
+    o.data = buildUnnamed2409();
     o.message = "foo";
   }
   buildCounterForwardingRuleListWarning--;
@@ -3784,7 +3784,7 @@
   buildCounterForwardingRuleListWarning++;
   if (buildCounterForwardingRuleListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2384(o.data);
+    checkUnnamed2409(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterForwardingRuleListWarning--;
@@ -3796,7 +3796,7 @@
   buildCounterForwardingRuleList++;
   if (buildCounterForwardingRuleList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2383();
+    o.items = buildUnnamed2408();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3810,7 +3810,7 @@
   buildCounterForwardingRuleList++;
   if (buildCounterForwardingRuleList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2383(o.items);
+    checkUnnamed2408(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3819,14 +3819,14 @@
   buildCounterForwardingRuleList--;
 }
 
-buildUnnamed2385() {
+buildUnnamed2410() {
   var o = new core.List<api.ForwardingRule>();
   o.add(buildForwardingRule());
   o.add(buildForwardingRule());
   return o;
 }
 
-checkUnnamed2385(core.List<api.ForwardingRule> o) {
+checkUnnamed2410(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRule(o[0]);
   checkForwardingRule(o[1]);
@@ -3854,14 +3854,14 @@
   buildCounterForwardingRulesScopedListWarningData--;
 }
 
-buildUnnamed2386() {
+buildUnnamed2411() {
   var o = new core.List<api.ForwardingRulesScopedListWarningData>();
   o.add(buildForwardingRulesScopedListWarningData());
   o.add(buildForwardingRulesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2386(core.List<api.ForwardingRulesScopedListWarningData> o) {
+checkUnnamed2411(core.List<api.ForwardingRulesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRulesScopedListWarningData(o[0]);
   checkForwardingRulesScopedListWarningData(o[1]);
@@ -3873,7 +3873,7 @@
   buildCounterForwardingRulesScopedListWarning++;
   if (buildCounterForwardingRulesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2386();
+    o.data = buildUnnamed2411();
     o.message = "foo";
   }
   buildCounterForwardingRulesScopedListWarning--;
@@ -3884,7 +3884,7 @@
   buildCounterForwardingRulesScopedListWarning++;
   if (buildCounterForwardingRulesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2386(o.data);
+    checkUnnamed2411(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterForwardingRulesScopedListWarning--;
@@ -3895,7 +3895,7 @@
   var o = new api.ForwardingRulesScopedList();
   buildCounterForwardingRulesScopedList++;
   if (buildCounterForwardingRulesScopedList < 3) {
-    o.forwardingRules = buildUnnamed2385();
+    o.forwardingRules = buildUnnamed2410();
     o.warning = buildForwardingRulesScopedListWarning();
   }
   buildCounterForwardingRulesScopedList--;
@@ -3905,20 +3905,20 @@
 checkForwardingRulesScopedList(api.ForwardingRulesScopedList o) {
   buildCounterForwardingRulesScopedList++;
   if (buildCounterForwardingRulesScopedList < 3) {
-    checkUnnamed2385(o.forwardingRules);
+    checkUnnamed2410(o.forwardingRules);
     checkForwardingRulesScopedListWarning(o.warning);
   }
   buildCounterForwardingRulesScopedList--;
 }
 
-buildUnnamed2387() {
+buildUnnamed2412() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2387(core.Map<core.String, core.String> o) {
+checkUnnamed2412(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'));
@@ -3930,7 +3930,7 @@
   buildCounterGlobalSetLabelsRequest++;
   if (buildCounterGlobalSetLabelsRequest < 3) {
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2387();
+    o.labels = buildUnnamed2412();
   }
   buildCounterGlobalSetLabelsRequest--;
   return o;
@@ -3940,7 +3940,7 @@
   buildCounterGlobalSetLabelsRequest++;
   if (buildCounterGlobalSetLabelsRequest < 3) {
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2387(o.labels);
+    checkUnnamed2412(o.labels);
   }
   buildCounterGlobalSetLabelsRequest--;
 }
@@ -4065,14 +4065,14 @@
   buildCounterHealthCheck--;
 }
 
-buildUnnamed2388() {
+buildUnnamed2413() {
   var o = new core.List<api.HealthCheck>();
   o.add(buildHealthCheck());
   o.add(buildHealthCheck());
   return o;
 }
 
-checkUnnamed2388(core.List<api.HealthCheck> o) {
+checkUnnamed2413(core.List<api.HealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheck(o[0]);
   checkHealthCheck(o[1]);
@@ -4099,14 +4099,14 @@
   buildCounterHealthCheckListWarningData--;
 }
 
-buildUnnamed2389() {
+buildUnnamed2414() {
   var o = new core.List<api.HealthCheckListWarningData>();
   o.add(buildHealthCheckListWarningData());
   o.add(buildHealthCheckListWarningData());
   return o;
 }
 
-checkUnnamed2389(core.List<api.HealthCheckListWarningData> o) {
+checkUnnamed2414(core.List<api.HealthCheckListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheckListWarningData(o[0]);
   checkHealthCheckListWarningData(o[1]);
@@ -4118,7 +4118,7 @@
   buildCounterHealthCheckListWarning++;
   if (buildCounterHealthCheckListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2389();
+    o.data = buildUnnamed2414();
     o.message = "foo";
   }
   buildCounterHealthCheckListWarning--;
@@ -4129,7 +4129,7 @@
   buildCounterHealthCheckListWarning++;
   if (buildCounterHealthCheckListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2389(o.data);
+    checkUnnamed2414(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterHealthCheckListWarning--;
@@ -4141,7 +4141,7 @@
   buildCounterHealthCheckList++;
   if (buildCounterHealthCheckList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2388();
+    o.items = buildUnnamed2413();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4155,7 +4155,7 @@
   buildCounterHealthCheckList++;
   if (buildCounterHealthCheckList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2388(o.items);
+    checkUnnamed2413(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4208,14 +4208,14 @@
   buildCounterHealthStatus--;
 }
 
-buildUnnamed2390() {
+buildUnnamed2415() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2390(core.List<core.String> o) {
+checkUnnamed2415(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -4227,7 +4227,7 @@
   buildCounterHostRule++;
   if (buildCounterHostRule < 3) {
     o.description = "foo";
-    o.hosts = buildUnnamed2390();
+    o.hosts = buildUnnamed2415();
     o.pathMatcher = "foo";
   }
   buildCounterHostRule--;
@@ -4238,7 +4238,7 @@
   buildCounterHostRule++;
   if (buildCounterHostRule < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2390(o.hosts);
+    checkUnnamed2415(o.hosts);
     unittest.expect(o.pathMatcher, unittest.equals('foo'));
   }
   buildCounterHostRule--;
@@ -4287,14 +4287,14 @@
   buildCounterHttpHealthCheck--;
 }
 
-buildUnnamed2391() {
+buildUnnamed2416() {
   var o = new core.List<api.HttpHealthCheck>();
   o.add(buildHttpHealthCheck());
   o.add(buildHttpHealthCheck());
   return o;
 }
 
-checkUnnamed2391(core.List<api.HttpHealthCheck> o) {
+checkUnnamed2416(core.List<api.HttpHealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpHealthCheck(o[0]);
   checkHttpHealthCheck(o[1]);
@@ -4321,14 +4321,14 @@
   buildCounterHttpHealthCheckListWarningData--;
 }
 
-buildUnnamed2392() {
+buildUnnamed2417() {
   var o = new core.List<api.HttpHealthCheckListWarningData>();
   o.add(buildHttpHealthCheckListWarningData());
   o.add(buildHttpHealthCheckListWarningData());
   return o;
 }
 
-checkUnnamed2392(core.List<api.HttpHealthCheckListWarningData> o) {
+checkUnnamed2417(core.List<api.HttpHealthCheckListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpHealthCheckListWarningData(o[0]);
   checkHttpHealthCheckListWarningData(o[1]);
@@ -4340,7 +4340,7 @@
   buildCounterHttpHealthCheckListWarning++;
   if (buildCounterHttpHealthCheckListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2392();
+    o.data = buildUnnamed2417();
     o.message = "foo";
   }
   buildCounterHttpHealthCheckListWarning--;
@@ -4351,7 +4351,7 @@
   buildCounterHttpHealthCheckListWarning++;
   if (buildCounterHttpHealthCheckListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2392(o.data);
+    checkUnnamed2417(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterHttpHealthCheckListWarning--;
@@ -4363,7 +4363,7 @@
   buildCounterHttpHealthCheckList++;
   if (buildCounterHttpHealthCheckList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2391();
+    o.items = buildUnnamed2416();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4377,7 +4377,7 @@
   buildCounterHttpHealthCheckList++;
   if (buildCounterHttpHealthCheckList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2391(o.items);
+    checkUnnamed2416(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4429,14 +4429,14 @@
   buildCounterHttpsHealthCheck--;
 }
 
-buildUnnamed2393() {
+buildUnnamed2418() {
   var o = new core.List<api.HttpsHealthCheck>();
   o.add(buildHttpsHealthCheck());
   o.add(buildHttpsHealthCheck());
   return o;
 }
 
-checkUnnamed2393(core.List<api.HttpsHealthCheck> o) {
+checkUnnamed2418(core.List<api.HttpsHealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpsHealthCheck(o[0]);
   checkHttpsHealthCheck(o[1]);
@@ -4463,14 +4463,14 @@
   buildCounterHttpsHealthCheckListWarningData--;
 }
 
-buildUnnamed2394() {
+buildUnnamed2419() {
   var o = new core.List<api.HttpsHealthCheckListWarningData>();
   o.add(buildHttpsHealthCheckListWarningData());
   o.add(buildHttpsHealthCheckListWarningData());
   return o;
 }
 
-checkUnnamed2394(core.List<api.HttpsHealthCheckListWarningData> o) {
+checkUnnamed2419(core.List<api.HttpsHealthCheckListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpsHealthCheckListWarningData(o[0]);
   checkHttpsHealthCheckListWarningData(o[1]);
@@ -4482,7 +4482,7 @@
   buildCounterHttpsHealthCheckListWarning++;
   if (buildCounterHttpsHealthCheckListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2394();
+    o.data = buildUnnamed2419();
     o.message = "foo";
   }
   buildCounterHttpsHealthCheckListWarning--;
@@ -4493,7 +4493,7 @@
   buildCounterHttpsHealthCheckListWarning++;
   if (buildCounterHttpsHealthCheckListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2394(o.data);
+    checkUnnamed2419(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterHttpsHealthCheckListWarning--;
@@ -4505,7 +4505,7 @@
   buildCounterHttpsHealthCheckList++;
   if (buildCounterHttpsHealthCheckList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2393();
+    o.items = buildUnnamed2418();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4519,7 +4519,7 @@
   buildCounterHttpsHealthCheckList++;
   if (buildCounterHttpsHealthCheckList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2393(o.items);
+    checkUnnamed2418(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4528,40 +4528,40 @@
   buildCounterHttpsHealthCheckList--;
 }
 
-buildUnnamed2395() {
+buildUnnamed2420() {
   var o = new core.List<api.GuestOsFeature>();
   o.add(buildGuestOsFeature());
   o.add(buildGuestOsFeature());
   return o;
 }
 
-checkUnnamed2395(core.List<api.GuestOsFeature> o) {
+checkUnnamed2420(core.List<api.GuestOsFeature> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGuestOsFeature(o[0]);
   checkGuestOsFeature(o[1]);
 }
 
-buildUnnamed2396() {
+buildUnnamed2421() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2396(core.Map<core.String, core.String> o) {
+checkUnnamed2421(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'));
 }
 
-buildUnnamed2397() {
+buildUnnamed2422() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2397(core.List<core.String> o) {
+checkUnnamed2422(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -4601,13 +4601,13 @@
     o.description = "foo";
     o.diskSizeGb = "foo";
     o.family = "foo";
-    o.guestOsFeatures = buildUnnamed2395();
+    o.guestOsFeatures = buildUnnamed2420();
     o.id = "foo";
     o.imageEncryptionKey = buildCustomerEncryptionKey();
     o.kind = "foo";
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2396();
-    o.licenses = buildUnnamed2397();
+    o.labels = buildUnnamed2421();
+    o.licenses = buildUnnamed2422();
     o.name = "foo";
     o.rawDisk = buildImageRawDisk();
     o.selfLink = "foo";
@@ -4633,13 +4633,13 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
     unittest.expect(o.family, unittest.equals('foo'));
-    checkUnnamed2395(o.guestOsFeatures);
+    checkUnnamed2420(o.guestOsFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
     checkCustomerEncryptionKey(o.imageEncryptionKey);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2396(o.labels);
-    checkUnnamed2397(o.licenses);
+    checkUnnamed2421(o.labels);
+    checkUnnamed2422(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     checkImageRawDisk(o.rawDisk);
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4655,14 +4655,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed2398() {
+buildUnnamed2423() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed2398(core.List<api.Image> o) {
+checkUnnamed2423(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -4689,14 +4689,14 @@
   buildCounterImageListWarningData--;
 }
 
-buildUnnamed2399() {
+buildUnnamed2424() {
   var o = new core.List<api.ImageListWarningData>();
   o.add(buildImageListWarningData());
   o.add(buildImageListWarningData());
   return o;
 }
 
-checkUnnamed2399(core.List<api.ImageListWarningData> o) {
+checkUnnamed2424(core.List<api.ImageListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImageListWarningData(o[0]);
   checkImageListWarningData(o[1]);
@@ -4708,7 +4708,7 @@
   buildCounterImageListWarning++;
   if (buildCounterImageListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2399();
+    o.data = buildUnnamed2424();
     o.message = "foo";
   }
   buildCounterImageListWarning--;
@@ -4719,7 +4719,7 @@
   buildCounterImageListWarning++;
   if (buildCounterImageListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2399(o.data);
+    checkUnnamed2424(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterImageListWarning--;
@@ -4731,7 +4731,7 @@
   buildCounterImageList++;
   if (buildCounterImageList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2398();
+    o.items = buildUnnamed2423();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4745,7 +4745,7 @@
   buildCounterImageList++;
   if (buildCounterImageList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2398(o.items);
+    checkUnnamed2423(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4754,66 +4754,66 @@
   buildCounterImageList--;
 }
 
-buildUnnamed2400() {
+buildUnnamed2425() {
   var o = new core.List<api.AttachedDisk>();
   o.add(buildAttachedDisk());
   o.add(buildAttachedDisk());
   return o;
 }
 
-checkUnnamed2400(core.List<api.AttachedDisk> o) {
+checkUnnamed2425(core.List<api.AttachedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachedDisk(o[0]);
   checkAttachedDisk(o[1]);
 }
 
-buildUnnamed2401() {
+buildUnnamed2426() {
   var o = new core.List<api.AcceleratorConfig>();
   o.add(buildAcceleratorConfig());
   o.add(buildAcceleratorConfig());
   return o;
 }
 
-checkUnnamed2401(core.List<api.AcceleratorConfig> o) {
+checkUnnamed2426(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorConfig(o[0]);
   checkAcceleratorConfig(o[1]);
 }
 
-buildUnnamed2402() {
+buildUnnamed2427() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2402(core.Map<core.String, core.String> o) {
+checkUnnamed2427(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'));
 }
 
-buildUnnamed2403() {
+buildUnnamed2428() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed2403(core.List<api.NetworkInterface> o) {
+checkUnnamed2428(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed2404() {
+buildUnnamed2429() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed2404(core.List<api.ServiceAccount> o) {
+checkUnnamed2429(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -4829,20 +4829,20 @@
     o.creationTimestamp = "foo";
     o.deletionProtection = true;
     o.description = "foo";
-    o.disks = buildUnnamed2400();
-    o.guestAccelerators = buildUnnamed2401();
+    o.disks = buildUnnamed2425();
+    o.guestAccelerators = buildUnnamed2426();
     o.id = "foo";
     o.kind = "foo";
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2402();
+    o.labels = buildUnnamed2427();
     o.machineType = "foo";
     o.metadata = buildMetadata();
     o.minCpuPlatform = "foo";
     o.name = "foo";
-    o.networkInterfaces = buildUnnamed2403();
+    o.networkInterfaces = buildUnnamed2428();
     o.scheduling = buildScheduling();
     o.selfLink = "foo";
-    o.serviceAccounts = buildUnnamed2404();
+    o.serviceAccounts = buildUnnamed2429();
     o.startRestricted = true;
     o.status = "foo";
     o.statusMessage = "foo";
@@ -4861,20 +4861,20 @@
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.deletionProtection, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2400(o.disks);
-    checkUnnamed2401(o.guestAccelerators);
+    checkUnnamed2425(o.disks);
+    checkUnnamed2426(o.guestAccelerators);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2402(o.labels);
+    checkUnnamed2427(o.labels);
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
     unittest.expect(o.minCpuPlatform, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2403(o.networkInterfaces);
+    checkUnnamed2428(o.networkInterfaces);
     checkScheduling(o.scheduling);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2404(o.serviceAccounts);
+    checkUnnamed2429(o.serviceAccounts);
     unittest.expect(o.startRestricted, unittest.isTrue);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusMessage, unittest.equals('foo'));
@@ -4884,14 +4884,14 @@
   buildCounterInstance--;
 }
 
-buildUnnamed2405() {
+buildUnnamed2430() {
   var o = new core.Map<core.String, api.InstancesScopedList>();
   o["x"] = buildInstancesScopedList();
   o["y"] = buildInstancesScopedList();
   return o;
 }
 
-checkUnnamed2405(core.Map<core.String, api.InstancesScopedList> o) {
+checkUnnamed2430(core.Map<core.String, api.InstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstancesScopedList(o["x"]);
   checkInstancesScopedList(o["y"]);
@@ -4919,14 +4919,14 @@
   buildCounterInstanceAggregatedListWarningData--;
 }
 
-buildUnnamed2406() {
+buildUnnamed2431() {
   var o = new core.List<api.InstanceAggregatedListWarningData>();
   o.add(buildInstanceAggregatedListWarningData());
   o.add(buildInstanceAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2406(core.List<api.InstanceAggregatedListWarningData> o) {
+checkUnnamed2431(core.List<api.InstanceAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceAggregatedListWarningData(o[0]);
   checkInstanceAggregatedListWarningData(o[1]);
@@ -4938,7 +4938,7 @@
   buildCounterInstanceAggregatedListWarning++;
   if (buildCounterInstanceAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2406();
+    o.data = buildUnnamed2431();
     o.message = "foo";
   }
   buildCounterInstanceAggregatedListWarning--;
@@ -4949,7 +4949,7 @@
   buildCounterInstanceAggregatedListWarning++;
   if (buildCounterInstanceAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2406(o.data);
+    checkUnnamed2431(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstanceAggregatedListWarning--;
@@ -4961,7 +4961,7 @@
   buildCounterInstanceAggregatedList++;
   if (buildCounterInstanceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2405();
+    o.items = buildUnnamed2430();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4975,7 +4975,7 @@
   buildCounterInstanceAggregatedList++;
   if (buildCounterInstanceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2405(o.items);
+    checkUnnamed2430(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4984,14 +4984,14 @@
   buildCounterInstanceAggregatedList--;
 }
 
-buildUnnamed2407() {
+buildUnnamed2432() {
   var o = new core.List<api.NamedPort>();
   o.add(buildNamedPort());
   o.add(buildNamedPort());
   return o;
 }
 
-checkUnnamed2407(core.List<api.NamedPort> o) {
+checkUnnamed2432(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNamedPort(o[0]);
   checkNamedPort(o[1]);
@@ -5008,7 +5008,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.namedPorts = buildUnnamed2407();
+    o.namedPorts = buildUnnamed2432();
     o.network = "foo";
     o.region = "foo";
     o.selfLink = "foo";
@@ -5029,7 +5029,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2407(o.namedPorts);
+    checkUnnamed2432(o.namedPorts);
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -5040,14 +5040,14 @@
   buildCounterInstanceGroup--;
 }
 
-buildUnnamed2408() {
+buildUnnamed2433() {
   var o = new core.Map<core.String, api.InstanceGroupsScopedList>();
   o["x"] = buildInstanceGroupsScopedList();
   o["y"] = buildInstanceGroupsScopedList();
   return o;
 }
 
-checkUnnamed2408(core.Map<core.String, api.InstanceGroupsScopedList> o) {
+checkUnnamed2433(core.Map<core.String, api.InstanceGroupsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupsScopedList(o["x"]);
   checkInstanceGroupsScopedList(o["y"]);
@@ -5075,14 +5075,14 @@
   buildCounterInstanceGroupAggregatedListWarningData--;
 }
 
-buildUnnamed2409() {
+buildUnnamed2434() {
   var o = new core.List<api.InstanceGroupAggregatedListWarningData>();
   o.add(buildInstanceGroupAggregatedListWarningData());
   o.add(buildInstanceGroupAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2409(core.List<api.InstanceGroupAggregatedListWarningData> o) {
+checkUnnamed2434(core.List<api.InstanceGroupAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupAggregatedListWarningData(o[0]);
   checkInstanceGroupAggregatedListWarningData(o[1]);
@@ -5094,7 +5094,7 @@
   buildCounterInstanceGroupAggregatedListWarning++;
   if (buildCounterInstanceGroupAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2409();
+    o.data = buildUnnamed2434();
     o.message = "foo";
   }
   buildCounterInstanceGroupAggregatedListWarning--;
@@ -5106,7 +5106,7 @@
   buildCounterInstanceGroupAggregatedListWarning++;
   if (buildCounterInstanceGroupAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2409(o.data);
+    checkUnnamed2434(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstanceGroupAggregatedListWarning--;
@@ -5118,7 +5118,7 @@
   buildCounterInstanceGroupAggregatedList++;
   if (buildCounterInstanceGroupAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2408();
+    o.items = buildUnnamed2433();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -5132,7 +5132,7 @@
   buildCounterInstanceGroupAggregatedList++;
   if (buildCounterInstanceGroupAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2408(o.items);
+    checkUnnamed2433(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -5141,14 +5141,14 @@
   buildCounterInstanceGroupAggregatedList--;
 }
 
-buildUnnamed2410() {
+buildUnnamed2435() {
   var o = new core.List<api.InstanceGroup>();
   o.add(buildInstanceGroup());
   o.add(buildInstanceGroup());
   return o;
 }
 
-checkUnnamed2410(core.List<api.InstanceGroup> o) {
+checkUnnamed2435(core.List<api.InstanceGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroup(o[0]);
   checkInstanceGroup(o[1]);
@@ -5175,14 +5175,14 @@
   buildCounterInstanceGroupListWarningData--;
 }
 
-buildUnnamed2411() {
+buildUnnamed2436() {
   var o = new core.List<api.InstanceGroupListWarningData>();
   o.add(buildInstanceGroupListWarningData());
   o.add(buildInstanceGroupListWarningData());
   return o;
 }
 
-checkUnnamed2411(core.List<api.InstanceGroupListWarningData> o) {
+checkUnnamed2436(core.List<api.InstanceGroupListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupListWarningData(o[0]);
   checkInstanceGroupListWarningData(o[1]);
@@ -5194,7 +5194,7 @@
   buildCounterInstanceGroupListWarning++;
   if (buildCounterInstanceGroupListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2411();
+    o.data = buildUnnamed2436();
     o.message = "foo";
   }
   buildCounterInstanceGroupListWarning--;
@@ -5205,7 +5205,7 @@
   buildCounterInstanceGroupListWarning++;
   if (buildCounterInstanceGroupListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2411(o.data);
+    checkUnnamed2436(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstanceGroupListWarning--;
@@ -5217,7 +5217,7 @@
   buildCounterInstanceGroupList++;
   if (buildCounterInstanceGroupList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2410();
+    o.items = buildUnnamed2435();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -5231,7 +5231,7 @@
   buildCounterInstanceGroupList++;
   if (buildCounterInstanceGroupList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2410(o.items);
+    checkUnnamed2435(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -5240,27 +5240,27 @@
   buildCounterInstanceGroupList--;
 }
 
-buildUnnamed2412() {
+buildUnnamed2437() {
   var o = new core.List<api.NamedPort>();
   o.add(buildNamedPort());
   o.add(buildNamedPort());
   return o;
 }
 
-checkUnnamed2412(core.List<api.NamedPort> o) {
+checkUnnamed2437(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNamedPort(o[0]);
   checkNamedPort(o[1]);
 }
 
-buildUnnamed2413() {
+buildUnnamed2438() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2413(core.List<core.String> o) {
+checkUnnamed2438(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5281,10 +5281,10 @@
     o.instanceTemplate = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.namedPorts = buildUnnamed2412();
+    o.namedPorts = buildUnnamed2437();
     o.region = "foo";
     o.selfLink = "foo";
-    o.targetPools = buildUnnamed2413();
+    o.targetPools = buildUnnamed2438();
     o.targetSize = 42;
     o.zone = "foo";
   }
@@ -5305,10 +5305,10 @@
     unittest.expect(o.instanceTemplate, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2412(o.namedPorts);
+    checkUnnamed2437(o.namedPorts);
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2413(o.targetPools);
+    checkUnnamed2438(o.targetPools);
     unittest.expect(o.targetSize, unittest.equals(42));
     unittest.expect(o.zone, unittest.equals('foo'));
   }
@@ -5349,14 +5349,14 @@
   buildCounterInstanceGroupManagerActionsSummary--;
 }
 
-buildUnnamed2414() {
+buildUnnamed2439() {
   var o = new core.Map<core.String, api.InstanceGroupManagersScopedList>();
   o["x"] = buildInstanceGroupManagersScopedList();
   o["y"] = buildInstanceGroupManagersScopedList();
   return o;
 }
 
-checkUnnamed2414(core.Map<core.String, api.InstanceGroupManagersScopedList> o) {
+checkUnnamed2439(core.Map<core.String, api.InstanceGroupManagersScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupManagersScopedList(o["x"]);
   checkInstanceGroupManagersScopedList(o["y"]);
@@ -5384,14 +5384,14 @@
   buildCounterInstanceGroupManagerAggregatedListWarningData--;
 }
 
-buildUnnamed2415() {
+buildUnnamed2440() {
   var o = new core.List<api.InstanceGroupManagerAggregatedListWarningData>();
   o.add(buildInstanceGroupManagerAggregatedListWarningData());
   o.add(buildInstanceGroupManagerAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2415(
+checkUnnamed2440(
     core.List<api.InstanceGroupManagerAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupManagerAggregatedListWarningData(o[0]);
@@ -5404,7 +5404,7 @@
   buildCounterInstanceGroupManagerAggregatedListWarning++;
   if (buildCounterInstanceGroupManagerAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2415();
+    o.data = buildUnnamed2440();
     o.message = "foo";
   }
   buildCounterInstanceGroupManagerAggregatedListWarning--;
@@ -5416,7 +5416,7 @@
   buildCounterInstanceGroupManagerAggregatedListWarning++;
   if (buildCounterInstanceGroupManagerAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2415(o.data);
+    checkUnnamed2440(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstanceGroupManagerAggregatedListWarning--;
@@ -5428,7 +5428,7 @@
   buildCounterInstanceGroupManagerAggregatedList++;
   if (buildCounterInstanceGroupManagerAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2414();
+    o.items = buildUnnamed2439();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -5443,7 +5443,7 @@
   buildCounterInstanceGroupManagerAggregatedList++;
   if (buildCounterInstanceGroupManagerAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2414(o.items);
+    checkUnnamed2439(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -5452,14 +5452,14 @@
   buildCounterInstanceGroupManagerAggregatedList--;
 }
 
-buildUnnamed2416() {
+buildUnnamed2441() {
   var o = new core.List<api.InstanceGroupManager>();
   o.add(buildInstanceGroupManager());
   o.add(buildInstanceGroupManager());
   return o;
 }
 
-checkUnnamed2416(core.List<api.InstanceGroupManager> o) {
+checkUnnamed2441(core.List<api.InstanceGroupManager> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupManager(o[0]);
   checkInstanceGroupManager(o[1]);
@@ -5487,14 +5487,14 @@
   buildCounterInstanceGroupManagerListWarningData--;
 }
 
-buildUnnamed2417() {
+buildUnnamed2442() {
   var o = new core.List<api.InstanceGroupManagerListWarningData>();
   o.add(buildInstanceGroupManagerListWarningData());
   o.add(buildInstanceGroupManagerListWarningData());
   return o;
 }
 
-checkUnnamed2417(core.List<api.InstanceGroupManagerListWarningData> o) {
+checkUnnamed2442(core.List<api.InstanceGroupManagerListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupManagerListWarningData(o[0]);
   checkInstanceGroupManagerListWarningData(o[1]);
@@ -5506,7 +5506,7 @@
   buildCounterInstanceGroupManagerListWarning++;
   if (buildCounterInstanceGroupManagerListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2417();
+    o.data = buildUnnamed2442();
     o.message = "foo";
   }
   buildCounterInstanceGroupManagerListWarning--;
@@ -5517,7 +5517,7 @@
   buildCounterInstanceGroupManagerListWarning++;
   if (buildCounterInstanceGroupManagerListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2417(o.data);
+    checkUnnamed2442(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstanceGroupManagerListWarning--;
@@ -5529,7 +5529,7 @@
   buildCounterInstanceGroupManagerList++;
   if (buildCounterInstanceGroupManagerList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2416();
+    o.items = buildUnnamed2441();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -5543,7 +5543,7 @@
   buildCounterInstanceGroupManagerList++;
   if (buildCounterInstanceGroupManagerList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2416(o.items);
+    checkUnnamed2441(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -5552,14 +5552,14 @@
   buildCounterInstanceGroupManagerList--;
 }
 
-buildUnnamed2418() {
+buildUnnamed2443() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2418(core.List<core.String> o) {
+checkUnnamed2443(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5570,7 +5570,7 @@
   var o = new api.InstanceGroupManagersAbandonInstancesRequest();
   buildCounterInstanceGroupManagersAbandonInstancesRequest++;
   if (buildCounterInstanceGroupManagersAbandonInstancesRequest < 3) {
-    o.instances = buildUnnamed2418();
+    o.instances = buildUnnamed2443();
   }
   buildCounterInstanceGroupManagersAbandonInstancesRequest--;
   return o;
@@ -5580,19 +5580,19 @@
     api.InstanceGroupManagersAbandonInstancesRequest o) {
   buildCounterInstanceGroupManagersAbandonInstancesRequest++;
   if (buildCounterInstanceGroupManagersAbandonInstancesRequest < 3) {
-    checkUnnamed2418(o.instances);
+    checkUnnamed2443(o.instances);
   }
   buildCounterInstanceGroupManagersAbandonInstancesRequest--;
 }
 
-buildUnnamed2419() {
+buildUnnamed2444() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2419(core.List<core.String> o) {
+checkUnnamed2444(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5603,7 +5603,7 @@
   var o = new api.InstanceGroupManagersDeleteInstancesRequest();
   buildCounterInstanceGroupManagersDeleteInstancesRequest++;
   if (buildCounterInstanceGroupManagersDeleteInstancesRequest < 3) {
-    o.instances = buildUnnamed2419();
+    o.instances = buildUnnamed2444();
   }
   buildCounterInstanceGroupManagersDeleteInstancesRequest--;
   return o;
@@ -5613,19 +5613,19 @@
     api.InstanceGroupManagersDeleteInstancesRequest o) {
   buildCounterInstanceGroupManagersDeleteInstancesRequest++;
   if (buildCounterInstanceGroupManagersDeleteInstancesRequest < 3) {
-    checkUnnamed2419(o.instances);
+    checkUnnamed2444(o.instances);
   }
   buildCounterInstanceGroupManagersDeleteInstancesRequest--;
 }
 
-buildUnnamed2420() {
+buildUnnamed2445() {
   var o = new core.List<api.ManagedInstance>();
   o.add(buildManagedInstance());
   o.add(buildManagedInstance());
   return o;
 }
 
-checkUnnamed2420(core.List<api.ManagedInstance> o) {
+checkUnnamed2445(core.List<api.ManagedInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedInstance(o[0]);
   checkManagedInstance(o[1]);
@@ -5636,7 +5636,7 @@
   var o = new api.InstanceGroupManagersListManagedInstancesResponse();
   buildCounterInstanceGroupManagersListManagedInstancesResponse++;
   if (buildCounterInstanceGroupManagersListManagedInstancesResponse < 3) {
-    o.managedInstances = buildUnnamed2420();
+    o.managedInstances = buildUnnamed2445();
   }
   buildCounterInstanceGroupManagersListManagedInstancesResponse--;
   return o;
@@ -5646,19 +5646,19 @@
     api.InstanceGroupManagersListManagedInstancesResponse o) {
   buildCounterInstanceGroupManagersListManagedInstancesResponse++;
   if (buildCounterInstanceGroupManagersListManagedInstancesResponse < 3) {
-    checkUnnamed2420(o.managedInstances);
+    checkUnnamed2445(o.managedInstances);
   }
   buildCounterInstanceGroupManagersListManagedInstancesResponse--;
 }
 
-buildUnnamed2421() {
+buildUnnamed2446() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2421(core.List<core.String> o) {
+checkUnnamed2446(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5669,7 +5669,7 @@
   var o = new api.InstanceGroupManagersRecreateInstancesRequest();
   buildCounterInstanceGroupManagersRecreateInstancesRequest++;
   if (buildCounterInstanceGroupManagersRecreateInstancesRequest < 3) {
-    o.instances = buildUnnamed2421();
+    o.instances = buildUnnamed2446();
   }
   buildCounterInstanceGroupManagersRecreateInstancesRequest--;
   return o;
@@ -5679,19 +5679,19 @@
     api.InstanceGroupManagersRecreateInstancesRequest o) {
   buildCounterInstanceGroupManagersRecreateInstancesRequest++;
   if (buildCounterInstanceGroupManagersRecreateInstancesRequest < 3) {
-    checkUnnamed2421(o.instances);
+    checkUnnamed2446(o.instances);
   }
   buildCounterInstanceGroupManagersRecreateInstancesRequest--;
 }
 
-buildUnnamed2422() {
+buildUnnamed2447() {
   var o = new core.List<api.InstanceGroupManager>();
   o.add(buildInstanceGroupManager());
   o.add(buildInstanceGroupManager());
   return o;
 }
 
-checkUnnamed2422(core.List<api.InstanceGroupManager> o) {
+checkUnnamed2447(core.List<api.InstanceGroupManager> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupManager(o[0]);
   checkInstanceGroupManager(o[1]);
@@ -5719,14 +5719,14 @@
   buildCounterInstanceGroupManagersScopedListWarningData--;
 }
 
-buildUnnamed2423() {
+buildUnnamed2448() {
   var o = new core.List<api.InstanceGroupManagersScopedListWarningData>();
   o.add(buildInstanceGroupManagersScopedListWarningData());
   o.add(buildInstanceGroupManagersScopedListWarningData());
   return o;
 }
 
-checkUnnamed2423(core.List<api.InstanceGroupManagersScopedListWarningData> o) {
+checkUnnamed2448(core.List<api.InstanceGroupManagersScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupManagersScopedListWarningData(o[0]);
   checkInstanceGroupManagersScopedListWarningData(o[1]);
@@ -5738,7 +5738,7 @@
   buildCounterInstanceGroupManagersScopedListWarning++;
   if (buildCounterInstanceGroupManagersScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2423();
+    o.data = buildUnnamed2448();
     o.message = "foo";
   }
   buildCounterInstanceGroupManagersScopedListWarning--;
@@ -5750,7 +5750,7 @@
   buildCounterInstanceGroupManagersScopedListWarning++;
   if (buildCounterInstanceGroupManagersScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2423(o.data);
+    checkUnnamed2448(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstanceGroupManagersScopedListWarning--;
@@ -5761,7 +5761,7 @@
   var o = new api.InstanceGroupManagersScopedList();
   buildCounterInstanceGroupManagersScopedList++;
   if (buildCounterInstanceGroupManagersScopedList < 3) {
-    o.instanceGroupManagers = buildUnnamed2422();
+    o.instanceGroupManagers = buildUnnamed2447();
     o.warning = buildInstanceGroupManagersScopedListWarning();
   }
   buildCounterInstanceGroupManagersScopedList--;
@@ -5771,7 +5771,7 @@
 checkInstanceGroupManagersScopedList(api.InstanceGroupManagersScopedList o) {
   buildCounterInstanceGroupManagersScopedList++;
   if (buildCounterInstanceGroupManagersScopedList < 3) {
-    checkUnnamed2422(o.instanceGroupManagers);
+    checkUnnamed2447(o.instanceGroupManagers);
     checkInstanceGroupManagersScopedListWarning(o.warning);
   }
   buildCounterInstanceGroupManagersScopedList--;
@@ -5797,14 +5797,14 @@
   buildCounterInstanceGroupManagersSetInstanceTemplateRequest--;
 }
 
-buildUnnamed2424() {
+buildUnnamed2449() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2424(core.List<core.String> o) {
+checkUnnamed2449(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5816,7 +5816,7 @@
   buildCounterInstanceGroupManagersSetTargetPoolsRequest++;
   if (buildCounterInstanceGroupManagersSetTargetPoolsRequest < 3) {
     o.fingerprint = "foo";
-    o.targetPools = buildUnnamed2424();
+    o.targetPools = buildUnnamed2449();
   }
   buildCounterInstanceGroupManagersSetTargetPoolsRequest--;
   return o;
@@ -5827,19 +5827,19 @@
   buildCounterInstanceGroupManagersSetTargetPoolsRequest++;
   if (buildCounterInstanceGroupManagersSetTargetPoolsRequest < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2424(o.targetPools);
+    checkUnnamed2449(o.targetPools);
   }
   buildCounterInstanceGroupManagersSetTargetPoolsRequest--;
 }
 
-buildUnnamed2425() {
+buildUnnamed2450() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed2425(core.List<api.InstanceReference> o) {
+checkUnnamed2450(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -5850,7 +5850,7 @@
   var o = new api.InstanceGroupsAddInstancesRequest();
   buildCounterInstanceGroupsAddInstancesRequest++;
   if (buildCounterInstanceGroupsAddInstancesRequest < 3) {
-    o.instances = buildUnnamed2425();
+    o.instances = buildUnnamed2450();
   }
   buildCounterInstanceGroupsAddInstancesRequest--;
   return o;
@@ -5860,19 +5860,19 @@
     api.InstanceGroupsAddInstancesRequest o) {
   buildCounterInstanceGroupsAddInstancesRequest++;
   if (buildCounterInstanceGroupsAddInstancesRequest < 3) {
-    checkUnnamed2425(o.instances);
+    checkUnnamed2450(o.instances);
   }
   buildCounterInstanceGroupsAddInstancesRequest--;
 }
 
-buildUnnamed2426() {
+buildUnnamed2451() {
   var o = new core.List<api.InstanceWithNamedPorts>();
   o.add(buildInstanceWithNamedPorts());
   o.add(buildInstanceWithNamedPorts());
   return o;
 }
 
-checkUnnamed2426(core.List<api.InstanceWithNamedPorts> o) {
+checkUnnamed2451(core.List<api.InstanceWithNamedPorts> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceWithNamedPorts(o[0]);
   checkInstanceWithNamedPorts(o[1]);
@@ -5900,14 +5900,14 @@
   buildCounterInstanceGroupsListInstancesWarningData--;
 }
 
-buildUnnamed2427() {
+buildUnnamed2452() {
   var o = new core.List<api.InstanceGroupsListInstancesWarningData>();
   o.add(buildInstanceGroupsListInstancesWarningData());
   o.add(buildInstanceGroupsListInstancesWarningData());
   return o;
 }
 
-checkUnnamed2427(core.List<api.InstanceGroupsListInstancesWarningData> o) {
+checkUnnamed2452(core.List<api.InstanceGroupsListInstancesWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupsListInstancesWarningData(o[0]);
   checkInstanceGroupsListInstancesWarningData(o[1]);
@@ -5919,7 +5919,7 @@
   buildCounterInstanceGroupsListInstancesWarning++;
   if (buildCounterInstanceGroupsListInstancesWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2427();
+    o.data = buildUnnamed2452();
     o.message = "foo";
   }
   buildCounterInstanceGroupsListInstancesWarning--;
@@ -5931,7 +5931,7 @@
   buildCounterInstanceGroupsListInstancesWarning++;
   if (buildCounterInstanceGroupsListInstancesWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2427(o.data);
+    checkUnnamed2452(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstanceGroupsListInstancesWarning--;
@@ -5943,7 +5943,7 @@
   buildCounterInstanceGroupsListInstances++;
   if (buildCounterInstanceGroupsListInstances < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2426();
+    o.items = buildUnnamed2451();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -5957,7 +5957,7 @@
   buildCounterInstanceGroupsListInstances++;
   if (buildCounterInstanceGroupsListInstances < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2426(o.items);
+    checkUnnamed2451(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -5986,14 +5986,14 @@
   buildCounterInstanceGroupsListInstancesRequest--;
 }
 
-buildUnnamed2428() {
+buildUnnamed2453() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed2428(core.List<api.InstanceReference> o) {
+checkUnnamed2453(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -6004,7 +6004,7 @@
   var o = new api.InstanceGroupsRemoveInstancesRequest();
   buildCounterInstanceGroupsRemoveInstancesRequest++;
   if (buildCounterInstanceGroupsRemoveInstancesRequest < 3) {
-    o.instances = buildUnnamed2428();
+    o.instances = buildUnnamed2453();
   }
   buildCounterInstanceGroupsRemoveInstancesRequest--;
   return o;
@@ -6014,19 +6014,19 @@
     api.InstanceGroupsRemoveInstancesRequest o) {
   buildCounterInstanceGroupsRemoveInstancesRequest++;
   if (buildCounterInstanceGroupsRemoveInstancesRequest < 3) {
-    checkUnnamed2428(o.instances);
+    checkUnnamed2453(o.instances);
   }
   buildCounterInstanceGroupsRemoveInstancesRequest--;
 }
 
-buildUnnamed2429() {
+buildUnnamed2454() {
   var o = new core.List<api.InstanceGroup>();
   o.add(buildInstanceGroup());
   o.add(buildInstanceGroup());
   return o;
 }
 
-checkUnnamed2429(core.List<api.InstanceGroup> o) {
+checkUnnamed2454(core.List<api.InstanceGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroup(o[0]);
   checkInstanceGroup(o[1]);
@@ -6054,14 +6054,14 @@
   buildCounterInstanceGroupsScopedListWarningData--;
 }
 
-buildUnnamed2430() {
+buildUnnamed2455() {
   var o = new core.List<api.InstanceGroupsScopedListWarningData>();
   o.add(buildInstanceGroupsScopedListWarningData());
   o.add(buildInstanceGroupsScopedListWarningData());
   return o;
 }
 
-checkUnnamed2430(core.List<api.InstanceGroupsScopedListWarningData> o) {
+checkUnnamed2455(core.List<api.InstanceGroupsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupsScopedListWarningData(o[0]);
   checkInstanceGroupsScopedListWarningData(o[1]);
@@ -6073,7 +6073,7 @@
   buildCounterInstanceGroupsScopedListWarning++;
   if (buildCounterInstanceGroupsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2430();
+    o.data = buildUnnamed2455();
     o.message = "foo";
   }
   buildCounterInstanceGroupsScopedListWarning--;
@@ -6084,7 +6084,7 @@
   buildCounterInstanceGroupsScopedListWarning++;
   if (buildCounterInstanceGroupsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2430(o.data);
+    checkUnnamed2455(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstanceGroupsScopedListWarning--;
@@ -6095,7 +6095,7 @@
   var o = new api.InstanceGroupsScopedList();
   buildCounterInstanceGroupsScopedList++;
   if (buildCounterInstanceGroupsScopedList < 3) {
-    o.instanceGroups = buildUnnamed2429();
+    o.instanceGroups = buildUnnamed2454();
     o.warning = buildInstanceGroupsScopedListWarning();
   }
   buildCounterInstanceGroupsScopedList--;
@@ -6105,20 +6105,20 @@
 checkInstanceGroupsScopedList(api.InstanceGroupsScopedList o) {
   buildCounterInstanceGroupsScopedList++;
   if (buildCounterInstanceGroupsScopedList < 3) {
-    checkUnnamed2429(o.instanceGroups);
+    checkUnnamed2454(o.instanceGroups);
     checkInstanceGroupsScopedListWarning(o.warning);
   }
   buildCounterInstanceGroupsScopedList--;
 }
 
-buildUnnamed2431() {
+buildUnnamed2456() {
   var o = new core.List<api.NamedPort>();
   o.add(buildNamedPort());
   o.add(buildNamedPort());
   return o;
 }
 
-checkUnnamed2431(core.List<api.NamedPort> o) {
+checkUnnamed2456(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNamedPort(o[0]);
   checkNamedPort(o[1]);
@@ -6130,7 +6130,7 @@
   buildCounterInstanceGroupsSetNamedPortsRequest++;
   if (buildCounterInstanceGroupsSetNamedPortsRequest < 3) {
     o.fingerprint = "foo";
-    o.namedPorts = buildUnnamed2431();
+    o.namedPorts = buildUnnamed2456();
   }
   buildCounterInstanceGroupsSetNamedPortsRequest--;
   return o;
@@ -6141,19 +6141,19 @@
   buildCounterInstanceGroupsSetNamedPortsRequest++;
   if (buildCounterInstanceGroupsSetNamedPortsRequest < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2431(o.namedPorts);
+    checkUnnamed2456(o.namedPorts);
   }
   buildCounterInstanceGroupsSetNamedPortsRequest--;
 }
 
-buildUnnamed2432() {
+buildUnnamed2457() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed2432(core.List<api.Instance> o) {
+checkUnnamed2457(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -6180,14 +6180,14 @@
   buildCounterInstanceListWarningData--;
 }
 
-buildUnnamed2433() {
+buildUnnamed2458() {
   var o = new core.List<api.InstanceListWarningData>();
   o.add(buildInstanceListWarningData());
   o.add(buildInstanceListWarningData());
   return o;
 }
 
-checkUnnamed2433(core.List<api.InstanceListWarningData> o) {
+checkUnnamed2458(core.List<api.InstanceListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceListWarningData(o[0]);
   checkInstanceListWarningData(o[1]);
@@ -6199,7 +6199,7 @@
   buildCounterInstanceListWarning++;
   if (buildCounterInstanceListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2433();
+    o.data = buildUnnamed2458();
     o.message = "foo";
   }
   buildCounterInstanceListWarning--;
@@ -6210,7 +6210,7 @@
   buildCounterInstanceListWarning++;
   if (buildCounterInstanceListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2433(o.data);
+    checkUnnamed2458(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstanceListWarning--;
@@ -6222,7 +6222,7 @@
   buildCounterInstanceList++;
   if (buildCounterInstanceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2432();
+    o.items = buildUnnamed2457();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -6236,7 +6236,7 @@
   buildCounterInstanceList++;
   if (buildCounterInstanceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2432(o.items);
+    checkUnnamed2457(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -6266,66 +6266,66 @@
   buildCounterInstanceMoveRequest--;
 }
 
-buildUnnamed2434() {
+buildUnnamed2459() {
   var o = new core.List<api.AttachedDisk>();
   o.add(buildAttachedDisk());
   o.add(buildAttachedDisk());
   return o;
 }
 
-checkUnnamed2434(core.List<api.AttachedDisk> o) {
+checkUnnamed2459(core.List<api.AttachedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachedDisk(o[0]);
   checkAttachedDisk(o[1]);
 }
 
-buildUnnamed2435() {
+buildUnnamed2460() {
   var o = new core.List<api.AcceleratorConfig>();
   o.add(buildAcceleratorConfig());
   o.add(buildAcceleratorConfig());
   return o;
 }
 
-checkUnnamed2435(core.List<api.AcceleratorConfig> o) {
+checkUnnamed2460(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorConfig(o[0]);
   checkAcceleratorConfig(o[1]);
 }
 
-buildUnnamed2436() {
+buildUnnamed2461() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2436(core.Map<core.String, core.String> o) {
+checkUnnamed2461(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'));
 }
 
-buildUnnamed2437() {
+buildUnnamed2462() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed2437(core.List<api.NetworkInterface> o) {
+checkUnnamed2462(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed2438() {
+buildUnnamed2463() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed2438(core.List<api.ServiceAccount> o) {
+checkUnnamed2463(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -6338,15 +6338,15 @@
   if (buildCounterInstanceProperties < 3) {
     o.canIpForward = true;
     o.description = "foo";
-    o.disks = buildUnnamed2434();
-    o.guestAccelerators = buildUnnamed2435();
-    o.labels = buildUnnamed2436();
+    o.disks = buildUnnamed2459();
+    o.guestAccelerators = buildUnnamed2460();
+    o.labels = buildUnnamed2461();
     o.machineType = "foo";
     o.metadata = buildMetadata();
     o.minCpuPlatform = "foo";
-    o.networkInterfaces = buildUnnamed2437();
+    o.networkInterfaces = buildUnnamed2462();
     o.scheduling = buildScheduling();
-    o.serviceAccounts = buildUnnamed2438();
+    o.serviceAccounts = buildUnnamed2463();
     o.tags = buildTags();
   }
   buildCounterInstanceProperties--;
@@ -6358,15 +6358,15 @@
   if (buildCounterInstanceProperties < 3) {
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2434(o.disks);
-    checkUnnamed2435(o.guestAccelerators);
-    checkUnnamed2436(o.labels);
+    checkUnnamed2459(o.disks);
+    checkUnnamed2460(o.guestAccelerators);
+    checkUnnamed2461(o.labels);
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
     unittest.expect(o.minCpuPlatform, unittest.equals('foo'));
-    checkUnnamed2437(o.networkInterfaces);
+    checkUnnamed2462(o.networkInterfaces);
     checkScheduling(o.scheduling);
-    checkUnnamed2438(o.serviceAccounts);
+    checkUnnamed2463(o.serviceAccounts);
     checkTags(o.tags);
   }
   buildCounterInstanceProperties--;
@@ -6422,14 +6422,14 @@
   buildCounterInstanceTemplate--;
 }
 
-buildUnnamed2439() {
+buildUnnamed2464() {
   var o = new core.List<api.InstanceTemplate>();
   o.add(buildInstanceTemplate());
   o.add(buildInstanceTemplate());
   return o;
 }
 
-checkUnnamed2439(core.List<api.InstanceTemplate> o) {
+checkUnnamed2464(core.List<api.InstanceTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceTemplate(o[0]);
   checkInstanceTemplate(o[1]);
@@ -6456,14 +6456,14 @@
   buildCounterInstanceTemplateListWarningData--;
 }
 
-buildUnnamed2440() {
+buildUnnamed2465() {
   var o = new core.List<api.InstanceTemplateListWarningData>();
   o.add(buildInstanceTemplateListWarningData());
   o.add(buildInstanceTemplateListWarningData());
   return o;
 }
 
-checkUnnamed2440(core.List<api.InstanceTemplateListWarningData> o) {
+checkUnnamed2465(core.List<api.InstanceTemplateListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceTemplateListWarningData(o[0]);
   checkInstanceTemplateListWarningData(o[1]);
@@ -6475,7 +6475,7 @@
   buildCounterInstanceTemplateListWarning++;
   if (buildCounterInstanceTemplateListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2440();
+    o.data = buildUnnamed2465();
     o.message = "foo";
   }
   buildCounterInstanceTemplateListWarning--;
@@ -6486,7 +6486,7 @@
   buildCounterInstanceTemplateListWarning++;
   if (buildCounterInstanceTemplateListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2440(o.data);
+    checkUnnamed2465(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstanceTemplateListWarning--;
@@ -6498,7 +6498,7 @@
   buildCounterInstanceTemplateList++;
   if (buildCounterInstanceTemplateList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2439();
+    o.items = buildUnnamed2464();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -6512,7 +6512,7 @@
   buildCounterInstanceTemplateList++;
   if (buildCounterInstanceTemplateList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2439(o.items);
+    checkUnnamed2464(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -6521,14 +6521,14 @@
   buildCounterInstanceTemplateList--;
 }
 
-buildUnnamed2441() {
+buildUnnamed2466() {
   var o = new core.List<api.NamedPort>();
   o.add(buildNamedPort());
   o.add(buildNamedPort());
   return o;
 }
 
-checkUnnamed2441(core.List<api.NamedPort> o) {
+checkUnnamed2466(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNamedPort(o[0]);
   checkNamedPort(o[1]);
@@ -6540,7 +6540,7 @@
   buildCounterInstanceWithNamedPorts++;
   if (buildCounterInstanceWithNamedPorts < 3) {
     o.instance = "foo";
-    o.namedPorts = buildUnnamed2441();
+    o.namedPorts = buildUnnamed2466();
     o.status = "foo";
   }
   buildCounterInstanceWithNamedPorts--;
@@ -6551,20 +6551,20 @@
   buildCounterInstanceWithNamedPorts++;
   if (buildCounterInstanceWithNamedPorts < 3) {
     unittest.expect(o.instance, unittest.equals('foo'));
-    checkUnnamed2441(o.namedPorts);
+    checkUnnamed2466(o.namedPorts);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterInstanceWithNamedPorts--;
 }
 
-buildUnnamed2442() {
+buildUnnamed2467() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed2442(core.List<api.Instance> o) {
+checkUnnamed2467(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -6591,14 +6591,14 @@
   buildCounterInstancesScopedListWarningData--;
 }
 
-buildUnnamed2443() {
+buildUnnamed2468() {
   var o = new core.List<api.InstancesScopedListWarningData>();
   o.add(buildInstancesScopedListWarningData());
   o.add(buildInstancesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2443(core.List<api.InstancesScopedListWarningData> o) {
+checkUnnamed2468(core.List<api.InstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstancesScopedListWarningData(o[0]);
   checkInstancesScopedListWarningData(o[1]);
@@ -6610,7 +6610,7 @@
   buildCounterInstancesScopedListWarning++;
   if (buildCounterInstancesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2443();
+    o.data = buildUnnamed2468();
     o.message = "foo";
   }
   buildCounterInstancesScopedListWarning--;
@@ -6621,7 +6621,7 @@
   buildCounterInstancesScopedListWarning++;
   if (buildCounterInstancesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2443(o.data);
+    checkUnnamed2468(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstancesScopedListWarning--;
@@ -6632,7 +6632,7 @@
   var o = new api.InstancesScopedList();
   buildCounterInstancesScopedList++;
   if (buildCounterInstancesScopedList < 3) {
-    o.instances = buildUnnamed2442();
+    o.instances = buildUnnamed2467();
     o.warning = buildInstancesScopedListWarning();
   }
   buildCounterInstancesScopedList--;
@@ -6642,20 +6642,20 @@
 checkInstancesScopedList(api.InstancesScopedList o) {
   buildCounterInstancesScopedList++;
   if (buildCounterInstancesScopedList < 3) {
-    checkUnnamed2442(o.instances);
+    checkUnnamed2467(o.instances);
     checkInstancesScopedListWarning(o.warning);
   }
   buildCounterInstancesScopedList--;
 }
 
-buildUnnamed2444() {
+buildUnnamed2469() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2444(core.Map<core.String, core.String> o) {
+checkUnnamed2469(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'));
@@ -6667,7 +6667,7 @@
   buildCounterInstancesSetLabelsRequest++;
   if (buildCounterInstancesSetLabelsRequest < 3) {
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2444();
+    o.labels = buildUnnamed2469();
   }
   buildCounterInstancesSetLabelsRequest--;
   return o;
@@ -6677,19 +6677,19 @@
   buildCounterInstancesSetLabelsRequest++;
   if (buildCounterInstancesSetLabelsRequest < 3) {
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2444(o.labels);
+    checkUnnamed2469(o.labels);
   }
   buildCounterInstancesSetLabelsRequest--;
 }
 
-buildUnnamed2445() {
+buildUnnamed2470() {
   var o = new core.List<api.AcceleratorConfig>();
   o.add(buildAcceleratorConfig());
   o.add(buildAcceleratorConfig());
   return o;
 }
 
-checkUnnamed2445(core.List<api.AcceleratorConfig> o) {
+checkUnnamed2470(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorConfig(o[0]);
   checkAcceleratorConfig(o[1]);
@@ -6700,7 +6700,7 @@
   var o = new api.InstancesSetMachineResourcesRequest();
   buildCounterInstancesSetMachineResourcesRequest++;
   if (buildCounterInstancesSetMachineResourcesRequest < 3) {
-    o.guestAccelerators = buildUnnamed2445();
+    o.guestAccelerators = buildUnnamed2470();
   }
   buildCounterInstancesSetMachineResourcesRequest--;
   return o;
@@ -6710,7 +6710,7 @@
     api.InstancesSetMachineResourcesRequest o) {
   buildCounterInstancesSetMachineResourcesRequest++;
   if (buildCounterInstancesSetMachineResourcesRequest < 3) {
-    checkUnnamed2445(o.guestAccelerators);
+    checkUnnamed2470(o.guestAccelerators);
   }
   buildCounterInstancesSetMachineResourcesRequest--;
 }
@@ -6754,14 +6754,14 @@
   buildCounterInstancesSetMinCpuPlatformRequest--;
 }
 
-buildUnnamed2446() {
+buildUnnamed2471() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2446(core.List<core.String> o) {
+checkUnnamed2471(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -6773,7 +6773,7 @@
   buildCounterInstancesSetServiceAccountRequest++;
   if (buildCounterInstancesSetServiceAccountRequest < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed2446();
+    o.scopes = buildUnnamed2471();
   }
   buildCounterInstancesSetServiceAccountRequest--;
   return o;
@@ -6784,19 +6784,19 @@
   buildCounterInstancesSetServiceAccountRequest++;
   if (buildCounterInstancesSetServiceAccountRequest < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed2446(o.scopes);
+    checkUnnamed2471(o.scopes);
   }
   buildCounterInstancesSetServiceAccountRequest--;
 }
 
-buildUnnamed2447() {
+buildUnnamed2472() {
   var o = new core.List<api.CustomerEncryptionKeyProtectedDisk>();
   o.add(buildCustomerEncryptionKeyProtectedDisk());
   o.add(buildCustomerEncryptionKeyProtectedDisk());
   return o;
 }
 
-checkUnnamed2447(core.List<api.CustomerEncryptionKeyProtectedDisk> o) {
+checkUnnamed2472(core.List<api.CustomerEncryptionKeyProtectedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomerEncryptionKeyProtectedDisk(o[0]);
   checkCustomerEncryptionKeyProtectedDisk(o[1]);
@@ -6807,7 +6807,7 @@
   var o = new api.InstancesStartWithEncryptionKeyRequest();
   buildCounterInstancesStartWithEncryptionKeyRequest++;
   if (buildCounterInstancesStartWithEncryptionKeyRequest < 3) {
-    o.disks = buildUnnamed2447();
+    o.disks = buildUnnamed2472();
   }
   buildCounterInstancesStartWithEncryptionKeyRequest--;
   return o;
@@ -6817,45 +6817,45 @@
     api.InstancesStartWithEncryptionKeyRequest o) {
   buildCounterInstancesStartWithEncryptionKeyRequest++;
   if (buildCounterInstancesStartWithEncryptionKeyRequest < 3) {
-    checkUnnamed2447(o.disks);
+    checkUnnamed2472(o.disks);
   }
   buildCounterInstancesStartWithEncryptionKeyRequest--;
 }
 
-buildUnnamed2448() {
+buildUnnamed2473() {
   var o = new core.List<api.InterconnectCircuitInfo>();
   o.add(buildInterconnectCircuitInfo());
   o.add(buildInterconnectCircuitInfo());
   return o;
 }
 
-checkUnnamed2448(core.List<api.InterconnectCircuitInfo> o) {
+checkUnnamed2473(core.List<api.InterconnectCircuitInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterconnectCircuitInfo(o[0]);
   checkInterconnectCircuitInfo(o[1]);
 }
 
-buildUnnamed2449() {
+buildUnnamed2474() {
   var o = new core.List<api.InterconnectOutageNotification>();
   o.add(buildInterconnectOutageNotification());
   o.add(buildInterconnectOutageNotification());
   return o;
 }
 
-checkUnnamed2449(core.List<api.InterconnectOutageNotification> o) {
+checkUnnamed2474(core.List<api.InterconnectOutageNotification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterconnectOutageNotification(o[0]);
   checkInterconnectOutageNotification(o[1]);
 }
 
-buildUnnamed2450() {
+buildUnnamed2475() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2450(core.List<core.String> o) {
+checkUnnamed2475(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -6867,15 +6867,15 @@
   buildCounterInterconnect++;
   if (buildCounterInterconnect < 3) {
     o.adminEnabled = true;
-    o.circuitInfos = buildUnnamed2448();
+    o.circuitInfos = buildUnnamed2473();
     o.creationTimestamp = "foo";
     o.customerName = "foo";
     o.description = "foo";
-    o.expectedOutages = buildUnnamed2449();
+    o.expectedOutages = buildUnnamed2474();
     o.googleIpAddress = "foo";
     o.googleReferenceId = "foo";
     o.id = "foo";
-    o.interconnectAttachments = buildUnnamed2450();
+    o.interconnectAttachments = buildUnnamed2475();
     o.interconnectType = "foo";
     o.kind = "foo";
     o.linkType = "foo";
@@ -6896,15 +6896,15 @@
   buildCounterInterconnect++;
   if (buildCounterInterconnect < 3) {
     unittest.expect(o.adminEnabled, unittest.isTrue);
-    checkUnnamed2448(o.circuitInfos);
+    checkUnnamed2473(o.circuitInfos);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.customerName, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2449(o.expectedOutages);
+    checkUnnamed2474(o.expectedOutages);
     unittest.expect(o.googleIpAddress, unittest.equals('foo'));
     unittest.expect(o.googleReferenceId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2450(o.interconnectAttachments);
+    checkUnnamed2475(o.interconnectAttachments);
     unittest.expect(o.interconnectType, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.linkType, unittest.equals('foo'));
@@ -6965,14 +6965,14 @@
   buildCounterInterconnectAttachment--;
 }
 
-buildUnnamed2451() {
+buildUnnamed2476() {
   var o = new core.Map<core.String, api.InterconnectAttachmentsScopedList>();
   o["x"] = buildInterconnectAttachmentsScopedList();
   o["y"] = buildInterconnectAttachmentsScopedList();
   return o;
 }
 
-checkUnnamed2451(
+checkUnnamed2476(
     core.Map<core.String, api.InterconnectAttachmentsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterconnectAttachmentsScopedList(o["x"]);
@@ -7001,14 +7001,14 @@
   buildCounterInterconnectAttachmentAggregatedListWarningData--;
 }
 
-buildUnnamed2452() {
+buildUnnamed2477() {
   var o = new core.List<api.InterconnectAttachmentAggregatedListWarningData>();
   o.add(buildInterconnectAttachmentAggregatedListWarningData());
   o.add(buildInterconnectAttachmentAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2452(
+checkUnnamed2477(
     core.List<api.InterconnectAttachmentAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterconnectAttachmentAggregatedListWarningData(o[0]);
@@ -7021,7 +7021,7 @@
   buildCounterInterconnectAttachmentAggregatedListWarning++;
   if (buildCounterInterconnectAttachmentAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2452();
+    o.data = buildUnnamed2477();
     o.message = "foo";
   }
   buildCounterInterconnectAttachmentAggregatedListWarning--;
@@ -7033,7 +7033,7 @@
   buildCounterInterconnectAttachmentAggregatedListWarning++;
   if (buildCounterInterconnectAttachmentAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2452(o.data);
+    checkUnnamed2477(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInterconnectAttachmentAggregatedListWarning--;
@@ -7045,7 +7045,7 @@
   buildCounterInterconnectAttachmentAggregatedList++;
   if (buildCounterInterconnectAttachmentAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2451();
+    o.items = buildUnnamed2476();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -7060,7 +7060,7 @@
   buildCounterInterconnectAttachmentAggregatedList++;
   if (buildCounterInterconnectAttachmentAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2451(o.items);
+    checkUnnamed2476(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -7069,14 +7069,14 @@
   buildCounterInterconnectAttachmentAggregatedList--;
 }
 
-buildUnnamed2453() {
+buildUnnamed2478() {
   var o = new core.List<api.InterconnectAttachment>();
   o.add(buildInterconnectAttachment());
   o.add(buildInterconnectAttachment());
   return o;
 }
 
-checkUnnamed2453(core.List<api.InterconnectAttachment> o) {
+checkUnnamed2478(core.List<api.InterconnectAttachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterconnectAttachment(o[0]);
   checkInterconnectAttachment(o[1]);
@@ -7104,14 +7104,14 @@
   buildCounterInterconnectAttachmentListWarningData--;
 }
 
-buildUnnamed2454() {
+buildUnnamed2479() {
   var o = new core.List<api.InterconnectAttachmentListWarningData>();
   o.add(buildInterconnectAttachmentListWarningData());
   o.add(buildInterconnectAttachmentListWarningData());
   return o;
 }
 
-checkUnnamed2454(core.List<api.InterconnectAttachmentListWarningData> o) {
+checkUnnamed2479(core.List<api.InterconnectAttachmentListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterconnectAttachmentListWarningData(o[0]);
   checkInterconnectAttachmentListWarningData(o[1]);
@@ -7123,7 +7123,7 @@
   buildCounterInterconnectAttachmentListWarning++;
   if (buildCounterInterconnectAttachmentListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2454();
+    o.data = buildUnnamed2479();
     o.message = "foo";
   }
   buildCounterInterconnectAttachmentListWarning--;
@@ -7135,7 +7135,7 @@
   buildCounterInterconnectAttachmentListWarning++;
   if (buildCounterInterconnectAttachmentListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2454(o.data);
+    checkUnnamed2479(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInterconnectAttachmentListWarning--;
@@ -7147,7 +7147,7 @@
   buildCounterInterconnectAttachmentList++;
   if (buildCounterInterconnectAttachmentList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2453();
+    o.items = buildUnnamed2478();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -7161,7 +7161,7 @@
   buildCounterInterconnectAttachmentList++;
   if (buildCounterInterconnectAttachmentList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2453(o.items);
+    checkUnnamed2478(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -7190,14 +7190,14 @@
   buildCounterInterconnectAttachmentPrivateInfo--;
 }
 
-buildUnnamed2455() {
+buildUnnamed2480() {
   var o = new core.List<api.InterconnectAttachment>();
   o.add(buildInterconnectAttachment());
   o.add(buildInterconnectAttachment());
   return o;
 }
 
-checkUnnamed2455(core.List<api.InterconnectAttachment> o) {
+checkUnnamed2480(core.List<api.InterconnectAttachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterconnectAttachment(o[0]);
   checkInterconnectAttachment(o[1]);
@@ -7225,14 +7225,14 @@
   buildCounterInterconnectAttachmentsScopedListWarningData--;
 }
 
-buildUnnamed2456() {
+buildUnnamed2481() {
   var o = new core.List<api.InterconnectAttachmentsScopedListWarningData>();
   o.add(buildInterconnectAttachmentsScopedListWarningData());
   o.add(buildInterconnectAttachmentsScopedListWarningData());
   return o;
 }
 
-checkUnnamed2456(
+checkUnnamed2481(
     core.List<api.InterconnectAttachmentsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterconnectAttachmentsScopedListWarningData(o[0]);
@@ -7245,7 +7245,7 @@
   buildCounterInterconnectAttachmentsScopedListWarning++;
   if (buildCounterInterconnectAttachmentsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2456();
+    o.data = buildUnnamed2481();
     o.message = "foo";
   }
   buildCounterInterconnectAttachmentsScopedListWarning--;
@@ -7257,7 +7257,7 @@
   buildCounterInterconnectAttachmentsScopedListWarning++;
   if (buildCounterInterconnectAttachmentsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2456(o.data);
+    checkUnnamed2481(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInterconnectAttachmentsScopedListWarning--;
@@ -7268,7 +7268,7 @@
   var o = new api.InterconnectAttachmentsScopedList();
   buildCounterInterconnectAttachmentsScopedList++;
   if (buildCounterInterconnectAttachmentsScopedList < 3) {
-    o.interconnectAttachments = buildUnnamed2455();
+    o.interconnectAttachments = buildUnnamed2480();
     o.warning = buildInterconnectAttachmentsScopedListWarning();
   }
   buildCounterInterconnectAttachmentsScopedList--;
@@ -7279,7 +7279,7 @@
     api.InterconnectAttachmentsScopedList o) {
   buildCounterInterconnectAttachmentsScopedList++;
   if (buildCounterInterconnectAttachmentsScopedList < 3) {
-    checkUnnamed2455(o.interconnectAttachments);
+    checkUnnamed2480(o.interconnectAttachments);
     checkInterconnectAttachmentsScopedListWarning(o.warning);
   }
   buildCounterInterconnectAttachmentsScopedList--;
@@ -7308,14 +7308,14 @@
   buildCounterInterconnectCircuitInfo--;
 }
 
-buildUnnamed2457() {
+buildUnnamed2482() {
   var o = new core.List<api.Interconnect>();
   o.add(buildInterconnect());
   o.add(buildInterconnect());
   return o;
 }
 
-checkUnnamed2457(core.List<api.Interconnect> o) {
+checkUnnamed2482(core.List<api.Interconnect> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterconnect(o[0]);
   checkInterconnect(o[1]);
@@ -7342,14 +7342,14 @@
   buildCounterInterconnectListWarningData--;
 }
 
-buildUnnamed2458() {
+buildUnnamed2483() {
   var o = new core.List<api.InterconnectListWarningData>();
   o.add(buildInterconnectListWarningData());
   o.add(buildInterconnectListWarningData());
   return o;
 }
 
-checkUnnamed2458(core.List<api.InterconnectListWarningData> o) {
+checkUnnamed2483(core.List<api.InterconnectListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterconnectListWarningData(o[0]);
   checkInterconnectListWarningData(o[1]);
@@ -7361,7 +7361,7 @@
   buildCounterInterconnectListWarning++;
   if (buildCounterInterconnectListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2458();
+    o.data = buildUnnamed2483();
     o.message = "foo";
   }
   buildCounterInterconnectListWarning--;
@@ -7372,7 +7372,7 @@
   buildCounterInterconnectListWarning++;
   if (buildCounterInterconnectListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2458(o.data);
+    checkUnnamed2483(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInterconnectListWarning--;
@@ -7384,7 +7384,7 @@
   buildCounterInterconnectList++;
   if (buildCounterInterconnectList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2457();
+    o.items = buildUnnamed2482();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -7398,7 +7398,7 @@
   buildCounterInterconnectList++;
   if (buildCounterInterconnectList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2457(o.items);
+    checkUnnamed2482(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -7407,14 +7407,14 @@
   buildCounterInterconnectList--;
 }
 
-buildUnnamed2459() {
+buildUnnamed2484() {
   var o = new core.List<api.InterconnectLocationRegionInfo>();
   o.add(buildInterconnectLocationRegionInfo());
   o.add(buildInterconnectLocationRegionInfo());
   return o;
 }
 
-checkUnnamed2459(core.List<api.InterconnectLocationRegionInfo> o) {
+checkUnnamed2484(core.List<api.InterconnectLocationRegionInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterconnectLocationRegionInfo(o[0]);
   checkInterconnectLocationRegionInfo(o[1]);
@@ -7437,7 +7437,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.peeringdbFacilityId = "foo";
-    o.regionInfos = buildUnnamed2459();
+    o.regionInfos = buildUnnamed2484();
     o.selfLink = "foo";
   }
   buildCounterInterconnectLocation--;
@@ -7459,20 +7459,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.peeringdbFacilityId, unittest.equals('foo'));
-    checkUnnamed2459(o.regionInfos);
+    checkUnnamed2484(o.regionInfos);
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterInterconnectLocation--;
 }
 
-buildUnnamed2460() {
+buildUnnamed2485() {
   var o = new core.List<api.InterconnectLocation>();
   o.add(buildInterconnectLocation());
   o.add(buildInterconnectLocation());
   return o;
 }
 
-checkUnnamed2460(core.List<api.InterconnectLocation> o) {
+checkUnnamed2485(core.List<api.InterconnectLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterconnectLocation(o[0]);
   checkInterconnectLocation(o[1]);
@@ -7500,14 +7500,14 @@
   buildCounterInterconnectLocationListWarningData--;
 }
 
-buildUnnamed2461() {
+buildUnnamed2486() {
   var o = new core.List<api.InterconnectLocationListWarningData>();
   o.add(buildInterconnectLocationListWarningData());
   o.add(buildInterconnectLocationListWarningData());
   return o;
 }
 
-checkUnnamed2461(core.List<api.InterconnectLocationListWarningData> o) {
+checkUnnamed2486(core.List<api.InterconnectLocationListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterconnectLocationListWarningData(o[0]);
   checkInterconnectLocationListWarningData(o[1]);
@@ -7519,7 +7519,7 @@
   buildCounterInterconnectLocationListWarning++;
   if (buildCounterInterconnectLocationListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2461();
+    o.data = buildUnnamed2486();
     o.message = "foo";
   }
   buildCounterInterconnectLocationListWarning--;
@@ -7530,7 +7530,7 @@
   buildCounterInterconnectLocationListWarning++;
   if (buildCounterInterconnectLocationListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2461(o.data);
+    checkUnnamed2486(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInterconnectLocationListWarning--;
@@ -7542,7 +7542,7 @@
   buildCounterInterconnectLocationList++;
   if (buildCounterInterconnectLocationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2460();
+    o.items = buildUnnamed2485();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -7556,7 +7556,7 @@
   buildCounterInterconnectLocationList++;
   if (buildCounterInterconnectLocationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2460(o.items);
+    checkUnnamed2485(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -7588,14 +7588,14 @@
   buildCounterInterconnectLocationRegionInfo--;
 }
 
-buildUnnamed2462() {
+buildUnnamed2487() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2462(core.List<core.String> o) {
+checkUnnamed2487(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -7606,7 +7606,7 @@
   var o = new api.InterconnectOutageNotification();
   buildCounterInterconnectOutageNotification++;
   if (buildCounterInterconnectOutageNotification < 3) {
-    o.affectedCircuits = buildUnnamed2462();
+    o.affectedCircuits = buildUnnamed2487();
     o.description = "foo";
     o.endTime = "foo";
     o.issueType = "foo";
@@ -7622,7 +7622,7 @@
 checkInterconnectOutageNotification(api.InterconnectOutageNotification o) {
   buildCounterInterconnectOutageNotification++;
   if (buildCounterInterconnectOutageNotification < 3) {
-    checkUnnamed2462(o.affectedCircuits);
+    checkUnnamed2487(o.affectedCircuits);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.issueType, unittest.equals('foo'));
@@ -7678,14 +7678,14 @@
   buildCounterMachineTypeScratchDisks--;
 }
 
-buildUnnamed2463() {
+buildUnnamed2488() {
   var o = new core.List<api.MachineTypeScratchDisks>();
   o.add(buildMachineTypeScratchDisks());
   o.add(buildMachineTypeScratchDisks());
   return o;
 }
 
-checkUnnamed2463(core.List<api.MachineTypeScratchDisks> o) {
+checkUnnamed2488(core.List<api.MachineTypeScratchDisks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypeScratchDisks(o[0]);
   checkMachineTypeScratchDisks(o[1]);
@@ -7708,7 +7708,7 @@
     o.maximumPersistentDisksSizeGb = "foo";
     o.memoryMb = 42;
     o.name = "foo";
-    o.scratchDisks = buildUnnamed2463();
+    o.scratchDisks = buildUnnamed2488();
     o.selfLink = "foo";
     o.zone = "foo";
   }
@@ -7731,21 +7731,21 @@
     unittest.expect(o.maximumPersistentDisksSizeGb, unittest.equals('foo'));
     unittest.expect(o.memoryMb, unittest.equals(42));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2463(o.scratchDisks);
+    checkUnnamed2488(o.scratchDisks);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterMachineType--;
 }
 
-buildUnnamed2464() {
+buildUnnamed2489() {
   var o = new core.Map<core.String, api.MachineTypesScopedList>();
   o["x"] = buildMachineTypesScopedList();
   o["y"] = buildMachineTypesScopedList();
   return o;
 }
 
-checkUnnamed2464(core.Map<core.String, api.MachineTypesScopedList> o) {
+checkUnnamed2489(core.Map<core.String, api.MachineTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypesScopedList(o["x"]);
   checkMachineTypesScopedList(o["y"]);
@@ -7773,14 +7773,14 @@
   buildCounterMachineTypeAggregatedListWarningData--;
 }
 
-buildUnnamed2465() {
+buildUnnamed2490() {
   var o = new core.List<api.MachineTypeAggregatedListWarningData>();
   o.add(buildMachineTypeAggregatedListWarningData());
   o.add(buildMachineTypeAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2465(core.List<api.MachineTypeAggregatedListWarningData> o) {
+checkUnnamed2490(core.List<api.MachineTypeAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypeAggregatedListWarningData(o[0]);
   checkMachineTypeAggregatedListWarningData(o[1]);
@@ -7792,7 +7792,7 @@
   buildCounterMachineTypeAggregatedListWarning++;
   if (buildCounterMachineTypeAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2465();
+    o.data = buildUnnamed2490();
     o.message = "foo";
   }
   buildCounterMachineTypeAggregatedListWarning--;
@@ -7803,7 +7803,7 @@
   buildCounterMachineTypeAggregatedListWarning++;
   if (buildCounterMachineTypeAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2465(o.data);
+    checkUnnamed2490(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterMachineTypeAggregatedListWarning--;
@@ -7815,7 +7815,7 @@
   buildCounterMachineTypeAggregatedList++;
   if (buildCounterMachineTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2464();
+    o.items = buildUnnamed2489();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -7829,7 +7829,7 @@
   buildCounterMachineTypeAggregatedList++;
   if (buildCounterMachineTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2464(o.items);
+    checkUnnamed2489(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -7838,14 +7838,14 @@
   buildCounterMachineTypeAggregatedList--;
 }
 
-buildUnnamed2466() {
+buildUnnamed2491() {
   var o = new core.List<api.MachineType>();
   o.add(buildMachineType());
   o.add(buildMachineType());
   return o;
 }
 
-checkUnnamed2466(core.List<api.MachineType> o) {
+checkUnnamed2491(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineType(o[0]);
   checkMachineType(o[1]);
@@ -7872,14 +7872,14 @@
   buildCounterMachineTypeListWarningData--;
 }
 
-buildUnnamed2467() {
+buildUnnamed2492() {
   var o = new core.List<api.MachineTypeListWarningData>();
   o.add(buildMachineTypeListWarningData());
   o.add(buildMachineTypeListWarningData());
   return o;
 }
 
-checkUnnamed2467(core.List<api.MachineTypeListWarningData> o) {
+checkUnnamed2492(core.List<api.MachineTypeListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypeListWarningData(o[0]);
   checkMachineTypeListWarningData(o[1]);
@@ -7891,7 +7891,7 @@
   buildCounterMachineTypeListWarning++;
   if (buildCounterMachineTypeListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2467();
+    o.data = buildUnnamed2492();
     o.message = "foo";
   }
   buildCounterMachineTypeListWarning--;
@@ -7902,7 +7902,7 @@
   buildCounterMachineTypeListWarning++;
   if (buildCounterMachineTypeListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2467(o.data);
+    checkUnnamed2492(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterMachineTypeListWarning--;
@@ -7914,7 +7914,7 @@
   buildCounterMachineTypeList++;
   if (buildCounterMachineTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2466();
+    o.items = buildUnnamed2491();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -7928,7 +7928,7 @@
   buildCounterMachineTypeList++;
   if (buildCounterMachineTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2466(o.items);
+    checkUnnamed2491(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -7937,14 +7937,14 @@
   buildCounterMachineTypeList--;
 }
 
-buildUnnamed2468() {
+buildUnnamed2493() {
   var o = new core.List<api.MachineType>();
   o.add(buildMachineType());
   o.add(buildMachineType());
   return o;
 }
 
-checkUnnamed2468(core.List<api.MachineType> o) {
+checkUnnamed2493(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineType(o[0]);
   checkMachineType(o[1]);
@@ -7972,14 +7972,14 @@
   buildCounterMachineTypesScopedListWarningData--;
 }
 
-buildUnnamed2469() {
+buildUnnamed2494() {
   var o = new core.List<api.MachineTypesScopedListWarningData>();
   o.add(buildMachineTypesScopedListWarningData());
   o.add(buildMachineTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2469(core.List<api.MachineTypesScopedListWarningData> o) {
+checkUnnamed2494(core.List<api.MachineTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypesScopedListWarningData(o[0]);
   checkMachineTypesScopedListWarningData(o[1]);
@@ -7991,7 +7991,7 @@
   buildCounterMachineTypesScopedListWarning++;
   if (buildCounterMachineTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2469();
+    o.data = buildUnnamed2494();
     o.message = "foo";
   }
   buildCounterMachineTypesScopedListWarning--;
@@ -8002,7 +8002,7 @@
   buildCounterMachineTypesScopedListWarning++;
   if (buildCounterMachineTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2469(o.data);
+    checkUnnamed2494(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterMachineTypesScopedListWarning--;
@@ -8013,7 +8013,7 @@
   var o = new api.MachineTypesScopedList();
   buildCounterMachineTypesScopedList++;
   if (buildCounterMachineTypesScopedList < 3) {
-    o.machineTypes = buildUnnamed2468();
+    o.machineTypes = buildUnnamed2493();
     o.warning = buildMachineTypesScopedListWarning();
   }
   buildCounterMachineTypesScopedList--;
@@ -8023,7 +8023,7 @@
 checkMachineTypesScopedList(api.MachineTypesScopedList o) {
   buildCounterMachineTypesScopedList++;
   if (buildCounterMachineTypesScopedList < 3) {
-    checkUnnamed2468(o.machineTypes);
+    checkUnnamed2493(o.machineTypes);
     checkMachineTypesScopedListWarning(o.warning);
   }
   buildCounterMachineTypesScopedList--;
@@ -8080,14 +8080,14 @@
   buildCounterManagedInstanceLastAttemptErrorsErrors--;
 }
 
-buildUnnamed2470() {
+buildUnnamed2495() {
   var o = new core.List<api.ManagedInstanceLastAttemptErrorsErrors>();
   o.add(buildManagedInstanceLastAttemptErrorsErrors());
   o.add(buildManagedInstanceLastAttemptErrorsErrors());
   return o;
 }
 
-checkUnnamed2470(core.List<api.ManagedInstanceLastAttemptErrorsErrors> o) {
+checkUnnamed2495(core.List<api.ManagedInstanceLastAttemptErrorsErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedInstanceLastAttemptErrorsErrors(o[0]);
   checkManagedInstanceLastAttemptErrorsErrors(o[1]);
@@ -8098,7 +8098,7 @@
   var o = new api.ManagedInstanceLastAttemptErrors();
   buildCounterManagedInstanceLastAttemptErrors++;
   if (buildCounterManagedInstanceLastAttemptErrors < 3) {
-    o.errors = buildUnnamed2470();
+    o.errors = buildUnnamed2495();
   }
   buildCounterManagedInstanceLastAttemptErrors--;
   return o;
@@ -8107,7 +8107,7 @@
 checkManagedInstanceLastAttemptErrors(api.ManagedInstanceLastAttemptErrors o) {
   buildCounterManagedInstanceLastAttemptErrors++;
   if (buildCounterManagedInstanceLastAttemptErrors < 3) {
-    checkUnnamed2470(o.errors);
+    checkUnnamed2495(o.errors);
   }
   buildCounterManagedInstanceLastAttemptErrors--;
 }
@@ -8152,14 +8152,14 @@
   buildCounterMetadataItems--;
 }
 
-buildUnnamed2471() {
+buildUnnamed2496() {
   var o = new core.List<api.MetadataItems>();
   o.add(buildMetadataItems());
   o.add(buildMetadataItems());
   return o;
 }
 
-checkUnnamed2471(core.List<api.MetadataItems> o) {
+checkUnnamed2496(core.List<api.MetadataItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataItems(o[0]);
   checkMetadataItems(o[1]);
@@ -8171,7 +8171,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     o.fingerprint = "foo";
-    o.items = buildUnnamed2471();
+    o.items = buildUnnamed2496();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -8182,7 +8182,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2471(o.items);
+    checkUnnamed2496(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -8209,27 +8209,27 @@
   buildCounterNamedPort--;
 }
 
-buildUnnamed2472() {
+buildUnnamed2497() {
   var o = new core.List<api.NetworkPeering>();
   o.add(buildNetworkPeering());
   o.add(buildNetworkPeering());
   return o;
 }
 
-checkUnnamed2472(core.List<api.NetworkPeering> o) {
+checkUnnamed2497(core.List<api.NetworkPeering> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkPeering(o[0]);
   checkNetworkPeering(o[1]);
 }
 
-buildUnnamed2473() {
+buildUnnamed2498() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2473(core.List<core.String> o) {
+checkUnnamed2498(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -8248,10 +8248,10 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.peerings = buildUnnamed2472();
+    o.peerings = buildUnnamed2497();
     o.routingConfig = buildNetworkRoutingConfig();
     o.selfLink = "foo";
-    o.subnetworks = buildUnnamed2473();
+    o.subnetworks = buildUnnamed2498();
   }
   buildCounterNetwork--;
   return o;
@@ -8268,35 +8268,35 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2472(o.peerings);
+    checkUnnamed2497(o.peerings);
     checkNetworkRoutingConfig(o.routingConfig);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2473(o.subnetworks);
+    checkUnnamed2498(o.subnetworks);
   }
   buildCounterNetwork--;
 }
 
-buildUnnamed2474() {
+buildUnnamed2499() {
   var o = new core.List<api.AccessConfig>();
   o.add(buildAccessConfig());
   o.add(buildAccessConfig());
   return o;
 }
 
-checkUnnamed2474(core.List<api.AccessConfig> o) {
+checkUnnamed2499(core.List<api.AccessConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccessConfig(o[0]);
   checkAccessConfig(o[1]);
 }
 
-buildUnnamed2475() {
+buildUnnamed2500() {
   var o = new core.List<api.AliasIpRange>();
   o.add(buildAliasIpRange());
   o.add(buildAliasIpRange());
   return o;
 }
 
-checkUnnamed2475(core.List<api.AliasIpRange> o) {
+checkUnnamed2500(core.List<api.AliasIpRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAliasIpRange(o[0]);
   checkAliasIpRange(o[1]);
@@ -8307,8 +8307,8 @@
   var o = new api.NetworkInterface();
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    o.accessConfigs = buildUnnamed2474();
-    o.aliasIpRanges = buildUnnamed2475();
+    o.accessConfigs = buildUnnamed2499();
+    o.aliasIpRanges = buildUnnamed2500();
     o.kind = "foo";
     o.name = "foo";
     o.network = "foo";
@@ -8322,8 +8322,8 @@
 checkNetworkInterface(api.NetworkInterface o) {
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    checkUnnamed2474(o.accessConfigs);
-    checkUnnamed2475(o.aliasIpRanges);
+    checkUnnamed2499(o.accessConfigs);
+    checkUnnamed2500(o.aliasIpRanges);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
@@ -8333,14 +8333,14 @@
   buildCounterNetworkInterface--;
 }
 
-buildUnnamed2476() {
+buildUnnamed2501() {
   var o = new core.List<api.Network>();
   o.add(buildNetwork());
   o.add(buildNetwork());
   return o;
 }
 
-checkUnnamed2476(core.List<api.Network> o) {
+checkUnnamed2501(core.List<api.Network> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetwork(o[0]);
   checkNetwork(o[1]);
@@ -8367,14 +8367,14 @@
   buildCounterNetworkListWarningData--;
 }
 
-buildUnnamed2477() {
+buildUnnamed2502() {
   var o = new core.List<api.NetworkListWarningData>();
   o.add(buildNetworkListWarningData());
   o.add(buildNetworkListWarningData());
   return o;
 }
 
-checkUnnamed2477(core.List<api.NetworkListWarningData> o) {
+checkUnnamed2502(core.List<api.NetworkListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkListWarningData(o[0]);
   checkNetworkListWarningData(o[1]);
@@ -8386,7 +8386,7 @@
   buildCounterNetworkListWarning++;
   if (buildCounterNetworkListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2477();
+    o.data = buildUnnamed2502();
     o.message = "foo";
   }
   buildCounterNetworkListWarning--;
@@ -8397,7 +8397,7 @@
   buildCounterNetworkListWarning++;
   if (buildCounterNetworkListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2477(o.data);
+    checkUnnamed2502(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterNetworkListWarning--;
@@ -8409,7 +8409,7 @@
   buildCounterNetworkList++;
   if (buildCounterNetworkList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2476();
+    o.items = buildUnnamed2501();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -8423,7 +8423,7 @@
   buildCounterNetworkList++;
   if (buildCounterNetworkList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2476(o.items);
+    checkUnnamed2501(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -8543,14 +8543,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed2478() {
+buildUnnamed2503() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed2478(core.List<api.OperationErrorErrors> o) {
+checkUnnamed2503(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -8561,7 +8561,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed2478();
+    o.errors = buildUnnamed2503();
   }
   buildCounterOperationError--;
   return o;
@@ -8570,7 +8570,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed2478(o.errors);
+    checkUnnamed2503(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -8596,14 +8596,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed2479() {
+buildUnnamed2504() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed2479(core.List<api.OperationWarningsData> o) {
+checkUnnamed2504(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -8615,7 +8615,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2479();
+    o.data = buildUnnamed2504();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -8626,20 +8626,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2479(o.data);
+    checkUnnamed2504(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed2480() {
+buildUnnamed2505() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed2480(core.List<api.OperationWarnings> o) {
+checkUnnamed2505(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -8671,7 +8671,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed2480();
+    o.warnings = buildUnnamed2505();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -8702,20 +8702,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed2480(o.warnings);
+    checkUnnamed2505(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed2481() {
+buildUnnamed2506() {
   var o = new core.Map<core.String, api.OperationsScopedList>();
   o["x"] = buildOperationsScopedList();
   o["y"] = buildOperationsScopedList();
   return o;
 }
 
-checkUnnamed2481(core.Map<core.String, api.OperationsScopedList> o) {
+checkUnnamed2506(core.Map<core.String, api.OperationsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationsScopedList(o["x"]);
   checkOperationsScopedList(o["y"]);
@@ -8743,14 +8743,14 @@
   buildCounterOperationAggregatedListWarningData--;
 }
 
-buildUnnamed2482() {
+buildUnnamed2507() {
   var o = new core.List<api.OperationAggregatedListWarningData>();
   o.add(buildOperationAggregatedListWarningData());
   o.add(buildOperationAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2482(core.List<api.OperationAggregatedListWarningData> o) {
+checkUnnamed2507(core.List<api.OperationAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationAggregatedListWarningData(o[0]);
   checkOperationAggregatedListWarningData(o[1]);
@@ -8762,7 +8762,7 @@
   buildCounterOperationAggregatedListWarning++;
   if (buildCounterOperationAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2482();
+    o.data = buildUnnamed2507();
     o.message = "foo";
   }
   buildCounterOperationAggregatedListWarning--;
@@ -8773,7 +8773,7 @@
   buildCounterOperationAggregatedListWarning++;
   if (buildCounterOperationAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2482(o.data);
+    checkUnnamed2507(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationAggregatedListWarning--;
@@ -8785,7 +8785,7 @@
   buildCounterOperationAggregatedList++;
   if (buildCounterOperationAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2481();
+    o.items = buildUnnamed2506();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -8799,7 +8799,7 @@
   buildCounterOperationAggregatedList++;
   if (buildCounterOperationAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2481(o.items);
+    checkUnnamed2506(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -8808,14 +8808,14 @@
   buildCounterOperationAggregatedList--;
 }
 
-buildUnnamed2483() {
+buildUnnamed2508() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed2483(core.List<api.Operation> o) {
+checkUnnamed2508(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -8842,14 +8842,14 @@
   buildCounterOperationListWarningData--;
 }
 
-buildUnnamed2484() {
+buildUnnamed2509() {
   var o = new core.List<api.OperationListWarningData>();
   o.add(buildOperationListWarningData());
   o.add(buildOperationListWarningData());
   return o;
 }
 
-checkUnnamed2484(core.List<api.OperationListWarningData> o) {
+checkUnnamed2509(core.List<api.OperationListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationListWarningData(o[0]);
   checkOperationListWarningData(o[1]);
@@ -8861,7 +8861,7 @@
   buildCounterOperationListWarning++;
   if (buildCounterOperationListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2484();
+    o.data = buildUnnamed2509();
     o.message = "foo";
   }
   buildCounterOperationListWarning--;
@@ -8872,7 +8872,7 @@
   buildCounterOperationListWarning++;
   if (buildCounterOperationListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2484(o.data);
+    checkUnnamed2509(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationListWarning--;
@@ -8884,7 +8884,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2483();
+    o.items = buildUnnamed2508();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -8898,7 +8898,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2483(o.items);
+    checkUnnamed2508(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -8907,14 +8907,14 @@
   buildCounterOperationList--;
 }
 
-buildUnnamed2485() {
+buildUnnamed2510() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed2485(core.List<api.Operation> o) {
+checkUnnamed2510(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -8941,14 +8941,14 @@
   buildCounterOperationsScopedListWarningData--;
 }
 
-buildUnnamed2486() {
+buildUnnamed2511() {
   var o = new core.List<api.OperationsScopedListWarningData>();
   o.add(buildOperationsScopedListWarningData());
   o.add(buildOperationsScopedListWarningData());
   return o;
 }
 
-checkUnnamed2486(core.List<api.OperationsScopedListWarningData> o) {
+checkUnnamed2511(core.List<api.OperationsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationsScopedListWarningData(o[0]);
   checkOperationsScopedListWarningData(o[1]);
@@ -8960,7 +8960,7 @@
   buildCounterOperationsScopedListWarning++;
   if (buildCounterOperationsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2486();
+    o.data = buildUnnamed2511();
     o.message = "foo";
   }
   buildCounterOperationsScopedListWarning--;
@@ -8971,7 +8971,7 @@
   buildCounterOperationsScopedListWarning++;
   if (buildCounterOperationsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2486(o.data);
+    checkUnnamed2511(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationsScopedListWarning--;
@@ -8982,7 +8982,7 @@
   var o = new api.OperationsScopedList();
   buildCounterOperationsScopedList++;
   if (buildCounterOperationsScopedList < 3) {
-    o.operations = buildUnnamed2485();
+    o.operations = buildUnnamed2510();
     o.warning = buildOperationsScopedListWarning();
   }
   buildCounterOperationsScopedList--;
@@ -8992,20 +8992,20 @@
 checkOperationsScopedList(api.OperationsScopedList o) {
   buildCounterOperationsScopedList++;
   if (buildCounterOperationsScopedList < 3) {
-    checkUnnamed2485(o.operations);
+    checkUnnamed2510(o.operations);
     checkOperationsScopedListWarning(o.warning);
   }
   buildCounterOperationsScopedList--;
 }
 
-buildUnnamed2487() {
+buildUnnamed2512() {
   var o = new core.List<api.PathRule>();
   o.add(buildPathRule());
   o.add(buildPathRule());
   return o;
 }
 
-checkUnnamed2487(core.List<api.PathRule> o) {
+checkUnnamed2512(core.List<api.PathRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathRule(o[0]);
   checkPathRule(o[1]);
@@ -9019,7 +9019,7 @@
     o.defaultService = "foo";
     o.description = "foo";
     o.name = "foo";
-    o.pathRules = buildUnnamed2487();
+    o.pathRules = buildUnnamed2512();
   }
   buildCounterPathMatcher--;
   return o;
@@ -9031,19 +9031,19 @@
     unittest.expect(o.defaultService, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2487(o.pathRules);
+    checkUnnamed2512(o.pathRules);
   }
   buildCounterPathMatcher--;
 }
 
-buildUnnamed2488() {
+buildUnnamed2513() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2488(core.List<core.String> o) {
+checkUnnamed2513(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -9054,7 +9054,7 @@
   var o = new api.PathRule();
   buildCounterPathRule++;
   if (buildCounterPathRule < 3) {
-    o.paths = buildUnnamed2488();
+    o.paths = buildUnnamed2513();
     o.service = "foo";
   }
   buildCounterPathRule--;
@@ -9064,33 +9064,33 @@
 checkPathRule(api.PathRule o) {
   buildCounterPathRule++;
   if (buildCounterPathRule < 3) {
-    checkUnnamed2488(o.paths);
+    checkUnnamed2513(o.paths);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterPathRule--;
 }
 
-buildUnnamed2489() {
+buildUnnamed2514() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2489(core.List<core.String> o) {
+checkUnnamed2514(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2490() {
+buildUnnamed2515() {
   var o = new core.List<api.Quota>();
   o.add(buildQuota());
   o.add(buildQuota());
   return o;
 }
 
-checkUnnamed2490(core.List<api.Quota> o) {
+checkUnnamed2515(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuota(o[0]);
   checkQuota(o[1]);
@@ -9105,11 +9105,11 @@
     o.creationTimestamp = "foo";
     o.defaultServiceAccount = "foo";
     o.description = "foo";
-    o.enabledFeatures = buildUnnamed2489();
+    o.enabledFeatures = buildUnnamed2514();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.quotas = buildUnnamed2490();
+    o.quotas = buildUnnamed2515();
     o.selfLink = "foo";
     o.usageExportLocation = buildUsageExportLocation();
     o.xpnProjectStatus = "foo";
@@ -9125,11 +9125,11 @@
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.defaultServiceAccount, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2489(o.enabledFeatures);
+    checkUnnamed2514(o.enabledFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2490(o.quotas);
+    checkUnnamed2515(o.quotas);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUsageExportLocation(o.usageExportLocation);
     unittest.expect(o.xpnProjectStatus, unittest.equals('foo'));
@@ -9176,14 +9176,14 @@
   buildCounterProjectsEnableXpnResourceRequest--;
 }
 
-buildUnnamed2491() {
+buildUnnamed2516() {
   var o = new core.List<api.XpnResourceId>();
   o.add(buildXpnResourceId());
   o.add(buildXpnResourceId());
   return o;
 }
 
-checkUnnamed2491(core.List<api.XpnResourceId> o) {
+checkUnnamed2516(core.List<api.XpnResourceId> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkXpnResourceId(o[0]);
   checkXpnResourceId(o[1]);
@@ -9196,7 +9196,7 @@
   if (buildCounterProjectsGetXpnResources < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed2491();
+    o.resources = buildUnnamed2516();
   }
   buildCounterProjectsGetXpnResources--;
   return o;
@@ -9207,7 +9207,7 @@
   if (buildCounterProjectsGetXpnResources < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2491(o.resources);
+    checkUnnamed2516(o.resources);
   }
   buildCounterProjectsGetXpnResources--;
 }
@@ -9254,27 +9254,27 @@
   buildCounterQuota--;
 }
 
-buildUnnamed2492() {
+buildUnnamed2517() {
   var o = new core.List<api.Quota>();
   o.add(buildQuota());
   o.add(buildQuota());
   return o;
 }
 
-checkUnnamed2492(core.List<api.Quota> o) {
+checkUnnamed2517(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuota(o[0]);
   checkQuota(o[1]);
 }
 
-buildUnnamed2493() {
+buildUnnamed2518() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2493(core.List<core.String> o) {
+checkUnnamed2518(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -9291,10 +9291,10 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.quotas = buildUnnamed2492();
+    o.quotas = buildUnnamed2517();
     o.selfLink = "foo";
     o.status = "foo";
-    o.zones = buildUnnamed2493();
+    o.zones = buildUnnamed2518();
   }
   buildCounterRegion--;
   return o;
@@ -9309,22 +9309,22 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2492(o.quotas);
+    checkUnnamed2517(o.quotas);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed2493(o.zones);
+    checkUnnamed2518(o.zones);
   }
   buildCounterRegion--;
 }
 
-buildUnnamed2494() {
+buildUnnamed2519() {
   var o = new core.List<api.Autoscaler>();
   o.add(buildAutoscaler());
   o.add(buildAutoscaler());
   return o;
 }
 
-checkUnnamed2494(core.List<api.Autoscaler> o) {
+checkUnnamed2519(core.List<api.Autoscaler> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscaler(o[0]);
   checkAutoscaler(o[1]);
@@ -9351,14 +9351,14 @@
   buildCounterRegionAutoscalerListWarningData--;
 }
 
-buildUnnamed2495() {
+buildUnnamed2520() {
   var o = new core.List<api.RegionAutoscalerListWarningData>();
   o.add(buildRegionAutoscalerListWarningData());
   o.add(buildRegionAutoscalerListWarningData());
   return o;
 }
 
-checkUnnamed2495(core.List<api.RegionAutoscalerListWarningData> o) {
+checkUnnamed2520(core.List<api.RegionAutoscalerListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegionAutoscalerListWarningData(o[0]);
   checkRegionAutoscalerListWarningData(o[1]);
@@ -9370,7 +9370,7 @@
   buildCounterRegionAutoscalerListWarning++;
   if (buildCounterRegionAutoscalerListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2495();
+    o.data = buildUnnamed2520();
     o.message = "foo";
   }
   buildCounterRegionAutoscalerListWarning--;
@@ -9381,7 +9381,7 @@
   buildCounterRegionAutoscalerListWarning++;
   if (buildCounterRegionAutoscalerListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2495(o.data);
+    checkUnnamed2520(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRegionAutoscalerListWarning--;
@@ -9393,7 +9393,7 @@
   buildCounterRegionAutoscalerList++;
   if (buildCounterRegionAutoscalerList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2494();
+    o.items = buildUnnamed2519();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -9407,7 +9407,7 @@
   buildCounterRegionAutoscalerList++;
   if (buildCounterRegionAutoscalerList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2494(o.items);
+    checkUnnamed2519(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -9416,14 +9416,14 @@
   buildCounterRegionAutoscalerList--;
 }
 
-buildUnnamed2496() {
+buildUnnamed2521() {
   var o = new core.List<api.InstanceGroup>();
   o.add(buildInstanceGroup());
   o.add(buildInstanceGroup());
   return o;
 }
 
-checkUnnamed2496(core.List<api.InstanceGroup> o) {
+checkUnnamed2521(core.List<api.InstanceGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroup(o[0]);
   checkInstanceGroup(o[1]);
@@ -9451,14 +9451,14 @@
   buildCounterRegionInstanceGroupListWarningData--;
 }
 
-buildUnnamed2497() {
+buildUnnamed2522() {
   var o = new core.List<api.RegionInstanceGroupListWarningData>();
   o.add(buildRegionInstanceGroupListWarningData());
   o.add(buildRegionInstanceGroupListWarningData());
   return o;
 }
 
-checkUnnamed2497(core.List<api.RegionInstanceGroupListWarningData> o) {
+checkUnnamed2522(core.List<api.RegionInstanceGroupListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegionInstanceGroupListWarningData(o[0]);
   checkRegionInstanceGroupListWarningData(o[1]);
@@ -9470,7 +9470,7 @@
   buildCounterRegionInstanceGroupListWarning++;
   if (buildCounterRegionInstanceGroupListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2497();
+    o.data = buildUnnamed2522();
     o.message = "foo";
   }
   buildCounterRegionInstanceGroupListWarning--;
@@ -9481,7 +9481,7 @@
   buildCounterRegionInstanceGroupListWarning++;
   if (buildCounterRegionInstanceGroupListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2497(o.data);
+    checkUnnamed2522(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRegionInstanceGroupListWarning--;
@@ -9493,7 +9493,7 @@
   buildCounterRegionInstanceGroupList++;
   if (buildCounterRegionInstanceGroupList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2496();
+    o.items = buildUnnamed2521();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -9507,7 +9507,7 @@
   buildCounterRegionInstanceGroupList++;
   if (buildCounterRegionInstanceGroupList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2496(o.items);
+    checkUnnamed2521(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -9516,14 +9516,14 @@
   buildCounterRegionInstanceGroupList--;
 }
 
-buildUnnamed2498() {
+buildUnnamed2523() {
   var o = new core.List<api.InstanceGroupManager>();
   o.add(buildInstanceGroupManager());
   o.add(buildInstanceGroupManager());
   return o;
 }
 
-checkUnnamed2498(core.List<api.InstanceGroupManager> o) {
+checkUnnamed2523(core.List<api.InstanceGroupManager> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupManager(o[0]);
   checkInstanceGroupManager(o[1]);
@@ -9551,14 +9551,14 @@
   buildCounterRegionInstanceGroupManagerListWarningData--;
 }
 
-buildUnnamed2499() {
+buildUnnamed2524() {
   var o = new core.List<api.RegionInstanceGroupManagerListWarningData>();
   o.add(buildRegionInstanceGroupManagerListWarningData());
   o.add(buildRegionInstanceGroupManagerListWarningData());
   return o;
 }
 
-checkUnnamed2499(core.List<api.RegionInstanceGroupManagerListWarningData> o) {
+checkUnnamed2524(core.List<api.RegionInstanceGroupManagerListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegionInstanceGroupManagerListWarningData(o[0]);
   checkRegionInstanceGroupManagerListWarningData(o[1]);
@@ -9570,7 +9570,7 @@
   buildCounterRegionInstanceGroupManagerListWarning++;
   if (buildCounterRegionInstanceGroupManagerListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2499();
+    o.data = buildUnnamed2524();
     o.message = "foo";
   }
   buildCounterRegionInstanceGroupManagerListWarning--;
@@ -9582,7 +9582,7 @@
   buildCounterRegionInstanceGroupManagerListWarning++;
   if (buildCounterRegionInstanceGroupManagerListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2499(o.data);
+    checkUnnamed2524(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRegionInstanceGroupManagerListWarning--;
@@ -9594,7 +9594,7 @@
   buildCounterRegionInstanceGroupManagerList++;
   if (buildCounterRegionInstanceGroupManagerList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2498();
+    o.items = buildUnnamed2523();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -9608,7 +9608,7 @@
   buildCounterRegionInstanceGroupManagerList++;
   if (buildCounterRegionInstanceGroupManagerList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2498(o.items);
+    checkUnnamed2523(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -9617,14 +9617,14 @@
   buildCounterRegionInstanceGroupManagerList--;
 }
 
-buildUnnamed2500() {
+buildUnnamed2525() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2500(core.List<core.String> o) {
+checkUnnamed2525(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -9635,7 +9635,7 @@
   var o = new api.RegionInstanceGroupManagersAbandonInstancesRequest();
   buildCounterRegionInstanceGroupManagersAbandonInstancesRequest++;
   if (buildCounterRegionInstanceGroupManagersAbandonInstancesRequest < 3) {
-    o.instances = buildUnnamed2500();
+    o.instances = buildUnnamed2525();
   }
   buildCounterRegionInstanceGroupManagersAbandonInstancesRequest--;
   return o;
@@ -9645,19 +9645,19 @@
     api.RegionInstanceGroupManagersAbandonInstancesRequest o) {
   buildCounterRegionInstanceGroupManagersAbandonInstancesRequest++;
   if (buildCounterRegionInstanceGroupManagersAbandonInstancesRequest < 3) {
-    checkUnnamed2500(o.instances);
+    checkUnnamed2525(o.instances);
   }
   buildCounterRegionInstanceGroupManagersAbandonInstancesRequest--;
 }
 
-buildUnnamed2501() {
+buildUnnamed2526() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2501(core.List<core.String> o) {
+checkUnnamed2526(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -9668,7 +9668,7 @@
   var o = new api.RegionInstanceGroupManagersDeleteInstancesRequest();
   buildCounterRegionInstanceGroupManagersDeleteInstancesRequest++;
   if (buildCounterRegionInstanceGroupManagersDeleteInstancesRequest < 3) {
-    o.instances = buildUnnamed2501();
+    o.instances = buildUnnamed2526();
   }
   buildCounterRegionInstanceGroupManagersDeleteInstancesRequest--;
   return o;
@@ -9678,19 +9678,19 @@
     api.RegionInstanceGroupManagersDeleteInstancesRequest o) {
   buildCounterRegionInstanceGroupManagersDeleteInstancesRequest++;
   if (buildCounterRegionInstanceGroupManagersDeleteInstancesRequest < 3) {
-    checkUnnamed2501(o.instances);
+    checkUnnamed2526(o.instances);
   }
   buildCounterRegionInstanceGroupManagersDeleteInstancesRequest--;
 }
 
-buildUnnamed2502() {
+buildUnnamed2527() {
   var o = new core.List<api.ManagedInstance>();
   o.add(buildManagedInstance());
   o.add(buildManagedInstance());
   return o;
 }
 
-checkUnnamed2502(core.List<api.ManagedInstance> o) {
+checkUnnamed2527(core.List<api.ManagedInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedInstance(o[0]);
   checkManagedInstance(o[1]);
@@ -9701,7 +9701,7 @@
   var o = new api.RegionInstanceGroupManagersListInstancesResponse();
   buildCounterRegionInstanceGroupManagersListInstancesResponse++;
   if (buildCounterRegionInstanceGroupManagersListInstancesResponse < 3) {
-    o.managedInstances = buildUnnamed2502();
+    o.managedInstances = buildUnnamed2527();
   }
   buildCounterRegionInstanceGroupManagersListInstancesResponse--;
   return o;
@@ -9711,19 +9711,19 @@
     api.RegionInstanceGroupManagersListInstancesResponse o) {
   buildCounterRegionInstanceGroupManagersListInstancesResponse++;
   if (buildCounterRegionInstanceGroupManagersListInstancesResponse < 3) {
-    checkUnnamed2502(o.managedInstances);
+    checkUnnamed2527(o.managedInstances);
   }
   buildCounterRegionInstanceGroupManagersListInstancesResponse--;
 }
 
-buildUnnamed2503() {
+buildUnnamed2528() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2503(core.List<core.String> o) {
+checkUnnamed2528(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -9734,7 +9734,7 @@
   var o = new api.RegionInstanceGroupManagersRecreateRequest();
   buildCounterRegionInstanceGroupManagersRecreateRequest++;
   if (buildCounterRegionInstanceGroupManagersRecreateRequest < 3) {
-    o.instances = buildUnnamed2503();
+    o.instances = buildUnnamed2528();
   }
   buildCounterRegionInstanceGroupManagersRecreateRequest--;
   return o;
@@ -9744,19 +9744,19 @@
     api.RegionInstanceGroupManagersRecreateRequest o) {
   buildCounterRegionInstanceGroupManagersRecreateRequest++;
   if (buildCounterRegionInstanceGroupManagersRecreateRequest < 3) {
-    checkUnnamed2503(o.instances);
+    checkUnnamed2528(o.instances);
   }
   buildCounterRegionInstanceGroupManagersRecreateRequest--;
 }
 
-buildUnnamed2504() {
+buildUnnamed2529() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2504(core.List<core.String> o) {
+checkUnnamed2529(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -9768,7 +9768,7 @@
   buildCounterRegionInstanceGroupManagersSetTargetPoolsRequest++;
   if (buildCounterRegionInstanceGroupManagersSetTargetPoolsRequest < 3) {
     o.fingerprint = "foo";
-    o.targetPools = buildUnnamed2504();
+    o.targetPools = buildUnnamed2529();
   }
   buildCounterRegionInstanceGroupManagersSetTargetPoolsRequest--;
   return o;
@@ -9779,7 +9779,7 @@
   buildCounterRegionInstanceGroupManagersSetTargetPoolsRequest++;
   if (buildCounterRegionInstanceGroupManagersSetTargetPoolsRequest < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2504(o.targetPools);
+    checkUnnamed2529(o.targetPools);
   }
   buildCounterRegionInstanceGroupManagersSetTargetPoolsRequest--;
 }
@@ -9804,14 +9804,14 @@
   buildCounterRegionInstanceGroupManagersSetTemplateRequest--;
 }
 
-buildUnnamed2505() {
+buildUnnamed2530() {
   var o = new core.List<api.InstanceWithNamedPorts>();
   o.add(buildInstanceWithNamedPorts());
   o.add(buildInstanceWithNamedPorts());
   return o;
 }
 
-checkUnnamed2505(core.List<api.InstanceWithNamedPorts> o) {
+checkUnnamed2530(core.List<api.InstanceWithNamedPorts> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceWithNamedPorts(o[0]);
   checkInstanceWithNamedPorts(o[1]);
@@ -9839,14 +9839,14 @@
   buildCounterRegionInstanceGroupsListInstancesWarningData--;
 }
 
-buildUnnamed2506() {
+buildUnnamed2531() {
   var o = new core.List<api.RegionInstanceGroupsListInstancesWarningData>();
   o.add(buildRegionInstanceGroupsListInstancesWarningData());
   o.add(buildRegionInstanceGroupsListInstancesWarningData());
   return o;
 }
 
-checkUnnamed2506(
+checkUnnamed2531(
     core.List<api.RegionInstanceGroupsListInstancesWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegionInstanceGroupsListInstancesWarningData(o[0]);
@@ -9859,7 +9859,7 @@
   buildCounterRegionInstanceGroupsListInstancesWarning++;
   if (buildCounterRegionInstanceGroupsListInstancesWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2506();
+    o.data = buildUnnamed2531();
     o.message = "foo";
   }
   buildCounterRegionInstanceGroupsListInstancesWarning--;
@@ -9871,7 +9871,7 @@
   buildCounterRegionInstanceGroupsListInstancesWarning++;
   if (buildCounterRegionInstanceGroupsListInstancesWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2506(o.data);
+    checkUnnamed2531(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRegionInstanceGroupsListInstancesWarning--;
@@ -9883,7 +9883,7 @@
   buildCounterRegionInstanceGroupsListInstances++;
   if (buildCounterRegionInstanceGroupsListInstances < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2505();
+    o.items = buildUnnamed2530();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -9898,7 +9898,7 @@
   buildCounterRegionInstanceGroupsListInstances++;
   if (buildCounterRegionInstanceGroupsListInstances < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2505(o.items);
+    checkUnnamed2530(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -9929,14 +9929,14 @@
   buildCounterRegionInstanceGroupsListInstancesRequest--;
 }
 
-buildUnnamed2507() {
+buildUnnamed2532() {
   var o = new core.List<api.NamedPort>();
   o.add(buildNamedPort());
   o.add(buildNamedPort());
   return o;
 }
 
-checkUnnamed2507(core.List<api.NamedPort> o) {
+checkUnnamed2532(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNamedPort(o[0]);
   checkNamedPort(o[1]);
@@ -9948,7 +9948,7 @@
   buildCounterRegionInstanceGroupsSetNamedPortsRequest++;
   if (buildCounterRegionInstanceGroupsSetNamedPortsRequest < 3) {
     o.fingerprint = "foo";
-    o.namedPorts = buildUnnamed2507();
+    o.namedPorts = buildUnnamed2532();
   }
   buildCounterRegionInstanceGroupsSetNamedPortsRequest--;
   return o;
@@ -9959,19 +9959,19 @@
   buildCounterRegionInstanceGroupsSetNamedPortsRequest++;
   if (buildCounterRegionInstanceGroupsSetNamedPortsRequest < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2507(o.namedPorts);
+    checkUnnamed2532(o.namedPorts);
   }
   buildCounterRegionInstanceGroupsSetNamedPortsRequest--;
 }
 
-buildUnnamed2508() {
+buildUnnamed2533() {
   var o = new core.List<api.Region>();
   o.add(buildRegion());
   o.add(buildRegion());
   return o;
 }
 
-checkUnnamed2508(core.List<api.Region> o) {
+checkUnnamed2533(core.List<api.Region> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegion(o[0]);
   checkRegion(o[1]);
@@ -9998,14 +9998,14 @@
   buildCounterRegionListWarningData--;
 }
 
-buildUnnamed2509() {
+buildUnnamed2534() {
   var o = new core.List<api.RegionListWarningData>();
   o.add(buildRegionListWarningData());
   o.add(buildRegionListWarningData());
   return o;
 }
 
-checkUnnamed2509(core.List<api.RegionListWarningData> o) {
+checkUnnamed2534(core.List<api.RegionListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegionListWarningData(o[0]);
   checkRegionListWarningData(o[1]);
@@ -10017,7 +10017,7 @@
   buildCounterRegionListWarning++;
   if (buildCounterRegionListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2509();
+    o.data = buildUnnamed2534();
     o.message = "foo";
   }
   buildCounterRegionListWarning--;
@@ -10028,7 +10028,7 @@
   buildCounterRegionListWarning++;
   if (buildCounterRegionListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2509(o.data);
+    checkUnnamed2534(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRegionListWarning--;
@@ -10040,7 +10040,7 @@
   buildCounterRegionList++;
   if (buildCounterRegionList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2508();
+    o.items = buildUnnamed2533();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -10054,7 +10054,7 @@
   buildCounterRegionList++;
   if (buildCounterRegionList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2508(o.items);
+    checkUnnamed2533(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -10103,14 +10103,14 @@
   buildCounterResourceGroupReference--;
 }
 
-buildUnnamed2510() {
+buildUnnamed2535() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2510(core.List<core.String> o) {
+checkUnnamed2535(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -10137,14 +10137,14 @@
   buildCounterRouteWarningsData--;
 }
 
-buildUnnamed2511() {
+buildUnnamed2536() {
   var o = new core.List<api.RouteWarningsData>();
   o.add(buildRouteWarningsData());
   o.add(buildRouteWarningsData());
   return o;
 }
 
-checkUnnamed2511(core.List<api.RouteWarningsData> o) {
+checkUnnamed2536(core.List<api.RouteWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouteWarningsData(o[0]);
   checkRouteWarningsData(o[1]);
@@ -10156,7 +10156,7 @@
   buildCounterRouteWarnings++;
   if (buildCounterRouteWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2511();
+    o.data = buildUnnamed2536();
     o.message = "foo";
   }
   buildCounterRouteWarnings--;
@@ -10167,20 +10167,20 @@
   buildCounterRouteWarnings++;
   if (buildCounterRouteWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2511(o.data);
+    checkUnnamed2536(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRouteWarnings--;
 }
 
-buildUnnamed2512() {
+buildUnnamed2537() {
   var o = new core.List<api.RouteWarnings>();
   o.add(buildRouteWarnings());
   o.add(buildRouteWarnings());
   return o;
 }
 
-checkUnnamed2512(core.List<api.RouteWarnings> o) {
+checkUnnamed2537(core.List<api.RouteWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouteWarnings(o[0]);
   checkRouteWarnings(o[1]);
@@ -10206,8 +10206,8 @@
     o.nextHopVpnTunnel = "foo";
     o.priority = 42;
     o.selfLink = "foo";
-    o.tags = buildUnnamed2510();
-    o.warnings = buildUnnamed2512();
+    o.tags = buildUnnamed2535();
+    o.warnings = buildUnnamed2537();
   }
   buildCounterRoute--;
   return o;
@@ -10231,20 +10231,20 @@
     unittest.expect(o.nextHopVpnTunnel, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2510(o.tags);
-    checkUnnamed2512(o.warnings);
+    checkUnnamed2535(o.tags);
+    checkUnnamed2537(o.warnings);
   }
   buildCounterRoute--;
 }
 
-buildUnnamed2513() {
+buildUnnamed2538() {
   var o = new core.List<api.Route>();
   o.add(buildRoute());
   o.add(buildRoute());
   return o;
 }
 
-checkUnnamed2513(core.List<api.Route> o) {
+checkUnnamed2538(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoute(o[0]);
   checkRoute(o[1]);
@@ -10271,14 +10271,14 @@
   buildCounterRouteListWarningData--;
 }
 
-buildUnnamed2514() {
+buildUnnamed2539() {
   var o = new core.List<api.RouteListWarningData>();
   o.add(buildRouteListWarningData());
   o.add(buildRouteListWarningData());
   return o;
 }
 
-checkUnnamed2514(core.List<api.RouteListWarningData> o) {
+checkUnnamed2539(core.List<api.RouteListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouteListWarningData(o[0]);
   checkRouteListWarningData(o[1]);
@@ -10290,7 +10290,7 @@
   buildCounterRouteListWarning++;
   if (buildCounterRouteListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2514();
+    o.data = buildUnnamed2539();
     o.message = "foo";
   }
   buildCounterRouteListWarning--;
@@ -10301,7 +10301,7 @@
   buildCounterRouteListWarning++;
   if (buildCounterRouteListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2514(o.data);
+    checkUnnamed2539(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRouteListWarning--;
@@ -10313,7 +10313,7 @@
   buildCounterRouteList++;
   if (buildCounterRouteList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2513();
+    o.items = buildUnnamed2538();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -10327,7 +10327,7 @@
   buildCounterRouteList++;
   if (buildCounterRouteList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2513(o.items);
+    checkUnnamed2538(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -10336,27 +10336,27 @@
   buildCounterRouteList--;
 }
 
-buildUnnamed2515() {
+buildUnnamed2540() {
   var o = new core.List<api.RouterBgpPeer>();
   o.add(buildRouterBgpPeer());
   o.add(buildRouterBgpPeer());
   return o;
 }
 
-checkUnnamed2515(core.List<api.RouterBgpPeer> o) {
+checkUnnamed2540(core.List<api.RouterBgpPeer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouterBgpPeer(o[0]);
   checkRouterBgpPeer(o[1]);
 }
 
-buildUnnamed2516() {
+buildUnnamed2541() {
   var o = new core.List<api.RouterInterface>();
   o.add(buildRouterInterface());
   o.add(buildRouterInterface());
   return o;
 }
 
-checkUnnamed2516(core.List<api.RouterInterface> o) {
+checkUnnamed2541(core.List<api.RouterInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouterInterface(o[0]);
   checkRouterInterface(o[1]);
@@ -10368,11 +10368,11 @@
   buildCounterRouter++;
   if (buildCounterRouter < 3) {
     o.bgp = buildRouterBgp();
-    o.bgpPeers = buildUnnamed2515();
+    o.bgpPeers = buildUnnamed2540();
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.id = "foo";
-    o.interfaces = buildUnnamed2516();
+    o.interfaces = buildUnnamed2541();
     o.kind = "foo";
     o.name = "foo";
     o.network = "foo";
@@ -10387,11 +10387,11 @@
   buildCounterRouter++;
   if (buildCounterRouter < 3) {
     checkRouterBgp(o.bgp);
-    checkUnnamed2515(o.bgpPeers);
+    checkUnnamed2540(o.bgpPeers);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2516(o.interfaces);
+    checkUnnamed2541(o.interfaces);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
@@ -10401,14 +10401,14 @@
   buildCounterRouter--;
 }
 
-buildUnnamed2517() {
+buildUnnamed2542() {
   var o = new core.Map<core.String, api.RoutersScopedList>();
   o["x"] = buildRoutersScopedList();
   o["y"] = buildRoutersScopedList();
   return o;
 }
 
-checkUnnamed2517(core.Map<core.String, api.RoutersScopedList> o) {
+checkUnnamed2542(core.Map<core.String, api.RoutersScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoutersScopedList(o["x"]);
   checkRoutersScopedList(o["y"]);
@@ -10435,14 +10435,14 @@
   buildCounterRouterAggregatedListWarningData--;
 }
 
-buildUnnamed2518() {
+buildUnnamed2543() {
   var o = new core.List<api.RouterAggregatedListWarningData>();
   o.add(buildRouterAggregatedListWarningData());
   o.add(buildRouterAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2518(core.List<api.RouterAggregatedListWarningData> o) {
+checkUnnamed2543(core.List<api.RouterAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouterAggregatedListWarningData(o[0]);
   checkRouterAggregatedListWarningData(o[1]);
@@ -10454,7 +10454,7 @@
   buildCounterRouterAggregatedListWarning++;
   if (buildCounterRouterAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2518();
+    o.data = buildUnnamed2543();
     o.message = "foo";
   }
   buildCounterRouterAggregatedListWarning--;
@@ -10465,7 +10465,7 @@
   buildCounterRouterAggregatedListWarning++;
   if (buildCounterRouterAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2518(o.data);
+    checkUnnamed2543(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRouterAggregatedListWarning--;
@@ -10477,7 +10477,7 @@
   buildCounterRouterAggregatedList++;
   if (buildCounterRouterAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2517();
+    o.items = buildUnnamed2542();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -10491,7 +10491,7 @@
   buildCounterRouterAggregatedList++;
   if (buildCounterRouterAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2517(o.items);
+    checkUnnamed2542(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -10573,14 +10573,14 @@
   buildCounterRouterInterface--;
 }
 
-buildUnnamed2519() {
+buildUnnamed2544() {
   var o = new core.List<api.Router>();
   o.add(buildRouter());
   o.add(buildRouter());
   return o;
 }
 
-checkUnnamed2519(core.List<api.Router> o) {
+checkUnnamed2544(core.List<api.Router> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouter(o[0]);
   checkRouter(o[1]);
@@ -10607,14 +10607,14 @@
   buildCounterRouterListWarningData--;
 }
 
-buildUnnamed2520() {
+buildUnnamed2545() {
   var o = new core.List<api.RouterListWarningData>();
   o.add(buildRouterListWarningData());
   o.add(buildRouterListWarningData());
   return o;
 }
 
-checkUnnamed2520(core.List<api.RouterListWarningData> o) {
+checkUnnamed2545(core.List<api.RouterListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouterListWarningData(o[0]);
   checkRouterListWarningData(o[1]);
@@ -10626,7 +10626,7 @@
   buildCounterRouterListWarning++;
   if (buildCounterRouterListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2520();
+    o.data = buildUnnamed2545();
     o.message = "foo";
   }
   buildCounterRouterListWarning--;
@@ -10637,7 +10637,7 @@
   buildCounterRouterListWarning++;
   if (buildCounterRouterListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2520(o.data);
+    checkUnnamed2545(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRouterListWarning--;
@@ -10649,7 +10649,7 @@
   buildCounterRouterList++;
   if (buildCounterRouterList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2519();
+    o.items = buildUnnamed2544();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -10663,7 +10663,7 @@
   buildCounterRouterList++;
   if (buildCounterRouterList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2519(o.items);
+    checkUnnamed2544(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -10672,40 +10672,40 @@
   buildCounterRouterList--;
 }
 
-buildUnnamed2521() {
+buildUnnamed2546() {
   var o = new core.List<api.Route>();
   o.add(buildRoute());
   o.add(buildRoute());
   return o;
 }
 
-checkUnnamed2521(core.List<api.Route> o) {
+checkUnnamed2546(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoute(o[0]);
   checkRoute(o[1]);
 }
 
-buildUnnamed2522() {
+buildUnnamed2547() {
   var o = new core.List<api.Route>();
   o.add(buildRoute());
   o.add(buildRoute());
   return o;
 }
 
-checkUnnamed2522(core.List<api.Route> o) {
+checkUnnamed2547(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoute(o[0]);
   checkRoute(o[1]);
 }
 
-buildUnnamed2523() {
+buildUnnamed2548() {
   var o = new core.List<api.RouterStatusBgpPeerStatus>();
   o.add(buildRouterStatusBgpPeerStatus());
   o.add(buildRouterStatusBgpPeerStatus());
   return o;
 }
 
-checkUnnamed2523(core.List<api.RouterStatusBgpPeerStatus> o) {
+checkUnnamed2548(core.List<api.RouterStatusBgpPeerStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouterStatusBgpPeerStatus(o[0]);
   checkRouterStatusBgpPeerStatus(o[1]);
@@ -10716,9 +10716,9 @@
   var o = new api.RouterStatus();
   buildCounterRouterStatus++;
   if (buildCounterRouterStatus < 3) {
-    o.bestRoutes = buildUnnamed2521();
-    o.bestRoutesForRouter = buildUnnamed2522();
-    o.bgpPeerStatus = buildUnnamed2523();
+    o.bestRoutes = buildUnnamed2546();
+    o.bestRoutesForRouter = buildUnnamed2547();
+    o.bgpPeerStatus = buildUnnamed2548();
     o.network = "foo";
   }
   buildCounterRouterStatus--;
@@ -10728,22 +10728,22 @@
 checkRouterStatus(api.RouterStatus o) {
   buildCounterRouterStatus++;
   if (buildCounterRouterStatus < 3) {
-    checkUnnamed2521(o.bestRoutes);
-    checkUnnamed2522(o.bestRoutesForRouter);
-    checkUnnamed2523(o.bgpPeerStatus);
+    checkUnnamed2546(o.bestRoutes);
+    checkUnnamed2547(o.bestRoutesForRouter);
+    checkUnnamed2548(o.bgpPeerStatus);
     unittest.expect(o.network, unittest.equals('foo'));
   }
   buildCounterRouterStatus--;
 }
 
-buildUnnamed2524() {
+buildUnnamed2549() {
   var o = new core.List<api.Route>();
   o.add(buildRoute());
   o.add(buildRoute());
   return o;
 }
 
-checkUnnamed2524(core.List<api.Route> o) {
+checkUnnamed2549(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoute(o[0]);
   checkRoute(o[1]);
@@ -10754,7 +10754,7 @@
   var o = new api.RouterStatusBgpPeerStatus();
   buildCounterRouterStatusBgpPeerStatus++;
   if (buildCounterRouterStatusBgpPeerStatus < 3) {
-    o.advertisedRoutes = buildUnnamed2524();
+    o.advertisedRoutes = buildUnnamed2549();
     o.ipAddress = "foo";
     o.linkedVpnTunnel = "foo";
     o.name = "foo";
@@ -10772,7 +10772,7 @@
 checkRouterStatusBgpPeerStatus(api.RouterStatusBgpPeerStatus o) {
   buildCounterRouterStatusBgpPeerStatus++;
   if (buildCounterRouterStatusBgpPeerStatus < 3) {
-    checkUnnamed2524(o.advertisedRoutes);
+    checkUnnamed2549(o.advertisedRoutes);
     unittest.expect(o.ipAddress, unittest.equals('foo'));
     unittest.expect(o.linkedVpnTunnel, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -10826,14 +10826,14 @@
   buildCounterRoutersPreviewResponse--;
 }
 
-buildUnnamed2525() {
+buildUnnamed2550() {
   var o = new core.List<api.Router>();
   o.add(buildRouter());
   o.add(buildRouter());
   return o;
 }
 
-checkUnnamed2525(core.List<api.Router> o) {
+checkUnnamed2550(core.List<api.Router> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouter(o[0]);
   checkRouter(o[1]);
@@ -10860,14 +10860,14 @@
   buildCounterRoutersScopedListWarningData--;
 }
 
-buildUnnamed2526() {
+buildUnnamed2551() {
   var o = new core.List<api.RoutersScopedListWarningData>();
   o.add(buildRoutersScopedListWarningData());
   o.add(buildRoutersScopedListWarningData());
   return o;
 }
 
-checkUnnamed2526(core.List<api.RoutersScopedListWarningData> o) {
+checkUnnamed2551(core.List<api.RoutersScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoutersScopedListWarningData(o[0]);
   checkRoutersScopedListWarningData(o[1]);
@@ -10879,7 +10879,7 @@
   buildCounterRoutersScopedListWarning++;
   if (buildCounterRoutersScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2526();
+    o.data = buildUnnamed2551();
     o.message = "foo";
   }
   buildCounterRoutersScopedListWarning--;
@@ -10890,7 +10890,7 @@
   buildCounterRoutersScopedListWarning++;
   if (buildCounterRoutersScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2526(o.data);
+    checkUnnamed2551(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRoutersScopedListWarning--;
@@ -10901,7 +10901,7 @@
   var o = new api.RoutersScopedList();
   buildCounterRoutersScopedList++;
   if (buildCounterRoutersScopedList < 3) {
-    o.routers = buildUnnamed2525();
+    o.routers = buildUnnamed2550();
     o.warning = buildRoutersScopedListWarning();
   }
   buildCounterRoutersScopedList--;
@@ -10911,7 +10911,7 @@
 checkRoutersScopedList(api.RoutersScopedList o) {
   buildCounterRoutersScopedList++;
   if (buildCounterRoutersScopedList < 3) {
-    checkUnnamed2525(o.routers);
+    checkUnnamed2550(o.routers);
     checkRoutersScopedListWarning(o.warning);
   }
   buildCounterRoutersScopedList--;
@@ -10994,14 +10994,14 @@
   buildCounterSerialPortOutput--;
 }
 
-buildUnnamed2527() {
+buildUnnamed2552() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2527(core.List<core.String> o) {
+checkUnnamed2552(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -11013,7 +11013,7 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed2527();
+    o.scopes = buildUnnamed2552();
   }
   buildCounterServiceAccount--;
   return o;
@@ -11023,32 +11023,32 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed2527(o.scopes);
+    checkUnnamed2552(o.scopes);
   }
   buildCounterServiceAccount--;
 }
 
-buildUnnamed2528() {
+buildUnnamed2553() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2528(core.Map<core.String, core.String> o) {
+checkUnnamed2553(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'));
 }
 
-buildUnnamed2529() {
+buildUnnamed2554() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2529(core.List<core.String> o) {
+checkUnnamed2554(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -11065,8 +11065,8 @@
     o.id = "foo";
     o.kind = "foo";
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2528();
-    o.licenses = buildUnnamed2529();
+    o.labels = buildUnnamed2553();
+    o.licenses = buildUnnamed2554();
     o.name = "foo";
     o.selfLink = "foo";
     o.snapshotEncryptionKey = buildCustomerEncryptionKey();
@@ -11090,8 +11090,8 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2528(o.labels);
-    checkUnnamed2529(o.licenses);
+    checkUnnamed2553(o.labels);
+    checkUnnamed2554(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkCustomerEncryptionKey(o.snapshotEncryptionKey);
@@ -11105,14 +11105,14 @@
   buildCounterSnapshot--;
 }
 
-buildUnnamed2530() {
+buildUnnamed2555() {
   var o = new core.List<api.Snapshot>();
   o.add(buildSnapshot());
   o.add(buildSnapshot());
   return o;
 }
 
-checkUnnamed2530(core.List<api.Snapshot> o) {
+checkUnnamed2555(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSnapshot(o[0]);
   checkSnapshot(o[1]);
@@ -11139,14 +11139,14 @@
   buildCounterSnapshotListWarningData--;
 }
 
-buildUnnamed2531() {
+buildUnnamed2556() {
   var o = new core.List<api.SnapshotListWarningData>();
   o.add(buildSnapshotListWarningData());
   o.add(buildSnapshotListWarningData());
   return o;
 }
 
-checkUnnamed2531(core.List<api.SnapshotListWarningData> o) {
+checkUnnamed2556(core.List<api.SnapshotListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSnapshotListWarningData(o[0]);
   checkSnapshotListWarningData(o[1]);
@@ -11158,7 +11158,7 @@
   buildCounterSnapshotListWarning++;
   if (buildCounterSnapshotListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2531();
+    o.data = buildUnnamed2556();
     o.message = "foo";
   }
   buildCounterSnapshotListWarning--;
@@ -11169,7 +11169,7 @@
   buildCounterSnapshotListWarning++;
   if (buildCounterSnapshotListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2531(o.data);
+    checkUnnamed2556(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterSnapshotListWarning--;
@@ -11181,7 +11181,7 @@
   buildCounterSnapshotList++;
   if (buildCounterSnapshotList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2530();
+    o.items = buildUnnamed2555();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -11195,7 +11195,7 @@
   buildCounterSnapshotList++;
   if (buildCounterSnapshotList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2530(o.items);
+    checkUnnamed2555(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -11237,14 +11237,14 @@
   buildCounterSslCertificate--;
 }
 
-buildUnnamed2532() {
+buildUnnamed2557() {
   var o = new core.List<api.SslCertificate>();
   o.add(buildSslCertificate());
   o.add(buildSslCertificate());
   return o;
 }
 
-checkUnnamed2532(core.List<api.SslCertificate> o) {
+checkUnnamed2557(core.List<api.SslCertificate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSslCertificate(o[0]);
   checkSslCertificate(o[1]);
@@ -11271,14 +11271,14 @@
   buildCounterSslCertificateListWarningData--;
 }
 
-buildUnnamed2533() {
+buildUnnamed2558() {
   var o = new core.List<api.SslCertificateListWarningData>();
   o.add(buildSslCertificateListWarningData());
   o.add(buildSslCertificateListWarningData());
   return o;
 }
 
-checkUnnamed2533(core.List<api.SslCertificateListWarningData> o) {
+checkUnnamed2558(core.List<api.SslCertificateListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSslCertificateListWarningData(o[0]);
   checkSslCertificateListWarningData(o[1]);
@@ -11290,7 +11290,7 @@
   buildCounterSslCertificateListWarning++;
   if (buildCounterSslCertificateListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2533();
+    o.data = buildUnnamed2558();
     o.message = "foo";
   }
   buildCounterSslCertificateListWarning--;
@@ -11301,7 +11301,7 @@
   buildCounterSslCertificateListWarning++;
   if (buildCounterSslCertificateListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2533(o.data);
+    checkUnnamed2558(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterSslCertificateListWarning--;
@@ -11313,7 +11313,7 @@
   buildCounterSslCertificateList++;
   if (buildCounterSslCertificateList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2532();
+    o.items = buildUnnamed2557();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -11327,7 +11327,7 @@
   buildCounterSslCertificateList++;
   if (buildCounterSslCertificateList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2532(o.items);
+    checkUnnamed2557(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -11336,14 +11336,14 @@
   buildCounterSslCertificateList--;
 }
 
-buildUnnamed2534() {
+buildUnnamed2559() {
   var o = new core.List<api.SubnetworkSecondaryRange>();
   o.add(buildSubnetworkSecondaryRange());
   o.add(buildSubnetworkSecondaryRange());
   return o;
 }
 
-checkUnnamed2534(core.List<api.SubnetworkSecondaryRange> o) {
+checkUnnamed2559(core.List<api.SubnetworkSecondaryRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubnetworkSecondaryRange(o[0]);
   checkSubnetworkSecondaryRange(o[1]);
@@ -11364,7 +11364,7 @@
     o.network = "foo";
     o.privateIpGoogleAccess = true;
     o.region = "foo";
-    o.secondaryIpRanges = buildUnnamed2534();
+    o.secondaryIpRanges = buildUnnamed2559();
     o.selfLink = "foo";
   }
   buildCounterSubnetwork--;
@@ -11384,20 +11384,20 @@
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.privateIpGoogleAccess, unittest.isTrue);
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed2534(o.secondaryIpRanges);
+    checkUnnamed2559(o.secondaryIpRanges);
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterSubnetwork--;
 }
 
-buildUnnamed2535() {
+buildUnnamed2560() {
   var o = new core.Map<core.String, api.SubnetworksScopedList>();
   o["x"] = buildSubnetworksScopedList();
   o["y"] = buildSubnetworksScopedList();
   return o;
 }
 
-checkUnnamed2535(core.Map<core.String, api.SubnetworksScopedList> o) {
+checkUnnamed2560(core.Map<core.String, api.SubnetworksScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubnetworksScopedList(o["x"]);
   checkSubnetworksScopedList(o["y"]);
@@ -11425,14 +11425,14 @@
   buildCounterSubnetworkAggregatedListWarningData--;
 }
 
-buildUnnamed2536() {
+buildUnnamed2561() {
   var o = new core.List<api.SubnetworkAggregatedListWarningData>();
   o.add(buildSubnetworkAggregatedListWarningData());
   o.add(buildSubnetworkAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2536(core.List<api.SubnetworkAggregatedListWarningData> o) {
+checkUnnamed2561(core.List<api.SubnetworkAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubnetworkAggregatedListWarningData(o[0]);
   checkSubnetworkAggregatedListWarningData(o[1]);
@@ -11444,7 +11444,7 @@
   buildCounterSubnetworkAggregatedListWarning++;
   if (buildCounterSubnetworkAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2536();
+    o.data = buildUnnamed2561();
     o.message = "foo";
   }
   buildCounterSubnetworkAggregatedListWarning--;
@@ -11455,7 +11455,7 @@
   buildCounterSubnetworkAggregatedListWarning++;
   if (buildCounterSubnetworkAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2536(o.data);
+    checkUnnamed2561(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterSubnetworkAggregatedListWarning--;
@@ -11467,7 +11467,7 @@
   buildCounterSubnetworkAggregatedList++;
   if (buildCounterSubnetworkAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2535();
+    o.items = buildUnnamed2560();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -11481,7 +11481,7 @@
   buildCounterSubnetworkAggregatedList++;
   if (buildCounterSubnetworkAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2535(o.items);
+    checkUnnamed2560(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -11490,14 +11490,14 @@
   buildCounterSubnetworkAggregatedList--;
 }
 
-buildUnnamed2537() {
+buildUnnamed2562() {
   var o = new core.List<api.Subnetwork>();
   o.add(buildSubnetwork());
   o.add(buildSubnetwork());
   return o;
 }
 
-checkUnnamed2537(core.List<api.Subnetwork> o) {
+checkUnnamed2562(core.List<api.Subnetwork> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubnetwork(o[0]);
   checkSubnetwork(o[1]);
@@ -11524,14 +11524,14 @@
   buildCounterSubnetworkListWarningData--;
 }
 
-buildUnnamed2538() {
+buildUnnamed2563() {
   var o = new core.List<api.SubnetworkListWarningData>();
   o.add(buildSubnetworkListWarningData());
   o.add(buildSubnetworkListWarningData());
   return o;
 }
 
-checkUnnamed2538(core.List<api.SubnetworkListWarningData> o) {
+checkUnnamed2563(core.List<api.SubnetworkListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubnetworkListWarningData(o[0]);
   checkSubnetworkListWarningData(o[1]);
@@ -11543,7 +11543,7 @@
   buildCounterSubnetworkListWarning++;
   if (buildCounterSubnetworkListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2538();
+    o.data = buildUnnamed2563();
     o.message = "foo";
   }
   buildCounterSubnetworkListWarning--;
@@ -11554,7 +11554,7 @@
   buildCounterSubnetworkListWarning++;
   if (buildCounterSubnetworkListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2538(o.data);
+    checkUnnamed2563(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterSubnetworkListWarning--;
@@ -11566,7 +11566,7 @@
   buildCounterSubnetworkList++;
   if (buildCounterSubnetworkList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2537();
+    o.items = buildUnnamed2562();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -11580,7 +11580,7 @@
   buildCounterSubnetworkList++;
   if (buildCounterSubnetworkList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2537(o.items);
+    checkUnnamed2562(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -11630,14 +11630,14 @@
   buildCounterSubnetworksExpandIpCidrRangeRequest--;
 }
 
-buildUnnamed2539() {
+buildUnnamed2564() {
   var o = new core.List<api.Subnetwork>();
   o.add(buildSubnetwork());
   o.add(buildSubnetwork());
   return o;
 }
 
-checkUnnamed2539(core.List<api.Subnetwork> o) {
+checkUnnamed2564(core.List<api.Subnetwork> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubnetwork(o[0]);
   checkSubnetwork(o[1]);
@@ -11664,14 +11664,14 @@
   buildCounterSubnetworksScopedListWarningData--;
 }
 
-buildUnnamed2540() {
+buildUnnamed2565() {
   var o = new core.List<api.SubnetworksScopedListWarningData>();
   o.add(buildSubnetworksScopedListWarningData());
   o.add(buildSubnetworksScopedListWarningData());
   return o;
 }
 
-checkUnnamed2540(core.List<api.SubnetworksScopedListWarningData> o) {
+checkUnnamed2565(core.List<api.SubnetworksScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubnetworksScopedListWarningData(o[0]);
   checkSubnetworksScopedListWarningData(o[1]);
@@ -11683,7 +11683,7 @@
   buildCounterSubnetworksScopedListWarning++;
   if (buildCounterSubnetworksScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2540();
+    o.data = buildUnnamed2565();
     o.message = "foo";
   }
   buildCounterSubnetworksScopedListWarning--;
@@ -11694,7 +11694,7 @@
   buildCounterSubnetworksScopedListWarning++;
   if (buildCounterSubnetworksScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2540(o.data);
+    checkUnnamed2565(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterSubnetworksScopedListWarning--;
@@ -11705,7 +11705,7 @@
   var o = new api.SubnetworksScopedList();
   buildCounterSubnetworksScopedList++;
   if (buildCounterSubnetworksScopedList < 3) {
-    o.subnetworks = buildUnnamed2539();
+    o.subnetworks = buildUnnamed2564();
     o.warning = buildSubnetworksScopedListWarning();
   }
   buildCounterSubnetworksScopedList--;
@@ -11715,7 +11715,7 @@
 checkSubnetworksScopedList(api.SubnetworksScopedList o) {
   buildCounterSubnetworksScopedList++;
   if (buildCounterSubnetworksScopedList < 3) {
-    checkUnnamed2539(o.subnetworks);
+    checkUnnamed2564(o.subnetworks);
     checkSubnetworksScopedListWarning(o.warning);
   }
   buildCounterSubnetworksScopedList--;
@@ -11768,14 +11768,14 @@
   buildCounterTCPHealthCheck--;
 }
 
-buildUnnamed2541() {
+buildUnnamed2566() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2541(core.List<core.String> o) {
+checkUnnamed2566(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -11787,7 +11787,7 @@
   buildCounterTags++;
   if (buildCounterTags < 3) {
     o.fingerprint = "foo";
-    o.items = buildUnnamed2541();
+    o.items = buildUnnamed2566();
   }
   buildCounterTags--;
   return o;
@@ -11797,7 +11797,7 @@
   buildCounterTags++;
   if (buildCounterTags < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2541(o.items);
+    checkUnnamed2566(o.items);
   }
   buildCounterTags--;
 }
@@ -11833,14 +11833,14 @@
   buildCounterTargetHttpProxy--;
 }
 
-buildUnnamed2542() {
+buildUnnamed2567() {
   var o = new core.List<api.TargetHttpProxy>();
   o.add(buildTargetHttpProxy());
   o.add(buildTargetHttpProxy());
   return o;
 }
 
-checkUnnamed2542(core.List<api.TargetHttpProxy> o) {
+checkUnnamed2567(core.List<api.TargetHttpProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetHttpProxy(o[0]);
   checkTargetHttpProxy(o[1]);
@@ -11867,14 +11867,14 @@
   buildCounterTargetHttpProxyListWarningData--;
 }
 
-buildUnnamed2543() {
+buildUnnamed2568() {
   var o = new core.List<api.TargetHttpProxyListWarningData>();
   o.add(buildTargetHttpProxyListWarningData());
   o.add(buildTargetHttpProxyListWarningData());
   return o;
 }
 
-checkUnnamed2543(core.List<api.TargetHttpProxyListWarningData> o) {
+checkUnnamed2568(core.List<api.TargetHttpProxyListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetHttpProxyListWarningData(o[0]);
   checkTargetHttpProxyListWarningData(o[1]);
@@ -11886,7 +11886,7 @@
   buildCounterTargetHttpProxyListWarning++;
   if (buildCounterTargetHttpProxyListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2543();
+    o.data = buildUnnamed2568();
     o.message = "foo";
   }
   buildCounterTargetHttpProxyListWarning--;
@@ -11897,7 +11897,7 @@
   buildCounterTargetHttpProxyListWarning++;
   if (buildCounterTargetHttpProxyListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2543(o.data);
+    checkUnnamed2568(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetHttpProxyListWarning--;
@@ -11909,7 +11909,7 @@
   buildCounterTargetHttpProxyList++;
   if (buildCounterTargetHttpProxyList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2542();
+    o.items = buildUnnamed2567();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -11923,7 +11923,7 @@
   buildCounterTargetHttpProxyList++;
   if (buildCounterTargetHttpProxyList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2542(o.items);
+    checkUnnamed2567(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -11932,14 +11932,14 @@
   buildCounterTargetHttpProxyList--;
 }
 
-buildUnnamed2544() {
+buildUnnamed2569() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2544(core.List<core.String> o) {
+checkUnnamed2569(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -11950,7 +11950,7 @@
   var o = new api.TargetHttpsProxiesSetSslCertificatesRequest();
   buildCounterTargetHttpsProxiesSetSslCertificatesRequest++;
   if (buildCounterTargetHttpsProxiesSetSslCertificatesRequest < 3) {
-    o.sslCertificates = buildUnnamed2544();
+    o.sslCertificates = buildUnnamed2569();
   }
   buildCounterTargetHttpsProxiesSetSslCertificatesRequest--;
   return o;
@@ -11960,19 +11960,19 @@
     api.TargetHttpsProxiesSetSslCertificatesRequest o) {
   buildCounterTargetHttpsProxiesSetSslCertificatesRequest++;
   if (buildCounterTargetHttpsProxiesSetSslCertificatesRequest < 3) {
-    checkUnnamed2544(o.sslCertificates);
+    checkUnnamed2569(o.sslCertificates);
   }
   buildCounterTargetHttpsProxiesSetSslCertificatesRequest--;
 }
 
-buildUnnamed2545() {
+buildUnnamed2570() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2545(core.List<core.String> o) {
+checkUnnamed2570(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -11989,7 +11989,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.selfLink = "foo";
-    o.sslCertificates = buildUnnamed2545();
+    o.sslCertificates = buildUnnamed2570();
     o.urlMap = "foo";
   }
   buildCounterTargetHttpsProxy--;
@@ -12005,20 +12005,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2545(o.sslCertificates);
+    checkUnnamed2570(o.sslCertificates);
     unittest.expect(o.urlMap, unittest.equals('foo'));
   }
   buildCounterTargetHttpsProxy--;
 }
 
-buildUnnamed2546() {
+buildUnnamed2571() {
   var o = new core.List<api.TargetHttpsProxy>();
   o.add(buildTargetHttpsProxy());
   o.add(buildTargetHttpsProxy());
   return o;
 }
 
-checkUnnamed2546(core.List<api.TargetHttpsProxy> o) {
+checkUnnamed2571(core.List<api.TargetHttpsProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetHttpsProxy(o[0]);
   checkTargetHttpsProxy(o[1]);
@@ -12045,14 +12045,14 @@
   buildCounterTargetHttpsProxyListWarningData--;
 }
 
-buildUnnamed2547() {
+buildUnnamed2572() {
   var o = new core.List<api.TargetHttpsProxyListWarningData>();
   o.add(buildTargetHttpsProxyListWarningData());
   o.add(buildTargetHttpsProxyListWarningData());
   return o;
 }
 
-checkUnnamed2547(core.List<api.TargetHttpsProxyListWarningData> o) {
+checkUnnamed2572(core.List<api.TargetHttpsProxyListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetHttpsProxyListWarningData(o[0]);
   checkTargetHttpsProxyListWarningData(o[1]);
@@ -12064,7 +12064,7 @@
   buildCounterTargetHttpsProxyListWarning++;
   if (buildCounterTargetHttpsProxyListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2547();
+    o.data = buildUnnamed2572();
     o.message = "foo";
   }
   buildCounterTargetHttpsProxyListWarning--;
@@ -12075,7 +12075,7 @@
   buildCounterTargetHttpsProxyListWarning++;
   if (buildCounterTargetHttpsProxyListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2547(o.data);
+    checkUnnamed2572(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetHttpsProxyListWarning--;
@@ -12087,7 +12087,7 @@
   buildCounterTargetHttpsProxyList++;
   if (buildCounterTargetHttpsProxyList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2546();
+    o.items = buildUnnamed2571();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -12101,7 +12101,7 @@
   buildCounterTargetHttpsProxyList++;
   if (buildCounterTargetHttpsProxyList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2546(o.items);
+    checkUnnamed2571(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -12145,14 +12145,14 @@
   buildCounterTargetInstance--;
 }
 
-buildUnnamed2548() {
+buildUnnamed2573() {
   var o = new core.Map<core.String, api.TargetInstancesScopedList>();
   o["x"] = buildTargetInstancesScopedList();
   o["y"] = buildTargetInstancesScopedList();
   return o;
 }
 
-checkUnnamed2548(core.Map<core.String, api.TargetInstancesScopedList> o) {
+checkUnnamed2573(core.Map<core.String, api.TargetInstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstancesScopedList(o["x"]);
   checkTargetInstancesScopedList(o["y"]);
@@ -12180,14 +12180,14 @@
   buildCounterTargetInstanceAggregatedListWarningData--;
 }
 
-buildUnnamed2549() {
+buildUnnamed2574() {
   var o = new core.List<api.TargetInstanceAggregatedListWarningData>();
   o.add(buildTargetInstanceAggregatedListWarningData());
   o.add(buildTargetInstanceAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2549(core.List<api.TargetInstanceAggregatedListWarningData> o) {
+checkUnnamed2574(core.List<api.TargetInstanceAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstanceAggregatedListWarningData(o[0]);
   checkTargetInstanceAggregatedListWarningData(o[1]);
@@ -12199,7 +12199,7 @@
   buildCounterTargetInstanceAggregatedListWarning++;
   if (buildCounterTargetInstanceAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2549();
+    o.data = buildUnnamed2574();
     o.message = "foo";
   }
   buildCounterTargetInstanceAggregatedListWarning--;
@@ -12211,7 +12211,7 @@
   buildCounterTargetInstanceAggregatedListWarning++;
   if (buildCounterTargetInstanceAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2549(o.data);
+    checkUnnamed2574(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetInstanceAggregatedListWarning--;
@@ -12223,7 +12223,7 @@
   buildCounterTargetInstanceAggregatedList++;
   if (buildCounterTargetInstanceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2548();
+    o.items = buildUnnamed2573();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -12237,7 +12237,7 @@
   buildCounterTargetInstanceAggregatedList++;
   if (buildCounterTargetInstanceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2548(o.items);
+    checkUnnamed2573(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -12246,14 +12246,14 @@
   buildCounterTargetInstanceAggregatedList--;
 }
 
-buildUnnamed2550() {
+buildUnnamed2575() {
   var o = new core.List<api.TargetInstance>();
   o.add(buildTargetInstance());
   o.add(buildTargetInstance());
   return o;
 }
 
-checkUnnamed2550(core.List<api.TargetInstance> o) {
+checkUnnamed2575(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstance(o[0]);
   checkTargetInstance(o[1]);
@@ -12280,14 +12280,14 @@
   buildCounterTargetInstanceListWarningData--;
 }
 
-buildUnnamed2551() {
+buildUnnamed2576() {
   var o = new core.List<api.TargetInstanceListWarningData>();
   o.add(buildTargetInstanceListWarningData());
   o.add(buildTargetInstanceListWarningData());
   return o;
 }
 
-checkUnnamed2551(core.List<api.TargetInstanceListWarningData> o) {
+checkUnnamed2576(core.List<api.TargetInstanceListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstanceListWarningData(o[0]);
   checkTargetInstanceListWarningData(o[1]);
@@ -12299,7 +12299,7 @@
   buildCounterTargetInstanceListWarning++;
   if (buildCounterTargetInstanceListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2551();
+    o.data = buildUnnamed2576();
     o.message = "foo";
   }
   buildCounterTargetInstanceListWarning--;
@@ -12310,7 +12310,7 @@
   buildCounterTargetInstanceListWarning++;
   if (buildCounterTargetInstanceListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2551(o.data);
+    checkUnnamed2576(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetInstanceListWarning--;
@@ -12322,7 +12322,7 @@
   buildCounterTargetInstanceList++;
   if (buildCounterTargetInstanceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2550();
+    o.items = buildUnnamed2575();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -12336,7 +12336,7 @@
   buildCounterTargetInstanceList++;
   if (buildCounterTargetInstanceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2550(o.items);
+    checkUnnamed2575(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -12345,14 +12345,14 @@
   buildCounterTargetInstanceList--;
 }
 
-buildUnnamed2552() {
+buildUnnamed2577() {
   var o = new core.List<api.TargetInstance>();
   o.add(buildTargetInstance());
   o.add(buildTargetInstance());
   return o;
 }
 
-checkUnnamed2552(core.List<api.TargetInstance> o) {
+checkUnnamed2577(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstance(o[0]);
   checkTargetInstance(o[1]);
@@ -12380,14 +12380,14 @@
   buildCounterTargetInstancesScopedListWarningData--;
 }
 
-buildUnnamed2553() {
+buildUnnamed2578() {
   var o = new core.List<api.TargetInstancesScopedListWarningData>();
   o.add(buildTargetInstancesScopedListWarningData());
   o.add(buildTargetInstancesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2553(core.List<api.TargetInstancesScopedListWarningData> o) {
+checkUnnamed2578(core.List<api.TargetInstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstancesScopedListWarningData(o[0]);
   checkTargetInstancesScopedListWarningData(o[1]);
@@ -12399,7 +12399,7 @@
   buildCounterTargetInstancesScopedListWarning++;
   if (buildCounterTargetInstancesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2553();
+    o.data = buildUnnamed2578();
     o.message = "foo";
   }
   buildCounterTargetInstancesScopedListWarning--;
@@ -12410,7 +12410,7 @@
   buildCounterTargetInstancesScopedListWarning++;
   if (buildCounterTargetInstancesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2553(o.data);
+    checkUnnamed2578(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetInstancesScopedListWarning--;
@@ -12421,7 +12421,7 @@
   var o = new api.TargetInstancesScopedList();
   buildCounterTargetInstancesScopedList++;
   if (buildCounterTargetInstancesScopedList < 3) {
-    o.targetInstances = buildUnnamed2552();
+    o.targetInstances = buildUnnamed2577();
     o.warning = buildTargetInstancesScopedListWarning();
   }
   buildCounterTargetInstancesScopedList--;
@@ -12431,33 +12431,33 @@
 checkTargetInstancesScopedList(api.TargetInstancesScopedList o) {
   buildCounterTargetInstancesScopedList++;
   if (buildCounterTargetInstancesScopedList < 3) {
-    checkUnnamed2552(o.targetInstances);
+    checkUnnamed2577(o.targetInstances);
     checkTargetInstancesScopedListWarning(o.warning);
   }
   buildCounterTargetInstancesScopedList--;
 }
 
-buildUnnamed2554() {
+buildUnnamed2579() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2554(core.List<core.String> o) {
+checkUnnamed2579(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2555() {
+buildUnnamed2580() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2555(core.List<core.String> o) {
+checkUnnamed2580(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -12472,9 +12472,9 @@
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.failoverRatio = 42.0;
-    o.healthChecks = buildUnnamed2554();
+    o.healthChecks = buildUnnamed2579();
     o.id = "foo";
-    o.instances = buildUnnamed2555();
+    o.instances = buildUnnamed2580();
     o.kind = "foo";
     o.name = "foo";
     o.region = "foo";
@@ -12492,9 +12492,9 @@
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.failoverRatio, unittest.equals(42.0));
-    checkUnnamed2554(o.healthChecks);
+    checkUnnamed2579(o.healthChecks);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2555(o.instances);
+    checkUnnamed2580(o.instances);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
@@ -12504,14 +12504,14 @@
   buildCounterTargetPool--;
 }
 
-buildUnnamed2556() {
+buildUnnamed2581() {
   var o = new core.Map<core.String, api.TargetPoolsScopedList>();
   o["x"] = buildTargetPoolsScopedList();
   o["y"] = buildTargetPoolsScopedList();
   return o;
 }
 
-checkUnnamed2556(core.Map<core.String, api.TargetPoolsScopedList> o) {
+checkUnnamed2581(core.Map<core.String, api.TargetPoolsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolsScopedList(o["x"]);
   checkTargetPoolsScopedList(o["y"]);
@@ -12539,14 +12539,14 @@
   buildCounterTargetPoolAggregatedListWarningData--;
 }
 
-buildUnnamed2557() {
+buildUnnamed2582() {
   var o = new core.List<api.TargetPoolAggregatedListWarningData>();
   o.add(buildTargetPoolAggregatedListWarningData());
   o.add(buildTargetPoolAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2557(core.List<api.TargetPoolAggregatedListWarningData> o) {
+checkUnnamed2582(core.List<api.TargetPoolAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolAggregatedListWarningData(o[0]);
   checkTargetPoolAggregatedListWarningData(o[1]);
@@ -12558,7 +12558,7 @@
   buildCounterTargetPoolAggregatedListWarning++;
   if (buildCounterTargetPoolAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2557();
+    o.data = buildUnnamed2582();
     o.message = "foo";
   }
   buildCounterTargetPoolAggregatedListWarning--;
@@ -12569,7 +12569,7 @@
   buildCounterTargetPoolAggregatedListWarning++;
   if (buildCounterTargetPoolAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2557(o.data);
+    checkUnnamed2582(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetPoolAggregatedListWarning--;
@@ -12581,7 +12581,7 @@
   buildCounterTargetPoolAggregatedList++;
   if (buildCounterTargetPoolAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2556();
+    o.items = buildUnnamed2581();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -12595,7 +12595,7 @@
   buildCounterTargetPoolAggregatedList++;
   if (buildCounterTargetPoolAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2556(o.items);
+    checkUnnamed2581(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -12604,14 +12604,14 @@
   buildCounterTargetPoolAggregatedList--;
 }
 
-buildUnnamed2558() {
+buildUnnamed2583() {
   var o = new core.List<api.HealthStatus>();
   o.add(buildHealthStatus());
   o.add(buildHealthStatus());
   return o;
 }
 
-checkUnnamed2558(core.List<api.HealthStatus> o) {
+checkUnnamed2583(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthStatus(o[0]);
   checkHealthStatus(o[1]);
@@ -12622,7 +12622,7 @@
   var o = new api.TargetPoolInstanceHealth();
   buildCounterTargetPoolInstanceHealth++;
   if (buildCounterTargetPoolInstanceHealth < 3) {
-    o.healthStatus = buildUnnamed2558();
+    o.healthStatus = buildUnnamed2583();
     o.kind = "foo";
   }
   buildCounterTargetPoolInstanceHealth--;
@@ -12632,20 +12632,20 @@
 checkTargetPoolInstanceHealth(api.TargetPoolInstanceHealth o) {
   buildCounterTargetPoolInstanceHealth++;
   if (buildCounterTargetPoolInstanceHealth < 3) {
-    checkUnnamed2558(o.healthStatus);
+    checkUnnamed2583(o.healthStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTargetPoolInstanceHealth--;
 }
 
-buildUnnamed2559() {
+buildUnnamed2584() {
   var o = new core.List<api.TargetPool>();
   o.add(buildTargetPool());
   o.add(buildTargetPool());
   return o;
 }
 
-checkUnnamed2559(core.List<api.TargetPool> o) {
+checkUnnamed2584(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPool(o[0]);
   checkTargetPool(o[1]);
@@ -12672,14 +12672,14 @@
   buildCounterTargetPoolListWarningData--;
 }
 
-buildUnnamed2560() {
+buildUnnamed2585() {
   var o = new core.List<api.TargetPoolListWarningData>();
   o.add(buildTargetPoolListWarningData());
   o.add(buildTargetPoolListWarningData());
   return o;
 }
 
-checkUnnamed2560(core.List<api.TargetPoolListWarningData> o) {
+checkUnnamed2585(core.List<api.TargetPoolListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolListWarningData(o[0]);
   checkTargetPoolListWarningData(o[1]);
@@ -12691,7 +12691,7 @@
   buildCounterTargetPoolListWarning++;
   if (buildCounterTargetPoolListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2560();
+    o.data = buildUnnamed2585();
     o.message = "foo";
   }
   buildCounterTargetPoolListWarning--;
@@ -12702,7 +12702,7 @@
   buildCounterTargetPoolListWarning++;
   if (buildCounterTargetPoolListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2560(o.data);
+    checkUnnamed2585(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetPoolListWarning--;
@@ -12714,7 +12714,7 @@
   buildCounterTargetPoolList++;
   if (buildCounterTargetPoolList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2559();
+    o.items = buildUnnamed2584();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -12728,7 +12728,7 @@
   buildCounterTargetPoolList++;
   if (buildCounterTargetPoolList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2559(o.items);
+    checkUnnamed2584(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -12737,14 +12737,14 @@
   buildCounterTargetPoolList--;
 }
 
-buildUnnamed2561() {
+buildUnnamed2586() {
   var o = new core.List<api.HealthCheckReference>();
   o.add(buildHealthCheckReference());
   o.add(buildHealthCheckReference());
   return o;
 }
 
-checkUnnamed2561(core.List<api.HealthCheckReference> o) {
+checkUnnamed2586(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheckReference(o[0]);
   checkHealthCheckReference(o[1]);
@@ -12755,7 +12755,7 @@
   var o = new api.TargetPoolsAddHealthCheckRequest();
   buildCounterTargetPoolsAddHealthCheckRequest++;
   if (buildCounterTargetPoolsAddHealthCheckRequest < 3) {
-    o.healthChecks = buildUnnamed2561();
+    o.healthChecks = buildUnnamed2586();
   }
   buildCounterTargetPoolsAddHealthCheckRequest--;
   return o;
@@ -12764,19 +12764,19 @@
 checkTargetPoolsAddHealthCheckRequest(api.TargetPoolsAddHealthCheckRequest o) {
   buildCounterTargetPoolsAddHealthCheckRequest++;
   if (buildCounterTargetPoolsAddHealthCheckRequest < 3) {
-    checkUnnamed2561(o.healthChecks);
+    checkUnnamed2586(o.healthChecks);
   }
   buildCounterTargetPoolsAddHealthCheckRequest--;
 }
 
-buildUnnamed2562() {
+buildUnnamed2587() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed2562(core.List<api.InstanceReference> o) {
+checkUnnamed2587(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -12787,7 +12787,7 @@
   var o = new api.TargetPoolsAddInstanceRequest();
   buildCounterTargetPoolsAddInstanceRequest++;
   if (buildCounterTargetPoolsAddInstanceRequest < 3) {
-    o.instances = buildUnnamed2562();
+    o.instances = buildUnnamed2587();
   }
   buildCounterTargetPoolsAddInstanceRequest--;
   return o;
@@ -12796,19 +12796,19 @@
 checkTargetPoolsAddInstanceRequest(api.TargetPoolsAddInstanceRequest o) {
   buildCounterTargetPoolsAddInstanceRequest++;
   if (buildCounterTargetPoolsAddInstanceRequest < 3) {
-    checkUnnamed2562(o.instances);
+    checkUnnamed2587(o.instances);
   }
   buildCounterTargetPoolsAddInstanceRequest--;
 }
 
-buildUnnamed2563() {
+buildUnnamed2588() {
   var o = new core.List<api.HealthCheckReference>();
   o.add(buildHealthCheckReference());
   o.add(buildHealthCheckReference());
   return o;
 }
 
-checkUnnamed2563(core.List<api.HealthCheckReference> o) {
+checkUnnamed2588(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheckReference(o[0]);
   checkHealthCheckReference(o[1]);
@@ -12819,7 +12819,7 @@
   var o = new api.TargetPoolsRemoveHealthCheckRequest();
   buildCounterTargetPoolsRemoveHealthCheckRequest++;
   if (buildCounterTargetPoolsRemoveHealthCheckRequest < 3) {
-    o.healthChecks = buildUnnamed2563();
+    o.healthChecks = buildUnnamed2588();
   }
   buildCounterTargetPoolsRemoveHealthCheckRequest--;
   return o;
@@ -12829,19 +12829,19 @@
     api.TargetPoolsRemoveHealthCheckRequest o) {
   buildCounterTargetPoolsRemoveHealthCheckRequest++;
   if (buildCounterTargetPoolsRemoveHealthCheckRequest < 3) {
-    checkUnnamed2563(o.healthChecks);
+    checkUnnamed2588(o.healthChecks);
   }
   buildCounterTargetPoolsRemoveHealthCheckRequest--;
 }
 
-buildUnnamed2564() {
+buildUnnamed2589() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed2564(core.List<api.InstanceReference> o) {
+checkUnnamed2589(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -12852,7 +12852,7 @@
   var o = new api.TargetPoolsRemoveInstanceRequest();
   buildCounterTargetPoolsRemoveInstanceRequest++;
   if (buildCounterTargetPoolsRemoveInstanceRequest < 3) {
-    o.instances = buildUnnamed2564();
+    o.instances = buildUnnamed2589();
   }
   buildCounterTargetPoolsRemoveInstanceRequest--;
   return o;
@@ -12861,19 +12861,19 @@
 checkTargetPoolsRemoveInstanceRequest(api.TargetPoolsRemoveInstanceRequest o) {
   buildCounterTargetPoolsRemoveInstanceRequest++;
   if (buildCounterTargetPoolsRemoveInstanceRequest < 3) {
-    checkUnnamed2564(o.instances);
+    checkUnnamed2589(o.instances);
   }
   buildCounterTargetPoolsRemoveInstanceRequest--;
 }
 
-buildUnnamed2565() {
+buildUnnamed2590() {
   var o = new core.List<api.TargetPool>();
   o.add(buildTargetPool());
   o.add(buildTargetPool());
   return o;
 }
 
-checkUnnamed2565(core.List<api.TargetPool> o) {
+checkUnnamed2590(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPool(o[0]);
   checkTargetPool(o[1]);
@@ -12900,14 +12900,14 @@
   buildCounterTargetPoolsScopedListWarningData--;
 }
 
-buildUnnamed2566() {
+buildUnnamed2591() {
   var o = new core.List<api.TargetPoolsScopedListWarningData>();
   o.add(buildTargetPoolsScopedListWarningData());
   o.add(buildTargetPoolsScopedListWarningData());
   return o;
 }
 
-checkUnnamed2566(core.List<api.TargetPoolsScopedListWarningData> o) {
+checkUnnamed2591(core.List<api.TargetPoolsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolsScopedListWarningData(o[0]);
   checkTargetPoolsScopedListWarningData(o[1]);
@@ -12919,7 +12919,7 @@
   buildCounterTargetPoolsScopedListWarning++;
   if (buildCounterTargetPoolsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2566();
+    o.data = buildUnnamed2591();
     o.message = "foo";
   }
   buildCounterTargetPoolsScopedListWarning--;
@@ -12930,7 +12930,7 @@
   buildCounterTargetPoolsScopedListWarning++;
   if (buildCounterTargetPoolsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2566(o.data);
+    checkUnnamed2591(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetPoolsScopedListWarning--;
@@ -12941,7 +12941,7 @@
   var o = new api.TargetPoolsScopedList();
   buildCounterTargetPoolsScopedList++;
   if (buildCounterTargetPoolsScopedList < 3) {
-    o.targetPools = buildUnnamed2565();
+    o.targetPools = buildUnnamed2590();
     o.warning = buildTargetPoolsScopedListWarning();
   }
   buildCounterTargetPoolsScopedList--;
@@ -12951,7 +12951,7 @@
 checkTargetPoolsScopedList(api.TargetPoolsScopedList o) {
   buildCounterTargetPoolsScopedList++;
   if (buildCounterTargetPoolsScopedList < 3) {
-    checkUnnamed2565(o.targetPools);
+    checkUnnamed2590(o.targetPools);
     checkTargetPoolsScopedListWarning(o.warning);
   }
   buildCounterTargetPoolsScopedList--;
@@ -13016,14 +13016,14 @@
   buildCounterTargetSslProxiesSetProxyHeaderRequest--;
 }
 
-buildUnnamed2567() {
+buildUnnamed2592() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2567(core.List<core.String> o) {
+checkUnnamed2592(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -13034,7 +13034,7 @@
   var o = new api.TargetSslProxiesSetSslCertificatesRequest();
   buildCounterTargetSslProxiesSetSslCertificatesRequest++;
   if (buildCounterTargetSslProxiesSetSslCertificatesRequest < 3) {
-    o.sslCertificates = buildUnnamed2567();
+    o.sslCertificates = buildUnnamed2592();
   }
   buildCounterTargetSslProxiesSetSslCertificatesRequest--;
   return o;
@@ -13044,19 +13044,19 @@
     api.TargetSslProxiesSetSslCertificatesRequest o) {
   buildCounterTargetSslProxiesSetSslCertificatesRequest++;
   if (buildCounterTargetSslProxiesSetSslCertificatesRequest < 3) {
-    checkUnnamed2567(o.sslCertificates);
+    checkUnnamed2592(o.sslCertificates);
   }
   buildCounterTargetSslProxiesSetSslCertificatesRequest--;
 }
 
-buildUnnamed2568() {
+buildUnnamed2593() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2568(core.List<core.String> o) {
+checkUnnamed2593(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -13075,7 +13075,7 @@
     o.proxyHeader = "foo";
     o.selfLink = "foo";
     o.service = "foo";
-    o.sslCertificates = buildUnnamed2568();
+    o.sslCertificates = buildUnnamed2593();
   }
   buildCounterTargetSslProxy--;
   return o;
@@ -13092,19 +13092,19 @@
     unittest.expect(o.proxyHeader, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.service, unittest.equals('foo'));
-    checkUnnamed2568(o.sslCertificates);
+    checkUnnamed2593(o.sslCertificates);
   }
   buildCounterTargetSslProxy--;
 }
 
-buildUnnamed2569() {
+buildUnnamed2594() {
   var o = new core.List<api.TargetSslProxy>();
   o.add(buildTargetSslProxy());
   o.add(buildTargetSslProxy());
   return o;
 }
 
-checkUnnamed2569(core.List<api.TargetSslProxy> o) {
+checkUnnamed2594(core.List<api.TargetSslProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetSslProxy(o[0]);
   checkTargetSslProxy(o[1]);
@@ -13131,14 +13131,14 @@
   buildCounterTargetSslProxyListWarningData--;
 }
 
-buildUnnamed2570() {
+buildUnnamed2595() {
   var o = new core.List<api.TargetSslProxyListWarningData>();
   o.add(buildTargetSslProxyListWarningData());
   o.add(buildTargetSslProxyListWarningData());
   return o;
 }
 
-checkUnnamed2570(core.List<api.TargetSslProxyListWarningData> o) {
+checkUnnamed2595(core.List<api.TargetSslProxyListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetSslProxyListWarningData(o[0]);
   checkTargetSslProxyListWarningData(o[1]);
@@ -13150,7 +13150,7 @@
   buildCounterTargetSslProxyListWarning++;
   if (buildCounterTargetSslProxyListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2570();
+    o.data = buildUnnamed2595();
     o.message = "foo";
   }
   buildCounterTargetSslProxyListWarning--;
@@ -13161,7 +13161,7 @@
   buildCounterTargetSslProxyListWarning++;
   if (buildCounterTargetSslProxyListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2570(o.data);
+    checkUnnamed2595(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetSslProxyListWarning--;
@@ -13173,7 +13173,7 @@
   buildCounterTargetSslProxyList++;
   if (buildCounterTargetSslProxyList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2569();
+    o.items = buildUnnamed2594();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -13187,7 +13187,7 @@
   buildCounterTargetSslProxyList++;
   if (buildCounterTargetSslProxyList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2569(o.items);
+    checkUnnamed2594(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -13269,14 +13269,14 @@
   buildCounterTargetTcpProxy--;
 }
 
-buildUnnamed2571() {
+buildUnnamed2596() {
   var o = new core.List<api.TargetTcpProxy>();
   o.add(buildTargetTcpProxy());
   o.add(buildTargetTcpProxy());
   return o;
 }
 
-checkUnnamed2571(core.List<api.TargetTcpProxy> o) {
+checkUnnamed2596(core.List<api.TargetTcpProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetTcpProxy(o[0]);
   checkTargetTcpProxy(o[1]);
@@ -13303,14 +13303,14 @@
   buildCounterTargetTcpProxyListWarningData--;
 }
 
-buildUnnamed2572() {
+buildUnnamed2597() {
   var o = new core.List<api.TargetTcpProxyListWarningData>();
   o.add(buildTargetTcpProxyListWarningData());
   o.add(buildTargetTcpProxyListWarningData());
   return o;
 }
 
-checkUnnamed2572(core.List<api.TargetTcpProxyListWarningData> o) {
+checkUnnamed2597(core.List<api.TargetTcpProxyListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetTcpProxyListWarningData(o[0]);
   checkTargetTcpProxyListWarningData(o[1]);
@@ -13322,7 +13322,7 @@
   buildCounterTargetTcpProxyListWarning++;
   if (buildCounterTargetTcpProxyListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2572();
+    o.data = buildUnnamed2597();
     o.message = "foo";
   }
   buildCounterTargetTcpProxyListWarning--;
@@ -13333,7 +13333,7 @@
   buildCounterTargetTcpProxyListWarning++;
   if (buildCounterTargetTcpProxyListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2572(o.data);
+    checkUnnamed2597(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetTcpProxyListWarning--;
@@ -13345,7 +13345,7 @@
   buildCounterTargetTcpProxyList++;
   if (buildCounterTargetTcpProxyList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2571();
+    o.items = buildUnnamed2596();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -13359,7 +13359,7 @@
   buildCounterTargetTcpProxyList++;
   if (buildCounterTargetTcpProxyList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2571(o.items);
+    checkUnnamed2596(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -13368,27 +13368,27 @@
   buildCounterTargetTcpProxyList--;
 }
 
-buildUnnamed2573() {
+buildUnnamed2598() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2573(core.List<core.String> o) {
+checkUnnamed2598(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2574() {
+buildUnnamed2599() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2574(core.List<core.String> o) {
+checkUnnamed2599(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -13401,7 +13401,7 @@
   if (buildCounterTargetVpnGateway < 3) {
     o.creationTimestamp = "foo";
     o.description = "foo";
-    o.forwardingRules = buildUnnamed2573();
+    o.forwardingRules = buildUnnamed2598();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -13409,7 +13409,7 @@
     o.region = "foo";
     o.selfLink = "foo";
     o.status = "foo";
-    o.tunnels = buildUnnamed2574();
+    o.tunnels = buildUnnamed2599();
   }
   buildCounterTargetVpnGateway--;
   return o;
@@ -13420,7 +13420,7 @@
   if (buildCounterTargetVpnGateway < 3) {
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2573(o.forwardingRules);
+    checkUnnamed2598(o.forwardingRules);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -13428,19 +13428,19 @@
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed2574(o.tunnels);
+    checkUnnamed2599(o.tunnels);
   }
   buildCounterTargetVpnGateway--;
 }
 
-buildUnnamed2575() {
+buildUnnamed2600() {
   var o = new core.Map<core.String, api.TargetVpnGatewaysScopedList>();
   o["x"] = buildTargetVpnGatewaysScopedList();
   o["y"] = buildTargetVpnGatewaysScopedList();
   return o;
 }
 
-checkUnnamed2575(core.Map<core.String, api.TargetVpnGatewaysScopedList> o) {
+checkUnnamed2600(core.Map<core.String, api.TargetVpnGatewaysScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetVpnGatewaysScopedList(o["x"]);
   checkTargetVpnGatewaysScopedList(o["y"]);
@@ -13468,14 +13468,14 @@
   buildCounterTargetVpnGatewayAggregatedListWarningData--;
 }
 
-buildUnnamed2576() {
+buildUnnamed2601() {
   var o = new core.List<api.TargetVpnGatewayAggregatedListWarningData>();
   o.add(buildTargetVpnGatewayAggregatedListWarningData());
   o.add(buildTargetVpnGatewayAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2576(core.List<api.TargetVpnGatewayAggregatedListWarningData> o) {
+checkUnnamed2601(core.List<api.TargetVpnGatewayAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetVpnGatewayAggregatedListWarningData(o[0]);
   checkTargetVpnGatewayAggregatedListWarningData(o[1]);
@@ -13487,7 +13487,7 @@
   buildCounterTargetVpnGatewayAggregatedListWarning++;
   if (buildCounterTargetVpnGatewayAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2576();
+    o.data = buildUnnamed2601();
     o.message = "foo";
   }
   buildCounterTargetVpnGatewayAggregatedListWarning--;
@@ -13499,7 +13499,7 @@
   buildCounterTargetVpnGatewayAggregatedListWarning++;
   if (buildCounterTargetVpnGatewayAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2576(o.data);
+    checkUnnamed2601(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetVpnGatewayAggregatedListWarning--;
@@ -13511,7 +13511,7 @@
   buildCounterTargetVpnGatewayAggregatedList++;
   if (buildCounterTargetVpnGatewayAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2575();
+    o.items = buildUnnamed2600();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -13525,7 +13525,7 @@
   buildCounterTargetVpnGatewayAggregatedList++;
   if (buildCounterTargetVpnGatewayAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2575(o.items);
+    checkUnnamed2600(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -13534,14 +13534,14 @@
   buildCounterTargetVpnGatewayAggregatedList--;
 }
 
-buildUnnamed2577() {
+buildUnnamed2602() {
   var o = new core.List<api.TargetVpnGateway>();
   o.add(buildTargetVpnGateway());
   o.add(buildTargetVpnGateway());
   return o;
 }
 
-checkUnnamed2577(core.List<api.TargetVpnGateway> o) {
+checkUnnamed2602(core.List<api.TargetVpnGateway> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetVpnGateway(o[0]);
   checkTargetVpnGateway(o[1]);
@@ -13568,14 +13568,14 @@
   buildCounterTargetVpnGatewayListWarningData--;
 }
 
-buildUnnamed2578() {
+buildUnnamed2603() {
   var o = new core.List<api.TargetVpnGatewayListWarningData>();
   o.add(buildTargetVpnGatewayListWarningData());
   o.add(buildTargetVpnGatewayListWarningData());
   return o;
 }
 
-checkUnnamed2578(core.List<api.TargetVpnGatewayListWarningData> o) {
+checkUnnamed2603(core.List<api.TargetVpnGatewayListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetVpnGatewayListWarningData(o[0]);
   checkTargetVpnGatewayListWarningData(o[1]);
@@ -13587,7 +13587,7 @@
   buildCounterTargetVpnGatewayListWarning++;
   if (buildCounterTargetVpnGatewayListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2578();
+    o.data = buildUnnamed2603();
     o.message = "foo";
   }
   buildCounterTargetVpnGatewayListWarning--;
@@ -13598,7 +13598,7 @@
   buildCounterTargetVpnGatewayListWarning++;
   if (buildCounterTargetVpnGatewayListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2578(o.data);
+    checkUnnamed2603(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetVpnGatewayListWarning--;
@@ -13610,7 +13610,7 @@
   buildCounterTargetVpnGatewayList++;
   if (buildCounterTargetVpnGatewayList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2577();
+    o.items = buildUnnamed2602();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -13624,7 +13624,7 @@
   buildCounterTargetVpnGatewayList++;
   if (buildCounterTargetVpnGatewayList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2577(o.items);
+    checkUnnamed2602(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -13633,14 +13633,14 @@
   buildCounterTargetVpnGatewayList--;
 }
 
-buildUnnamed2579() {
+buildUnnamed2604() {
   var o = new core.List<api.TargetVpnGateway>();
   o.add(buildTargetVpnGateway());
   o.add(buildTargetVpnGateway());
   return o;
 }
 
-checkUnnamed2579(core.List<api.TargetVpnGateway> o) {
+checkUnnamed2604(core.List<api.TargetVpnGateway> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetVpnGateway(o[0]);
   checkTargetVpnGateway(o[1]);
@@ -13668,14 +13668,14 @@
   buildCounterTargetVpnGatewaysScopedListWarningData--;
 }
 
-buildUnnamed2580() {
+buildUnnamed2605() {
   var o = new core.List<api.TargetVpnGatewaysScopedListWarningData>();
   o.add(buildTargetVpnGatewaysScopedListWarningData());
   o.add(buildTargetVpnGatewaysScopedListWarningData());
   return o;
 }
 
-checkUnnamed2580(core.List<api.TargetVpnGatewaysScopedListWarningData> o) {
+checkUnnamed2605(core.List<api.TargetVpnGatewaysScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetVpnGatewaysScopedListWarningData(o[0]);
   checkTargetVpnGatewaysScopedListWarningData(o[1]);
@@ -13687,7 +13687,7 @@
   buildCounterTargetVpnGatewaysScopedListWarning++;
   if (buildCounterTargetVpnGatewaysScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2580();
+    o.data = buildUnnamed2605();
     o.message = "foo";
   }
   buildCounterTargetVpnGatewaysScopedListWarning--;
@@ -13699,7 +13699,7 @@
   buildCounterTargetVpnGatewaysScopedListWarning++;
   if (buildCounterTargetVpnGatewaysScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2580(o.data);
+    checkUnnamed2605(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetVpnGatewaysScopedListWarning--;
@@ -13710,7 +13710,7 @@
   var o = new api.TargetVpnGatewaysScopedList();
   buildCounterTargetVpnGatewaysScopedList++;
   if (buildCounterTargetVpnGatewaysScopedList < 3) {
-    o.targetVpnGateways = buildUnnamed2579();
+    o.targetVpnGateways = buildUnnamed2604();
     o.warning = buildTargetVpnGatewaysScopedListWarning();
   }
   buildCounterTargetVpnGatewaysScopedList--;
@@ -13720,7 +13720,7 @@
 checkTargetVpnGatewaysScopedList(api.TargetVpnGatewaysScopedList o) {
   buildCounterTargetVpnGatewaysScopedList++;
   if (buildCounterTargetVpnGatewaysScopedList < 3) {
-    checkUnnamed2579(o.targetVpnGateways);
+    checkUnnamed2604(o.targetVpnGateways);
     checkTargetVpnGatewaysScopedListWarning(o.warning);
   }
   buildCounterTargetVpnGatewaysScopedList--;
@@ -13751,40 +13751,40 @@
   buildCounterTestFailure--;
 }
 
-buildUnnamed2581() {
+buildUnnamed2606() {
   var o = new core.List<api.HostRule>();
   o.add(buildHostRule());
   o.add(buildHostRule());
   return o;
 }
 
-checkUnnamed2581(core.List<api.HostRule> o) {
+checkUnnamed2606(core.List<api.HostRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHostRule(o[0]);
   checkHostRule(o[1]);
 }
 
-buildUnnamed2582() {
+buildUnnamed2607() {
   var o = new core.List<api.PathMatcher>();
   o.add(buildPathMatcher());
   o.add(buildPathMatcher());
   return o;
 }
 
-checkUnnamed2582(core.List<api.PathMatcher> o) {
+checkUnnamed2607(core.List<api.PathMatcher> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathMatcher(o[0]);
   checkPathMatcher(o[1]);
 }
 
-buildUnnamed2583() {
+buildUnnamed2608() {
   var o = new core.List<api.UrlMapTest>();
   o.add(buildUrlMapTest());
   o.add(buildUrlMapTest());
   return o;
 }
 
-checkUnnamed2583(core.List<api.UrlMapTest> o) {
+checkUnnamed2608(core.List<api.UrlMapTest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMapTest(o[0]);
   checkUrlMapTest(o[1]);
@@ -13799,13 +13799,13 @@
     o.defaultService = "foo";
     o.description = "foo";
     o.fingerprint = "foo";
-    o.hostRules = buildUnnamed2581();
+    o.hostRules = buildUnnamed2606();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.pathMatchers = buildUnnamed2582();
+    o.pathMatchers = buildUnnamed2607();
     o.selfLink = "foo";
-    o.tests = buildUnnamed2583();
+    o.tests = buildUnnamed2608();
   }
   buildCounterUrlMap--;
   return o;
@@ -13818,25 +13818,25 @@
     unittest.expect(o.defaultService, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2581(o.hostRules);
+    checkUnnamed2606(o.hostRules);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2582(o.pathMatchers);
+    checkUnnamed2607(o.pathMatchers);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2583(o.tests);
+    checkUnnamed2608(o.tests);
   }
   buildCounterUrlMap--;
 }
 
-buildUnnamed2584() {
+buildUnnamed2609() {
   var o = new core.List<api.UrlMap>();
   o.add(buildUrlMap());
   o.add(buildUrlMap());
   return o;
 }
 
-checkUnnamed2584(core.List<api.UrlMap> o) {
+checkUnnamed2609(core.List<api.UrlMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMap(o[0]);
   checkUrlMap(o[1]);
@@ -13863,14 +13863,14 @@
   buildCounterUrlMapListWarningData--;
 }
 
-buildUnnamed2585() {
+buildUnnamed2610() {
   var o = new core.List<api.UrlMapListWarningData>();
   o.add(buildUrlMapListWarningData());
   o.add(buildUrlMapListWarningData());
   return o;
 }
 
-checkUnnamed2585(core.List<api.UrlMapListWarningData> o) {
+checkUnnamed2610(core.List<api.UrlMapListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMapListWarningData(o[0]);
   checkUrlMapListWarningData(o[1]);
@@ -13882,7 +13882,7 @@
   buildCounterUrlMapListWarning++;
   if (buildCounterUrlMapListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2585();
+    o.data = buildUnnamed2610();
     o.message = "foo";
   }
   buildCounterUrlMapListWarning--;
@@ -13893,7 +13893,7 @@
   buildCounterUrlMapListWarning++;
   if (buildCounterUrlMapListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2585(o.data);
+    checkUnnamed2610(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterUrlMapListWarning--;
@@ -13905,7 +13905,7 @@
   buildCounterUrlMapList++;
   if (buildCounterUrlMapList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2584();
+    o.items = buildUnnamed2609();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -13919,7 +13919,7 @@
   buildCounterUrlMapList++;
   if (buildCounterUrlMapList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2584(o.items);
+    checkUnnamed2609(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -13972,27 +13972,27 @@
   buildCounterUrlMapTest--;
 }
 
-buildUnnamed2586() {
+buildUnnamed2611() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2586(core.List<core.String> o) {
+checkUnnamed2611(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2587() {
+buildUnnamed2612() {
   var o = new core.List<api.TestFailure>();
   o.add(buildTestFailure());
   o.add(buildTestFailure());
   return o;
 }
 
-checkUnnamed2587(core.List<api.TestFailure> o) {
+checkUnnamed2612(core.List<api.TestFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTestFailure(o[0]);
   checkTestFailure(o[1]);
@@ -14003,9 +14003,9 @@
   var o = new api.UrlMapValidationResult();
   buildCounterUrlMapValidationResult++;
   if (buildCounterUrlMapValidationResult < 3) {
-    o.loadErrors = buildUnnamed2586();
+    o.loadErrors = buildUnnamed2611();
     o.loadSucceeded = true;
-    o.testFailures = buildUnnamed2587();
+    o.testFailures = buildUnnamed2612();
     o.testPassed = true;
   }
   buildCounterUrlMapValidationResult--;
@@ -14015,9 +14015,9 @@
 checkUrlMapValidationResult(api.UrlMapValidationResult o) {
   buildCounterUrlMapValidationResult++;
   if (buildCounterUrlMapValidationResult < 3) {
-    checkUnnamed2586(o.loadErrors);
+    checkUnnamed2611(o.loadErrors);
     unittest.expect(o.loadSucceeded, unittest.isTrue);
-    checkUnnamed2587(o.testFailures);
+    checkUnnamed2612(o.testFailures);
     unittest.expect(o.testPassed, unittest.isTrue);
   }
   buildCounterUrlMapValidationResult--;
@@ -14082,27 +14082,27 @@
   buildCounterUsageExportLocation--;
 }
 
-buildUnnamed2588() {
+buildUnnamed2613() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2588(core.List<core.String> o) {
+checkUnnamed2613(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2589() {
+buildUnnamed2614() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2589(core.List<core.String> o) {
+checkUnnamed2614(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -14119,11 +14119,11 @@
     o.id = "foo";
     o.ikeVersion = 42;
     o.kind = "foo";
-    o.localTrafficSelector = buildUnnamed2588();
+    o.localTrafficSelector = buildUnnamed2613();
     o.name = "foo";
     o.peerIp = "foo";
     o.region = "foo";
-    o.remoteTrafficSelector = buildUnnamed2589();
+    o.remoteTrafficSelector = buildUnnamed2614();
     o.router = "foo";
     o.selfLink = "foo";
     o.sharedSecret = "foo";
@@ -14144,11 +14144,11 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.ikeVersion, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2588(o.localTrafficSelector);
+    checkUnnamed2613(o.localTrafficSelector);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.peerIp, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed2589(o.remoteTrafficSelector);
+    checkUnnamed2614(o.remoteTrafficSelector);
     unittest.expect(o.router, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.sharedSecret, unittest.equals('foo'));
@@ -14159,14 +14159,14 @@
   buildCounterVpnTunnel--;
 }
 
-buildUnnamed2590() {
+buildUnnamed2615() {
   var o = new core.Map<core.String, api.VpnTunnelsScopedList>();
   o["x"] = buildVpnTunnelsScopedList();
   o["y"] = buildVpnTunnelsScopedList();
   return o;
 }
 
-checkUnnamed2590(core.Map<core.String, api.VpnTunnelsScopedList> o) {
+checkUnnamed2615(core.Map<core.String, api.VpnTunnelsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVpnTunnelsScopedList(o["x"]);
   checkVpnTunnelsScopedList(o["y"]);
@@ -14194,14 +14194,14 @@
   buildCounterVpnTunnelAggregatedListWarningData--;
 }
 
-buildUnnamed2591() {
+buildUnnamed2616() {
   var o = new core.List<api.VpnTunnelAggregatedListWarningData>();
   o.add(buildVpnTunnelAggregatedListWarningData());
   o.add(buildVpnTunnelAggregatedListWarningData());
   return o;
 }
 
-checkUnnamed2591(core.List<api.VpnTunnelAggregatedListWarningData> o) {
+checkUnnamed2616(core.List<api.VpnTunnelAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVpnTunnelAggregatedListWarningData(o[0]);
   checkVpnTunnelAggregatedListWarningData(o[1]);
@@ -14213,7 +14213,7 @@
   buildCounterVpnTunnelAggregatedListWarning++;
   if (buildCounterVpnTunnelAggregatedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2591();
+    o.data = buildUnnamed2616();
     o.message = "foo";
   }
   buildCounterVpnTunnelAggregatedListWarning--;
@@ -14224,7 +14224,7 @@
   buildCounterVpnTunnelAggregatedListWarning++;
   if (buildCounterVpnTunnelAggregatedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2591(o.data);
+    checkUnnamed2616(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterVpnTunnelAggregatedListWarning--;
@@ -14236,7 +14236,7 @@
   buildCounterVpnTunnelAggregatedList++;
   if (buildCounterVpnTunnelAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2590();
+    o.items = buildUnnamed2615();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -14250,7 +14250,7 @@
   buildCounterVpnTunnelAggregatedList++;
   if (buildCounterVpnTunnelAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2590(o.items);
+    checkUnnamed2615(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -14259,14 +14259,14 @@
   buildCounterVpnTunnelAggregatedList--;
 }
 
-buildUnnamed2592() {
+buildUnnamed2617() {
   var o = new core.List<api.VpnTunnel>();
   o.add(buildVpnTunnel());
   o.add(buildVpnTunnel());
   return o;
 }
 
-checkUnnamed2592(core.List<api.VpnTunnel> o) {
+checkUnnamed2617(core.List<api.VpnTunnel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVpnTunnel(o[0]);
   checkVpnTunnel(o[1]);
@@ -14293,14 +14293,14 @@
   buildCounterVpnTunnelListWarningData--;
 }
 
-buildUnnamed2593() {
+buildUnnamed2618() {
   var o = new core.List<api.VpnTunnelListWarningData>();
   o.add(buildVpnTunnelListWarningData());
   o.add(buildVpnTunnelListWarningData());
   return o;
 }
 
-checkUnnamed2593(core.List<api.VpnTunnelListWarningData> o) {
+checkUnnamed2618(core.List<api.VpnTunnelListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVpnTunnelListWarningData(o[0]);
   checkVpnTunnelListWarningData(o[1]);
@@ -14312,7 +14312,7 @@
   buildCounterVpnTunnelListWarning++;
   if (buildCounterVpnTunnelListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2593();
+    o.data = buildUnnamed2618();
     o.message = "foo";
   }
   buildCounterVpnTunnelListWarning--;
@@ -14323,7 +14323,7 @@
   buildCounterVpnTunnelListWarning++;
   if (buildCounterVpnTunnelListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2593(o.data);
+    checkUnnamed2618(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterVpnTunnelListWarning--;
@@ -14335,7 +14335,7 @@
   buildCounterVpnTunnelList++;
   if (buildCounterVpnTunnelList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2592();
+    o.items = buildUnnamed2617();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -14349,7 +14349,7 @@
   buildCounterVpnTunnelList++;
   if (buildCounterVpnTunnelList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2592(o.items);
+    checkUnnamed2617(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -14358,14 +14358,14 @@
   buildCounterVpnTunnelList--;
 }
 
-buildUnnamed2594() {
+buildUnnamed2619() {
   var o = new core.List<api.VpnTunnel>();
   o.add(buildVpnTunnel());
   o.add(buildVpnTunnel());
   return o;
 }
 
-checkUnnamed2594(core.List<api.VpnTunnel> o) {
+checkUnnamed2619(core.List<api.VpnTunnel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVpnTunnel(o[0]);
   checkVpnTunnel(o[1]);
@@ -14392,14 +14392,14 @@
   buildCounterVpnTunnelsScopedListWarningData--;
 }
 
-buildUnnamed2595() {
+buildUnnamed2620() {
   var o = new core.List<api.VpnTunnelsScopedListWarningData>();
   o.add(buildVpnTunnelsScopedListWarningData());
   o.add(buildVpnTunnelsScopedListWarningData());
   return o;
 }
 
-checkUnnamed2595(core.List<api.VpnTunnelsScopedListWarningData> o) {
+checkUnnamed2620(core.List<api.VpnTunnelsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVpnTunnelsScopedListWarningData(o[0]);
   checkVpnTunnelsScopedListWarningData(o[1]);
@@ -14411,7 +14411,7 @@
   buildCounterVpnTunnelsScopedListWarning++;
   if (buildCounterVpnTunnelsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2595();
+    o.data = buildUnnamed2620();
     o.message = "foo";
   }
   buildCounterVpnTunnelsScopedListWarning--;
@@ -14422,7 +14422,7 @@
   buildCounterVpnTunnelsScopedListWarning++;
   if (buildCounterVpnTunnelsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2595(o.data);
+    checkUnnamed2620(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterVpnTunnelsScopedListWarning--;
@@ -14433,7 +14433,7 @@
   var o = new api.VpnTunnelsScopedList();
   buildCounterVpnTunnelsScopedList++;
   if (buildCounterVpnTunnelsScopedList < 3) {
-    o.vpnTunnels = buildUnnamed2594();
+    o.vpnTunnels = buildUnnamed2619();
     o.warning = buildVpnTunnelsScopedListWarning();
   }
   buildCounterVpnTunnelsScopedList--;
@@ -14443,20 +14443,20 @@
 checkVpnTunnelsScopedList(api.VpnTunnelsScopedList o) {
   buildCounterVpnTunnelsScopedList++;
   if (buildCounterVpnTunnelsScopedList < 3) {
-    checkUnnamed2594(o.vpnTunnels);
+    checkUnnamed2619(o.vpnTunnels);
     checkVpnTunnelsScopedListWarning(o.warning);
   }
   buildCounterVpnTunnelsScopedList--;
 }
 
-buildUnnamed2596() {
+buildUnnamed2621() {
   var o = new core.List<api.Project>();
   o.add(buildProject());
   o.add(buildProject());
   return o;
 }
 
-checkUnnamed2596(core.List<api.Project> o) {
+checkUnnamed2621(core.List<api.Project> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProject(o[0]);
   checkProject(o[1]);
@@ -14483,14 +14483,14 @@
   buildCounterXpnHostListWarningData--;
 }
 
-buildUnnamed2597() {
+buildUnnamed2622() {
   var o = new core.List<api.XpnHostListWarningData>();
   o.add(buildXpnHostListWarningData());
   o.add(buildXpnHostListWarningData());
   return o;
 }
 
-checkUnnamed2597(core.List<api.XpnHostListWarningData> o) {
+checkUnnamed2622(core.List<api.XpnHostListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkXpnHostListWarningData(o[0]);
   checkXpnHostListWarningData(o[1]);
@@ -14502,7 +14502,7 @@
   buildCounterXpnHostListWarning++;
   if (buildCounterXpnHostListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2597();
+    o.data = buildUnnamed2622();
     o.message = "foo";
   }
   buildCounterXpnHostListWarning--;
@@ -14513,7 +14513,7 @@
   buildCounterXpnHostListWarning++;
   if (buildCounterXpnHostListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2597(o.data);
+    checkUnnamed2622(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterXpnHostListWarning--;
@@ -14525,7 +14525,7 @@
   buildCounterXpnHostList++;
   if (buildCounterXpnHostList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2596();
+    o.items = buildUnnamed2621();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -14539,7 +14539,7 @@
   buildCounterXpnHostList++;
   if (buildCounterXpnHostList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2596(o.items);
+    checkUnnamed2621(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -14569,14 +14569,14 @@
   buildCounterXpnResourceId--;
 }
 
-buildUnnamed2598() {
+buildUnnamed2623() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2598(core.List<core.String> o) {
+checkUnnamed2623(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -14587,7 +14587,7 @@
   var o = new api.Zone();
   buildCounterZone++;
   if (buildCounterZone < 3) {
-    o.availableCpuPlatforms = buildUnnamed2598();
+    o.availableCpuPlatforms = buildUnnamed2623();
     o.creationTimestamp = "foo";
     o.deprecated = buildDeprecationStatus();
     o.description = "foo";
@@ -14605,7 +14605,7 @@
 checkZone(api.Zone o) {
   buildCounterZone++;
   if (buildCounterZone < 3) {
-    checkUnnamed2598(o.availableCpuPlatforms);
+    checkUnnamed2623(o.availableCpuPlatforms);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     checkDeprecationStatus(o.deprecated);
     unittest.expect(o.description, unittest.equals('foo'));
@@ -14619,14 +14619,14 @@
   buildCounterZone--;
 }
 
-buildUnnamed2599() {
+buildUnnamed2624() {
   var o = new core.List<api.Zone>();
   o.add(buildZone());
   o.add(buildZone());
   return o;
 }
 
-checkUnnamed2599(core.List<api.Zone> o) {
+checkUnnamed2624(core.List<api.Zone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZone(o[0]);
   checkZone(o[1]);
@@ -14653,14 +14653,14 @@
   buildCounterZoneListWarningData--;
 }
 
-buildUnnamed2600() {
+buildUnnamed2625() {
   var o = new core.List<api.ZoneListWarningData>();
   o.add(buildZoneListWarningData());
   o.add(buildZoneListWarningData());
   return o;
 }
 
-checkUnnamed2600(core.List<api.ZoneListWarningData> o) {
+checkUnnamed2625(core.List<api.ZoneListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZoneListWarningData(o[0]);
   checkZoneListWarningData(o[1]);
@@ -14672,7 +14672,7 @@
   buildCounterZoneListWarning++;
   if (buildCounterZoneListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2600();
+    o.data = buildUnnamed2625();
     o.message = "foo";
   }
   buildCounterZoneListWarning--;
@@ -14683,7 +14683,7 @@
   buildCounterZoneListWarning++;
   if (buildCounterZoneListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2600(o.data);
+    checkUnnamed2625(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterZoneListWarning--;
@@ -14695,7 +14695,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2599();
+    o.items = buildUnnamed2624();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -14709,7 +14709,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2599(o.items);
+    checkUnnamed2624(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -14718,14 +14718,14 @@
   buildCounterZoneList--;
 }
 
-buildUnnamed2601() {
+buildUnnamed2626() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2601(core.Map<core.String, core.String> o) {
+checkUnnamed2626(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'));
@@ -14737,7 +14737,7 @@
   buildCounterZoneSetLabelsRequest++;
   if (buildCounterZoneSetLabelsRequest < 3) {
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2601();
+    o.labels = buildUnnamed2626();
   }
   buildCounterZoneSetLabelsRequest--;
   return o;
@@ -14747,7 +14747,7 @@
   buildCounterZoneSetLabelsRequest++;
   if (buildCounterZoneSetLabelsRequest < 3) {
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2601(o.labels);
+    checkUnnamed2626(o.labels);
   }
   buildCounterZoneSetLabelsRequest--;
 }
diff --git a/generated/googleapis/test/consumersurveys/v2_test.dart b/generated/googleapis/test/consumersurveys/v2_test.dart
deleted file mode 100644
index 9dfee64..0000000
--- a/generated/googleapis/test/consumersurveys/v2_test.dart
+++ /dev/null
@@ -1,1526 +0,0 @@
-library googleapis.consumersurveys.v2.test;
-
-import "dart:core" as core;
-import "dart:async" as async;
-import "dart:convert" as convert;
-
-import 'package:http/http.dart' as http;
-import 'package:test/test.dart' as unittest;
-
-import 'package:googleapis/consumersurveys/v2.dart' as api;
-
-class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
-  core.bool _expectJson;
-
-  void register(core.Function callback, core.bool expectJson) {
-    _callback = callback;
-    _expectJson = expectJson;
-  }
-
-  async.Future<http.StreamedResponse> send(http.BaseRequest request) {
-    if (_expectJson) {
-      return request
-          .finalize()
-          .transform(convert.UTF8.decoder)
-          .join('')
-          .then((core.String jsonString) {
-        if (jsonString.isEmpty) {
-          return _callback(request, null);
-        } else {
-          return _callback(request, convert.JSON.decode(jsonString));
-        }
-      });
-    } else {
-      var stream = request.finalize();
-      if (stream == null) {
-        return _callback(request, []);
-      } else {
-        return stream.toBytes().then((data) {
-          return _callback(request, data);
-        });
-      }
-    }
-  }
-}
-
-http.StreamedResponse stringResponse(core.int status,
-    core.Map<core.String, core.String> headers, core.String body) {
-  var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
-  return new http.StreamedResponse(stream, status, headers: headers);
-}
-
-buildUnnamed55() {
-  var o = new core.List<api.FieldMask>();
-  o.add(buildFieldMask());
-  o.add(buildFieldMask());
-  return o;
-}
-
-checkUnnamed55(core.List<api.FieldMask> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkFieldMask(o[0]);
-  checkFieldMask(o[1]);
-}
-
-core.int buildCounterFieldMask = 0;
-buildFieldMask() {
-  var o = new api.FieldMask();
-  buildCounterFieldMask++;
-  if (buildCounterFieldMask < 3) {
-    o.fields = buildUnnamed55();
-    o.id = 42;
-  }
-  buildCounterFieldMask--;
-  return o;
-}
-
-checkFieldMask(api.FieldMask o) {
-  buildCounterFieldMask++;
-  if (buildCounterFieldMask < 3) {
-    checkUnnamed55(o.fields);
-    unittest.expect(o.id, unittest.equals(42));
-  }
-  buildCounterFieldMask--;
-}
-
-buildUnnamed56() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed56(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterMobileAppPanel = 0;
-buildMobileAppPanel() {
-  var o = new api.MobileAppPanel();
-  buildCounterMobileAppPanel++;
-  if (buildCounterMobileAppPanel < 3) {
-    o.country = "foo";
-    o.isPublicPanel = true;
-    o.language = "foo";
-    o.mobileAppPanelId = "foo";
-    o.name = "foo";
-    o.owners = buildUnnamed56();
-  }
-  buildCounterMobileAppPanel--;
-  return o;
-}
-
-checkMobileAppPanel(api.MobileAppPanel o) {
-  buildCounterMobileAppPanel++;
-  if (buildCounterMobileAppPanel < 3) {
-    unittest.expect(o.country, unittest.equals('foo'));
-    unittest.expect(o.isPublicPanel, unittest.isTrue);
-    unittest.expect(o.language, unittest.equals('foo'));
-    unittest.expect(o.mobileAppPanelId, unittest.equals('foo'));
-    unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed56(o.owners);
-  }
-  buildCounterMobileAppPanel--;
-}
-
-buildUnnamed57() {
-  var o = new core.List<api.MobileAppPanel>();
-  o.add(buildMobileAppPanel());
-  o.add(buildMobileAppPanel());
-  return o;
-}
-
-checkUnnamed57(core.List<api.MobileAppPanel> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkMobileAppPanel(o[0]);
-  checkMobileAppPanel(o[1]);
-}
-
-core.int buildCounterMobileAppPanelsListResponse = 0;
-buildMobileAppPanelsListResponse() {
-  var o = new api.MobileAppPanelsListResponse();
-  buildCounterMobileAppPanelsListResponse++;
-  if (buildCounterMobileAppPanelsListResponse < 3) {
-    o.pageInfo = buildPageInfo();
-    o.requestId = "foo";
-    o.resources = buildUnnamed57();
-    o.tokenPagination = buildTokenPagination();
-  }
-  buildCounterMobileAppPanelsListResponse--;
-  return o;
-}
-
-checkMobileAppPanelsListResponse(api.MobileAppPanelsListResponse o) {
-  buildCounterMobileAppPanelsListResponse++;
-  if (buildCounterMobileAppPanelsListResponse < 3) {
-    checkPageInfo(o.pageInfo);
-    unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed57(o.resources);
-    checkTokenPagination(o.tokenPagination);
-  }
-  buildCounterMobileAppPanelsListResponse--;
-}
-
-core.int buildCounterPageInfo = 0;
-buildPageInfo() {
-  var o = new api.PageInfo();
-  buildCounterPageInfo++;
-  if (buildCounterPageInfo < 3) {
-    o.resultPerPage = 42;
-    o.startIndex = 42;
-    o.totalResults = 42;
-  }
-  buildCounterPageInfo--;
-  return o;
-}
-
-checkPageInfo(api.PageInfo o) {
-  buildCounterPageInfo++;
-  if (buildCounterPageInfo < 3) {
-    unittest.expect(o.resultPerPage, unittest.equals(42));
-    unittest.expect(o.startIndex, unittest.equals(42));
-    unittest.expect(o.totalResults, unittest.equals(42));
-  }
-  buildCounterPageInfo--;
-}
-
-core.int buildCounterResultsGetRequest = 0;
-buildResultsGetRequest() {
-  var o = new api.ResultsGetRequest();
-  buildCounterResultsGetRequest++;
-  if (buildCounterResultsGetRequest < 3) {
-    o.resultMask = buildResultsMask();
-  }
-  buildCounterResultsGetRequest--;
-  return o;
-}
-
-checkResultsGetRequest(api.ResultsGetRequest o) {
-  buildCounterResultsGetRequest++;
-  if (buildCounterResultsGetRequest < 3) {
-    checkResultsMask(o.resultMask);
-  }
-  buildCounterResultsGetRequest--;
-}
-
-buildUnnamed58() {
-  var o = new core.List<api.FieldMask>();
-  o.add(buildFieldMask());
-  o.add(buildFieldMask());
-  return o;
-}
-
-checkUnnamed58(core.List<api.FieldMask> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkFieldMask(o[0]);
-  checkFieldMask(o[1]);
-}
-
-core.int buildCounterResultsMask = 0;
-buildResultsMask() {
-  var o = new api.ResultsMask();
-  buildCounterResultsMask++;
-  if (buildCounterResultsMask < 3) {
-    o.fields = buildUnnamed58();
-    o.projection = "foo";
-  }
-  buildCounterResultsMask--;
-  return o;
-}
-
-checkResultsMask(api.ResultsMask o) {
-  buildCounterResultsMask++;
-  if (buildCounterResultsMask < 3) {
-    checkUnnamed58(o.fields);
-    unittest.expect(o.projection, unittest.equals('foo'));
-  }
-  buildCounterResultsMask--;
-}
-
-buildUnnamed59() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed59(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed60() {
-  var o = new core.List<api.SurveyQuestion>();
-  o.add(buildSurveyQuestion());
-  o.add(buildSurveyQuestion());
-  return o;
-}
-
-checkUnnamed60(core.List<api.SurveyQuestion> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkSurveyQuestion(o[0]);
-  checkSurveyQuestion(o[1]);
-}
-
-core.int buildCounterSurvey = 0;
-buildSurvey() {
-  var o = new api.Survey();
-  buildCounterSurvey++;
-  if (buildCounterSurvey < 3) {
-    o.audience = buildSurveyAudience();
-    o.cost = buildSurveyCost();
-    o.customerData = "foo";
-    o.description = "foo";
-    o.owners = buildUnnamed59();
-    o.questions = buildUnnamed60();
-    o.rejectionReason = buildSurveyRejection();
-    o.state = "foo";
-    o.surveyUrlId = "foo";
-    o.title = "foo";
-    o.wantedResponseCount = 42;
-  }
-  buildCounterSurvey--;
-  return o;
-}
-
-checkSurvey(api.Survey o) {
-  buildCounterSurvey++;
-  if (buildCounterSurvey < 3) {
-    checkSurveyAudience(o.audience);
-    checkSurveyCost(o.cost);
-    unittest.expect(o.customerData, unittest.equals('foo'));
-    unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed59(o.owners);
-    checkUnnamed60(o.questions);
-    checkSurveyRejection(o.rejectionReason);
-    unittest.expect(o.state, unittest.equals('foo'));
-    unittest.expect(o.surveyUrlId, unittest.equals('foo'));
-    unittest.expect(o.title, unittest.equals('foo'));
-    unittest.expect(o.wantedResponseCount, unittest.equals(42));
-  }
-  buildCounterSurvey--;
-}
-
-buildUnnamed61() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed61(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed62() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed62(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterSurveyAudience = 0;
-buildSurveyAudience() {
-  var o = new api.SurveyAudience();
-  buildCounterSurveyAudience++;
-  if (buildCounterSurveyAudience < 3) {
-    o.ages = buildUnnamed61();
-    o.country = "foo";
-    o.countrySubdivision = "foo";
-    o.gender = "foo";
-    o.languages = buildUnnamed62();
-    o.mobileAppPanelId = "foo";
-    o.populationSource = "foo";
-  }
-  buildCounterSurveyAudience--;
-  return o;
-}
-
-checkSurveyAudience(api.SurveyAudience o) {
-  buildCounterSurveyAudience++;
-  if (buildCounterSurveyAudience < 3) {
-    checkUnnamed61(o.ages);
-    unittest.expect(o.country, unittest.equals('foo'));
-    unittest.expect(o.countrySubdivision, unittest.equals('foo'));
-    unittest.expect(o.gender, unittest.equals('foo'));
-    checkUnnamed62(o.languages);
-    unittest.expect(o.mobileAppPanelId, unittest.equals('foo'));
-    unittest.expect(o.populationSource, unittest.equals('foo'));
-  }
-  buildCounterSurveyAudience--;
-}
-
-core.int buildCounterSurveyCost = 0;
-buildSurveyCost() {
-  var o = new api.SurveyCost();
-  buildCounterSurveyCost++;
-  if (buildCounterSurveyCost < 3) {
-    o.costPerResponseNanos = "foo";
-    o.currencyCode = "foo";
-    o.maxCostPerResponseNanos = "foo";
-    o.nanos = "foo";
-  }
-  buildCounterSurveyCost--;
-  return o;
-}
-
-checkSurveyCost(api.SurveyCost o) {
-  buildCounterSurveyCost++;
-  if (buildCounterSurveyCost < 3) {
-    unittest.expect(o.costPerResponseNanos, unittest.equals('foo'));
-    unittest.expect(o.currencyCode, unittest.equals('foo'));
-    unittest.expect(o.maxCostPerResponseNanos, unittest.equals('foo'));
-    unittest.expect(o.nanos, unittest.equals('foo'));
-  }
-  buildCounterSurveyCost--;
-}
-
-buildUnnamed63() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed63(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed64() {
-  var o = new core.List<api.SurveyQuestionImage>();
-  o.add(buildSurveyQuestionImage());
-  o.add(buildSurveyQuestionImage());
-  return o;
-}
-
-checkUnnamed64(core.List<api.SurveyQuestionImage> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkSurveyQuestionImage(o[0]);
-  checkSurveyQuestionImage(o[1]);
-}
-
-buildUnnamed65() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed65(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed66() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed66(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterSurveyQuestion = 0;
-buildSurveyQuestion() {
-  var o = new api.SurveyQuestion();
-  buildCounterSurveyQuestion++;
-  if (buildCounterSurveyQuestion < 3) {
-    o.answerOrder = "foo";
-    o.answers = buildUnnamed63();
-    o.hasOther = true;
-    o.highValueLabel = "foo";
-    o.images = buildUnnamed64();
-    o.lastAnswerPositionPinned = true;
-    o.lowValueLabel = "foo";
-    o.mustPickSuggestion = true;
-    o.numStars = "foo";
-    o.openTextPlaceholder = "foo";
-    o.openTextSuggestions = buildUnnamed65();
-    o.question = "foo";
-    o.sentimentText = "foo";
-    o.singleLineResponse = true;
-    o.thresholdAnswers = buildUnnamed66();
-    o.type = "foo";
-    o.unitOfMeasurementLabel = "foo";
-    o.videoId = "foo";
-  }
-  buildCounterSurveyQuestion--;
-  return o;
-}
-
-checkSurveyQuestion(api.SurveyQuestion o) {
-  buildCounterSurveyQuestion++;
-  if (buildCounterSurveyQuestion < 3) {
-    unittest.expect(o.answerOrder, unittest.equals('foo'));
-    checkUnnamed63(o.answers);
-    unittest.expect(o.hasOther, unittest.isTrue);
-    unittest.expect(o.highValueLabel, unittest.equals('foo'));
-    checkUnnamed64(o.images);
-    unittest.expect(o.lastAnswerPositionPinned, unittest.isTrue);
-    unittest.expect(o.lowValueLabel, unittest.equals('foo'));
-    unittest.expect(o.mustPickSuggestion, unittest.isTrue);
-    unittest.expect(o.numStars, unittest.equals('foo'));
-    unittest.expect(o.openTextPlaceholder, unittest.equals('foo'));
-    checkUnnamed65(o.openTextSuggestions);
-    unittest.expect(o.question, unittest.equals('foo'));
-    unittest.expect(o.sentimentText, unittest.equals('foo'));
-    unittest.expect(o.singleLineResponse, unittest.isTrue);
-    checkUnnamed66(o.thresholdAnswers);
-    unittest.expect(o.type, unittest.equals('foo'));
-    unittest.expect(o.unitOfMeasurementLabel, unittest.equals('foo'));
-    unittest.expect(o.videoId, unittest.equals('foo'));
-  }
-  buildCounterSurveyQuestion--;
-}
-
-core.int buildCounterSurveyQuestionImage = 0;
-buildSurveyQuestionImage() {
-  var o = new api.SurveyQuestionImage();
-  buildCounterSurveyQuestionImage++;
-  if (buildCounterSurveyQuestionImage < 3) {
-    o.altText = "foo";
-    o.data = "foo";
-    o.url = "foo";
-  }
-  buildCounterSurveyQuestionImage--;
-  return o;
-}
-
-checkSurveyQuestionImage(api.SurveyQuestionImage o) {
-  buildCounterSurveyQuestionImage++;
-  if (buildCounterSurveyQuestionImage < 3) {
-    unittest.expect(o.altText, unittest.equals('foo'));
-    unittest.expect(o.data, unittest.equals('foo'));
-    unittest.expect(o.url, unittest.equals('foo'));
-  }
-  buildCounterSurveyQuestionImage--;
-}
-
-core.int buildCounterSurveyRejection = 0;
-buildSurveyRejection() {
-  var o = new api.SurveyRejection();
-  buildCounterSurveyRejection++;
-  if (buildCounterSurveyRejection < 3) {
-    o.explanation = "foo";
-    o.type = "foo";
-  }
-  buildCounterSurveyRejection--;
-  return o;
-}
-
-checkSurveyRejection(api.SurveyRejection o) {
-  buildCounterSurveyRejection++;
-  if (buildCounterSurveyRejection < 3) {
-    unittest.expect(o.explanation, unittest.equals('foo'));
-    unittest.expect(o.type, unittest.equals('foo'));
-  }
-  buildCounterSurveyRejection--;
-}
-
-core.int buildCounterSurveyResults = 0;
-buildSurveyResults() {
-  var o = new api.SurveyResults();
-  buildCounterSurveyResults++;
-  if (buildCounterSurveyResults < 3) {
-    o.status = "foo";
-    o.surveyUrlId = "foo";
-  }
-  buildCounterSurveyResults--;
-  return o;
-}
-
-checkSurveyResults(api.SurveyResults o) {
-  buildCounterSurveyResults++;
-  if (buildCounterSurveyResults < 3) {
-    unittest.expect(o.status, unittest.equals('foo'));
-    unittest.expect(o.surveyUrlId, unittest.equals('foo'));
-  }
-  buildCounterSurveyResults--;
-}
-
-core.int buildCounterSurveysDeleteResponse = 0;
-buildSurveysDeleteResponse() {
-  var o = new api.SurveysDeleteResponse();
-  buildCounterSurveysDeleteResponse++;
-  if (buildCounterSurveysDeleteResponse < 3) {
-    o.requestId = "foo";
-  }
-  buildCounterSurveysDeleteResponse--;
-  return o;
-}
-
-checkSurveysDeleteResponse(api.SurveysDeleteResponse o) {
-  buildCounterSurveysDeleteResponse++;
-  if (buildCounterSurveysDeleteResponse < 3) {
-    unittest.expect(o.requestId, unittest.equals('foo'));
-  }
-  buildCounterSurveysDeleteResponse--;
-}
-
-buildUnnamed67() {
-  var o = new core.List<api.Survey>();
-  o.add(buildSurvey());
-  o.add(buildSurvey());
-  return o;
-}
-
-checkUnnamed67(core.List<api.Survey> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkSurvey(o[0]);
-  checkSurvey(o[1]);
-}
-
-core.int buildCounterSurveysListResponse = 0;
-buildSurveysListResponse() {
-  var o = new api.SurveysListResponse();
-  buildCounterSurveysListResponse++;
-  if (buildCounterSurveysListResponse < 3) {
-    o.pageInfo = buildPageInfo();
-    o.requestId = "foo";
-    o.resources = buildUnnamed67();
-    o.tokenPagination = buildTokenPagination();
-  }
-  buildCounterSurveysListResponse--;
-  return o;
-}
-
-checkSurveysListResponse(api.SurveysListResponse o) {
-  buildCounterSurveysListResponse++;
-  if (buildCounterSurveysListResponse < 3) {
-    checkPageInfo(o.pageInfo);
-    unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed67(o.resources);
-    checkTokenPagination(o.tokenPagination);
-  }
-  buildCounterSurveysListResponse--;
-}
-
-core.int buildCounterSurveysStartRequest = 0;
-buildSurveysStartRequest() {
-  var o = new api.SurveysStartRequest();
-  buildCounterSurveysStartRequest++;
-  if (buildCounterSurveysStartRequest < 3) {
-    o.maxCostPerResponseNanos = "foo";
-  }
-  buildCounterSurveysStartRequest--;
-  return o;
-}
-
-checkSurveysStartRequest(api.SurveysStartRequest o) {
-  buildCounterSurveysStartRequest++;
-  if (buildCounterSurveysStartRequest < 3) {
-    unittest.expect(o.maxCostPerResponseNanos, unittest.equals('foo'));
-  }
-  buildCounterSurveysStartRequest--;
-}
-
-core.int buildCounterSurveysStartResponse = 0;
-buildSurveysStartResponse() {
-  var o = new api.SurveysStartResponse();
-  buildCounterSurveysStartResponse++;
-  if (buildCounterSurveysStartResponse < 3) {
-    o.requestId = "foo";
-  }
-  buildCounterSurveysStartResponse--;
-  return o;
-}
-
-checkSurveysStartResponse(api.SurveysStartResponse o) {
-  buildCounterSurveysStartResponse++;
-  if (buildCounterSurveysStartResponse < 3) {
-    unittest.expect(o.requestId, unittest.equals('foo'));
-  }
-  buildCounterSurveysStartResponse--;
-}
-
-core.int buildCounterSurveysStopResponse = 0;
-buildSurveysStopResponse() {
-  var o = new api.SurveysStopResponse();
-  buildCounterSurveysStopResponse++;
-  if (buildCounterSurveysStopResponse < 3) {
-    o.requestId = "foo";
-  }
-  buildCounterSurveysStopResponse--;
-  return o;
-}
-
-checkSurveysStopResponse(api.SurveysStopResponse o) {
-  buildCounterSurveysStopResponse++;
-  if (buildCounterSurveysStopResponse < 3) {
-    unittest.expect(o.requestId, unittest.equals('foo'));
-  }
-  buildCounterSurveysStopResponse--;
-}
-
-core.int buildCounterTokenPagination = 0;
-buildTokenPagination() {
-  var o = new api.TokenPagination();
-  buildCounterTokenPagination++;
-  if (buildCounterTokenPagination < 3) {
-    o.nextPageToken = "foo";
-    o.previousPageToken = "foo";
-  }
-  buildCounterTokenPagination--;
-  return o;
-}
-
-checkTokenPagination(api.TokenPagination o) {
-  buildCounterTokenPagination++;
-  if (buildCounterTokenPagination < 3) {
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    unittest.expect(o.previousPageToken, unittest.equals('foo'));
-  }
-  buildCounterTokenPagination--;
-}
-
-main() {
-  unittest.group("obj-schema-FieldMask", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildFieldMask();
-      var od = new api.FieldMask.fromJson(o.toJson());
-      checkFieldMask(od);
-    });
-  });
-
-  unittest.group("obj-schema-MobileAppPanel", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildMobileAppPanel();
-      var od = new api.MobileAppPanel.fromJson(o.toJson());
-      checkMobileAppPanel(od);
-    });
-  });
-
-  unittest.group("obj-schema-MobileAppPanelsListResponse", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildMobileAppPanelsListResponse();
-      var od = new api.MobileAppPanelsListResponse.fromJson(o.toJson());
-      checkMobileAppPanelsListResponse(od);
-    });
-  });
-
-  unittest.group("obj-schema-PageInfo", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildPageInfo();
-      var od = new api.PageInfo.fromJson(o.toJson());
-      checkPageInfo(od);
-    });
-  });
-
-  unittest.group("obj-schema-ResultsGetRequest", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildResultsGetRequest();
-      var od = new api.ResultsGetRequest.fromJson(o.toJson());
-      checkResultsGetRequest(od);
-    });
-  });
-
-  unittest.group("obj-schema-ResultsMask", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildResultsMask();
-      var od = new api.ResultsMask.fromJson(o.toJson());
-      checkResultsMask(od);
-    });
-  });
-
-  unittest.group("obj-schema-Survey", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildSurvey();
-      var od = new api.Survey.fromJson(o.toJson());
-      checkSurvey(od);
-    });
-  });
-
-  unittest.group("obj-schema-SurveyAudience", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildSurveyAudience();
-      var od = new api.SurveyAudience.fromJson(o.toJson());
-      checkSurveyAudience(od);
-    });
-  });
-
-  unittest.group("obj-schema-SurveyCost", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildSurveyCost();
-      var od = new api.SurveyCost.fromJson(o.toJson());
-      checkSurveyCost(od);
-    });
-  });
-
-  unittest.group("obj-schema-SurveyQuestion", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildSurveyQuestion();
-      var od = new api.SurveyQuestion.fromJson(o.toJson());
-      checkSurveyQuestion(od);
-    });
-  });
-
-  unittest.group("obj-schema-SurveyQuestionImage", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildSurveyQuestionImage();
-      var od = new api.SurveyQuestionImage.fromJson(o.toJson());
-      checkSurveyQuestionImage(od);
-    });
-  });
-
-  unittest.group("obj-schema-SurveyRejection", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildSurveyRejection();
-      var od = new api.SurveyRejection.fromJson(o.toJson());
-      checkSurveyRejection(od);
-    });
-  });
-
-  unittest.group("obj-schema-SurveyResults", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildSurveyResults();
-      var od = new api.SurveyResults.fromJson(o.toJson());
-      checkSurveyResults(od);
-    });
-  });
-
-  unittest.group("obj-schema-SurveysDeleteResponse", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildSurveysDeleteResponse();
-      var od = new api.SurveysDeleteResponse.fromJson(o.toJson());
-      checkSurveysDeleteResponse(od);
-    });
-  });
-
-  unittest.group("obj-schema-SurveysListResponse", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildSurveysListResponse();
-      var od = new api.SurveysListResponse.fromJson(o.toJson());
-      checkSurveysListResponse(od);
-    });
-  });
-
-  unittest.group("obj-schema-SurveysStartRequest", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildSurveysStartRequest();
-      var od = new api.SurveysStartRequest.fromJson(o.toJson());
-      checkSurveysStartRequest(od);
-    });
-  });
-
-  unittest.group("obj-schema-SurveysStartResponse", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildSurveysStartResponse();
-      var od = new api.SurveysStartResponse.fromJson(o.toJson());
-      checkSurveysStartResponse(od);
-    });
-  });
-
-  unittest.group("obj-schema-SurveysStopResponse", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildSurveysStopResponse();
-      var od = new api.SurveysStopResponse.fromJson(o.toJson());
-      checkSurveysStopResponse(od);
-    });
-  });
-
-  unittest.group("obj-schema-TokenPagination", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildTokenPagination();
-      var od = new api.TokenPagination.fromJson(o.toJson());
-      checkTokenPagination(od);
-    });
-  });
-
-  unittest.group("resource-MobileapppanelsResourceApi", () {
-    unittest.test("method--get", () {
-      var mock = new HttpServerMock();
-      api.MobileapppanelsResourceApi res =
-          new api.ConsumersurveysApi(mock).mobileapppanels;
-      var arg_panelId = "foo";
-      var arg_$fields = "foo";
-      mock.register(unittest.expectAsync2((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 + 19),
-            unittest.equals("consumersurveys/v2/"));
-        pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16),
-            unittest.equals("mobileAppPanels/"));
-        pathOffset += 16;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_panelId"));
-
-        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]));
-          }
-        }
-        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
-
-        var h = {
-          "content-type": "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildMobileAppPanel());
-        return new async.Future.value(stringResponse(200, h, resp));
-      }), true);
-      res
-          .get(arg_panelId, $fields: arg_$fields)
-          .then(unittest.expectAsync1(((api.MobileAppPanel response) {
-        checkMobileAppPanel(response);
-      })));
-    });
-
-    unittest.test("method--list", () {
-      var mock = new HttpServerMock();
-      api.MobileapppanelsResourceApi res =
-          new api.ConsumersurveysApi(mock).mobileapppanels;
-      var arg_maxResults = 42;
-      var arg_startIndex = 42;
-      var arg_token = "foo";
-      var arg_$fields = "foo";
-      mock.register(unittest.expectAsync2((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 + 19),
-            unittest.equals("consumersurveys/v2/"));
-        pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15),
-            unittest.equals("mobileAppPanels"));
-        pathOffset += 15;
-
-        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]));
-          }
-        }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first),
-            unittest.equals(arg_maxResults));
-        unittest.expect(core.int.parse(queryMap["startIndex"].first),
-            unittest.equals(arg_startIndex));
-        unittest.expect(queryMap["token"].first, unittest.equals(arg_token));
-        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
-
-        var h = {
-          "content-type": "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildMobileAppPanelsListResponse());
-        return new async.Future.value(stringResponse(200, h, resp));
-      }), true);
-      res
-          .list(
-              maxResults: arg_maxResults,
-              startIndex: arg_startIndex,
-              token: arg_token,
-              $fields: arg_$fields)
-          .then(unittest
-              .expectAsync1(((api.MobileAppPanelsListResponse response) {
-        checkMobileAppPanelsListResponse(response);
-      })));
-    });
-
-    unittest.test("method--update", () {
-      var mock = new HttpServerMock();
-      api.MobileapppanelsResourceApi res =
-          new api.ConsumersurveysApi(mock).mobileapppanels;
-      var arg_request = buildMobileAppPanel();
-      var arg_panelId = "foo";
-      var arg_$fields = "foo";
-      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.MobileAppPanel.fromJson(json);
-        checkMobileAppPanel(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 + 19),
-            unittest.equals("consumersurveys/v2/"));
-        pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16),
-            unittest.equals("mobileAppPanels/"));
-        pathOffset += 16;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_panelId"));
-
-        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]));
-          }
-        }
-        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
-
-        var h = {
-          "content-type": "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildMobileAppPanel());
-        return new async.Future.value(stringResponse(200, h, resp));
-      }), true);
-      res
-          .update(arg_request, arg_panelId, $fields: arg_$fields)
-          .then(unittest.expectAsync1(((api.MobileAppPanel response) {
-        checkMobileAppPanel(response);
-      })));
-    });
-  });
-
-  unittest.group("resource-ResultsResourceApi", () {
-    unittest.test("method--get", () {
-      // TODO: Implement tests for media upload;
-      // TODO: Implement tests for media download;
-
-      var mock = new HttpServerMock();
-      api.ResultsResourceApi res = new api.ConsumersurveysApi(mock).results;
-      var arg_request = buildResultsGetRequest();
-      var arg_surveyUrlId = "foo";
-      var arg_$fields = "foo";
-      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.ResultsGetRequest.fromJson(json);
-        checkResultsGetRequest(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 + 19),
-            unittest.equals("consumersurveys/v2/"));
-        pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8),
-            unittest.equals("surveys/"));
-        pathOffset += 8;
-        index = path.indexOf("/results", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart =
-            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_surveyUrlId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8),
-            unittest.equals("/results"));
-        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]));
-          }
-        }
-        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
-
-        var h = {
-          "content-type": "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildSurveyResults());
-        return new async.Future.value(stringResponse(200, h, resp));
-      }), true);
-      res
-          .get(arg_request, arg_surveyUrlId, $fields: arg_$fields)
-          .then(unittest.expectAsync1(((api.SurveyResults response) {
-        checkSurveyResults(response);
-      })));
-    });
-  });
-
-  unittest.group("resource-SurveysResourceApi", () {
-    unittest.test("method--delete", () {
-      var mock = new HttpServerMock();
-      api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
-      var arg_surveyUrlId = "foo";
-      var arg_$fields = "foo";
-      mock.register(unittest.expectAsync2((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 + 19),
-            unittest.equals("consumersurveys/v2/"));
-        pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8),
-            unittest.equals("surveys/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_surveyUrlId"));
-
-        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]));
-          }
-        }
-        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
-
-        var h = {
-          "content-type": "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildSurveysDeleteResponse());
-        return new async.Future.value(stringResponse(200, h, resp));
-      }), true);
-      res
-          .delete(arg_surveyUrlId, $fields: arg_$fields)
-          .then(unittest.expectAsync1(((api.SurveysDeleteResponse response) {
-        checkSurveysDeleteResponse(response);
-      })));
-    });
-
-    unittest.test("method--get", () {
-      var mock = new HttpServerMock();
-      api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
-      var arg_surveyUrlId = "foo";
-      var arg_$fields = "foo";
-      mock.register(unittest.expectAsync2((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 + 19),
-            unittest.equals("consumersurveys/v2/"));
-        pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8),
-            unittest.equals("surveys/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_surveyUrlId"));
-
-        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]));
-          }
-        }
-        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
-
-        var h = {
-          "content-type": "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildSurvey());
-        return new async.Future.value(stringResponse(200, h, resp));
-      }), true);
-      res
-          .get(arg_surveyUrlId, $fields: arg_$fields)
-          .then(unittest.expectAsync1(((api.Survey response) {
-        checkSurvey(response);
-      })));
-    });
-
-    unittest.test("method--insert", () {
-      var mock = new HttpServerMock();
-      api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
-      var arg_request = buildSurvey();
-      var arg_$fields = "foo";
-      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.Survey.fromJson(json);
-        checkSurvey(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 + 19),
-            unittest.equals("consumersurveys/v2/"));
-        pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7),
-            unittest.equals("surveys"));
-        pathOffset += 7;
-
-        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]));
-          }
-        }
-        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
-
-        var h = {
-          "content-type": "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildSurvey());
-        return new async.Future.value(stringResponse(200, h, resp));
-      }), true);
-      res
-          .insert(arg_request, $fields: arg_$fields)
-          .then(unittest.expectAsync1(((api.Survey response) {
-        checkSurvey(response);
-      })));
-    });
-
-    unittest.test("method--list", () {
-      var mock = new HttpServerMock();
-      api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
-      var arg_maxResults = 42;
-      var arg_startIndex = 42;
-      var arg_token = "foo";
-      var arg_$fields = "foo";
-      mock.register(unittest.expectAsync2((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 + 19),
-            unittest.equals("consumersurveys/v2/"));
-        pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7),
-            unittest.equals("surveys"));
-        pathOffset += 7;
-
-        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]));
-          }
-        }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first),
-            unittest.equals(arg_maxResults));
-        unittest.expect(core.int.parse(queryMap["startIndex"].first),
-            unittest.equals(arg_startIndex));
-        unittest.expect(queryMap["token"].first, unittest.equals(arg_token));
-        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
-
-        var h = {
-          "content-type": "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildSurveysListResponse());
-        return new async.Future.value(stringResponse(200, h, resp));
-      }), true);
-      res
-          .list(
-              maxResults: arg_maxResults,
-              startIndex: arg_startIndex,
-              token: arg_token,
-              $fields: arg_$fields)
-          .then(unittest.expectAsync1(((api.SurveysListResponse response) {
-        checkSurveysListResponse(response);
-      })));
-    });
-
-    unittest.test("method--start", () {
-      var mock = new HttpServerMock();
-      api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
-      var arg_request = buildSurveysStartRequest();
-      var arg_resourceId = "foo";
-      var arg_$fields = "foo";
-      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.SurveysStartRequest.fromJson(json);
-        checkSurveysStartRequest(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 + 19),
-            unittest.equals("consumersurveys/v2/"));
-        pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8),
-            unittest.equals("surveys/"));
-        pathOffset += 8;
-        index = path.indexOf("/start", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart =
-            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_resourceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6),
-            unittest.equals("/start"));
-        pathOffset += 6;
-
-        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]));
-          }
-        }
-        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
-
-        var h = {
-          "content-type": "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildSurveysStartResponse());
-        return new async.Future.value(stringResponse(200, h, resp));
-      }), true);
-      res
-          .start(arg_request, arg_resourceId, $fields: arg_$fields)
-          .then(unittest.expectAsync1(((api.SurveysStartResponse response) {
-        checkSurveysStartResponse(response);
-      })));
-    });
-
-    unittest.test("method--stop", () {
-      var mock = new HttpServerMock();
-      api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
-      var arg_resourceId = "foo";
-      var arg_$fields = "foo";
-      mock.register(unittest.expectAsync2((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 + 19),
-            unittest.equals("consumersurveys/v2/"));
-        pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8),
-            unittest.equals("surveys/"));
-        pathOffset += 8;
-        index = path.indexOf("/stop", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart =
-            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_resourceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5),
-            unittest.equals("/stop"));
-        pathOffset += 5;
-
-        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]));
-          }
-        }
-        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
-
-        var h = {
-          "content-type": "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildSurveysStopResponse());
-        return new async.Future.value(stringResponse(200, h, resp));
-      }), true);
-      res
-          .stop(arg_resourceId, $fields: arg_$fields)
-          .then(unittest.expectAsync1(((api.SurveysStopResponse response) {
-        checkSurveysStopResponse(response);
-      })));
-    });
-
-    unittest.test("method--update", () {
-      var mock = new HttpServerMock();
-      api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
-      var arg_request = buildSurvey();
-      var arg_surveyUrlId = "foo";
-      var arg_$fields = "foo";
-      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.Survey.fromJson(json);
-        checkSurvey(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 + 19),
-            unittest.equals("consumersurveys/v2/"));
-        pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8),
-            unittest.equals("surveys/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_surveyUrlId"));
-
-        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]));
-          }
-        }
-        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
-
-        var h = {
-          "content-type": "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildSurvey());
-        return new async.Future.value(stringResponse(200, h, resp));
-      }), true);
-      res
-          .update(arg_request, arg_surveyUrlId, $fields: arg_$fields)
-          .then(unittest.expectAsync1(((api.Survey response) {
-        checkSurvey(response);
-      })));
-    });
-  });
-}
diff --git a/generated/googleapis/test/container/v1_test.dart b/generated/googleapis/test/container/v1_test.dart
index 6125e9e..d35809d 100644
--- a/generated/googleapis/test/container/v1_test.dart
+++ b/generated/googleapis/test/container/v1_test.dart
@@ -172,53 +172,53 @@
   buildCounterClientCertificateConfig--;
 }
 
-buildUnnamed1935() {
+buildUnnamed1957() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1935(core.List<core.String> o) {
+checkUnnamed1957(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1936() {
+buildUnnamed1958() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1936(core.List<core.String> o) {
+checkUnnamed1958(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1937() {
+buildUnnamed1959() {
   var o = new core.List<api.NodePool>();
   o.add(buildNodePool());
   o.add(buildNodePool());
   return o;
 }
 
-checkUnnamed1937(core.List<api.NodePool> o) {
+checkUnnamed1959(core.List<api.NodePool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNodePool(o[0]);
   checkNodePool(o[1]);
 }
 
-buildUnnamed1938() {
+buildUnnamed1960() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1938(core.Map<core.String, core.String> o) {
+checkUnnamed1960(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'));
@@ -241,11 +241,11 @@
     o.expireTime = "foo";
     o.initialClusterVersion = "foo";
     o.initialNodeCount = 42;
-    o.instanceGroupUrls = buildUnnamed1935();
+    o.instanceGroupUrls = buildUnnamed1957();
     o.ipAllocationPolicy = buildIPAllocationPolicy();
     o.labelFingerprint = "foo";
     o.legacyAbac = buildLegacyAbac();
-    o.locations = buildUnnamed1936();
+    o.locations = buildUnnamed1958();
     o.loggingService = "foo";
     o.maintenancePolicy = buildMaintenancePolicy();
     o.masterAuth = buildMasterAuth();
@@ -256,8 +256,8 @@
     o.networkPolicy = buildNetworkPolicy();
     o.nodeConfig = buildNodeConfig();
     o.nodeIpv4CidrSize = 42;
-    o.nodePools = buildUnnamed1937();
-    o.resourceLabels = buildUnnamed1938();
+    o.nodePools = buildUnnamed1959();
+    o.resourceLabels = buildUnnamed1960();
     o.selfLink = "foo";
     o.servicesIpv4Cidr = "foo";
     o.status = "foo";
@@ -284,11 +284,11 @@
     unittest.expect(o.expireTime, unittest.equals('foo'));
     unittest.expect(o.initialClusterVersion, unittest.equals('foo'));
     unittest.expect(o.initialNodeCount, unittest.equals(42));
-    checkUnnamed1935(o.instanceGroupUrls);
+    checkUnnamed1957(o.instanceGroupUrls);
     checkIPAllocationPolicy(o.ipAllocationPolicy);
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
     checkLegacyAbac(o.legacyAbac);
-    checkUnnamed1936(o.locations);
+    checkUnnamed1958(o.locations);
     unittest.expect(o.loggingService, unittest.equals('foo'));
     checkMaintenancePolicy(o.maintenancePolicy);
     checkMasterAuth(o.masterAuth);
@@ -299,8 +299,8 @@
     checkNetworkPolicy(o.networkPolicy);
     checkNodeConfig(o.nodeConfig);
     unittest.expect(o.nodeIpv4CidrSize, unittest.equals(42));
-    checkUnnamed1937(o.nodePools);
-    checkUnnamed1938(o.resourceLabels);
+    checkUnnamed1959(o.nodePools);
+    checkUnnamed1960(o.resourceLabels);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.servicesIpv4Cidr, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -311,14 +311,14 @@
   buildCounterCluster--;
 }
 
-buildUnnamed1939() {
+buildUnnamed1961() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1939(core.List<core.String> o) {
+checkUnnamed1961(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -331,7 +331,7 @@
   if (buildCounterClusterUpdate < 3) {
     o.desiredAddonsConfig = buildAddonsConfig();
     o.desiredImageType = "foo";
-    o.desiredLocations = buildUnnamed1939();
+    o.desiredLocations = buildUnnamed1961();
     o.desiredMasterAuthorizedNetworksConfig =
         buildMasterAuthorizedNetworksConfig();
     o.desiredMasterVersion = "foo";
@@ -349,7 +349,7 @@
   if (buildCounterClusterUpdate < 3) {
     checkAddonsConfig(o.desiredAddonsConfig);
     unittest.expect(o.desiredImageType, unittest.equals('foo'));
-    checkUnnamed1939(o.desiredLocations);
+    checkUnnamed1961(o.desiredLocations);
     checkMasterAuthorizedNetworksConfig(
         o.desiredMasterAuthorizedNetworksConfig);
     unittest.expect(o.desiredMasterVersion, unittest.equals('foo'));
@@ -565,27 +565,27 @@
   buildCounterLegacyAbac--;
 }
 
-buildUnnamed1940() {
+buildUnnamed1962() {
   var o = new core.List<api.Cluster>();
   o.add(buildCluster());
   o.add(buildCluster());
   return o;
 }
 
-checkUnnamed1940(core.List<api.Cluster> o) {
+checkUnnamed1962(core.List<api.Cluster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCluster(o[0]);
   checkCluster(o[1]);
 }
 
-buildUnnamed1941() {
+buildUnnamed1963() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1941(core.List<core.String> o) {
+checkUnnamed1963(core.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,8 +596,8 @@
   var o = new api.ListClustersResponse();
   buildCounterListClustersResponse++;
   if (buildCounterListClustersResponse < 3) {
-    o.clusters = buildUnnamed1940();
-    o.missingZones = buildUnnamed1941();
+    o.clusters = buildUnnamed1962();
+    o.missingZones = buildUnnamed1963();
   }
   buildCounterListClustersResponse--;
   return o;
@@ -606,20 +606,20 @@
 checkListClustersResponse(api.ListClustersResponse o) {
   buildCounterListClustersResponse++;
   if (buildCounterListClustersResponse < 3) {
-    checkUnnamed1940(o.clusters);
-    checkUnnamed1941(o.missingZones);
+    checkUnnamed1962(o.clusters);
+    checkUnnamed1963(o.missingZones);
   }
   buildCounterListClustersResponse--;
 }
 
-buildUnnamed1942() {
+buildUnnamed1964() {
   var o = new core.List<api.NodePool>();
   o.add(buildNodePool());
   o.add(buildNodePool());
   return o;
 }
 
-checkUnnamed1942(core.List<api.NodePool> o) {
+checkUnnamed1964(core.List<api.NodePool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNodePool(o[0]);
   checkNodePool(o[1]);
@@ -630,7 +630,7 @@
   var o = new api.ListNodePoolsResponse();
   buildCounterListNodePoolsResponse++;
   if (buildCounterListNodePoolsResponse < 3) {
-    o.nodePools = buildUnnamed1942();
+    o.nodePools = buildUnnamed1964();
   }
   buildCounterListNodePoolsResponse--;
   return o;
@@ -639,32 +639,32 @@
 checkListNodePoolsResponse(api.ListNodePoolsResponse o) {
   buildCounterListNodePoolsResponse++;
   if (buildCounterListNodePoolsResponse < 3) {
-    checkUnnamed1942(o.nodePools);
+    checkUnnamed1964(o.nodePools);
   }
   buildCounterListNodePoolsResponse--;
 }
 
-buildUnnamed1943() {
+buildUnnamed1965() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1943(core.List<core.String> o) {
+checkUnnamed1965(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1944() {
+buildUnnamed1966() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1944(core.List<api.Operation> o) {
+checkUnnamed1966(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -675,8 +675,8 @@
   var o = new api.ListOperationsResponse();
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
-    o.missingZones = buildUnnamed1943();
-    o.operations = buildUnnamed1944();
+    o.missingZones = buildUnnamed1965();
+    o.operations = buildUnnamed1966();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -685,8 +685,8 @@
 checkListOperationsResponse(api.ListOperationsResponse o) {
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
-    checkUnnamed1943(o.missingZones);
-    checkUnnamed1944(o.operations);
+    checkUnnamed1965(o.missingZones);
+    checkUnnamed1966(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
@@ -758,14 +758,14 @@
   buildCounterMasterAuth--;
 }
 
-buildUnnamed1945() {
+buildUnnamed1967() {
   var o = new core.List<api.CidrBlock>();
   o.add(buildCidrBlock());
   o.add(buildCidrBlock());
   return o;
 }
 
-checkUnnamed1945(core.List<api.CidrBlock> o) {
+checkUnnamed1967(core.List<api.CidrBlock> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCidrBlock(o[0]);
   checkCidrBlock(o[1]);
@@ -776,7 +776,7 @@
   var o = new api.MasterAuthorizedNetworksConfig();
   buildCounterMasterAuthorizedNetworksConfig++;
   if (buildCounterMasterAuthorizedNetworksConfig < 3) {
-    o.cidrBlocks = buildUnnamed1945();
+    o.cidrBlocks = buildUnnamed1967();
     o.enabled = true;
   }
   buildCounterMasterAuthorizedNetworksConfig--;
@@ -786,7 +786,7 @@
 checkMasterAuthorizedNetworksConfig(api.MasterAuthorizedNetworksConfig o) {
   buildCounterMasterAuthorizedNetworksConfig++;
   if (buildCounterMasterAuthorizedNetworksConfig < 3) {
-    checkUnnamed1945(o.cidrBlocks);
+    checkUnnamed1967(o.cidrBlocks);
     unittest.expect(o.enabled, unittest.isTrue);
   }
   buildCounterMasterAuthorizedNetworksConfig--;
@@ -832,66 +832,66 @@
   buildCounterNetworkPolicyConfig--;
 }
 
-buildUnnamed1946() {
+buildUnnamed1968() {
   var o = new core.List<api.AcceleratorConfig>();
   o.add(buildAcceleratorConfig());
   o.add(buildAcceleratorConfig());
   return o;
 }
 
-checkUnnamed1946(core.List<api.AcceleratorConfig> o) {
+checkUnnamed1968(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorConfig(o[0]);
   checkAcceleratorConfig(o[1]);
 }
 
-buildUnnamed1947() {
+buildUnnamed1969() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1947(core.Map<core.String, core.String> o) {
+checkUnnamed1969(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'));
 }
 
-buildUnnamed1948() {
+buildUnnamed1970() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1948(core.Map<core.String, core.String> o) {
+checkUnnamed1970(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'));
 }
 
-buildUnnamed1949() {
+buildUnnamed1971() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1949(core.List<core.String> o) {
+checkUnnamed1971(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1950() {
+buildUnnamed1972() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1950(core.List<core.String> o) {
+checkUnnamed1972(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -902,18 +902,18 @@
   var o = new api.NodeConfig();
   buildCounterNodeConfig++;
   if (buildCounterNodeConfig < 3) {
-    o.accelerators = buildUnnamed1946();
+    o.accelerators = buildUnnamed1968();
     o.diskSizeGb = 42;
     o.imageType = "foo";
-    o.labels = buildUnnamed1947();
+    o.labels = buildUnnamed1969();
     o.localSsdCount = 42;
     o.machineType = "foo";
-    o.metadata = buildUnnamed1948();
+    o.metadata = buildUnnamed1970();
     o.minCpuPlatform = "foo";
-    o.oauthScopes = buildUnnamed1949();
+    o.oauthScopes = buildUnnamed1971();
     o.preemptible = true;
     o.serviceAccount = "foo";
-    o.tags = buildUnnamed1950();
+    o.tags = buildUnnamed1972();
   }
   buildCounterNodeConfig--;
   return o;
@@ -922,18 +922,18 @@
 checkNodeConfig(api.NodeConfig o) {
   buildCounterNodeConfig++;
   if (buildCounterNodeConfig < 3) {
-    checkUnnamed1946(o.accelerators);
+    checkUnnamed1968(o.accelerators);
     unittest.expect(o.diskSizeGb, unittest.equals(42));
     unittest.expect(o.imageType, unittest.equals('foo'));
-    checkUnnamed1947(o.labels);
+    checkUnnamed1969(o.labels);
     unittest.expect(o.localSsdCount, unittest.equals(42));
     unittest.expect(o.machineType, unittest.equals('foo'));
-    checkUnnamed1948(o.metadata);
+    checkUnnamed1970(o.metadata);
     unittest.expect(o.minCpuPlatform, unittest.equals('foo'));
-    checkUnnamed1949(o.oauthScopes);
+    checkUnnamed1971(o.oauthScopes);
     unittest.expect(o.preemptible, unittest.isTrue);
     unittest.expect(o.serviceAccount, unittest.equals('foo'));
-    checkUnnamed1950(o.tags);
+    checkUnnamed1972(o.tags);
   }
   buildCounterNodeConfig--;
 }
@@ -961,14 +961,14 @@
   buildCounterNodeManagement--;
 }
 
-buildUnnamed1951() {
+buildUnnamed1973() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1951(core.List<core.String> o) {
+checkUnnamed1973(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -982,7 +982,7 @@
     o.autoscaling = buildNodePoolAutoscaling();
     o.config = buildNodeConfig();
     o.initialNodeCount = 42;
-    o.instanceGroupUrls = buildUnnamed1951();
+    o.instanceGroupUrls = buildUnnamed1973();
     o.management = buildNodeManagement();
     o.name = "foo";
     o.selfLink = "foo";
@@ -1000,7 +1000,7 @@
     checkNodePoolAutoscaling(o.autoscaling);
     checkNodeConfig(o.config);
     unittest.expect(o.initialNodeCount, unittest.equals(42));
-    checkUnnamed1951(o.instanceGroupUrls);
+    checkUnnamed1973(o.instanceGroupUrls);
     checkNodeManagement(o.management);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1086,40 +1086,40 @@
   buildCounterRollbackNodePoolUpgradeRequest--;
 }
 
-buildUnnamed1952() {
+buildUnnamed1974() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1952(core.List<core.String> o) {
+checkUnnamed1974(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1953() {
+buildUnnamed1975() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1953(core.List<core.String> o) {
+checkUnnamed1975(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1954() {
+buildUnnamed1976() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1954(core.List<core.String> o) {
+checkUnnamed1976(core.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,9 +1132,9 @@
   if (buildCounterServerConfig < 3) {
     o.defaultClusterVersion = "foo";
     o.defaultImageType = "foo";
-    o.validImageTypes = buildUnnamed1952();
-    o.validMasterVersions = buildUnnamed1953();
-    o.validNodeVersions = buildUnnamed1954();
+    o.validImageTypes = buildUnnamed1974();
+    o.validMasterVersions = buildUnnamed1975();
+    o.validNodeVersions = buildUnnamed1976();
   }
   buildCounterServerConfig--;
   return o;
@@ -1145,9 +1145,9 @@
   if (buildCounterServerConfig < 3) {
     unittest.expect(o.defaultClusterVersion, unittest.equals('foo'));
     unittest.expect(o.defaultImageType, unittest.equals('foo'));
-    checkUnnamed1952(o.validImageTypes);
-    checkUnnamed1953(o.validMasterVersions);
-    checkUnnamed1954(o.validNodeVersions);
+    checkUnnamed1974(o.validImageTypes);
+    checkUnnamed1975(o.validMasterVersions);
+    checkUnnamed1976(o.validNodeVersions);
   }
   buildCounterServerConfig--;
 }
@@ -1171,14 +1171,14 @@
   buildCounterSetAddonsConfigRequest--;
 }
 
-buildUnnamed1955() {
+buildUnnamed1977() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1955(core.Map<core.String, core.String> o) {
+checkUnnamed1977(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'));
@@ -1190,7 +1190,7 @@
   buildCounterSetLabelsRequest++;
   if (buildCounterSetLabelsRequest < 3) {
     o.labelFingerprint = "foo";
-    o.resourceLabels = buildUnnamed1955();
+    o.resourceLabels = buildUnnamed1977();
   }
   buildCounterSetLabelsRequest--;
   return o;
@@ -1200,7 +1200,7 @@
   buildCounterSetLabelsRequest++;
   if (buildCounterSetLabelsRequest < 3) {
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed1955(o.resourceLabels);
+    checkUnnamed1977(o.resourceLabels);
   }
   buildCounterSetLabelsRequest--;
 }
@@ -1224,14 +1224,14 @@
   buildCounterSetLegacyAbacRequest--;
 }
 
-buildUnnamed1956() {
+buildUnnamed1978() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1956(core.List<core.String> o) {
+checkUnnamed1978(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1242,7 +1242,7 @@
   var o = new api.SetLocationsRequest();
   buildCounterSetLocationsRequest++;
   if (buildCounterSetLocationsRequest < 3) {
-    o.locations = buildUnnamed1956();
+    o.locations = buildUnnamed1978();
   }
   buildCounterSetLocationsRequest--;
   return o;
@@ -1251,7 +1251,7 @@
 checkSetLocationsRequest(api.SetLocationsRequest o) {
   buildCounterSetLocationsRequest++;
   if (buildCounterSetLocationsRequest < 3) {
-    checkUnnamed1956(o.locations);
+    checkUnnamed1978(o.locations);
   }
   buildCounterSetLocationsRequest--;
 }
diff --git a/generated/googleapis/test/content/v2_test.dart b/generated/googleapis/test/content/v2_test.dart
index 8ea05ee..add9474 100644
--- a/generated/googleapis/test/content/v2_test.dart
+++ b/generated/googleapis/test/content/v2_test.dart
@@ -50,40 +50,40 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed337() {
+buildUnnamed331() {
   var o = new core.List<api.AccountAdwordsLink>();
   o.add(buildAccountAdwordsLink());
   o.add(buildAccountAdwordsLink());
   return o;
 }
 
-checkUnnamed337(core.List<api.AccountAdwordsLink> o) {
+checkUnnamed331(core.List<api.AccountAdwordsLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountAdwordsLink(o[0]);
   checkAccountAdwordsLink(o[1]);
 }
 
-buildUnnamed338() {
+buildUnnamed332() {
   var o = new core.List<api.AccountUser>();
   o.add(buildAccountUser());
   o.add(buildAccountUser());
   return o;
 }
 
-checkUnnamed338(core.List<api.AccountUser> o) {
+checkUnnamed332(core.List<api.AccountUser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountUser(o[0]);
   checkAccountUser(o[1]);
 }
 
-buildUnnamed339() {
+buildUnnamed333() {
   var o = new core.List<api.AccountYouTubeChannelLink>();
   o.add(buildAccountYouTubeChannelLink());
   o.add(buildAccountYouTubeChannelLink());
   return o;
 }
 
-checkUnnamed339(core.List<api.AccountYouTubeChannelLink> o) {
+checkUnnamed333(core.List<api.AccountYouTubeChannelLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountYouTubeChannelLink(o[0]);
   checkAccountYouTubeChannelLink(o[1]);
@@ -95,16 +95,16 @@
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
     o.adultContent = true;
-    o.adwordsLinks = buildUnnamed337();
+    o.adwordsLinks = buildUnnamed331();
     o.googleMyBusinessLink = buildAccountGoogleMyBusinessLink();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
     o.reviewsUrl = "foo";
     o.sellerId = "foo";
-    o.users = buildUnnamed338();
+    o.users = buildUnnamed332();
     o.websiteUrl = "foo";
-    o.youtubeChannelLinks = buildUnnamed339();
+    o.youtubeChannelLinks = buildUnnamed333();
   }
   buildCounterAccount--;
   return o;
@@ -114,16 +114,16 @@
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
     unittest.expect(o.adultContent, unittest.isTrue);
-    checkUnnamed337(o.adwordsLinks);
+    checkUnnamed331(o.adwordsLinks);
     checkAccountGoogleMyBusinessLink(o.googleMyBusinessLink);
     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'));
-    checkUnnamed338(o.users);
+    checkUnnamed332(o.users);
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
-    checkUnnamed339(o.youtubeChannelLinks);
+    checkUnnamed333(o.youtubeChannelLinks);
   }
   buildCounterAccount--;
 }
@@ -191,27 +191,27 @@
   buildCounterAccountIdentifier--;
 }
 
-buildUnnamed340() {
+buildUnnamed334() {
   var o = new core.List<api.AccountStatusAccountLevelIssue>();
   o.add(buildAccountStatusAccountLevelIssue());
   o.add(buildAccountStatusAccountLevelIssue());
   return o;
 }
 
-checkUnnamed340(core.List<api.AccountStatusAccountLevelIssue> o) {
+checkUnnamed334(core.List<api.AccountStatusAccountLevelIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatusAccountLevelIssue(o[0]);
   checkAccountStatusAccountLevelIssue(o[1]);
 }
 
-buildUnnamed341() {
+buildUnnamed335() {
   var o = new core.List<api.AccountStatusDataQualityIssue>();
   o.add(buildAccountStatusDataQualityIssue());
   o.add(buildAccountStatusDataQualityIssue());
   return o;
 }
 
-checkUnnamed341(core.List<api.AccountStatusDataQualityIssue> o) {
+checkUnnamed335(core.List<api.AccountStatusDataQualityIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatusDataQualityIssue(o[0]);
   checkAccountStatusDataQualityIssue(o[1]);
@@ -223,8 +223,8 @@
   buildCounterAccountStatus++;
   if (buildCounterAccountStatus < 3) {
     o.accountId = "foo";
-    o.accountLevelIssues = buildUnnamed340();
-    o.dataQualityIssues = buildUnnamed341();
+    o.accountLevelIssues = buildUnnamed334();
+    o.dataQualityIssues = buildUnnamed335();
     o.kind = "foo";
     o.websiteClaimed = true;
   }
@@ -236,8 +236,8 @@
   buildCounterAccountStatus++;
   if (buildCounterAccountStatus < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed340(o.accountLevelIssues);
-    checkUnnamed341(o.dataQualityIssues);
+    checkUnnamed334(o.accountLevelIssues);
+    checkUnnamed335(o.dataQualityIssues);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.websiteClaimed, unittest.isTrue);
   }
@@ -271,14 +271,14 @@
   buildCounterAccountStatusAccountLevelIssue--;
 }
 
-buildUnnamed342() {
+buildUnnamed336() {
   var o = new core.List<api.AccountStatusExampleItem>();
   o.add(buildAccountStatusExampleItem());
   o.add(buildAccountStatusExampleItem());
   return o;
 }
 
-checkUnnamed342(core.List<api.AccountStatusExampleItem> o) {
+checkUnnamed336(core.List<api.AccountStatusExampleItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatusExampleItem(o[0]);
   checkAccountStatusExampleItem(o[1]);
@@ -292,7 +292,7 @@
     o.country = "foo";
     o.detail = "foo";
     o.displayedValue = "foo";
-    o.exampleItems = buildUnnamed342();
+    o.exampleItems = buildUnnamed336();
     o.id = "foo";
     o.lastChecked = "foo";
     o.location = "foo";
@@ -310,7 +310,7 @@
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.detail, unittest.equals('foo'));
     unittest.expect(o.displayedValue, unittest.equals('foo'));
-    checkUnnamed342(o.exampleItems);
+    checkUnnamed336(o.exampleItems);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastChecked, unittest.equals('foo'));
     unittest.expect(o.location, unittest.equals('foo'));
@@ -348,14 +348,14 @@
   buildCounterAccountStatusExampleItem--;
 }
 
-buildUnnamed343() {
+buildUnnamed337() {
   var o = new core.List<api.AccountTaxTaxRule>();
   o.add(buildAccountTaxTaxRule());
   o.add(buildAccountTaxTaxRule());
   return o;
 }
 
-checkUnnamed343(core.List<api.AccountTaxTaxRule> o) {
+checkUnnamed337(core.List<api.AccountTaxTaxRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountTaxTaxRule(o[0]);
   checkAccountTaxTaxRule(o[1]);
@@ -368,7 +368,7 @@
   if (buildCounterAccountTax < 3) {
     o.accountId = "foo";
     o.kind = "foo";
-    o.rules = buildUnnamed343();
+    o.rules = buildUnnamed337();
   }
   buildCounterAccountTax--;
   return o;
@@ -379,7 +379,7 @@
   if (buildCounterAccountTax < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed343(o.rules);
+    checkUnnamed337(o.rules);
   }
   buildCounterAccountTax--;
 }
@@ -453,14 +453,14 @@
   buildCounterAccountYouTubeChannelLink--;
 }
 
-buildUnnamed344() {
+buildUnnamed338() {
   var o = new core.List<api.AccountIdentifier>();
   o.add(buildAccountIdentifier());
   o.add(buildAccountIdentifier());
   return o;
 }
 
-checkUnnamed344(core.List<api.AccountIdentifier> o) {
+checkUnnamed338(core.List<api.AccountIdentifier> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountIdentifier(o[0]);
   checkAccountIdentifier(o[1]);
@@ -471,7 +471,7 @@
   var o = new api.AccountsAuthInfoResponse();
   buildCounterAccountsAuthInfoResponse++;
   if (buildCounterAccountsAuthInfoResponse < 3) {
-    o.accountIdentifiers = buildUnnamed344();
+    o.accountIdentifiers = buildUnnamed338();
     o.kind = "foo";
   }
   buildCounterAccountsAuthInfoResponse--;
@@ -481,7 +481,7 @@
 checkAccountsAuthInfoResponse(api.AccountsAuthInfoResponse o) {
   buildCounterAccountsAuthInfoResponse++;
   if (buildCounterAccountsAuthInfoResponse < 3) {
-    checkUnnamed344(o.accountIdentifiers);
+    checkUnnamed338(o.accountIdentifiers);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountsAuthInfoResponse--;
@@ -506,14 +506,14 @@
   buildCounterAccountsClaimWebsiteResponse--;
 }
 
-buildUnnamed345() {
+buildUnnamed339() {
   var o = new core.List<api.AccountsCustomBatchRequestEntry>();
   o.add(buildAccountsCustomBatchRequestEntry());
   o.add(buildAccountsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed345(core.List<api.AccountsCustomBatchRequestEntry> o) {
+checkUnnamed339(core.List<api.AccountsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountsCustomBatchRequestEntry(o[0]);
   checkAccountsCustomBatchRequestEntry(o[1]);
@@ -524,7 +524,7 @@
   var o = new api.AccountsCustomBatchRequest();
   buildCounterAccountsCustomBatchRequest++;
   if (buildCounterAccountsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed345();
+    o.entries = buildUnnamed339();
   }
   buildCounterAccountsCustomBatchRequest--;
   return o;
@@ -533,7 +533,7 @@
 checkAccountsCustomBatchRequest(api.AccountsCustomBatchRequest o) {
   buildCounterAccountsCustomBatchRequest++;
   if (buildCounterAccountsCustomBatchRequest < 3) {
-    checkUnnamed345(o.entries);
+    checkUnnamed339(o.entries);
   }
   buildCounterAccountsCustomBatchRequest--;
 }
@@ -569,14 +569,14 @@
   buildCounterAccountsCustomBatchRequestEntry--;
 }
 
-buildUnnamed346() {
+buildUnnamed340() {
   var o = new core.List<api.AccountsCustomBatchResponseEntry>();
   o.add(buildAccountsCustomBatchResponseEntry());
   o.add(buildAccountsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed346(core.List<api.AccountsCustomBatchResponseEntry> o) {
+checkUnnamed340(core.List<api.AccountsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountsCustomBatchResponseEntry(o[0]);
   checkAccountsCustomBatchResponseEntry(o[1]);
@@ -587,7 +587,7 @@
   var o = new api.AccountsCustomBatchResponse();
   buildCounterAccountsCustomBatchResponse++;
   if (buildCounterAccountsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed346();
+    o.entries = buildUnnamed340();
     o.kind = "foo";
   }
   buildCounterAccountsCustomBatchResponse--;
@@ -597,7 +597,7 @@
 checkAccountsCustomBatchResponse(api.AccountsCustomBatchResponse o) {
   buildCounterAccountsCustomBatchResponse++;
   if (buildCounterAccountsCustomBatchResponse < 3) {
-    checkUnnamed346(o.entries);
+    checkUnnamed340(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountsCustomBatchResponse--;
@@ -628,14 +628,14 @@
   buildCounterAccountsCustomBatchResponseEntry--;
 }
 
-buildUnnamed347() {
+buildUnnamed341() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed347(core.List<api.Account> o) {
+checkUnnamed341(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -648,7 +648,7 @@
   if (buildCounterAccountsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed347();
+    o.resources = buildUnnamed341();
   }
   buildCounterAccountsListResponse--;
   return o;
@@ -659,19 +659,19 @@
   if (buildCounterAccountsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed347(o.resources);
+    checkUnnamed341(o.resources);
   }
   buildCounterAccountsListResponse--;
 }
 
-buildUnnamed348() {
+buildUnnamed342() {
   var o = new core.List<api.AccountstatusesCustomBatchRequestEntry>();
   o.add(buildAccountstatusesCustomBatchRequestEntry());
   o.add(buildAccountstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed348(core.List<api.AccountstatusesCustomBatchRequestEntry> o) {
+checkUnnamed342(core.List<api.AccountstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountstatusesCustomBatchRequestEntry(o[0]);
   checkAccountstatusesCustomBatchRequestEntry(o[1]);
@@ -682,7 +682,7 @@
   var o = new api.AccountstatusesCustomBatchRequest();
   buildCounterAccountstatusesCustomBatchRequest++;
   if (buildCounterAccountstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed348();
+    o.entries = buildUnnamed342();
   }
   buildCounterAccountstatusesCustomBatchRequest--;
   return o;
@@ -692,7 +692,7 @@
     api.AccountstatusesCustomBatchRequest o) {
   buildCounterAccountstatusesCustomBatchRequest++;
   if (buildCounterAccountstatusesCustomBatchRequest < 3) {
-    checkUnnamed348(o.entries);
+    checkUnnamed342(o.entries);
   }
   buildCounterAccountstatusesCustomBatchRequest--;
 }
@@ -723,14 +723,14 @@
   buildCounterAccountstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed349() {
+buildUnnamed343() {
   var o = new core.List<api.AccountstatusesCustomBatchResponseEntry>();
   o.add(buildAccountstatusesCustomBatchResponseEntry());
   o.add(buildAccountstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed349(core.List<api.AccountstatusesCustomBatchResponseEntry> o) {
+checkUnnamed343(core.List<api.AccountstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountstatusesCustomBatchResponseEntry(o[0]);
   checkAccountstatusesCustomBatchResponseEntry(o[1]);
@@ -741,7 +741,7 @@
   var o = new api.AccountstatusesCustomBatchResponse();
   buildCounterAccountstatusesCustomBatchResponse++;
   if (buildCounterAccountstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed349();
+    o.entries = buildUnnamed343();
     o.kind = "foo";
   }
   buildCounterAccountstatusesCustomBatchResponse--;
@@ -752,7 +752,7 @@
     api.AccountstatusesCustomBatchResponse o) {
   buildCounterAccountstatusesCustomBatchResponse++;
   if (buildCounterAccountstatusesCustomBatchResponse < 3) {
-    checkUnnamed349(o.entries);
+    checkUnnamed343(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountstatusesCustomBatchResponse--;
@@ -782,14 +782,14 @@
   buildCounterAccountstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed350() {
+buildUnnamed344() {
   var o = new core.List<api.AccountStatus>();
   o.add(buildAccountStatus());
   o.add(buildAccountStatus());
   return o;
 }
 
-checkUnnamed350(core.List<api.AccountStatus> o) {
+checkUnnamed344(core.List<api.AccountStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatus(o[0]);
   checkAccountStatus(o[1]);
@@ -802,7 +802,7 @@
   if (buildCounterAccountstatusesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed350();
+    o.resources = buildUnnamed344();
   }
   buildCounterAccountstatusesListResponse--;
   return o;
@@ -813,19 +813,19 @@
   if (buildCounterAccountstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed350(o.resources);
+    checkUnnamed344(o.resources);
   }
   buildCounterAccountstatusesListResponse--;
 }
 
-buildUnnamed351() {
+buildUnnamed345() {
   var o = new core.List<api.AccounttaxCustomBatchRequestEntry>();
   o.add(buildAccounttaxCustomBatchRequestEntry());
   o.add(buildAccounttaxCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed351(core.List<api.AccounttaxCustomBatchRequestEntry> o) {
+checkUnnamed345(core.List<api.AccounttaxCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccounttaxCustomBatchRequestEntry(o[0]);
   checkAccounttaxCustomBatchRequestEntry(o[1]);
@@ -836,7 +836,7 @@
   var o = new api.AccounttaxCustomBatchRequest();
   buildCounterAccounttaxCustomBatchRequest++;
   if (buildCounterAccounttaxCustomBatchRequest < 3) {
-    o.entries = buildUnnamed351();
+    o.entries = buildUnnamed345();
   }
   buildCounterAccounttaxCustomBatchRequest--;
   return o;
@@ -845,7 +845,7 @@
 checkAccounttaxCustomBatchRequest(api.AccounttaxCustomBatchRequest o) {
   buildCounterAccounttaxCustomBatchRequest++;
   if (buildCounterAccounttaxCustomBatchRequest < 3) {
-    checkUnnamed351(o.entries);
+    checkUnnamed345(o.entries);
   }
   buildCounterAccounttaxCustomBatchRequest--;
 }
@@ -878,14 +878,14 @@
   buildCounterAccounttaxCustomBatchRequestEntry--;
 }
 
-buildUnnamed352() {
+buildUnnamed346() {
   var o = new core.List<api.AccounttaxCustomBatchResponseEntry>();
   o.add(buildAccounttaxCustomBatchResponseEntry());
   o.add(buildAccounttaxCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed352(core.List<api.AccounttaxCustomBatchResponseEntry> o) {
+checkUnnamed346(core.List<api.AccounttaxCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccounttaxCustomBatchResponseEntry(o[0]);
   checkAccounttaxCustomBatchResponseEntry(o[1]);
@@ -896,7 +896,7 @@
   var o = new api.AccounttaxCustomBatchResponse();
   buildCounterAccounttaxCustomBatchResponse++;
   if (buildCounterAccounttaxCustomBatchResponse < 3) {
-    o.entries = buildUnnamed352();
+    o.entries = buildUnnamed346();
     o.kind = "foo";
   }
   buildCounterAccounttaxCustomBatchResponse--;
@@ -906,7 +906,7 @@
 checkAccounttaxCustomBatchResponse(api.AccounttaxCustomBatchResponse o) {
   buildCounterAccounttaxCustomBatchResponse++;
   if (buildCounterAccounttaxCustomBatchResponse < 3) {
-    checkUnnamed352(o.entries);
+    checkUnnamed346(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccounttaxCustomBatchResponse--;
@@ -938,14 +938,14 @@
   buildCounterAccounttaxCustomBatchResponseEntry--;
 }
 
-buildUnnamed353() {
+buildUnnamed347() {
   var o = new core.List<api.AccountTax>();
   o.add(buildAccountTax());
   o.add(buildAccountTax());
   return o;
 }
 
-checkUnnamed353(core.List<api.AccountTax> o) {
+checkUnnamed347(core.List<api.AccountTax> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountTax(o[0]);
   checkAccountTax(o[1]);
@@ -958,7 +958,7 @@
   if (buildCounterAccounttaxListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed353();
+    o.resources = buildUnnamed347();
   }
   buildCounterAccounttaxListResponse--;
   return o;
@@ -969,7 +969,7 @@
   if (buildCounterAccounttaxListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed353(o.resources);
+    checkUnnamed347(o.resources);
   }
   buildCounterAccounttaxListResponse--;
 }
@@ -1003,14 +1003,14 @@
   buildCounterCarrierRate--;
 }
 
-buildUnnamed354() {
+buildUnnamed348() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed354(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'));
@@ -1023,7 +1023,7 @@
   if (buildCounterCarriersCarrier < 3) {
     o.country = "foo";
     o.name = "foo";
-    o.services = buildUnnamed354();
+    o.services = buildUnnamed348();
   }
   buildCounterCarriersCarrier--;
   return o;
@@ -1034,32 +1034,32 @@
   if (buildCounterCarriersCarrier < 3) {
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed354(o.services);
+    checkUnnamed348(o.services);
   }
   buildCounterCarriersCarrier--;
 }
 
-buildUnnamed355() {
+buildUnnamed349() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed355(core.List<core.String> o) {
+checkUnnamed349(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed356() {
+buildUnnamed350() {
   var o = new core.List<api.DatafeedTarget>();
   o.add(buildDatafeedTarget());
   o.add(buildDatafeedTarget());
   return o;
 }
 
-checkUnnamed356(core.List<api.DatafeedTarget> o) {
+checkUnnamed350(core.List<api.DatafeedTarget> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedTarget(o[0]);
   checkDatafeedTarget(o[1]);
@@ -1077,11 +1077,11 @@
     o.fileName = "foo";
     o.format = buildDatafeedFormat();
     o.id = "foo";
-    o.intendedDestinations = buildUnnamed355();
+    o.intendedDestinations = buildUnnamed349();
     o.kind = "foo";
     o.name = "foo";
     o.targetCountry = "foo";
-    o.targets = buildUnnamed356();
+    o.targets = buildUnnamed350();
   }
   buildCounterDatafeed--;
   return o;
@@ -1097,11 +1097,11 @@
     unittest.expect(o.fileName, unittest.equals('foo'));
     checkDatafeedFormat(o.format);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed355(o.intendedDestinations);
+    checkUnnamed349(o.intendedDestinations);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.targetCountry, unittest.equals('foo'));
-    checkUnnamed356(o.targets);
+    checkUnnamed350(o.targets);
   }
   buildCounterDatafeed--;
 }
@@ -1164,27 +1164,27 @@
   buildCounterDatafeedFormat--;
 }
 
-buildUnnamed357() {
+buildUnnamed351() {
   var o = new core.List<api.DatafeedStatusError>();
   o.add(buildDatafeedStatusError());
   o.add(buildDatafeedStatusError());
   return o;
 }
 
-checkUnnamed357(core.List<api.DatafeedStatusError> o) {
+checkUnnamed351(core.List<api.DatafeedStatusError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusError(o[0]);
   checkDatafeedStatusError(o[1]);
 }
 
-buildUnnamed358() {
+buildUnnamed352() {
   var o = new core.List<api.DatafeedStatusError>();
   o.add(buildDatafeedStatusError());
   o.add(buildDatafeedStatusError());
   return o;
 }
 
-checkUnnamed358(core.List<api.DatafeedStatusError> o) {
+checkUnnamed352(core.List<api.DatafeedStatusError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusError(o[0]);
   checkDatafeedStatusError(o[1]);
@@ -1197,14 +1197,14 @@
   if (buildCounterDatafeedStatus < 3) {
     o.country = "foo";
     o.datafeedId = "foo";
-    o.errors = buildUnnamed357();
+    o.errors = buildUnnamed351();
     o.itemsTotal = "foo";
     o.itemsValid = "foo";
     o.kind = "foo";
     o.language = "foo";
     o.lastUploadDate = "foo";
     o.processingStatus = "foo";
-    o.warnings = buildUnnamed358();
+    o.warnings = buildUnnamed352();
   }
   buildCounterDatafeedStatus--;
   return o;
@@ -1215,26 +1215,26 @@
   if (buildCounterDatafeedStatus < 3) {
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.datafeedId, unittest.equals('foo'));
-    checkUnnamed357(o.errors);
+    checkUnnamed351(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.language, unittest.equals('foo'));
     unittest.expect(o.lastUploadDate, unittest.equals('foo'));
     unittest.expect(o.processingStatus, unittest.equals('foo'));
-    checkUnnamed358(o.warnings);
+    checkUnnamed352(o.warnings);
   }
   buildCounterDatafeedStatus--;
 }
 
-buildUnnamed359() {
+buildUnnamed353() {
   var o = new core.List<api.DatafeedStatusExample>();
   o.add(buildDatafeedStatusExample());
   o.add(buildDatafeedStatusExample());
   return o;
 }
 
-checkUnnamed359(core.List<api.DatafeedStatusExample> o) {
+checkUnnamed353(core.List<api.DatafeedStatusExample> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusExample(o[0]);
   checkDatafeedStatusExample(o[1]);
@@ -1247,7 +1247,7 @@
   if (buildCounterDatafeedStatusError < 3) {
     o.code = "foo";
     o.count = "foo";
-    o.examples = buildUnnamed359();
+    o.examples = buildUnnamed353();
     o.message = "foo";
   }
   buildCounterDatafeedStatusError--;
@@ -1259,7 +1259,7 @@
   if (buildCounterDatafeedStatusError < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
     unittest.expect(o.count, unittest.equals('foo'));
-    checkUnnamed359(o.examples);
+    checkUnnamed353(o.examples);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDatafeedStatusError--;
@@ -1288,27 +1288,27 @@
   buildCounterDatafeedStatusExample--;
 }
 
-buildUnnamed360() {
+buildUnnamed354() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed360(core.List<core.String> o) {
+checkUnnamed354(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed361() {
+buildUnnamed355() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed361(core.List<core.String> o) {
+checkUnnamed355(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1320,8 +1320,8 @@
   buildCounterDatafeedTarget++;
   if (buildCounterDatafeedTarget < 3) {
     o.country = "foo";
-    o.excludedDestinations = buildUnnamed360();
-    o.includedDestinations = buildUnnamed361();
+    o.excludedDestinations = buildUnnamed354();
+    o.includedDestinations = buildUnnamed355();
     o.language = "foo";
   }
   buildCounterDatafeedTarget--;
@@ -1332,21 +1332,21 @@
   buildCounterDatafeedTarget++;
   if (buildCounterDatafeedTarget < 3) {
     unittest.expect(o.country, unittest.equals('foo'));
-    checkUnnamed360(o.excludedDestinations);
-    checkUnnamed361(o.includedDestinations);
+    checkUnnamed354(o.excludedDestinations);
+    checkUnnamed355(o.includedDestinations);
     unittest.expect(o.language, unittest.equals('foo'));
   }
   buildCounterDatafeedTarget--;
 }
 
-buildUnnamed362() {
+buildUnnamed356() {
   var o = new core.List<api.DatafeedsCustomBatchRequestEntry>();
   o.add(buildDatafeedsCustomBatchRequestEntry());
   o.add(buildDatafeedsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed362(core.List<api.DatafeedsCustomBatchRequestEntry> o) {
+checkUnnamed356(core.List<api.DatafeedsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedsCustomBatchRequestEntry(o[0]);
   checkDatafeedsCustomBatchRequestEntry(o[1]);
@@ -1357,7 +1357,7 @@
   var o = new api.DatafeedsCustomBatchRequest();
   buildCounterDatafeedsCustomBatchRequest++;
   if (buildCounterDatafeedsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed362();
+    o.entries = buildUnnamed356();
   }
   buildCounterDatafeedsCustomBatchRequest--;
   return o;
@@ -1366,7 +1366,7 @@
 checkDatafeedsCustomBatchRequest(api.DatafeedsCustomBatchRequest o) {
   buildCounterDatafeedsCustomBatchRequest++;
   if (buildCounterDatafeedsCustomBatchRequest < 3) {
-    checkUnnamed362(o.entries);
+    checkUnnamed356(o.entries);
   }
   buildCounterDatafeedsCustomBatchRequest--;
 }
@@ -1398,14 +1398,14 @@
   buildCounterDatafeedsCustomBatchRequestEntry--;
 }
 
-buildUnnamed363() {
+buildUnnamed357() {
   var o = new core.List<api.DatafeedsCustomBatchResponseEntry>();
   o.add(buildDatafeedsCustomBatchResponseEntry());
   o.add(buildDatafeedsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed363(core.List<api.DatafeedsCustomBatchResponseEntry> o) {
+checkUnnamed357(core.List<api.DatafeedsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedsCustomBatchResponseEntry(o[0]);
   checkDatafeedsCustomBatchResponseEntry(o[1]);
@@ -1416,7 +1416,7 @@
   var o = new api.DatafeedsCustomBatchResponse();
   buildCounterDatafeedsCustomBatchResponse++;
   if (buildCounterDatafeedsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed363();
+    o.entries = buildUnnamed357();
     o.kind = "foo";
   }
   buildCounterDatafeedsCustomBatchResponse--;
@@ -1426,7 +1426,7 @@
 checkDatafeedsCustomBatchResponse(api.DatafeedsCustomBatchResponse o) {
   buildCounterDatafeedsCustomBatchResponse++;
   if (buildCounterDatafeedsCustomBatchResponse < 3) {
-    checkUnnamed363(o.entries);
+    checkUnnamed357(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDatafeedsCustomBatchResponse--;
@@ -1456,14 +1456,14 @@
   buildCounterDatafeedsCustomBatchResponseEntry--;
 }
 
-buildUnnamed364() {
+buildUnnamed358() {
   var o = new core.List<api.Datafeed>();
   o.add(buildDatafeed());
   o.add(buildDatafeed());
   return o;
 }
 
-checkUnnamed364(core.List<api.Datafeed> o) {
+checkUnnamed358(core.List<api.Datafeed> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeed(o[0]);
   checkDatafeed(o[1]);
@@ -1476,7 +1476,7 @@
   if (buildCounterDatafeedsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed364();
+    o.resources = buildUnnamed358();
   }
   buildCounterDatafeedsListResponse--;
   return o;
@@ -1487,19 +1487,19 @@
   if (buildCounterDatafeedsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed364(o.resources);
+    checkUnnamed358(o.resources);
   }
   buildCounterDatafeedsListResponse--;
 }
 
-buildUnnamed365() {
+buildUnnamed359() {
   var o = new core.List<api.DatafeedstatusesCustomBatchRequestEntry>();
   o.add(buildDatafeedstatusesCustomBatchRequestEntry());
   o.add(buildDatafeedstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed365(core.List<api.DatafeedstatusesCustomBatchRequestEntry> o) {
+checkUnnamed359(core.List<api.DatafeedstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedstatusesCustomBatchRequestEntry(o[0]);
   checkDatafeedstatusesCustomBatchRequestEntry(o[1]);
@@ -1510,7 +1510,7 @@
   var o = new api.DatafeedstatusesCustomBatchRequest();
   buildCounterDatafeedstatusesCustomBatchRequest++;
   if (buildCounterDatafeedstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed365();
+    o.entries = buildUnnamed359();
   }
   buildCounterDatafeedstatusesCustomBatchRequest--;
   return o;
@@ -1520,7 +1520,7 @@
     api.DatafeedstatusesCustomBatchRequest o) {
   buildCounterDatafeedstatusesCustomBatchRequest++;
   if (buildCounterDatafeedstatusesCustomBatchRequest < 3) {
-    checkUnnamed365(o.entries);
+    checkUnnamed359(o.entries);
   }
   buildCounterDatafeedstatusesCustomBatchRequest--;
 }
@@ -1555,14 +1555,14 @@
   buildCounterDatafeedstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed366() {
+buildUnnamed360() {
   var o = new core.List<api.DatafeedstatusesCustomBatchResponseEntry>();
   o.add(buildDatafeedstatusesCustomBatchResponseEntry());
   o.add(buildDatafeedstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed366(core.List<api.DatafeedstatusesCustomBatchResponseEntry> o) {
+checkUnnamed360(core.List<api.DatafeedstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedstatusesCustomBatchResponseEntry(o[0]);
   checkDatafeedstatusesCustomBatchResponseEntry(o[1]);
@@ -1573,7 +1573,7 @@
   var o = new api.DatafeedstatusesCustomBatchResponse();
   buildCounterDatafeedstatusesCustomBatchResponse++;
   if (buildCounterDatafeedstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed366();
+    o.entries = buildUnnamed360();
     o.kind = "foo";
   }
   buildCounterDatafeedstatusesCustomBatchResponse--;
@@ -1584,7 +1584,7 @@
     api.DatafeedstatusesCustomBatchResponse o) {
   buildCounterDatafeedstatusesCustomBatchResponse++;
   if (buildCounterDatafeedstatusesCustomBatchResponse < 3) {
-    checkUnnamed366(o.entries);
+    checkUnnamed360(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDatafeedstatusesCustomBatchResponse--;
@@ -1614,14 +1614,14 @@
   buildCounterDatafeedstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed367() {
+buildUnnamed361() {
   var o = new core.List<api.DatafeedStatus>();
   o.add(buildDatafeedStatus());
   o.add(buildDatafeedStatus());
   return o;
 }
 
-checkUnnamed367(core.List<api.DatafeedStatus> o) {
+checkUnnamed361(core.List<api.DatafeedStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatus(o[0]);
   checkDatafeedStatus(o[1]);
@@ -1634,7 +1634,7 @@
   if (buildCounterDatafeedstatusesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed367();
+    o.resources = buildUnnamed361();
   }
   buildCounterDatafeedstatusesListResponse--;
   return o;
@@ -1645,7 +1645,7 @@
   if (buildCounterDatafeedstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed367(o.resources);
+    checkUnnamed361(o.resources);
   }
   buildCounterDatafeedstatusesListResponse--;
 }
@@ -1694,14 +1694,14 @@
   buildCounterError--;
 }
 
-buildUnnamed368() {
+buildUnnamed362() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed368(core.List<api.Error> o) {
+checkUnnamed362(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -1713,7 +1713,7 @@
   buildCounterErrors++;
   if (buildCounterErrors < 3) {
     o.code = 42;
-    o.errors = buildUnnamed368();
+    o.errors = buildUnnamed362();
     o.message = "foo";
   }
   buildCounterErrors--;
@@ -1724,72 +1724,72 @@
   buildCounterErrors++;
   if (buildCounterErrors < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed368(o.errors);
+    checkUnnamed362(o.errors);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterErrors--;
 }
 
-buildUnnamed369() {
+buildUnnamed363() {
   var o = new core.List<api.LocationIdSet>();
   o.add(buildLocationIdSet());
   o.add(buildLocationIdSet());
   return o;
 }
 
-checkUnnamed369(core.List<api.LocationIdSet> o) {
+checkUnnamed363(core.List<api.LocationIdSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocationIdSet(o[0]);
   checkLocationIdSet(o[1]);
 }
 
-buildUnnamed370() {
+buildUnnamed364() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed370(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'));
 }
 
-buildUnnamed371() {
+buildUnnamed365() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed371(core.List<core.String> o) {
+checkUnnamed365(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed372() {
+buildUnnamed366() {
   var o = new core.List<api.Price>();
   o.add(buildPrice());
   o.add(buildPrice());
   return o;
 }
 
-checkUnnamed372(core.List<api.Price> o) {
+checkUnnamed366(core.List<api.Price> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPrice(o[0]);
   checkPrice(o[1]);
 }
 
-buildUnnamed373() {
+buildUnnamed367() {
   var o = new core.List<api.Weight>();
   o.add(buildWeight());
   o.add(buildWeight());
   return o;
 }
 
-checkUnnamed373(core.List<api.Weight> o) {
+checkUnnamed367(core.List<api.Weight> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWeight(o[0]);
   checkWeight(o[1]);
@@ -1800,11 +1800,11 @@
   var o = new api.Headers();
   buildCounterHeaders++;
   if (buildCounterHeaders < 3) {
-    o.locations = buildUnnamed369();
-    o.numberOfItems = buildUnnamed370();
-    o.postalCodeGroupNames = buildUnnamed371();
-    o.prices = buildUnnamed372();
-    o.weights = buildUnnamed373();
+    o.locations = buildUnnamed363();
+    o.numberOfItems = buildUnnamed364();
+    o.postalCodeGroupNames = buildUnnamed365();
+    o.prices = buildUnnamed366();
+    o.weights = buildUnnamed367();
   }
   buildCounterHeaders--;
   return o;
@@ -1813,11 +1813,11 @@
 checkHeaders(api.Headers o) {
   buildCounterHeaders++;
   if (buildCounterHeaders < 3) {
-    checkUnnamed369(o.locations);
-    checkUnnamed370(o.numberOfItems);
-    checkUnnamed371(o.postalCodeGroupNames);
-    checkUnnamed372(o.prices);
-    checkUnnamed373(o.weights);
+    checkUnnamed363(o.locations);
+    checkUnnamed364(o.numberOfItems);
+    checkUnnamed365(o.postalCodeGroupNames);
+    checkUnnamed366(o.prices);
+    checkUnnamed367(o.weights);
   }
   buildCounterHeaders--;
 }
@@ -1880,14 +1880,14 @@
   buildCounterInventory--;
 }
 
-buildUnnamed374() {
+buildUnnamed368() {
   var o = new core.List<api.InventoryCustomBatchRequestEntry>();
   o.add(buildInventoryCustomBatchRequestEntry());
   o.add(buildInventoryCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed374(core.List<api.InventoryCustomBatchRequestEntry> o) {
+checkUnnamed368(core.List<api.InventoryCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInventoryCustomBatchRequestEntry(o[0]);
   checkInventoryCustomBatchRequestEntry(o[1]);
@@ -1898,7 +1898,7 @@
   var o = new api.InventoryCustomBatchRequest();
   buildCounterInventoryCustomBatchRequest++;
   if (buildCounterInventoryCustomBatchRequest < 3) {
-    o.entries = buildUnnamed374();
+    o.entries = buildUnnamed368();
   }
   buildCounterInventoryCustomBatchRequest--;
   return o;
@@ -1907,7 +1907,7 @@
 checkInventoryCustomBatchRequest(api.InventoryCustomBatchRequest o) {
   buildCounterInventoryCustomBatchRequest++;
   if (buildCounterInventoryCustomBatchRequest < 3) {
-    checkUnnamed374(o.entries);
+    checkUnnamed368(o.entries);
   }
   buildCounterInventoryCustomBatchRequest--;
 }
@@ -1939,14 +1939,14 @@
   buildCounterInventoryCustomBatchRequestEntry--;
 }
 
-buildUnnamed375() {
+buildUnnamed369() {
   var o = new core.List<api.InventoryCustomBatchResponseEntry>();
   o.add(buildInventoryCustomBatchResponseEntry());
   o.add(buildInventoryCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed375(core.List<api.InventoryCustomBatchResponseEntry> o) {
+checkUnnamed369(core.List<api.InventoryCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInventoryCustomBatchResponseEntry(o[0]);
   checkInventoryCustomBatchResponseEntry(o[1]);
@@ -1957,7 +1957,7 @@
   var o = new api.InventoryCustomBatchResponse();
   buildCounterInventoryCustomBatchResponse++;
   if (buildCounterInventoryCustomBatchResponse < 3) {
-    o.entries = buildUnnamed375();
+    o.entries = buildUnnamed369();
     o.kind = "foo";
   }
   buildCounterInventoryCustomBatchResponse--;
@@ -1967,7 +1967,7 @@
 checkInventoryCustomBatchResponse(api.InventoryCustomBatchResponse o) {
   buildCounterInventoryCustomBatchResponse++;
   if (buildCounterInventoryCustomBatchResponse < 3) {
-    checkUnnamed375(o.entries);
+    checkUnnamed369(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterInventoryCustomBatchResponse--;
@@ -2072,14 +2072,14 @@
   buildCounterInventorySetResponse--;
 }
 
-buildUnnamed376() {
+buildUnnamed370() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed376(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'));
@@ -2090,7 +2090,7 @@
   var o = new api.LocationIdSet();
   buildCounterLocationIdSet++;
   if (buildCounterLocationIdSet < 3) {
-    o.locationIds = buildUnnamed376();
+    o.locationIds = buildUnnamed370();
   }
   buildCounterLocationIdSet--;
   return o;
@@ -2099,7 +2099,7 @@
 checkLocationIdSet(api.LocationIdSet o) {
   buildCounterLocationIdSet++;
   if (buildCounterLocationIdSet < 3) {
-    checkUnnamed376(o.locationIds);
+    checkUnnamed370(o.locationIds);
   }
   buildCounterLocationIdSet--;
 }
@@ -2127,53 +2127,53 @@
   buildCounterLoyaltyPoints--;
 }
 
-buildUnnamed377() {
+buildUnnamed371() {
   var o = new core.List<api.OrderLineItem>();
   o.add(buildOrderLineItem());
   o.add(buildOrderLineItem());
   return o;
 }
 
-checkUnnamed377(core.List<api.OrderLineItem> o) {
+checkUnnamed371(core.List<api.OrderLineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderLineItem(o[0]);
   checkOrderLineItem(o[1]);
 }
 
-buildUnnamed378() {
+buildUnnamed372() {
   var o = new core.List<api.OrderPromotion>();
   o.add(buildOrderPromotion());
   o.add(buildOrderPromotion());
   return o;
 }
 
-checkUnnamed378(core.List<api.OrderPromotion> o) {
+checkUnnamed372(core.List<api.OrderPromotion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderPromotion(o[0]);
   checkOrderPromotion(o[1]);
 }
 
-buildUnnamed379() {
+buildUnnamed373() {
   var o = new core.List<api.OrderRefund>();
   o.add(buildOrderRefund());
   o.add(buildOrderRefund());
   return o;
 }
 
-checkUnnamed379(core.List<api.OrderRefund> o) {
+checkUnnamed373(core.List<api.OrderRefund> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderRefund(o[0]);
   checkOrderRefund(o[1]);
 }
 
-buildUnnamed380() {
+buildUnnamed374() {
   var o = new core.List<api.OrderShipment>();
   o.add(buildOrderShipment());
   o.add(buildOrderShipment());
   return o;
 }
 
-checkUnnamed380(core.List<api.OrderShipment> o) {
+checkUnnamed374(core.List<api.OrderShipment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderShipment(o[0]);
   checkOrderShipment(o[1]);
@@ -2190,16 +2190,16 @@
     o.deliveryDetails = buildOrderDeliveryDetails();
     o.id = "foo";
     o.kind = "foo";
-    o.lineItems = buildUnnamed377();
+    o.lineItems = buildUnnamed371();
     o.merchantId = "foo";
     o.merchantOrderId = "foo";
     o.netAmount = buildPrice();
     o.paymentMethod = buildOrderPaymentMethod();
     o.paymentStatus = "foo";
     o.placedDate = "foo";
-    o.promotions = buildUnnamed378();
-    o.refunds = buildUnnamed379();
-    o.shipments = buildUnnamed380();
+    o.promotions = buildUnnamed372();
+    o.refunds = buildUnnamed373();
+    o.shipments = buildUnnamed374();
     o.shippingCost = buildPrice();
     o.shippingCostTax = buildPrice();
     o.shippingOption = "foo";
@@ -2218,16 +2218,16 @@
     checkOrderDeliveryDetails(o.deliveryDetails);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed377(o.lineItems);
+    checkUnnamed371(o.lineItems);
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.merchantOrderId, unittest.equals('foo'));
     checkPrice(o.netAmount);
     checkOrderPaymentMethod(o.paymentMethod);
     unittest.expect(o.paymentStatus, unittest.equals('foo'));
     unittest.expect(o.placedDate, unittest.equals('foo'));
-    checkUnnamed378(o.promotions);
-    checkUnnamed379(o.refunds);
-    checkUnnamed380(o.shipments);
+    checkUnnamed372(o.promotions);
+    checkUnnamed373(o.refunds);
+    checkUnnamed374(o.shipments);
     checkPrice(o.shippingCost);
     checkPrice(o.shippingCostTax);
     unittest.expect(o.shippingOption, unittest.equals('foo'));
@@ -2236,27 +2236,27 @@
   buildCounterOrder--;
 }
 
-buildUnnamed381() {
+buildUnnamed375() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed381(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'));
 }
 
-buildUnnamed382() {
+buildUnnamed376() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed382(core.List<core.String> o) {
+checkUnnamed376(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2268,13 +2268,13 @@
   buildCounterOrderAddress++;
   if (buildCounterOrderAddress < 3) {
     o.country = "foo";
-    o.fullAddress = buildUnnamed381();
+    o.fullAddress = buildUnnamed375();
     o.isPostOfficeBox = true;
     o.locality = "foo";
     o.postalCode = "foo";
     o.recipientName = "foo";
     o.region = "foo";
-    o.streetAddress = buildUnnamed382();
+    o.streetAddress = buildUnnamed376();
   }
   buildCounterOrderAddress--;
   return o;
@@ -2284,13 +2284,13 @@
   buildCounterOrderAddress++;
   if (buildCounterOrderAddress < 3) {
     unittest.expect(o.country, unittest.equals('foo'));
-    checkUnnamed381(o.fullAddress);
+    checkUnnamed375(o.fullAddress);
     unittest.expect(o.isPostOfficeBox, unittest.isTrue);
     unittest.expect(o.locality, unittest.equals('foo'));
     unittest.expect(o.postalCode, unittest.equals('foo'));
     unittest.expect(o.recipientName, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed382(o.streetAddress);
+    checkUnnamed376(o.streetAddress);
   }
   buildCounterOrderAddress--;
 }
@@ -2366,27 +2366,40 @@
   buildCounterOrderDeliveryDetails--;
 }
 
-buildUnnamed383() {
+buildUnnamed377() {
+  var o = new core.List<api.OrderMerchantProvidedAnnotation>();
+  o.add(buildOrderMerchantProvidedAnnotation());
+  o.add(buildOrderMerchantProvidedAnnotation());
+  return o;
+}
+
+checkUnnamed377(core.List<api.OrderMerchantProvidedAnnotation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOrderMerchantProvidedAnnotation(o[0]);
+  checkOrderMerchantProvidedAnnotation(o[1]);
+}
+
+buildUnnamed378() {
   var o = new core.List<api.OrderCancellation>();
   o.add(buildOrderCancellation());
   o.add(buildOrderCancellation());
   return o;
 }
 
-checkUnnamed383(core.List<api.OrderCancellation> o) {
+checkUnnamed378(core.List<api.OrderCancellation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderCancellation(o[0]);
   checkOrderCancellation(o[1]);
 }
 
-buildUnnamed384() {
+buildUnnamed379() {
   var o = new core.List<api.OrderReturn>();
   o.add(buildOrderReturn());
   o.add(buildOrderReturn());
   return o;
 }
 
-checkUnnamed384(core.List<api.OrderReturn> o) {
+checkUnnamed379(core.List<api.OrderReturn> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderReturn(o[0]);
   checkOrderReturn(o[1]);
@@ -2397,7 +2410,8 @@
   var o = new api.OrderLineItem();
   buildCounterOrderLineItem++;
   if (buildCounterOrderLineItem < 3) {
-    o.cancellations = buildUnnamed383();
+    o.annotations = buildUnnamed377();
+    o.cancellations = buildUnnamed378();
     o.id = "foo";
     o.price = buildPrice();
     o.product = buildOrderLineItemProduct();
@@ -2408,7 +2422,7 @@
     o.quantityReturned = 42;
     o.quantityShipped = 42;
     o.returnInfo = buildOrderLineItemReturnInfo();
-    o.returns = buildUnnamed384();
+    o.returns = buildUnnamed379();
     o.shippingDetails = buildOrderLineItemShippingDetails();
     o.tax = buildPrice();
   }
@@ -2419,7 +2433,8 @@
 checkOrderLineItem(api.OrderLineItem o) {
   buildCounterOrderLineItem++;
   if (buildCounterOrderLineItem < 3) {
-    checkUnnamed383(o.cancellations);
+    checkUnnamed377(o.annotations);
+    checkUnnamed378(o.cancellations);
     unittest.expect(o.id, unittest.equals('foo'));
     checkPrice(o.price);
     checkOrderLineItemProduct(o.product);
@@ -2430,21 +2445,21 @@
     unittest.expect(o.quantityReturned, unittest.equals(42));
     unittest.expect(o.quantityShipped, unittest.equals(42));
     checkOrderLineItemReturnInfo(o.returnInfo);
-    checkUnnamed384(o.returns);
+    checkUnnamed379(o.returns);
     checkOrderLineItemShippingDetails(o.shippingDetails);
     checkPrice(o.tax);
   }
   buildCounterOrderLineItem--;
 }
 
-buildUnnamed385() {
+buildUnnamed380() {
   var o = new core.List<api.OrderLineItemProductVariantAttribute>();
   o.add(buildOrderLineItemProductVariantAttribute());
   o.add(buildOrderLineItemProductVariantAttribute());
   return o;
 }
 
-checkUnnamed385(core.List<api.OrderLineItemProductVariantAttribute> o) {
+checkUnnamed380(core.List<api.OrderLineItemProductVariantAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderLineItemProductVariantAttribute(o[0]);
   checkOrderLineItemProductVariantAttribute(o[1]);
@@ -2469,7 +2484,7 @@
     o.shownImage = "foo";
     o.targetCountry = "foo";
     o.title = "foo";
-    o.variantAttributes = buildUnnamed385();
+    o.variantAttributes = buildUnnamed380();
   }
   buildCounterOrderLineItemProduct--;
   return o;
@@ -2492,7 +2507,7 @@
     unittest.expect(o.shownImage, unittest.equals('foo'));
     unittest.expect(o.targetCountry, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    checkUnnamed385(o.variantAttributes);
+    checkUnnamed380(o.variantAttributes);
   }
   buildCounterOrderLineItemProduct--;
 }
@@ -2591,6 +2606,27 @@
   buildCounterOrderLineItemShippingDetailsMethod--;
 }
 
+core.int buildCounterOrderMerchantProvidedAnnotation = 0;
+buildOrderMerchantProvidedAnnotation() {
+  var o = new api.OrderMerchantProvidedAnnotation();
+  buildCounterOrderMerchantProvidedAnnotation++;
+  if (buildCounterOrderMerchantProvidedAnnotation < 3) {
+    o.key = "foo";
+    o.value = "foo";
+  }
+  buildCounterOrderMerchantProvidedAnnotation--;
+  return o;
+}
+
+checkOrderMerchantProvidedAnnotation(api.OrderMerchantProvidedAnnotation o) {
+  buildCounterOrderMerchantProvidedAnnotation++;
+  if (buildCounterOrderMerchantProvidedAnnotation < 3) {
+    unittest.expect(o.key, unittest.equals('foo'));
+    unittest.expect(o.value, unittest.equals('foo'));
+  }
+  buildCounterOrderMerchantProvidedAnnotation--;
+}
+
 core.int buildCounterOrderPaymentMethod = 0;
 buildOrderPaymentMethod() {
   var o = new api.OrderPaymentMethod();
@@ -2620,14 +2656,14 @@
   buildCounterOrderPaymentMethod--;
 }
 
-buildUnnamed386() {
+buildUnnamed381() {
   var o = new core.List<api.OrderPromotionBenefit>();
   o.add(buildOrderPromotionBenefit());
   o.add(buildOrderPromotionBenefit());
   return o;
 }
 
-checkUnnamed386(core.List<api.OrderPromotionBenefit> o) {
+checkUnnamed381(core.List<api.OrderPromotionBenefit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderPromotionBenefit(o[0]);
   checkOrderPromotionBenefit(o[1]);
@@ -2638,7 +2674,7 @@
   var o = new api.OrderPromotion();
   buildCounterOrderPromotion++;
   if (buildCounterOrderPromotion < 3) {
-    o.benefits = buildUnnamed386();
+    o.benefits = buildUnnamed381();
     o.effectiveDates = "foo";
     o.genericRedemptionCode = "foo";
     o.id = "foo";
@@ -2653,7 +2689,7 @@
 checkOrderPromotion(api.OrderPromotion o) {
   buildCounterOrderPromotion++;
   if (buildCounterOrderPromotion < 3) {
-    checkUnnamed386(o.benefits);
+    checkUnnamed381(o.benefits);
     unittest.expect(o.effectiveDates, unittest.equals('foo'));
     unittest.expect(o.genericRedemptionCode, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -2664,14 +2700,14 @@
   buildCounterOrderPromotion--;
 }
 
-buildUnnamed387() {
+buildUnnamed382() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed387(core.List<core.String> o) {
+checkUnnamed382(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2683,7 +2719,7 @@
   buildCounterOrderPromotionBenefit++;
   if (buildCounterOrderPromotionBenefit < 3) {
     o.discount = buildPrice();
-    o.offerIds = buildUnnamed387();
+    o.offerIds = buildUnnamed382();
     o.subType = "foo";
     o.taxImpact = buildPrice();
     o.type = "foo";
@@ -2696,7 +2732,7 @@
   buildCounterOrderPromotionBenefit++;
   if (buildCounterOrderPromotionBenefit < 3) {
     checkPrice(o.discount);
-    checkUnnamed387(o.offerIds);
+    checkUnnamed382(o.offerIds);
     unittest.expect(o.subType, unittest.equals('foo'));
     checkPrice(o.taxImpact);
     unittest.expect(o.type, unittest.equals('foo'));
@@ -2758,14 +2794,14 @@
   buildCounterOrderReturn--;
 }
 
-buildUnnamed388() {
+buildUnnamed383() {
   var o = new core.List<api.OrderShipmentLineItemShipment>();
   o.add(buildOrderShipmentLineItemShipment());
   o.add(buildOrderShipmentLineItemShipment());
   return o;
 }
 
-checkUnnamed388(core.List<api.OrderShipmentLineItemShipment> o) {
+checkUnnamed383(core.List<api.OrderShipmentLineItemShipment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderShipmentLineItemShipment(o[0]);
   checkOrderShipmentLineItemShipment(o[1]);
@@ -2780,7 +2816,7 @@
     o.creationDate = "foo";
     o.deliveryDate = "foo";
     o.id = "foo";
-    o.lineItems = buildUnnamed388();
+    o.lineItems = buildUnnamed383();
     o.status = "foo";
     o.trackingId = "foo";
   }
@@ -2795,7 +2831,7 @@
     unittest.expect(o.creationDate, unittest.equals('foo'));
     unittest.expect(o.deliveryDate, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed388(o.lineItems);
+    checkUnnamed383(o.lineItems);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.trackingId, unittest.equals('foo'));
   }
@@ -3026,14 +3062,14 @@
   buildCounterOrdersCreateTestOrderResponse--;
 }
 
-buildUnnamed389() {
+buildUnnamed384() {
   var o = new core.List<api.OrdersCustomBatchRequestEntry>();
   o.add(buildOrdersCustomBatchRequestEntry());
   o.add(buildOrdersCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed389(core.List<api.OrdersCustomBatchRequestEntry> o) {
+checkUnnamed384(core.List<api.OrdersCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrdersCustomBatchRequestEntry(o[0]);
   checkOrdersCustomBatchRequestEntry(o[1]);
@@ -3044,7 +3080,7 @@
   var o = new api.OrdersCustomBatchRequest();
   buildCounterOrdersCustomBatchRequest++;
   if (buildCounterOrdersCustomBatchRequest < 3) {
-    o.entries = buildUnnamed389();
+    o.entries = buildUnnamed384();
   }
   buildCounterOrdersCustomBatchRequest--;
   return o;
@@ -3053,7 +3089,7 @@
 checkOrdersCustomBatchRequest(api.OrdersCustomBatchRequest o) {
   buildCounterOrdersCustomBatchRequest++;
   if (buildCounterOrdersCustomBatchRequest < 3) {
-    checkUnnamed389(o.entries);
+    checkUnnamed384(o.entries);
   }
   buildCounterOrdersCustomBatchRequest--;
 }
@@ -3073,7 +3109,11 @@
     o.orderId = "foo";
     o.refund = buildOrdersCustomBatchRequestEntryRefund();
     o.returnLineItem = buildOrdersCustomBatchRequestEntryReturnLineItem();
+    o.setLineItemMetadata =
+        buildOrdersCustomBatchRequestEntrySetLineItemMetadata();
     o.shipLineItems = buildOrdersCustomBatchRequestEntryShipLineItems();
+    o.updateLineItemShippingDetails =
+        buildOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails();
     o.updateShipment = buildOrdersCustomBatchRequestEntryUpdateShipment();
   }
   buildCounterOrdersCustomBatchRequestEntry--;
@@ -3093,7 +3133,11 @@
     unittest.expect(o.orderId, unittest.equals('foo'));
     checkOrdersCustomBatchRequestEntryRefund(o.refund);
     checkOrdersCustomBatchRequestEntryReturnLineItem(o.returnLineItem);
+    checkOrdersCustomBatchRequestEntrySetLineItemMetadata(
+        o.setLineItemMetadata);
     checkOrdersCustomBatchRequestEntryShipLineItems(o.shipLineItems);
+    checkOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails(
+        o.updateLineItemShippingDetails);
     checkOrdersCustomBatchRequestEntryUpdateShipment(o.updateShipment);
   }
   buildCounterOrdersCustomBatchRequestEntry--;
@@ -3211,20 +3255,57 @@
   buildCounterOrdersCustomBatchRequestEntryReturnLineItem--;
 }
 
-buildUnnamed390() {
+buildUnnamed385() {
+  var o = new core.List<api.OrderMerchantProvidedAnnotation>();
+  o.add(buildOrderMerchantProvidedAnnotation());
+  o.add(buildOrderMerchantProvidedAnnotation());
+  return o;
+}
+
+checkUnnamed385(core.List<api.OrderMerchantProvidedAnnotation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOrderMerchantProvidedAnnotation(o[0]);
+  checkOrderMerchantProvidedAnnotation(o[1]);
+}
+
+core.int buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata = 0;
+buildOrdersCustomBatchRequestEntrySetLineItemMetadata() {
+  var o = new api.OrdersCustomBatchRequestEntrySetLineItemMetadata();
+  buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata++;
+  if (buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata < 3) {
+    o.annotations = buildUnnamed385();
+    o.lineItemId = "foo";
+    o.productId = "foo";
+  }
+  buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata--;
+  return o;
+}
+
+checkOrdersCustomBatchRequestEntrySetLineItemMetadata(
+    api.OrdersCustomBatchRequestEntrySetLineItemMetadata o) {
+  buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata++;
+  if (buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata < 3) {
+    checkUnnamed385(o.annotations);
+    unittest.expect(o.lineItemId, unittest.equals('foo'));
+    unittest.expect(o.productId, unittest.equals('foo'));
+  }
+  buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata--;
+}
+
+buildUnnamed386() {
   var o = new core.List<api.OrderShipmentLineItemShipment>();
   o.add(buildOrderShipmentLineItemShipment());
   o.add(buildOrderShipmentLineItemShipment());
   return o;
 }
 
-checkUnnamed390(core.List<api.OrderShipmentLineItemShipment> o) {
+checkUnnamed386(core.List<api.OrderShipmentLineItemShipment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderShipmentLineItemShipment(o[0]);
   checkOrderShipmentLineItemShipment(o[1]);
 }
 
-buildUnnamed391() {
+buildUnnamed387() {
   var o = new core
       .List<api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo>();
   o.add(buildOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo());
@@ -3232,7 +3313,7 @@
   return o;
 }
 
-checkUnnamed391(
+checkUnnamed387(
     core.List<api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo(o[0]);
@@ -3245,9 +3326,9 @@
   buildCounterOrdersCustomBatchRequestEntryShipLineItems++;
   if (buildCounterOrdersCustomBatchRequestEntryShipLineItems < 3) {
     o.carrier = "foo";
-    o.lineItems = buildUnnamed390();
+    o.lineItems = buildUnnamed386();
     o.shipmentId = "foo";
-    o.shipmentInfos = buildUnnamed391();
+    o.shipmentInfos = buildUnnamed387();
     o.trackingId = "foo";
   }
   buildCounterOrdersCustomBatchRequestEntryShipLineItems--;
@@ -3259,9 +3340,9 @@
   buildCounterOrdersCustomBatchRequestEntryShipLineItems++;
   if (buildCounterOrdersCustomBatchRequestEntryShipLineItems < 3) {
     unittest.expect(o.carrier, unittest.equals('foo'));
-    checkUnnamed390(o.lineItems);
+    checkUnnamed386(o.lineItems);
     unittest.expect(o.shipmentId, unittest.equals('foo'));
-    checkUnnamed391(o.shipmentInfos);
+    checkUnnamed387(o.shipmentInfos);
     unittest.expect(o.trackingId, unittest.equals('foo'));
   }
   buildCounterOrdersCustomBatchRequestEntryShipLineItems--;
@@ -3291,6 +3372,35 @@
   buildCounterOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo--;
 }
 
+core.int
+    buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails = 0;
+buildOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails() {
+  var o = new api.OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails();
+  buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails++;
+  if (buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails <
+      3) {
+    o.deliverByDate = "foo";
+    o.lineItemId = "foo";
+    o.productId = "foo";
+    o.shipByDate = "foo";
+  }
+  buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails--;
+  return o;
+}
+
+checkOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails(
+    api.OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails o) {
+  buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails++;
+  if (buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails <
+      3) {
+    unittest.expect(o.deliverByDate, unittest.equals('foo'));
+    unittest.expect(o.lineItemId, unittest.equals('foo'));
+    unittest.expect(o.productId, unittest.equals('foo'));
+    unittest.expect(o.shipByDate, unittest.equals('foo'));
+  }
+  buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails--;
+}
+
 core.int buildCounterOrdersCustomBatchRequestEntryUpdateShipment = 0;
 buildOrdersCustomBatchRequestEntryUpdateShipment() {
   var o = new api.OrdersCustomBatchRequestEntryUpdateShipment();
@@ -3317,14 +3427,14 @@
   buildCounterOrdersCustomBatchRequestEntryUpdateShipment--;
 }
 
-buildUnnamed392() {
+buildUnnamed388() {
   var o = new core.List<api.OrdersCustomBatchResponseEntry>();
   o.add(buildOrdersCustomBatchResponseEntry());
   o.add(buildOrdersCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed392(core.List<api.OrdersCustomBatchResponseEntry> o) {
+checkUnnamed388(core.List<api.OrdersCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrdersCustomBatchResponseEntry(o[0]);
   checkOrdersCustomBatchResponseEntry(o[1]);
@@ -3335,7 +3445,7 @@
   var o = new api.OrdersCustomBatchResponse();
   buildCounterOrdersCustomBatchResponse++;
   if (buildCounterOrdersCustomBatchResponse < 3) {
-    o.entries = buildUnnamed392();
+    o.entries = buildUnnamed388();
     o.kind = "foo";
   }
   buildCounterOrdersCustomBatchResponse--;
@@ -3345,7 +3455,7 @@
 checkOrdersCustomBatchResponse(api.OrdersCustomBatchResponse o) {
   buildCounterOrdersCustomBatchResponse++;
   if (buildCounterOrdersCustomBatchResponse < 3) {
-    checkUnnamed392(o.entries);
+    checkUnnamed388(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterOrdersCustomBatchResponse--;
@@ -3422,14 +3532,14 @@
   buildCounterOrdersGetTestOrderTemplateResponse--;
 }
 
-buildUnnamed393() {
+buildUnnamed389() {
   var o = new core.List<api.Order>();
   o.add(buildOrder());
   o.add(buildOrder());
   return o;
 }
 
-checkUnnamed393(core.List<api.Order> o) {
+checkUnnamed389(core.List<api.Order> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrder(o[0]);
   checkOrder(o[1]);
@@ -3442,7 +3552,7 @@
   if (buildCounterOrdersListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed393();
+    o.resources = buildUnnamed389();
   }
   buildCounterOrdersListResponse--;
   return o;
@@ -3453,7 +3563,7 @@
   if (buildCounterOrdersListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed393(o.resources);
+    checkUnnamed389(o.resources);
   }
   buildCounterOrdersListResponse--;
 }
@@ -3558,20 +3668,80 @@
   buildCounterOrdersReturnLineItemResponse--;
 }
 
-buildUnnamed394() {
+buildUnnamed390() {
+  var o = new core.List<api.OrderMerchantProvidedAnnotation>();
+  o.add(buildOrderMerchantProvidedAnnotation());
+  o.add(buildOrderMerchantProvidedAnnotation());
+  return o;
+}
+
+checkUnnamed390(core.List<api.OrderMerchantProvidedAnnotation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOrderMerchantProvidedAnnotation(o[0]);
+  checkOrderMerchantProvidedAnnotation(o[1]);
+}
+
+core.int buildCounterOrdersSetLineItemMetadataRequest = 0;
+buildOrdersSetLineItemMetadataRequest() {
+  var o = new api.OrdersSetLineItemMetadataRequest();
+  buildCounterOrdersSetLineItemMetadataRequest++;
+  if (buildCounterOrdersSetLineItemMetadataRequest < 3) {
+    o.annotations = buildUnnamed390();
+    o.lineItemId = "foo";
+    o.operationId = "foo";
+    o.productId = "foo";
+  }
+  buildCounterOrdersSetLineItemMetadataRequest--;
+  return o;
+}
+
+checkOrdersSetLineItemMetadataRequest(api.OrdersSetLineItemMetadataRequest o) {
+  buildCounterOrdersSetLineItemMetadataRequest++;
+  if (buildCounterOrdersSetLineItemMetadataRequest < 3) {
+    checkUnnamed390(o.annotations);
+    unittest.expect(o.lineItemId, unittest.equals('foo'));
+    unittest.expect(o.operationId, unittest.equals('foo'));
+    unittest.expect(o.productId, unittest.equals('foo'));
+  }
+  buildCounterOrdersSetLineItemMetadataRequest--;
+}
+
+core.int buildCounterOrdersSetLineItemMetadataResponse = 0;
+buildOrdersSetLineItemMetadataResponse() {
+  var o = new api.OrdersSetLineItemMetadataResponse();
+  buildCounterOrdersSetLineItemMetadataResponse++;
+  if (buildCounterOrdersSetLineItemMetadataResponse < 3) {
+    o.executionStatus = "foo";
+    o.kind = "foo";
+  }
+  buildCounterOrdersSetLineItemMetadataResponse--;
+  return o;
+}
+
+checkOrdersSetLineItemMetadataResponse(
+    api.OrdersSetLineItemMetadataResponse o) {
+  buildCounterOrdersSetLineItemMetadataResponse++;
+  if (buildCounterOrdersSetLineItemMetadataResponse < 3) {
+    unittest.expect(o.executionStatus, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+  }
+  buildCounterOrdersSetLineItemMetadataResponse--;
+}
+
+buildUnnamed391() {
   var o = new core.List<api.OrderShipmentLineItemShipment>();
   o.add(buildOrderShipmentLineItemShipment());
   o.add(buildOrderShipmentLineItemShipment());
   return o;
 }
 
-checkUnnamed394(core.List<api.OrderShipmentLineItemShipment> o) {
+checkUnnamed391(core.List<api.OrderShipmentLineItemShipment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderShipmentLineItemShipment(o[0]);
   checkOrderShipmentLineItemShipment(o[1]);
 }
 
-buildUnnamed395() {
+buildUnnamed392() {
   var o = new core
       .List<api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo>();
   o.add(buildOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo());
@@ -3579,7 +3749,7 @@
   return o;
 }
 
-checkUnnamed395(
+checkUnnamed392(
     core.List<api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo(o[0]);
@@ -3592,10 +3762,10 @@
   buildCounterOrdersShipLineItemsRequest++;
   if (buildCounterOrdersShipLineItemsRequest < 3) {
     o.carrier = "foo";
-    o.lineItems = buildUnnamed394();
+    o.lineItems = buildUnnamed391();
     o.operationId = "foo";
     o.shipmentId = "foo";
-    o.shipmentInfos = buildUnnamed395();
+    o.shipmentInfos = buildUnnamed392();
     o.trackingId = "foo";
   }
   buildCounterOrdersShipLineItemsRequest--;
@@ -3606,10 +3776,10 @@
   buildCounterOrdersShipLineItemsRequest++;
   if (buildCounterOrdersShipLineItemsRequest < 3) {
     unittest.expect(o.carrier, unittest.equals('foo'));
-    checkUnnamed394(o.lineItems);
+    checkUnnamed391(o.lineItems);
     unittest.expect(o.operationId, unittest.equals('foo'));
     unittest.expect(o.shipmentId, unittest.equals('foo'));
-    checkUnnamed395(o.shipmentInfos);
+    checkUnnamed392(o.shipmentInfos);
     unittest.expect(o.trackingId, unittest.equals('foo'));
   }
   buildCounterOrdersShipLineItemsRequest--;
@@ -3636,6 +3806,56 @@
   buildCounterOrdersShipLineItemsResponse--;
 }
 
+core.int buildCounterOrdersUpdateLineItemShippingDetailsRequest = 0;
+buildOrdersUpdateLineItemShippingDetailsRequest() {
+  var o = new api.OrdersUpdateLineItemShippingDetailsRequest();
+  buildCounterOrdersUpdateLineItemShippingDetailsRequest++;
+  if (buildCounterOrdersUpdateLineItemShippingDetailsRequest < 3) {
+    o.deliverByDate = "foo";
+    o.lineItemId = "foo";
+    o.operationId = "foo";
+    o.productId = "foo";
+    o.shipByDate = "foo";
+  }
+  buildCounterOrdersUpdateLineItemShippingDetailsRequest--;
+  return o;
+}
+
+checkOrdersUpdateLineItemShippingDetailsRequest(
+    api.OrdersUpdateLineItemShippingDetailsRequest o) {
+  buildCounterOrdersUpdateLineItemShippingDetailsRequest++;
+  if (buildCounterOrdersUpdateLineItemShippingDetailsRequest < 3) {
+    unittest.expect(o.deliverByDate, unittest.equals('foo'));
+    unittest.expect(o.lineItemId, unittest.equals('foo'));
+    unittest.expect(o.operationId, unittest.equals('foo'));
+    unittest.expect(o.productId, unittest.equals('foo'));
+    unittest.expect(o.shipByDate, unittest.equals('foo'));
+  }
+  buildCounterOrdersUpdateLineItemShippingDetailsRequest--;
+}
+
+core.int buildCounterOrdersUpdateLineItemShippingDetailsResponse = 0;
+buildOrdersUpdateLineItemShippingDetailsResponse() {
+  var o = new api.OrdersUpdateLineItemShippingDetailsResponse();
+  buildCounterOrdersUpdateLineItemShippingDetailsResponse++;
+  if (buildCounterOrdersUpdateLineItemShippingDetailsResponse < 3) {
+    o.executionStatus = "foo";
+    o.kind = "foo";
+  }
+  buildCounterOrdersUpdateLineItemShippingDetailsResponse--;
+  return o;
+}
+
+checkOrdersUpdateLineItemShippingDetailsResponse(
+    api.OrdersUpdateLineItemShippingDetailsResponse o) {
+  buildCounterOrdersUpdateLineItemShippingDetailsResponse++;
+  if (buildCounterOrdersUpdateLineItemShippingDetailsResponse < 3) {
+    unittest.expect(o.executionStatus, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+  }
+  buildCounterOrdersUpdateLineItemShippingDetailsResponse--;
+}
+
 core.int buildCounterOrdersUpdateMerchantOrderIdRequest = 0;
 buildOrdersUpdateMerchantOrderIdRequest() {
   var o = new api.OrdersUpdateMerchantOrderIdRequest();
@@ -3728,14 +3948,14 @@
   buildCounterOrdersUpdateShipmentResponse--;
 }
 
-buildUnnamed396() {
+buildUnnamed393() {
   var o = new core.List<api.PostalCodeRange>();
   o.add(buildPostalCodeRange());
   o.add(buildPostalCodeRange());
   return o;
 }
 
-checkUnnamed396(core.List<api.PostalCodeRange> o) {
+checkUnnamed393(core.List<api.PostalCodeRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostalCodeRange(o[0]);
   checkPostalCodeRange(o[1]);
@@ -3748,7 +3968,7 @@
   if (buildCounterPostalCodeGroup < 3) {
     o.country = "foo";
     o.name = "foo";
-    o.postalCodeRanges = buildUnnamed396();
+    o.postalCodeRanges = buildUnnamed393();
   }
   buildCounterPostalCodeGroup--;
   return o;
@@ -3759,7 +3979,7 @@
   if (buildCounterPostalCodeGroup < 3) {
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed396(o.postalCodeRanges);
+    checkUnnamed393(o.postalCodeRanges);
   }
   buildCounterPostalCodeGroup--;
 }
@@ -3806,97 +4026,136 @@
   buildCounterPrice--;
 }
 
+buildUnnamed394() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed394(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed395() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed395(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed396() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed396(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed397() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed397(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed398() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed398(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed399() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed399(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed400() {
   var o = new core.List<api.ProductAspect>();
   o.add(buildProductAspect());
   o.add(buildProductAspect());
   return o;
 }
 
-checkUnnamed400(core.List<api.ProductAspect> o) {
+checkUnnamed397(core.List<api.ProductAspect> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductAspect(o[0]);
   checkProductAspect(o[1]);
 }
 
-buildUnnamed401() {
+buildUnnamed398() {
   var o = new core.List<api.ProductCustomAttribute>();
   o.add(buildProductCustomAttribute());
   o.add(buildProductCustomAttribute());
   return o;
 }
 
-checkUnnamed401(core.List<api.ProductCustomAttribute> o) {
+checkUnnamed398(core.List<api.ProductCustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomAttribute(o[0]);
   checkProductCustomAttribute(o[1]);
 }
 
-buildUnnamed402() {
+buildUnnamed399() {
   var o = new core.List<api.ProductCustomGroup>();
   o.add(buildProductCustomGroup());
   o.add(buildProductCustomGroup());
   return o;
 }
 
-checkUnnamed402(core.List<api.ProductCustomGroup> o) {
+checkUnnamed399(core.List<api.ProductCustomGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomGroup(o[0]);
   checkProductCustomGroup(o[1]);
 }
 
-buildUnnamed403() {
+buildUnnamed400() {
   var o = new core.List<api.ProductDestination>();
   o.add(buildProductDestination());
   o.add(buildProductDestination());
   return o;
 }
 
-checkUnnamed403(core.List<api.ProductDestination> o) {
+checkUnnamed400(core.List<api.ProductDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductDestination(o[0]);
   checkProductDestination(o[1]);
 }
 
+buildUnnamed401() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed401(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed402() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed402(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed403() {
+  var o = new core.List<api.ProductShipping>();
+  o.add(buildProductShipping());
+  o.add(buildProductShipping());
+  return o;
+}
+
+checkUnnamed403(core.List<api.ProductShipping> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkProductShipping(o[0]);
+  checkProductShipping(o[1]);
+}
+
 buildUnnamed404() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -3911,78 +4170,39 @@
 }
 
 buildUnnamed405() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed405(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed406() {
-  var o = new core.List<api.ProductShipping>();
-  o.add(buildProductShipping());
-  o.add(buildProductShipping());
-  return o;
-}
-
-checkUnnamed406(core.List<api.ProductShipping> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkProductShipping(o[0]);
-  checkProductShipping(o[1]);
-}
-
-buildUnnamed407() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed407(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed408() {
   var o = new core.List<api.ProductTax>();
   o.add(buildProductTax());
   o.add(buildProductTax());
   return o;
 }
 
-checkUnnamed408(core.List<api.ProductTax> o) {
+checkUnnamed405(core.List<api.ProductTax> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductTax(o[0]);
   checkProductTax(o[1]);
 }
 
-buildUnnamed409() {
+buildUnnamed406() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed409(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'));
 }
 
-buildUnnamed410() {
+buildUnnamed407() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed410(core.List<api.Error> o) {
+checkUnnamed407(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -3993,14 +4213,14 @@
   var o = new api.Product();
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    o.additionalImageLinks = buildUnnamed397();
-    o.additionalProductTypes = buildUnnamed398();
+    o.additionalImageLinks = buildUnnamed394();
+    o.additionalProductTypes = buildUnnamed395();
     o.adult = true;
     o.adwordsGrouping = "foo";
-    o.adwordsLabels = buildUnnamed399();
+    o.adwordsLabels = buildUnnamed396();
     o.adwordsRedirect = "foo";
     o.ageGroup = "foo";
-    o.aspects = buildUnnamed400();
+    o.aspects = buildUnnamed397();
     o.availability = "foo";
     o.availabilityDate = "foo";
     o.brand = "foo";
@@ -4008,18 +4228,18 @@
     o.color = "foo";
     o.condition = "foo";
     o.contentLanguage = "foo";
-    o.customAttributes = buildUnnamed401();
-    o.customGroups = buildUnnamed402();
+    o.customAttributes = buildUnnamed398();
+    o.customGroups = buildUnnamed399();
     o.customLabel0 = "foo";
     o.customLabel1 = "foo";
     o.customLabel2 = "foo";
     o.customLabel3 = "foo";
     o.customLabel4 = "foo";
     o.description = "foo";
-    o.destinations = buildUnnamed403();
+    o.destinations = buildUnnamed400();
     o.displayAdsId = "foo";
     o.displayAdsLink = "foo";
-    o.displayAdsSimilarIds = buildUnnamed404();
+    o.displayAdsSimilarIds = buildUnnamed401();
     o.displayAdsTitle = "foo";
     o.displayAdsValue = 42.0;
     o.energyEfficiencyClass = "foo";
@@ -4047,11 +4267,11 @@
     o.pattern = "foo";
     o.price = buildPrice();
     o.productType = "foo";
-    o.promotionIds = buildUnnamed405();
+    o.promotionIds = buildUnnamed402();
     o.salePrice = buildPrice();
     o.salePriceEffectiveDate = "foo";
     o.sellOnGoogleQuantity = "foo";
-    o.shipping = buildUnnamed406();
+    o.shipping = buildUnnamed403();
     o.shippingHeight = buildProductShippingDimension();
     o.shippingLabel = "foo";
     o.shippingLength = buildProductShippingDimension();
@@ -4059,14 +4279,14 @@
     o.shippingWidth = buildProductShippingDimension();
     o.sizeSystem = "foo";
     o.sizeType = "foo";
-    o.sizes = buildUnnamed407();
+    o.sizes = buildUnnamed404();
     o.targetCountry = "foo";
-    o.taxes = buildUnnamed408();
+    o.taxes = buildUnnamed405();
     o.title = "foo";
     o.unitPricingBaseMeasure = buildProductUnitPricingBaseMeasure();
     o.unitPricingMeasure = buildProductUnitPricingMeasure();
-    o.validatedDestinations = buildUnnamed409();
-    o.warnings = buildUnnamed410();
+    o.validatedDestinations = buildUnnamed406();
+    o.warnings = buildUnnamed407();
   }
   buildCounterProduct--;
   return o;
@@ -4075,14 +4295,14 @@
 checkProduct(api.Product o) {
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    checkUnnamed397(o.additionalImageLinks);
-    checkUnnamed398(o.additionalProductTypes);
+    checkUnnamed394(o.additionalImageLinks);
+    checkUnnamed395(o.additionalProductTypes);
     unittest.expect(o.adult, unittest.isTrue);
     unittest.expect(o.adwordsGrouping, unittest.equals('foo'));
-    checkUnnamed399(o.adwordsLabels);
+    checkUnnamed396(o.adwordsLabels);
     unittest.expect(o.adwordsRedirect, unittest.equals('foo'));
     unittest.expect(o.ageGroup, unittest.equals('foo'));
-    checkUnnamed400(o.aspects);
+    checkUnnamed397(o.aspects);
     unittest.expect(o.availability, unittest.equals('foo'));
     unittest.expect(o.availabilityDate, unittest.equals('foo'));
     unittest.expect(o.brand, unittest.equals('foo'));
@@ -4090,18 +4310,18 @@
     unittest.expect(o.color, unittest.equals('foo'));
     unittest.expect(o.condition, unittest.equals('foo'));
     unittest.expect(o.contentLanguage, unittest.equals('foo'));
-    checkUnnamed401(o.customAttributes);
-    checkUnnamed402(o.customGroups);
+    checkUnnamed398(o.customAttributes);
+    checkUnnamed399(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'));
-    checkUnnamed403(o.destinations);
+    checkUnnamed400(o.destinations);
     unittest.expect(o.displayAdsId, unittest.equals('foo'));
     unittest.expect(o.displayAdsLink, unittest.equals('foo'));
-    checkUnnamed404(o.displayAdsSimilarIds);
+    checkUnnamed401(o.displayAdsSimilarIds);
     unittest.expect(o.displayAdsTitle, unittest.equals('foo'));
     unittest.expect(o.displayAdsValue, unittest.equals(42.0));
     unittest.expect(o.energyEfficiencyClass, unittest.equals('foo'));
@@ -4129,11 +4349,11 @@
     unittest.expect(o.pattern, unittest.equals('foo'));
     checkPrice(o.price);
     unittest.expect(o.productType, unittest.equals('foo'));
-    checkUnnamed405(o.promotionIds);
+    checkUnnamed402(o.promotionIds);
     checkPrice(o.salePrice);
     unittest.expect(o.salePriceEffectiveDate, unittest.equals('foo'));
     unittest.expect(o.sellOnGoogleQuantity, unittest.equals('foo'));
-    checkUnnamed406(o.shipping);
+    checkUnnamed403(o.shipping);
     checkProductShippingDimension(o.shippingHeight);
     unittest.expect(o.shippingLabel, unittest.equals('foo'));
     checkProductShippingDimension(o.shippingLength);
@@ -4141,14 +4361,14 @@
     checkProductShippingDimension(o.shippingWidth);
     unittest.expect(o.sizeSystem, unittest.equals('foo'));
     unittest.expect(o.sizeType, unittest.equals('foo'));
-    checkUnnamed407(o.sizes);
+    checkUnnamed404(o.sizes);
     unittest.expect(o.targetCountry, unittest.equals('foo'));
-    checkUnnamed408(o.taxes);
+    checkUnnamed405(o.taxes);
     unittest.expect(o.title, unittest.equals('foo'));
     checkProductUnitPricingBaseMeasure(o.unitPricingBaseMeasure);
     checkProductUnitPricingMeasure(o.unitPricingMeasure);
-    checkUnnamed409(o.validatedDestinations);
-    checkUnnamed410(o.warnings);
+    checkUnnamed406(o.validatedDestinations);
+    checkUnnamed407(o.warnings);
   }
   buildCounterProduct--;
 }
@@ -4201,14 +4421,14 @@
   buildCounterProductCustomAttribute--;
 }
 
-buildUnnamed411() {
+buildUnnamed408() {
   var o = new core.List<api.ProductCustomAttribute>();
   o.add(buildProductCustomAttribute());
   o.add(buildProductCustomAttribute());
   return o;
 }
 
-checkUnnamed411(core.List<api.ProductCustomAttribute> o) {
+checkUnnamed408(core.List<api.ProductCustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomAttribute(o[0]);
   checkProductCustomAttribute(o[1]);
@@ -4219,7 +4439,7 @@
   var o = new api.ProductCustomGroup();
   buildCounterProductCustomGroup++;
   if (buildCounterProductCustomGroup < 3) {
-    o.attributes = buildUnnamed411();
+    o.attributes = buildUnnamed408();
     o.name = "foo";
   }
   buildCounterProductCustomGroup--;
@@ -4229,7 +4449,7 @@
 checkProductCustomGroup(api.ProductCustomGroup o) {
   buildCounterProductCustomGroup++;
   if (buildCounterProductCustomGroup < 3) {
-    checkUnnamed411(o.attributes);
+    checkUnnamed408(o.attributes);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterProductCustomGroup--;
@@ -4329,27 +4549,27 @@
   buildCounterProductShippingWeight--;
 }
 
-buildUnnamed412() {
+buildUnnamed409() {
   var o = new core.List<api.ProductStatusDataQualityIssue>();
   o.add(buildProductStatusDataQualityIssue());
   o.add(buildProductStatusDataQualityIssue());
   return o;
 }
 
-checkUnnamed412(core.List<api.ProductStatusDataQualityIssue> o) {
+checkUnnamed409(core.List<api.ProductStatusDataQualityIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatusDataQualityIssue(o[0]);
   checkProductStatusDataQualityIssue(o[1]);
 }
 
-buildUnnamed413() {
+buildUnnamed410() {
   var o = new core.List<api.ProductStatusDestinationStatus>();
   o.add(buildProductStatusDestinationStatus());
   o.add(buildProductStatusDestinationStatus());
   return o;
 }
 
-checkUnnamed413(core.List<api.ProductStatusDestinationStatus> o) {
+checkUnnamed410(core.List<api.ProductStatusDestinationStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatusDestinationStatus(o[0]);
   checkProductStatusDestinationStatus(o[1]);
@@ -4361,8 +4581,8 @@
   buildCounterProductStatus++;
   if (buildCounterProductStatus < 3) {
     o.creationDate = "foo";
-    o.dataQualityIssues = buildUnnamed412();
-    o.destinationStatuses = buildUnnamed413();
+    o.dataQualityIssues = buildUnnamed409();
+    o.destinationStatuses = buildUnnamed410();
     o.googleExpirationDate = "foo";
     o.kind = "foo";
     o.lastUpdateDate = "foo";
@@ -4379,8 +4599,8 @@
   buildCounterProductStatus++;
   if (buildCounterProductStatus < 3) {
     unittest.expect(o.creationDate, unittest.equals('foo'));
-    checkUnnamed412(o.dataQualityIssues);
-    checkUnnamed413(o.destinationStatuses);
+    checkUnnamed409(o.dataQualityIssues);
+    checkUnnamed410(o.destinationStatuses);
     unittest.expect(o.googleExpirationDate, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastUpdateDate, unittest.equals('foo'));
@@ -4519,14 +4739,14 @@
   buildCounterProductUnitPricingMeasure--;
 }
 
-buildUnnamed414() {
+buildUnnamed411() {
   var o = new core.List<api.ProductsCustomBatchRequestEntry>();
   o.add(buildProductsCustomBatchRequestEntry());
   o.add(buildProductsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed414(core.List<api.ProductsCustomBatchRequestEntry> o) {
+checkUnnamed411(core.List<api.ProductsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductsCustomBatchRequestEntry(o[0]);
   checkProductsCustomBatchRequestEntry(o[1]);
@@ -4537,7 +4757,7 @@
   var o = new api.ProductsCustomBatchRequest();
   buildCounterProductsCustomBatchRequest++;
   if (buildCounterProductsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed414();
+    o.entries = buildUnnamed411();
   }
   buildCounterProductsCustomBatchRequest--;
   return o;
@@ -4546,7 +4766,7 @@
 checkProductsCustomBatchRequest(api.ProductsCustomBatchRequest o) {
   buildCounterProductsCustomBatchRequest++;
   if (buildCounterProductsCustomBatchRequest < 3) {
-    checkUnnamed414(o.entries);
+    checkUnnamed411(o.entries);
   }
   buildCounterProductsCustomBatchRequest--;
 }
@@ -4578,14 +4798,14 @@
   buildCounterProductsCustomBatchRequestEntry--;
 }
 
-buildUnnamed415() {
+buildUnnamed412() {
   var o = new core.List<api.ProductsCustomBatchResponseEntry>();
   o.add(buildProductsCustomBatchResponseEntry());
   o.add(buildProductsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed415(core.List<api.ProductsCustomBatchResponseEntry> o) {
+checkUnnamed412(core.List<api.ProductsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductsCustomBatchResponseEntry(o[0]);
   checkProductsCustomBatchResponseEntry(o[1]);
@@ -4596,7 +4816,7 @@
   var o = new api.ProductsCustomBatchResponse();
   buildCounterProductsCustomBatchResponse++;
   if (buildCounterProductsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed415();
+    o.entries = buildUnnamed412();
     o.kind = "foo";
   }
   buildCounterProductsCustomBatchResponse--;
@@ -4606,7 +4826,7 @@
 checkProductsCustomBatchResponse(api.ProductsCustomBatchResponse o) {
   buildCounterProductsCustomBatchResponse++;
   if (buildCounterProductsCustomBatchResponse < 3) {
-    checkUnnamed415(o.entries);
+    checkUnnamed412(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterProductsCustomBatchResponse--;
@@ -4637,14 +4857,14 @@
   buildCounterProductsCustomBatchResponseEntry--;
 }
 
-buildUnnamed416() {
+buildUnnamed413() {
   var o = new core.List<api.Product>();
   o.add(buildProduct());
   o.add(buildProduct());
   return o;
 }
 
-checkUnnamed416(core.List<api.Product> o) {
+checkUnnamed413(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProduct(o[0]);
   checkProduct(o[1]);
@@ -4657,7 +4877,7 @@
   if (buildCounterProductsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed416();
+    o.resources = buildUnnamed413();
   }
   buildCounterProductsListResponse--;
   return o;
@@ -4668,19 +4888,19 @@
   if (buildCounterProductsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed416(o.resources);
+    checkUnnamed413(o.resources);
   }
   buildCounterProductsListResponse--;
 }
 
-buildUnnamed417() {
+buildUnnamed414() {
   var o = new core.List<api.ProductstatusesCustomBatchRequestEntry>();
   o.add(buildProductstatusesCustomBatchRequestEntry());
   o.add(buildProductstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed417(core.List<api.ProductstatusesCustomBatchRequestEntry> o) {
+checkUnnamed414(core.List<api.ProductstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductstatusesCustomBatchRequestEntry(o[0]);
   checkProductstatusesCustomBatchRequestEntry(o[1]);
@@ -4691,7 +4911,7 @@
   var o = new api.ProductstatusesCustomBatchRequest();
   buildCounterProductstatusesCustomBatchRequest++;
   if (buildCounterProductstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed417();
+    o.entries = buildUnnamed414();
   }
   buildCounterProductstatusesCustomBatchRequest--;
   return o;
@@ -4701,7 +4921,7 @@
     api.ProductstatusesCustomBatchRequest o) {
   buildCounterProductstatusesCustomBatchRequest++;
   if (buildCounterProductstatusesCustomBatchRequest < 3) {
-    checkUnnamed417(o.entries);
+    checkUnnamed414(o.entries);
   }
   buildCounterProductstatusesCustomBatchRequest--;
 }
@@ -4734,14 +4954,14 @@
   buildCounterProductstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed418() {
+buildUnnamed415() {
   var o = new core.List<api.ProductstatusesCustomBatchResponseEntry>();
   o.add(buildProductstatusesCustomBatchResponseEntry());
   o.add(buildProductstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed418(core.List<api.ProductstatusesCustomBatchResponseEntry> o) {
+checkUnnamed415(core.List<api.ProductstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductstatusesCustomBatchResponseEntry(o[0]);
   checkProductstatusesCustomBatchResponseEntry(o[1]);
@@ -4752,7 +4972,7 @@
   var o = new api.ProductstatusesCustomBatchResponse();
   buildCounterProductstatusesCustomBatchResponse++;
   if (buildCounterProductstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed418();
+    o.entries = buildUnnamed415();
     o.kind = "foo";
   }
   buildCounterProductstatusesCustomBatchResponse--;
@@ -4763,7 +4983,7 @@
     api.ProductstatusesCustomBatchResponse o) {
   buildCounterProductstatusesCustomBatchResponse++;
   if (buildCounterProductstatusesCustomBatchResponse < 3) {
-    checkUnnamed418(o.entries);
+    checkUnnamed415(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterProductstatusesCustomBatchResponse--;
@@ -4795,14 +5015,14 @@
   buildCounterProductstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed419() {
+buildUnnamed416() {
   var o = new core.List<api.ProductStatus>();
   o.add(buildProductStatus());
   o.add(buildProductStatus());
   return o;
 }
 
-checkUnnamed419(core.List<api.ProductStatus> o) {
+checkUnnamed416(core.List<api.ProductStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatus(o[0]);
   checkProductStatus(o[1]);
@@ -4815,7 +5035,7 @@
   if (buildCounterProductstatusesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed419();
+    o.resources = buildUnnamed416();
   }
   buildCounterProductstatusesListResponse--;
   return o;
@@ -4826,45 +5046,45 @@
   if (buildCounterProductstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed419(o.resources);
+    checkUnnamed416(o.resources);
   }
   buildCounterProductstatusesListResponse--;
 }
 
-buildUnnamed420() {
+buildUnnamed417() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed420(core.List<core.String> o) {
+checkUnnamed417(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed421() {
+buildUnnamed418() {
   var o = new core.List<api.CarrierRate>();
   o.add(buildCarrierRate());
   o.add(buildCarrierRate());
   return o;
 }
 
-checkUnnamed421(core.List<api.CarrierRate> o) {
+checkUnnamed418(core.List<api.CarrierRate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCarrierRate(o[0]);
   checkCarrierRate(o[1]);
 }
 
-buildUnnamed422() {
+buildUnnamed419() {
   var o = new core.List<api.Table>();
   o.add(buildTable());
   o.add(buildTable());
   return o;
 }
 
-checkUnnamed422(core.List<api.Table> o) {
+checkUnnamed419(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTable(o[0]);
   checkTable(o[1]);
@@ -4875,11 +5095,11 @@
   var o = new api.RateGroup();
   buildCounterRateGroup++;
   if (buildCounterRateGroup < 3) {
-    o.applicableShippingLabels = buildUnnamed420();
-    o.carrierRates = buildUnnamed421();
+    o.applicableShippingLabels = buildUnnamed417();
+    o.carrierRates = buildUnnamed418();
     o.mainTable = buildTable();
     o.singleValue = buildValue();
-    o.subtables = buildUnnamed422();
+    o.subtables = buildUnnamed419();
   }
   buildCounterRateGroup--;
   return o;
@@ -4888,23 +5108,23 @@
 checkRateGroup(api.RateGroup o) {
   buildCounterRateGroup++;
   if (buildCounterRateGroup < 3) {
-    checkUnnamed420(o.applicableShippingLabels);
-    checkUnnamed421(o.carrierRates);
+    checkUnnamed417(o.applicableShippingLabels);
+    checkUnnamed418(o.carrierRates);
     checkTable(o.mainTable);
     checkValue(o.singleValue);
-    checkUnnamed422(o.subtables);
+    checkUnnamed419(o.subtables);
   }
   buildCounterRateGroup--;
 }
 
-buildUnnamed423() {
+buildUnnamed420() {
   var o = new core.List<api.Value>();
   o.add(buildValue());
   o.add(buildValue());
   return o;
 }
 
-checkUnnamed423(core.List<api.Value> o) {
+checkUnnamed420(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o[0]);
   checkValue(o[1]);
@@ -4915,7 +5135,7 @@
   var o = new api.Row();
   buildCounterRow++;
   if (buildCounterRow < 3) {
-    o.cells = buildUnnamed423();
+    o.cells = buildUnnamed420();
   }
   buildCounterRow--;
   return o;
@@ -4924,19 +5144,19 @@
 checkRow(api.Row o) {
   buildCounterRow++;
   if (buildCounterRow < 3) {
-    checkUnnamed423(o.cells);
+    checkUnnamed420(o.cells);
   }
   buildCounterRow--;
 }
 
-buildUnnamed424() {
+buildUnnamed421() {
   var o = new core.List<api.RateGroup>();
   o.add(buildRateGroup());
   o.add(buildRateGroup());
   return o;
 }
 
-checkUnnamed424(core.List<api.RateGroup> o) {
+checkUnnamed421(core.List<api.RateGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRateGroup(o[0]);
   checkRateGroup(o[1]);
@@ -4953,7 +5173,7 @@
     o.deliveryTime = buildDeliveryTime();
     o.minimumOrderValue = buildPrice();
     o.name = "foo";
-    o.rateGroups = buildUnnamed424();
+    o.rateGroups = buildUnnamed421();
   }
   buildCounterService--;
   return o;
@@ -4968,32 +5188,32 @@
     checkDeliveryTime(o.deliveryTime);
     checkPrice(o.minimumOrderValue);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed424(o.rateGroups);
+    checkUnnamed421(o.rateGroups);
   }
   buildCounterService--;
 }
 
-buildUnnamed425() {
+buildUnnamed422() {
   var o = new core.List<api.PostalCodeGroup>();
   o.add(buildPostalCodeGroup());
   o.add(buildPostalCodeGroup());
   return o;
 }
 
-checkUnnamed425(core.List<api.PostalCodeGroup> o) {
+checkUnnamed422(core.List<api.PostalCodeGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostalCodeGroup(o[0]);
   checkPostalCodeGroup(o[1]);
 }
 
-buildUnnamed426() {
+buildUnnamed423() {
   var o = new core.List<api.Service>();
   o.add(buildService());
   o.add(buildService());
   return o;
 }
 
-checkUnnamed426(core.List<api.Service> o) {
+checkUnnamed423(core.List<api.Service> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkService(o[0]);
   checkService(o[1]);
@@ -5005,8 +5225,8 @@
   buildCounterShippingSettings++;
   if (buildCounterShippingSettings < 3) {
     o.accountId = "foo";
-    o.postalCodeGroups = buildUnnamed425();
-    o.services = buildUnnamed426();
+    o.postalCodeGroups = buildUnnamed422();
+    o.services = buildUnnamed423();
   }
   buildCounterShippingSettings--;
   return o;
@@ -5016,20 +5236,20 @@
   buildCounterShippingSettings++;
   if (buildCounterShippingSettings < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed425(o.postalCodeGroups);
-    checkUnnamed426(o.services);
+    checkUnnamed422(o.postalCodeGroups);
+    checkUnnamed423(o.services);
   }
   buildCounterShippingSettings--;
 }
 
-buildUnnamed427() {
+buildUnnamed424() {
   var o = new core.List<api.ShippingsettingsCustomBatchRequestEntry>();
   o.add(buildShippingsettingsCustomBatchRequestEntry());
   o.add(buildShippingsettingsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed427(core.List<api.ShippingsettingsCustomBatchRequestEntry> o) {
+checkUnnamed424(core.List<api.ShippingsettingsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkShippingsettingsCustomBatchRequestEntry(o[0]);
   checkShippingsettingsCustomBatchRequestEntry(o[1]);
@@ -5040,7 +5260,7 @@
   var o = new api.ShippingsettingsCustomBatchRequest();
   buildCounterShippingsettingsCustomBatchRequest++;
   if (buildCounterShippingsettingsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed427();
+    o.entries = buildUnnamed424();
   }
   buildCounterShippingsettingsCustomBatchRequest--;
   return o;
@@ -5050,7 +5270,7 @@
     api.ShippingsettingsCustomBatchRequest o) {
   buildCounterShippingsettingsCustomBatchRequest++;
   if (buildCounterShippingsettingsCustomBatchRequest < 3) {
-    checkUnnamed427(o.entries);
+    checkUnnamed424(o.entries);
   }
   buildCounterShippingsettingsCustomBatchRequest--;
 }
@@ -5083,14 +5303,14 @@
   buildCounterShippingsettingsCustomBatchRequestEntry--;
 }
 
-buildUnnamed428() {
+buildUnnamed425() {
   var o = new core.List<api.ShippingsettingsCustomBatchResponseEntry>();
   o.add(buildShippingsettingsCustomBatchResponseEntry());
   o.add(buildShippingsettingsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed428(core.List<api.ShippingsettingsCustomBatchResponseEntry> o) {
+checkUnnamed425(core.List<api.ShippingsettingsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkShippingsettingsCustomBatchResponseEntry(o[0]);
   checkShippingsettingsCustomBatchResponseEntry(o[1]);
@@ -5101,7 +5321,7 @@
   var o = new api.ShippingsettingsCustomBatchResponse();
   buildCounterShippingsettingsCustomBatchResponse++;
   if (buildCounterShippingsettingsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed428();
+    o.entries = buildUnnamed425();
     o.kind = "foo";
   }
   buildCounterShippingsettingsCustomBatchResponse--;
@@ -5112,7 +5332,7 @@
     api.ShippingsettingsCustomBatchResponse o) {
   buildCounterShippingsettingsCustomBatchResponse++;
   if (buildCounterShippingsettingsCustomBatchResponse < 3) {
-    checkUnnamed428(o.entries);
+    checkUnnamed425(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterShippingsettingsCustomBatchResponse--;
@@ -5144,14 +5364,14 @@
   buildCounterShippingsettingsCustomBatchResponseEntry--;
 }
 
-buildUnnamed429() {
+buildUnnamed426() {
   var o = new core.List<api.CarriersCarrier>();
   o.add(buildCarriersCarrier());
   o.add(buildCarriersCarrier());
   return o;
 }
 
-checkUnnamed429(core.List<api.CarriersCarrier> o) {
+checkUnnamed426(core.List<api.CarriersCarrier> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCarriersCarrier(o[0]);
   checkCarriersCarrier(o[1]);
@@ -5162,7 +5382,7 @@
   var o = new api.ShippingsettingsGetSupportedCarriersResponse();
   buildCounterShippingsettingsGetSupportedCarriersResponse++;
   if (buildCounterShippingsettingsGetSupportedCarriersResponse < 3) {
-    o.carriers = buildUnnamed429();
+    o.carriers = buildUnnamed426();
     o.kind = "foo";
   }
   buildCounterShippingsettingsGetSupportedCarriersResponse--;
@@ -5173,20 +5393,20 @@
     api.ShippingsettingsGetSupportedCarriersResponse o) {
   buildCounterShippingsettingsGetSupportedCarriersResponse++;
   if (buildCounterShippingsettingsGetSupportedCarriersResponse < 3) {
-    checkUnnamed429(o.carriers);
+    checkUnnamed426(o.carriers);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterShippingsettingsGetSupportedCarriersResponse--;
 }
 
-buildUnnamed430() {
+buildUnnamed427() {
   var o = new core.List<api.ShippingSettings>();
   o.add(buildShippingSettings());
   o.add(buildShippingSettings());
   return o;
 }
 
-checkUnnamed430(core.List<api.ShippingSettings> o) {
+checkUnnamed427(core.List<api.ShippingSettings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkShippingSettings(o[0]);
   checkShippingSettings(o[1]);
@@ -5199,7 +5419,7 @@
   if (buildCounterShippingsettingsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed430();
+    o.resources = buildUnnamed427();
   }
   buildCounterShippingsettingsListResponse--;
   return o;
@@ -5210,19 +5430,19 @@
   if (buildCounterShippingsettingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed430(o.resources);
+    checkUnnamed427(o.resources);
   }
   buildCounterShippingsettingsListResponse--;
 }
 
-buildUnnamed431() {
+buildUnnamed428() {
   var o = new core.List<api.Row>();
   o.add(buildRow());
   o.add(buildRow());
   return o;
 }
 
-checkUnnamed431(core.List<api.Row> o) {
+checkUnnamed428(core.List<api.Row> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRow(o[0]);
   checkRow(o[1]);
@@ -5236,7 +5456,7 @@
     o.columnHeaders = buildHeaders();
     o.name = "foo";
     o.rowHeaders = buildHeaders();
-    o.rows = buildUnnamed431();
+    o.rows = buildUnnamed428();
   }
   buildCounterTable--;
   return o;
@@ -5248,32 +5468,32 @@
     checkHeaders(o.columnHeaders);
     unittest.expect(o.name, unittest.equals('foo'));
     checkHeaders(o.rowHeaders);
-    checkUnnamed431(o.rows);
+    checkUnnamed428(o.rows);
   }
   buildCounterTable--;
 }
 
-buildUnnamed432() {
+buildUnnamed429() {
   var o = new core.List<api.TestOrderLineItem>();
   o.add(buildTestOrderLineItem());
   o.add(buildTestOrderLineItem());
   return o;
 }
 
-checkUnnamed432(core.List<api.TestOrderLineItem> o) {
+checkUnnamed429(core.List<api.TestOrderLineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTestOrderLineItem(o[0]);
   checkTestOrderLineItem(o[1]);
 }
 
-buildUnnamed433() {
+buildUnnamed430() {
   var o = new core.List<api.OrderPromotion>();
   o.add(buildOrderPromotion());
   o.add(buildOrderPromotion());
   return o;
 }
 
-checkUnnamed433(core.List<api.OrderPromotion> o) {
+checkUnnamed430(core.List<api.OrderPromotion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderPromotion(o[0]);
   checkOrderPromotion(o[1]);
@@ -5286,11 +5506,11 @@
   if (buildCounterTestOrder < 3) {
     o.customer = buildTestOrderCustomer();
     o.kind = "foo";
-    o.lineItems = buildUnnamed432();
+    o.lineItems = buildUnnamed429();
     o.notificationMode = "foo";
     o.paymentMethod = buildTestOrderPaymentMethod();
     o.predefinedDeliveryAddress = "foo";
-    o.promotions = buildUnnamed433();
+    o.promotions = buildUnnamed430();
     o.shippingCost = buildPrice();
     o.shippingCostTax = buildPrice();
     o.shippingOption = "foo";
@@ -5304,11 +5524,11 @@
   if (buildCounterTestOrder < 3) {
     checkTestOrderCustomer(o.customer);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed432(o.lineItems);
+    checkUnnamed429(o.lineItems);
     unittest.expect(o.notificationMode, unittest.equals('foo'));
     checkTestOrderPaymentMethod(o.paymentMethod);
     unittest.expect(o.predefinedDeliveryAddress, unittest.equals('foo'));
-    checkUnnamed433(o.promotions);
+    checkUnnamed430(o.promotions);
     checkPrice(o.shippingCost);
     checkPrice(o.shippingCostTax);
     unittest.expect(o.shippingOption, unittest.equals('foo'));
@@ -5366,14 +5586,14 @@
   buildCounterTestOrderLineItem--;
 }
 
-buildUnnamed434() {
+buildUnnamed431() {
   var o = new core.List<api.OrderLineItemProductVariantAttribute>();
   o.add(buildOrderLineItemProductVariantAttribute());
   o.add(buildOrderLineItemProductVariantAttribute());
   return o;
 }
 
-checkUnnamed434(core.List<api.OrderLineItemProductVariantAttribute> o) {
+checkUnnamed431(core.List<api.OrderLineItemProductVariantAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderLineItemProductVariantAttribute(o[0]);
   checkOrderLineItemProductVariantAttribute(o[1]);
@@ -5396,7 +5616,7 @@
     o.price = buildPrice();
     o.targetCountry = "foo";
     o.title = "foo";
-    o.variantAttributes = buildUnnamed434();
+    o.variantAttributes = buildUnnamed431();
   }
   buildCounterTestOrderLineItemProduct--;
   return o;
@@ -5417,7 +5637,7 @@
     checkPrice(o.price);
     unittest.expect(o.targetCountry, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    checkUnnamed434(o.variantAttributes);
+    checkUnnamed431(o.variantAttributes);
   }
   buildCounterTestOrderLineItemProduct--;
 }
@@ -5497,14 +5717,14 @@
   buildCounterWeight--;
 }
 
-buildUnnamed435() {
+buildUnnamed432() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed435(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'));
@@ -6108,6 +6328,14 @@
     });
   });
 
+  unittest.group("obj-schema-OrderMerchantProvidedAnnotation", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrderMerchantProvidedAnnotation();
+      var od = new api.OrderMerchantProvidedAnnotation.fromJson(o.toJson());
+      checkOrderMerchantProvidedAnnotation(od);
+    });
+  });
+
   unittest.group("obj-schema-OrderPaymentMethod", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrderPaymentMethod();
@@ -6286,6 +6514,17 @@
     });
   });
 
+  unittest.group("obj-schema-OrdersCustomBatchRequestEntrySetLineItemMetadata",
+      () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrdersCustomBatchRequestEntrySetLineItemMetadata();
+      var od =
+          new api.OrdersCustomBatchRequestEntrySetLineItemMetadata.fromJson(
+              o.toJson());
+      checkOrdersCustomBatchRequestEntrySetLineItemMetadata(od);
+    });
+  });
+
   unittest.group("obj-schema-OrdersCustomBatchRequestEntryShipLineItems", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrdersCustomBatchRequestEntryShipLineItems();
@@ -6306,6 +6545,18 @@
     });
   });
 
+  unittest.group(
+      "obj-schema-OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails",
+      () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails();
+      var od = new api
+              .OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails.fromJson(
+          o.toJson());
+      checkOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails(od);
+    });
+  });
+
   unittest.group("obj-schema-OrdersCustomBatchRequestEntryUpdateShipment", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrdersCustomBatchRequestEntryUpdateShipment();
@@ -6387,6 +6638,22 @@
     });
   });
 
+  unittest.group("obj-schema-OrdersSetLineItemMetadataRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrdersSetLineItemMetadataRequest();
+      var od = new api.OrdersSetLineItemMetadataRequest.fromJson(o.toJson());
+      checkOrdersSetLineItemMetadataRequest(od);
+    });
+  });
+
+  unittest.group("obj-schema-OrdersSetLineItemMetadataResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrdersSetLineItemMetadataResponse();
+      var od = new api.OrdersSetLineItemMetadataResponse.fromJson(o.toJson());
+      checkOrdersSetLineItemMetadataResponse(od);
+    });
+  });
+
   unittest.group("obj-schema-OrdersShipLineItemsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrdersShipLineItemsRequest();
@@ -6403,6 +6670,24 @@
     });
   });
 
+  unittest.group("obj-schema-OrdersUpdateLineItemShippingDetailsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrdersUpdateLineItemShippingDetailsRequest();
+      var od = new api.OrdersUpdateLineItemShippingDetailsRequest.fromJson(
+          o.toJson());
+      checkOrdersUpdateLineItemShippingDetailsRequest(od);
+    });
+  });
+
+  unittest.group("obj-schema-OrdersUpdateLineItemShippingDetailsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrdersUpdateLineItemShippingDetailsResponse();
+      var od = new api.OrdersUpdateLineItemShippingDetailsResponse.fromJson(
+          o.toJson());
+      checkOrdersUpdateLineItemShippingDetailsResponse(od);
+    });
+  });
+
   unittest.group("obj-schema-OrdersUpdateMerchantOrderIdRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrdersUpdateMerchantOrderIdRequest();
@@ -8889,7 +9174,7 @@
       var arg_pageToken = "foo";
       var arg_placedDateEnd = "foo";
       var arg_placedDateStart = "foo";
-      var arg_statuses = buildUnnamed435();
+      var arg_statuses = buildUnnamed432();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -9061,6 +9346,61 @@
       })));
     });
 
+    unittest.test("method--setlineitemmetadata", () {
+      var mock = new HttpServerMock();
+      api.OrdersResourceApi res = new api.ContentApi(mock).orders;
+      var arg_request = buildOrdersSetLineItemMetadataRequest();
+      var arg_merchantId = "foo";
+      var arg_orderId = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.OrdersSetLineItemMetadataRequest.fromJson(json);
+        checkOrdersSetLineItemMetadataRequest(obj);
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp =
+            convert.JSON.encode(buildOrdersSetLineItemMetadataResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .setlineitemmetadata(arg_request, arg_merchantId, arg_orderId,
+              $fields: arg_$fields)
+          .then(unittest
+              .expectAsync1(((api.OrdersSetLineItemMetadataResponse response) {
+        checkOrdersSetLineItemMetadataResponse(response);
+      })));
+    });
+
     unittest.test("method--shiplineitems", () {
       var mock = new HttpServerMock();
       api.OrdersResourceApi res = new api.ContentApi(mock).orders;
@@ -9115,6 +9455,62 @@
       })));
     });
 
+    unittest.test("method--updatelineitemshippingdetails", () {
+      var mock = new HttpServerMock();
+      api.OrdersResourceApi res = new api.ContentApi(mock).orders;
+      var arg_request = buildOrdersUpdateLineItemShippingDetailsRequest();
+      var arg_merchantId = "foo";
+      var arg_orderId = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj =
+            new api.OrdersUpdateLineItemShippingDetailsRequest.fromJson(json);
+        checkOrdersUpdateLineItemShippingDetailsRequest(obj);
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON
+            .encode(buildOrdersUpdateLineItemShippingDetailsResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .updatelineitemshippingdetails(
+              arg_request, arg_merchantId, arg_orderId, $fields: arg_$fields)
+          .then(unittest.expectAsync1(
+              ((api.OrdersUpdateLineItemShippingDetailsResponse response) {
+        checkOrdersUpdateLineItemShippingDetailsResponse(response);
+      })));
+    });
+
     unittest.test("method--updatemerchantorderid", () {
       var mock = new HttpServerMock();
       api.OrdersResourceApi res = new api.ContentApi(mock).orders;
diff --git a/generated/googleapis/test/content/v2sandbox_test.dart b/generated/googleapis/test/content/v2sandbox_test.dart
index 7cf7069..78a53fb 100644
--- a/generated/googleapis/test/content/v2sandbox_test.dart
+++ b/generated/googleapis/test/content/v2sandbox_test.dart
@@ -73,14 +73,14 @@
   buildCounterError--;
 }
 
-buildUnnamed1558() {
+buildUnnamed1575() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed1558(core.List<api.Error> o) {
+checkUnnamed1575(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -92,7 +92,7 @@
   buildCounterErrors++;
   if (buildCounterErrors < 3) {
     o.code = 42;
-    o.errors = buildUnnamed1558();
+    o.errors = buildUnnamed1575();
     o.message = "foo";
   }
   buildCounterErrors--;
@@ -103,59 +103,59 @@
   buildCounterErrors++;
   if (buildCounterErrors < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1558(o.errors);
+    checkUnnamed1575(o.errors);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterErrors--;
 }
 
-buildUnnamed1559() {
+buildUnnamed1576() {
   var o = new core.List<api.OrderLineItem>();
   o.add(buildOrderLineItem());
   o.add(buildOrderLineItem());
   return o;
 }
 
-checkUnnamed1559(core.List<api.OrderLineItem> o) {
+checkUnnamed1576(core.List<api.OrderLineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderLineItem(o[0]);
   checkOrderLineItem(o[1]);
 }
 
-buildUnnamed1560() {
+buildUnnamed1577() {
   var o = new core.List<api.OrderPromotion>();
   o.add(buildOrderPromotion());
   o.add(buildOrderPromotion());
   return o;
 }
 
-checkUnnamed1560(core.List<api.OrderPromotion> o) {
+checkUnnamed1577(core.List<api.OrderPromotion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderPromotion(o[0]);
   checkOrderPromotion(o[1]);
 }
 
-buildUnnamed1561() {
+buildUnnamed1578() {
   var o = new core.List<api.OrderRefund>();
   o.add(buildOrderRefund());
   o.add(buildOrderRefund());
   return o;
 }
 
-checkUnnamed1561(core.List<api.OrderRefund> o) {
+checkUnnamed1578(core.List<api.OrderRefund> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderRefund(o[0]);
   checkOrderRefund(o[1]);
 }
 
-buildUnnamed1562() {
+buildUnnamed1579() {
   var o = new core.List<api.OrderShipment>();
   o.add(buildOrderShipment());
   o.add(buildOrderShipment());
   return o;
 }
 
-checkUnnamed1562(core.List<api.OrderShipment> o) {
+checkUnnamed1579(core.List<api.OrderShipment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderShipment(o[0]);
   checkOrderShipment(o[1]);
@@ -172,16 +172,16 @@
     o.deliveryDetails = buildOrderDeliveryDetails();
     o.id = "foo";
     o.kind = "foo";
-    o.lineItems = buildUnnamed1559();
+    o.lineItems = buildUnnamed1576();
     o.merchantId = "foo";
     o.merchantOrderId = "foo";
     o.netAmount = buildPrice();
     o.paymentMethod = buildOrderPaymentMethod();
     o.paymentStatus = "foo";
     o.placedDate = "foo";
-    o.promotions = buildUnnamed1560();
-    o.refunds = buildUnnamed1561();
-    o.shipments = buildUnnamed1562();
+    o.promotions = buildUnnamed1577();
+    o.refunds = buildUnnamed1578();
+    o.shipments = buildUnnamed1579();
     o.shippingCost = buildPrice();
     o.shippingCostTax = buildPrice();
     o.shippingOption = "foo";
@@ -200,16 +200,16 @@
     checkOrderDeliveryDetails(o.deliveryDetails);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1559(o.lineItems);
+    checkUnnamed1576(o.lineItems);
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.merchantOrderId, unittest.equals('foo'));
     checkPrice(o.netAmount);
     checkOrderPaymentMethod(o.paymentMethod);
     unittest.expect(o.paymentStatus, unittest.equals('foo'));
     unittest.expect(o.placedDate, unittest.equals('foo'));
-    checkUnnamed1560(o.promotions);
-    checkUnnamed1561(o.refunds);
-    checkUnnamed1562(o.shipments);
+    checkUnnamed1577(o.promotions);
+    checkUnnamed1578(o.refunds);
+    checkUnnamed1579(o.shipments);
     checkPrice(o.shippingCost);
     checkPrice(o.shippingCostTax);
     unittest.expect(o.shippingOption, unittest.equals('foo'));
@@ -218,27 +218,27 @@
   buildCounterOrder--;
 }
 
-buildUnnamed1563() {
+buildUnnamed1580() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1563(core.List<core.String> o) {
+checkUnnamed1580(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1564() {
+buildUnnamed1581() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1564(core.List<core.String> o) {
+checkUnnamed1581(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -250,13 +250,13 @@
   buildCounterOrderAddress++;
   if (buildCounterOrderAddress < 3) {
     o.country = "foo";
-    o.fullAddress = buildUnnamed1563();
+    o.fullAddress = buildUnnamed1580();
     o.isPostOfficeBox = true;
     o.locality = "foo";
     o.postalCode = "foo";
     o.recipientName = "foo";
     o.region = "foo";
-    o.streetAddress = buildUnnamed1564();
+    o.streetAddress = buildUnnamed1581();
   }
   buildCounterOrderAddress--;
   return o;
@@ -266,13 +266,13 @@
   buildCounterOrderAddress++;
   if (buildCounterOrderAddress < 3) {
     unittest.expect(o.country, unittest.equals('foo'));
-    checkUnnamed1563(o.fullAddress);
+    checkUnnamed1580(o.fullAddress);
     unittest.expect(o.isPostOfficeBox, unittest.isTrue);
     unittest.expect(o.locality, unittest.equals('foo'));
     unittest.expect(o.postalCode, unittest.equals('foo'));
     unittest.expect(o.recipientName, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed1564(o.streetAddress);
+    checkUnnamed1581(o.streetAddress);
   }
   buildCounterOrderAddress--;
 }
@@ -348,27 +348,40 @@
   buildCounterOrderDeliveryDetails--;
 }
 
-buildUnnamed1565() {
+buildUnnamed1582() {
+  var o = new core.List<api.OrderMerchantProvidedAnnotation>();
+  o.add(buildOrderMerchantProvidedAnnotation());
+  o.add(buildOrderMerchantProvidedAnnotation());
+  return o;
+}
+
+checkUnnamed1582(core.List<api.OrderMerchantProvidedAnnotation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOrderMerchantProvidedAnnotation(o[0]);
+  checkOrderMerchantProvidedAnnotation(o[1]);
+}
+
+buildUnnamed1583() {
   var o = new core.List<api.OrderCancellation>();
   o.add(buildOrderCancellation());
   o.add(buildOrderCancellation());
   return o;
 }
 
-checkUnnamed1565(core.List<api.OrderCancellation> o) {
+checkUnnamed1583(core.List<api.OrderCancellation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderCancellation(o[0]);
   checkOrderCancellation(o[1]);
 }
 
-buildUnnamed1566() {
+buildUnnamed1584() {
   var o = new core.List<api.OrderReturn>();
   o.add(buildOrderReturn());
   o.add(buildOrderReturn());
   return o;
 }
 
-checkUnnamed1566(core.List<api.OrderReturn> o) {
+checkUnnamed1584(core.List<api.OrderReturn> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderReturn(o[0]);
   checkOrderReturn(o[1]);
@@ -379,7 +392,8 @@
   var o = new api.OrderLineItem();
   buildCounterOrderLineItem++;
   if (buildCounterOrderLineItem < 3) {
-    o.cancellations = buildUnnamed1565();
+    o.annotations = buildUnnamed1582();
+    o.cancellations = buildUnnamed1583();
     o.id = "foo";
     o.price = buildPrice();
     o.product = buildOrderLineItemProduct();
@@ -390,7 +404,7 @@
     o.quantityReturned = 42;
     o.quantityShipped = 42;
     o.returnInfo = buildOrderLineItemReturnInfo();
-    o.returns = buildUnnamed1566();
+    o.returns = buildUnnamed1584();
     o.shippingDetails = buildOrderLineItemShippingDetails();
     o.tax = buildPrice();
   }
@@ -401,7 +415,8 @@
 checkOrderLineItem(api.OrderLineItem o) {
   buildCounterOrderLineItem++;
   if (buildCounterOrderLineItem < 3) {
-    checkUnnamed1565(o.cancellations);
+    checkUnnamed1582(o.annotations);
+    checkUnnamed1583(o.cancellations);
     unittest.expect(o.id, unittest.equals('foo'));
     checkPrice(o.price);
     checkOrderLineItemProduct(o.product);
@@ -412,21 +427,21 @@
     unittest.expect(o.quantityReturned, unittest.equals(42));
     unittest.expect(o.quantityShipped, unittest.equals(42));
     checkOrderLineItemReturnInfo(o.returnInfo);
-    checkUnnamed1566(o.returns);
+    checkUnnamed1584(o.returns);
     checkOrderLineItemShippingDetails(o.shippingDetails);
     checkPrice(o.tax);
   }
   buildCounterOrderLineItem--;
 }
 
-buildUnnamed1567() {
+buildUnnamed1585() {
   var o = new core.List<api.OrderLineItemProductVariantAttribute>();
   o.add(buildOrderLineItemProductVariantAttribute());
   o.add(buildOrderLineItemProductVariantAttribute());
   return o;
 }
 
-checkUnnamed1567(core.List<api.OrderLineItemProductVariantAttribute> o) {
+checkUnnamed1585(core.List<api.OrderLineItemProductVariantAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderLineItemProductVariantAttribute(o[0]);
   checkOrderLineItemProductVariantAttribute(o[1]);
@@ -451,7 +466,7 @@
     o.shownImage = "foo";
     o.targetCountry = "foo";
     o.title = "foo";
-    o.variantAttributes = buildUnnamed1567();
+    o.variantAttributes = buildUnnamed1585();
   }
   buildCounterOrderLineItemProduct--;
   return o;
@@ -474,7 +489,7 @@
     unittest.expect(o.shownImage, unittest.equals('foo'));
     unittest.expect(o.targetCountry, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    checkUnnamed1567(o.variantAttributes);
+    checkUnnamed1585(o.variantAttributes);
   }
   buildCounterOrderLineItemProduct--;
 }
@@ -573,6 +588,27 @@
   buildCounterOrderLineItemShippingDetailsMethod--;
 }
 
+core.int buildCounterOrderMerchantProvidedAnnotation = 0;
+buildOrderMerchantProvidedAnnotation() {
+  var o = new api.OrderMerchantProvidedAnnotation();
+  buildCounterOrderMerchantProvidedAnnotation++;
+  if (buildCounterOrderMerchantProvidedAnnotation < 3) {
+    o.key = "foo";
+    o.value = "foo";
+  }
+  buildCounterOrderMerchantProvidedAnnotation--;
+  return o;
+}
+
+checkOrderMerchantProvidedAnnotation(api.OrderMerchantProvidedAnnotation o) {
+  buildCounterOrderMerchantProvidedAnnotation++;
+  if (buildCounterOrderMerchantProvidedAnnotation < 3) {
+    unittest.expect(o.key, unittest.equals('foo'));
+    unittest.expect(o.value, unittest.equals('foo'));
+  }
+  buildCounterOrderMerchantProvidedAnnotation--;
+}
+
 core.int buildCounterOrderPaymentMethod = 0;
 buildOrderPaymentMethod() {
   var o = new api.OrderPaymentMethod();
@@ -602,14 +638,14 @@
   buildCounterOrderPaymentMethod--;
 }
 
-buildUnnamed1568() {
+buildUnnamed1586() {
   var o = new core.List<api.OrderPromotionBenefit>();
   o.add(buildOrderPromotionBenefit());
   o.add(buildOrderPromotionBenefit());
   return o;
 }
 
-checkUnnamed1568(core.List<api.OrderPromotionBenefit> o) {
+checkUnnamed1586(core.List<api.OrderPromotionBenefit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderPromotionBenefit(o[0]);
   checkOrderPromotionBenefit(o[1]);
@@ -620,7 +656,7 @@
   var o = new api.OrderPromotion();
   buildCounterOrderPromotion++;
   if (buildCounterOrderPromotion < 3) {
-    o.benefits = buildUnnamed1568();
+    o.benefits = buildUnnamed1586();
     o.effectiveDates = "foo";
     o.genericRedemptionCode = "foo";
     o.id = "foo";
@@ -635,7 +671,7 @@
 checkOrderPromotion(api.OrderPromotion o) {
   buildCounterOrderPromotion++;
   if (buildCounterOrderPromotion < 3) {
-    checkUnnamed1568(o.benefits);
+    checkUnnamed1586(o.benefits);
     unittest.expect(o.effectiveDates, unittest.equals('foo'));
     unittest.expect(o.genericRedemptionCode, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -646,14 +682,14 @@
   buildCounterOrderPromotion--;
 }
 
-buildUnnamed1569() {
+buildUnnamed1587() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1569(core.List<core.String> o) {
+checkUnnamed1587(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -665,7 +701,7 @@
   buildCounterOrderPromotionBenefit++;
   if (buildCounterOrderPromotionBenefit < 3) {
     o.discount = buildPrice();
-    o.offerIds = buildUnnamed1569();
+    o.offerIds = buildUnnamed1587();
     o.subType = "foo";
     o.taxImpact = buildPrice();
     o.type = "foo";
@@ -678,7 +714,7 @@
   buildCounterOrderPromotionBenefit++;
   if (buildCounterOrderPromotionBenefit < 3) {
     checkPrice(o.discount);
-    checkUnnamed1569(o.offerIds);
+    checkUnnamed1587(o.offerIds);
     unittest.expect(o.subType, unittest.equals('foo'));
     checkPrice(o.taxImpact);
     unittest.expect(o.type, unittest.equals('foo'));
@@ -740,14 +776,14 @@
   buildCounterOrderReturn--;
 }
 
-buildUnnamed1570() {
+buildUnnamed1588() {
   var o = new core.List<api.OrderShipmentLineItemShipment>();
   o.add(buildOrderShipmentLineItemShipment());
   o.add(buildOrderShipmentLineItemShipment());
   return o;
 }
 
-checkUnnamed1570(core.List<api.OrderShipmentLineItemShipment> o) {
+checkUnnamed1588(core.List<api.OrderShipmentLineItemShipment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderShipmentLineItemShipment(o[0]);
   checkOrderShipmentLineItemShipment(o[1]);
@@ -762,7 +798,7 @@
     o.creationDate = "foo";
     o.deliveryDate = "foo";
     o.id = "foo";
-    o.lineItems = buildUnnamed1570();
+    o.lineItems = buildUnnamed1588();
     o.status = "foo";
     o.trackingId = "foo";
   }
@@ -777,7 +813,7 @@
     unittest.expect(o.creationDate, unittest.equals('foo'));
     unittest.expect(o.deliveryDate, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1570(o.lineItems);
+    checkUnnamed1588(o.lineItems);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.trackingId, unittest.equals('foo'));
   }
@@ -1008,14 +1044,14 @@
   buildCounterOrdersCreateTestOrderResponse--;
 }
 
-buildUnnamed1571() {
+buildUnnamed1589() {
   var o = new core.List<api.OrdersCustomBatchRequestEntry>();
   o.add(buildOrdersCustomBatchRequestEntry());
   o.add(buildOrdersCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed1571(core.List<api.OrdersCustomBatchRequestEntry> o) {
+checkUnnamed1589(core.List<api.OrdersCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrdersCustomBatchRequestEntry(o[0]);
   checkOrdersCustomBatchRequestEntry(o[1]);
@@ -1026,7 +1062,7 @@
   var o = new api.OrdersCustomBatchRequest();
   buildCounterOrdersCustomBatchRequest++;
   if (buildCounterOrdersCustomBatchRequest < 3) {
-    o.entries = buildUnnamed1571();
+    o.entries = buildUnnamed1589();
   }
   buildCounterOrdersCustomBatchRequest--;
   return o;
@@ -1035,7 +1071,7 @@
 checkOrdersCustomBatchRequest(api.OrdersCustomBatchRequest o) {
   buildCounterOrdersCustomBatchRequest++;
   if (buildCounterOrdersCustomBatchRequest < 3) {
-    checkUnnamed1571(o.entries);
+    checkUnnamed1589(o.entries);
   }
   buildCounterOrdersCustomBatchRequest--;
 }
@@ -1055,7 +1091,11 @@
     o.orderId = "foo";
     o.refund = buildOrdersCustomBatchRequestEntryRefund();
     o.returnLineItem = buildOrdersCustomBatchRequestEntryReturnLineItem();
+    o.setLineItemMetadata =
+        buildOrdersCustomBatchRequestEntrySetLineItemMetadata();
     o.shipLineItems = buildOrdersCustomBatchRequestEntryShipLineItems();
+    o.updateLineItemShippingDetails =
+        buildOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails();
     o.updateShipment = buildOrdersCustomBatchRequestEntryUpdateShipment();
   }
   buildCounterOrdersCustomBatchRequestEntry--;
@@ -1075,7 +1115,11 @@
     unittest.expect(o.orderId, unittest.equals('foo'));
     checkOrdersCustomBatchRequestEntryRefund(o.refund);
     checkOrdersCustomBatchRequestEntryReturnLineItem(o.returnLineItem);
+    checkOrdersCustomBatchRequestEntrySetLineItemMetadata(
+        o.setLineItemMetadata);
     checkOrdersCustomBatchRequestEntryShipLineItems(o.shipLineItems);
+    checkOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails(
+        o.updateLineItemShippingDetails);
     checkOrdersCustomBatchRequestEntryUpdateShipment(o.updateShipment);
   }
   buildCounterOrdersCustomBatchRequestEntry--;
@@ -1193,20 +1237,57 @@
   buildCounterOrdersCustomBatchRequestEntryReturnLineItem--;
 }
 
-buildUnnamed1572() {
+buildUnnamed1590() {
+  var o = new core.List<api.OrderMerchantProvidedAnnotation>();
+  o.add(buildOrderMerchantProvidedAnnotation());
+  o.add(buildOrderMerchantProvidedAnnotation());
+  return o;
+}
+
+checkUnnamed1590(core.List<api.OrderMerchantProvidedAnnotation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOrderMerchantProvidedAnnotation(o[0]);
+  checkOrderMerchantProvidedAnnotation(o[1]);
+}
+
+core.int buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata = 0;
+buildOrdersCustomBatchRequestEntrySetLineItemMetadata() {
+  var o = new api.OrdersCustomBatchRequestEntrySetLineItemMetadata();
+  buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata++;
+  if (buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata < 3) {
+    o.annotations = buildUnnamed1590();
+    o.lineItemId = "foo";
+    o.productId = "foo";
+  }
+  buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata--;
+  return o;
+}
+
+checkOrdersCustomBatchRequestEntrySetLineItemMetadata(
+    api.OrdersCustomBatchRequestEntrySetLineItemMetadata o) {
+  buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata++;
+  if (buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata < 3) {
+    checkUnnamed1590(o.annotations);
+    unittest.expect(o.lineItemId, unittest.equals('foo'));
+    unittest.expect(o.productId, unittest.equals('foo'));
+  }
+  buildCounterOrdersCustomBatchRequestEntrySetLineItemMetadata--;
+}
+
+buildUnnamed1591() {
   var o = new core.List<api.OrderShipmentLineItemShipment>();
   o.add(buildOrderShipmentLineItemShipment());
   o.add(buildOrderShipmentLineItemShipment());
   return o;
 }
 
-checkUnnamed1572(core.List<api.OrderShipmentLineItemShipment> o) {
+checkUnnamed1591(core.List<api.OrderShipmentLineItemShipment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderShipmentLineItemShipment(o[0]);
   checkOrderShipmentLineItemShipment(o[1]);
 }
 
-buildUnnamed1573() {
+buildUnnamed1592() {
   var o = new core
       .List<api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo>();
   o.add(buildOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo());
@@ -1214,7 +1295,7 @@
   return o;
 }
 
-checkUnnamed1573(
+checkUnnamed1592(
     core.List<api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo(o[0]);
@@ -1227,9 +1308,9 @@
   buildCounterOrdersCustomBatchRequestEntryShipLineItems++;
   if (buildCounterOrdersCustomBatchRequestEntryShipLineItems < 3) {
     o.carrier = "foo";
-    o.lineItems = buildUnnamed1572();
+    o.lineItems = buildUnnamed1591();
     o.shipmentId = "foo";
-    o.shipmentInfos = buildUnnamed1573();
+    o.shipmentInfos = buildUnnamed1592();
     o.trackingId = "foo";
   }
   buildCounterOrdersCustomBatchRequestEntryShipLineItems--;
@@ -1241,9 +1322,9 @@
   buildCounterOrdersCustomBatchRequestEntryShipLineItems++;
   if (buildCounterOrdersCustomBatchRequestEntryShipLineItems < 3) {
     unittest.expect(o.carrier, unittest.equals('foo'));
-    checkUnnamed1572(o.lineItems);
+    checkUnnamed1591(o.lineItems);
     unittest.expect(o.shipmentId, unittest.equals('foo'));
-    checkUnnamed1573(o.shipmentInfos);
+    checkUnnamed1592(o.shipmentInfos);
     unittest.expect(o.trackingId, unittest.equals('foo'));
   }
   buildCounterOrdersCustomBatchRequestEntryShipLineItems--;
@@ -1273,6 +1354,35 @@
   buildCounterOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo--;
 }
 
+core.int
+    buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails = 0;
+buildOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails() {
+  var o = new api.OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails();
+  buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails++;
+  if (buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails <
+      3) {
+    o.deliverByDate = "foo";
+    o.lineItemId = "foo";
+    o.productId = "foo";
+    o.shipByDate = "foo";
+  }
+  buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails--;
+  return o;
+}
+
+checkOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails(
+    api.OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails o) {
+  buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails++;
+  if (buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails <
+      3) {
+    unittest.expect(o.deliverByDate, unittest.equals('foo'));
+    unittest.expect(o.lineItemId, unittest.equals('foo'));
+    unittest.expect(o.productId, unittest.equals('foo'));
+    unittest.expect(o.shipByDate, unittest.equals('foo'));
+  }
+  buildCounterOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails--;
+}
+
 core.int buildCounterOrdersCustomBatchRequestEntryUpdateShipment = 0;
 buildOrdersCustomBatchRequestEntryUpdateShipment() {
   var o = new api.OrdersCustomBatchRequestEntryUpdateShipment();
@@ -1299,14 +1409,14 @@
   buildCounterOrdersCustomBatchRequestEntryUpdateShipment--;
 }
 
-buildUnnamed1574() {
+buildUnnamed1593() {
   var o = new core.List<api.OrdersCustomBatchResponseEntry>();
   o.add(buildOrdersCustomBatchResponseEntry());
   o.add(buildOrdersCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed1574(core.List<api.OrdersCustomBatchResponseEntry> o) {
+checkUnnamed1593(core.List<api.OrdersCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrdersCustomBatchResponseEntry(o[0]);
   checkOrdersCustomBatchResponseEntry(o[1]);
@@ -1317,7 +1427,7 @@
   var o = new api.OrdersCustomBatchResponse();
   buildCounterOrdersCustomBatchResponse++;
   if (buildCounterOrdersCustomBatchResponse < 3) {
-    o.entries = buildUnnamed1574();
+    o.entries = buildUnnamed1593();
     o.kind = "foo";
   }
   buildCounterOrdersCustomBatchResponse--;
@@ -1327,7 +1437,7 @@
 checkOrdersCustomBatchResponse(api.OrdersCustomBatchResponse o) {
   buildCounterOrdersCustomBatchResponse++;
   if (buildCounterOrdersCustomBatchResponse < 3) {
-    checkUnnamed1574(o.entries);
+    checkUnnamed1593(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterOrdersCustomBatchResponse--;
@@ -1404,14 +1514,14 @@
   buildCounterOrdersGetTestOrderTemplateResponse--;
 }
 
-buildUnnamed1575() {
+buildUnnamed1594() {
   var o = new core.List<api.Order>();
   o.add(buildOrder());
   o.add(buildOrder());
   return o;
 }
 
-checkUnnamed1575(core.List<api.Order> o) {
+checkUnnamed1594(core.List<api.Order> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrder(o[0]);
   checkOrder(o[1]);
@@ -1424,7 +1534,7 @@
   if (buildCounterOrdersListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed1575();
+    o.resources = buildUnnamed1594();
   }
   buildCounterOrdersListResponse--;
   return o;
@@ -1435,7 +1545,7 @@
   if (buildCounterOrdersListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1575(o.resources);
+    checkUnnamed1594(o.resources);
   }
   buildCounterOrdersListResponse--;
 }
@@ -1540,20 +1650,80 @@
   buildCounterOrdersReturnLineItemResponse--;
 }
 
-buildUnnamed1576() {
+buildUnnamed1595() {
+  var o = new core.List<api.OrderMerchantProvidedAnnotation>();
+  o.add(buildOrderMerchantProvidedAnnotation());
+  o.add(buildOrderMerchantProvidedAnnotation());
+  return o;
+}
+
+checkUnnamed1595(core.List<api.OrderMerchantProvidedAnnotation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOrderMerchantProvidedAnnotation(o[0]);
+  checkOrderMerchantProvidedAnnotation(o[1]);
+}
+
+core.int buildCounterOrdersSetLineItemMetadataRequest = 0;
+buildOrdersSetLineItemMetadataRequest() {
+  var o = new api.OrdersSetLineItemMetadataRequest();
+  buildCounterOrdersSetLineItemMetadataRequest++;
+  if (buildCounterOrdersSetLineItemMetadataRequest < 3) {
+    o.annotations = buildUnnamed1595();
+    o.lineItemId = "foo";
+    o.operationId = "foo";
+    o.productId = "foo";
+  }
+  buildCounterOrdersSetLineItemMetadataRequest--;
+  return o;
+}
+
+checkOrdersSetLineItemMetadataRequest(api.OrdersSetLineItemMetadataRequest o) {
+  buildCounterOrdersSetLineItemMetadataRequest++;
+  if (buildCounterOrdersSetLineItemMetadataRequest < 3) {
+    checkUnnamed1595(o.annotations);
+    unittest.expect(o.lineItemId, unittest.equals('foo'));
+    unittest.expect(o.operationId, unittest.equals('foo'));
+    unittest.expect(o.productId, unittest.equals('foo'));
+  }
+  buildCounterOrdersSetLineItemMetadataRequest--;
+}
+
+core.int buildCounterOrdersSetLineItemMetadataResponse = 0;
+buildOrdersSetLineItemMetadataResponse() {
+  var o = new api.OrdersSetLineItemMetadataResponse();
+  buildCounterOrdersSetLineItemMetadataResponse++;
+  if (buildCounterOrdersSetLineItemMetadataResponse < 3) {
+    o.executionStatus = "foo";
+    o.kind = "foo";
+  }
+  buildCounterOrdersSetLineItemMetadataResponse--;
+  return o;
+}
+
+checkOrdersSetLineItemMetadataResponse(
+    api.OrdersSetLineItemMetadataResponse o) {
+  buildCounterOrdersSetLineItemMetadataResponse++;
+  if (buildCounterOrdersSetLineItemMetadataResponse < 3) {
+    unittest.expect(o.executionStatus, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+  }
+  buildCounterOrdersSetLineItemMetadataResponse--;
+}
+
+buildUnnamed1596() {
   var o = new core.List<api.OrderShipmentLineItemShipment>();
   o.add(buildOrderShipmentLineItemShipment());
   o.add(buildOrderShipmentLineItemShipment());
   return o;
 }
 
-checkUnnamed1576(core.List<api.OrderShipmentLineItemShipment> o) {
+checkUnnamed1596(core.List<api.OrderShipmentLineItemShipment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderShipmentLineItemShipment(o[0]);
   checkOrderShipmentLineItemShipment(o[1]);
 }
 
-buildUnnamed1577() {
+buildUnnamed1597() {
   var o = new core
       .List<api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo>();
   o.add(buildOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo());
@@ -1561,7 +1731,7 @@
   return o;
 }
 
-checkUnnamed1577(
+checkUnnamed1597(
     core.List<api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo(o[0]);
@@ -1574,10 +1744,10 @@
   buildCounterOrdersShipLineItemsRequest++;
   if (buildCounterOrdersShipLineItemsRequest < 3) {
     o.carrier = "foo";
-    o.lineItems = buildUnnamed1576();
+    o.lineItems = buildUnnamed1596();
     o.operationId = "foo";
     o.shipmentId = "foo";
-    o.shipmentInfos = buildUnnamed1577();
+    o.shipmentInfos = buildUnnamed1597();
     o.trackingId = "foo";
   }
   buildCounterOrdersShipLineItemsRequest--;
@@ -1588,10 +1758,10 @@
   buildCounterOrdersShipLineItemsRequest++;
   if (buildCounterOrdersShipLineItemsRequest < 3) {
     unittest.expect(o.carrier, unittest.equals('foo'));
-    checkUnnamed1576(o.lineItems);
+    checkUnnamed1596(o.lineItems);
     unittest.expect(o.operationId, unittest.equals('foo'));
     unittest.expect(o.shipmentId, unittest.equals('foo'));
-    checkUnnamed1577(o.shipmentInfos);
+    checkUnnamed1597(o.shipmentInfos);
     unittest.expect(o.trackingId, unittest.equals('foo'));
   }
   buildCounterOrdersShipLineItemsRequest--;
@@ -1618,6 +1788,56 @@
   buildCounterOrdersShipLineItemsResponse--;
 }
 
+core.int buildCounterOrdersUpdateLineItemShippingDetailsRequest = 0;
+buildOrdersUpdateLineItemShippingDetailsRequest() {
+  var o = new api.OrdersUpdateLineItemShippingDetailsRequest();
+  buildCounterOrdersUpdateLineItemShippingDetailsRequest++;
+  if (buildCounterOrdersUpdateLineItemShippingDetailsRequest < 3) {
+    o.deliverByDate = "foo";
+    o.lineItemId = "foo";
+    o.operationId = "foo";
+    o.productId = "foo";
+    o.shipByDate = "foo";
+  }
+  buildCounterOrdersUpdateLineItemShippingDetailsRequest--;
+  return o;
+}
+
+checkOrdersUpdateLineItemShippingDetailsRequest(
+    api.OrdersUpdateLineItemShippingDetailsRequest o) {
+  buildCounterOrdersUpdateLineItemShippingDetailsRequest++;
+  if (buildCounterOrdersUpdateLineItemShippingDetailsRequest < 3) {
+    unittest.expect(o.deliverByDate, unittest.equals('foo'));
+    unittest.expect(o.lineItemId, unittest.equals('foo'));
+    unittest.expect(o.operationId, unittest.equals('foo'));
+    unittest.expect(o.productId, unittest.equals('foo'));
+    unittest.expect(o.shipByDate, unittest.equals('foo'));
+  }
+  buildCounterOrdersUpdateLineItemShippingDetailsRequest--;
+}
+
+core.int buildCounterOrdersUpdateLineItemShippingDetailsResponse = 0;
+buildOrdersUpdateLineItemShippingDetailsResponse() {
+  var o = new api.OrdersUpdateLineItemShippingDetailsResponse();
+  buildCounterOrdersUpdateLineItemShippingDetailsResponse++;
+  if (buildCounterOrdersUpdateLineItemShippingDetailsResponse < 3) {
+    o.executionStatus = "foo";
+    o.kind = "foo";
+  }
+  buildCounterOrdersUpdateLineItemShippingDetailsResponse--;
+  return o;
+}
+
+checkOrdersUpdateLineItemShippingDetailsResponse(
+    api.OrdersUpdateLineItemShippingDetailsResponse o) {
+  buildCounterOrdersUpdateLineItemShippingDetailsResponse++;
+  if (buildCounterOrdersUpdateLineItemShippingDetailsResponse < 3) {
+    unittest.expect(o.executionStatus, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+  }
+  buildCounterOrdersUpdateLineItemShippingDetailsResponse--;
+}
+
 core.int buildCounterOrdersUpdateMerchantOrderIdRequest = 0;
 buildOrdersUpdateMerchantOrderIdRequest() {
   var o = new api.OrdersUpdateMerchantOrderIdRequest();
@@ -1731,27 +1951,27 @@
   buildCounterPrice--;
 }
 
-buildUnnamed1578() {
+buildUnnamed1598() {
   var o = new core.List<api.TestOrderLineItem>();
   o.add(buildTestOrderLineItem());
   o.add(buildTestOrderLineItem());
   return o;
 }
 
-checkUnnamed1578(core.List<api.TestOrderLineItem> o) {
+checkUnnamed1598(core.List<api.TestOrderLineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTestOrderLineItem(o[0]);
   checkTestOrderLineItem(o[1]);
 }
 
-buildUnnamed1579() {
+buildUnnamed1599() {
   var o = new core.List<api.OrderPromotion>();
   o.add(buildOrderPromotion());
   o.add(buildOrderPromotion());
   return o;
 }
 
-checkUnnamed1579(core.List<api.OrderPromotion> o) {
+checkUnnamed1599(core.List<api.OrderPromotion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderPromotion(o[0]);
   checkOrderPromotion(o[1]);
@@ -1764,11 +1984,11 @@
   if (buildCounterTestOrder < 3) {
     o.customer = buildTestOrderCustomer();
     o.kind = "foo";
-    o.lineItems = buildUnnamed1578();
+    o.lineItems = buildUnnamed1598();
     o.notificationMode = "foo";
     o.paymentMethod = buildTestOrderPaymentMethod();
     o.predefinedDeliveryAddress = "foo";
-    o.promotions = buildUnnamed1579();
+    o.promotions = buildUnnamed1599();
     o.shippingCost = buildPrice();
     o.shippingCostTax = buildPrice();
     o.shippingOption = "foo";
@@ -1782,11 +2002,11 @@
   if (buildCounterTestOrder < 3) {
     checkTestOrderCustomer(o.customer);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1578(o.lineItems);
+    checkUnnamed1598(o.lineItems);
     unittest.expect(o.notificationMode, unittest.equals('foo'));
     checkTestOrderPaymentMethod(o.paymentMethod);
     unittest.expect(o.predefinedDeliveryAddress, unittest.equals('foo'));
-    checkUnnamed1579(o.promotions);
+    checkUnnamed1599(o.promotions);
     checkPrice(o.shippingCost);
     checkPrice(o.shippingCostTax);
     unittest.expect(o.shippingOption, unittest.equals('foo'));
@@ -1844,14 +2064,14 @@
   buildCounterTestOrderLineItem--;
 }
 
-buildUnnamed1580() {
+buildUnnamed1600() {
   var o = new core.List<api.OrderLineItemProductVariantAttribute>();
   o.add(buildOrderLineItemProductVariantAttribute());
   o.add(buildOrderLineItemProductVariantAttribute());
   return o;
 }
 
-checkUnnamed1580(core.List<api.OrderLineItemProductVariantAttribute> o) {
+checkUnnamed1600(core.List<api.OrderLineItemProductVariantAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderLineItemProductVariantAttribute(o[0]);
   checkOrderLineItemProductVariantAttribute(o[1]);
@@ -1874,7 +2094,7 @@
     o.price = buildPrice();
     o.targetCountry = "foo";
     o.title = "foo";
-    o.variantAttributes = buildUnnamed1580();
+    o.variantAttributes = buildUnnamed1600();
   }
   buildCounterTestOrderLineItemProduct--;
   return o;
@@ -1895,7 +2115,7 @@
     checkPrice(o.price);
     unittest.expect(o.targetCountry, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    checkUnnamed1580(o.variantAttributes);
+    checkUnnamed1600(o.variantAttributes);
   }
   buildCounterTestOrderLineItemProduct--;
 }
@@ -1927,14 +2147,14 @@
   buildCounterTestOrderPaymentMethod--;
 }
 
-buildUnnamed1581() {
+buildUnnamed1601() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1581(core.List<core.String> o) {
+checkUnnamed1601(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2046,6 +2266,14 @@
     });
   });
 
+  unittest.group("obj-schema-OrderMerchantProvidedAnnotation", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrderMerchantProvidedAnnotation();
+      var od = new api.OrderMerchantProvidedAnnotation.fromJson(o.toJson());
+      checkOrderMerchantProvidedAnnotation(od);
+    });
+  });
+
   unittest.group("obj-schema-OrderPaymentMethod", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrderPaymentMethod();
@@ -2224,6 +2452,17 @@
     });
   });
 
+  unittest.group("obj-schema-OrdersCustomBatchRequestEntrySetLineItemMetadata",
+      () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrdersCustomBatchRequestEntrySetLineItemMetadata();
+      var od =
+          new api.OrdersCustomBatchRequestEntrySetLineItemMetadata.fromJson(
+              o.toJson());
+      checkOrdersCustomBatchRequestEntrySetLineItemMetadata(od);
+    });
+  });
+
   unittest.group("obj-schema-OrdersCustomBatchRequestEntryShipLineItems", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrdersCustomBatchRequestEntryShipLineItems();
@@ -2244,6 +2483,18 @@
     });
   });
 
+  unittest.group(
+      "obj-schema-OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails",
+      () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails();
+      var od = new api
+              .OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails.fromJson(
+          o.toJson());
+      checkOrdersCustomBatchRequestEntryUpdateLineItemShippingDetails(od);
+    });
+  });
+
   unittest.group("obj-schema-OrdersCustomBatchRequestEntryUpdateShipment", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrdersCustomBatchRequestEntryUpdateShipment();
@@ -2325,6 +2576,22 @@
     });
   });
 
+  unittest.group("obj-schema-OrdersSetLineItemMetadataRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrdersSetLineItemMetadataRequest();
+      var od = new api.OrdersSetLineItemMetadataRequest.fromJson(o.toJson());
+      checkOrdersSetLineItemMetadataRequest(od);
+    });
+  });
+
+  unittest.group("obj-schema-OrdersSetLineItemMetadataResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrdersSetLineItemMetadataResponse();
+      var od = new api.OrdersSetLineItemMetadataResponse.fromJson(o.toJson());
+      checkOrdersSetLineItemMetadataResponse(od);
+    });
+  });
+
   unittest.group("obj-schema-OrdersShipLineItemsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrdersShipLineItemsRequest();
@@ -2341,6 +2608,24 @@
     });
   });
 
+  unittest.group("obj-schema-OrdersUpdateLineItemShippingDetailsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrdersUpdateLineItemShippingDetailsRequest();
+      var od = new api.OrdersUpdateLineItemShippingDetailsRequest.fromJson(
+          o.toJson());
+      checkOrdersUpdateLineItemShippingDetailsRequest(od);
+    });
+  });
+
+  unittest.group("obj-schema-OrdersUpdateLineItemShippingDetailsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOrdersUpdateLineItemShippingDetailsResponse();
+      var od = new api.OrdersUpdateLineItemShippingDetailsResponse.fromJson(
+          o.toJson());
+      checkOrdersUpdateLineItemShippingDetailsResponse(od);
+    });
+  });
+
   unittest.group("obj-schema-OrdersUpdateMerchantOrderIdRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrdersUpdateMerchantOrderIdRequest();
@@ -2899,7 +3184,7 @@
       var arg_pageToken = "foo";
       var arg_placedDateEnd = "foo";
       var arg_placedDateStart = "foo";
-      var arg_statuses = buildUnnamed1581();
+      var arg_statuses = buildUnnamed1601();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3071,6 +3356,61 @@
       })));
     });
 
+    unittest.test("method--setlineitemmetadata", () {
+      var mock = new HttpServerMock();
+      api.OrdersResourceApi res = new api.ContentApi(mock).orders;
+      var arg_request = buildOrdersSetLineItemMetadataRequest();
+      var arg_merchantId = "foo";
+      var arg_orderId = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.OrdersSetLineItemMetadataRequest.fromJson(json);
+        checkOrdersSetLineItemMetadataRequest(obj);
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp =
+            convert.JSON.encode(buildOrdersSetLineItemMetadataResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .setlineitemmetadata(arg_request, arg_merchantId, arg_orderId,
+              $fields: arg_$fields)
+          .then(unittest
+              .expectAsync1(((api.OrdersSetLineItemMetadataResponse response) {
+        checkOrdersSetLineItemMetadataResponse(response);
+      })));
+    });
+
     unittest.test("method--shiplineitems", () {
       var mock = new HttpServerMock();
       api.OrdersResourceApi res = new api.ContentApi(mock).orders;
@@ -3125,6 +3465,62 @@
       })));
     });
 
+    unittest.test("method--updatelineitemshippingdetails", () {
+      var mock = new HttpServerMock();
+      api.OrdersResourceApi res = new api.ContentApi(mock).orders;
+      var arg_request = buildOrdersUpdateLineItemShippingDetailsRequest();
+      var arg_merchantId = "foo";
+      var arg_orderId = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj =
+            new api.OrdersUpdateLineItemShippingDetailsRequest.fromJson(json);
+        checkOrdersUpdateLineItemShippingDetailsRequest(obj);
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON
+            .encode(buildOrdersUpdateLineItemShippingDetailsResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .updatelineitemshippingdetails(
+              arg_request, arg_merchantId, arg_orderId, $fields: arg_$fields)
+          .then(unittest.expectAsync1(
+              ((api.OrdersUpdateLineItemShippingDetailsResponse response) {
+        checkOrdersUpdateLineItemShippingDetailsResponse(response);
+      })));
+    });
+
     unittest.test("method--updatemerchantorderid", () {
       var mock = new HttpServerMock();
       api.OrdersResourceApi res = new api.ContentApi(mock).orders;
diff --git a/generated/googleapis/test/customsearch/v1_test.dart b/generated/googleapis/test/customsearch/v1_test.dart
index 789429f..7beb9a2 100644
--- a/generated/googleapis/test/customsearch/v1_test.dart
+++ b/generated/googleapis/test/customsearch/v1_test.dart
@@ -73,30 +73,30 @@
   buildCounterContextFacets--;
 }
 
-buildUnnamed306() {
+buildUnnamed300() {
   var o = new core.List<api.ContextFacets>();
   o.add(buildContextFacets());
   o.add(buildContextFacets());
   return o;
 }
 
-checkUnnamed306(core.List<api.ContextFacets> o) {
+checkUnnamed300(core.List<api.ContextFacets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContextFacets(o[0]);
   checkContextFacets(o[1]);
 }
 
-buildUnnamed307() {
+buildUnnamed301() {
   var o = new core.List<core.List<api.ContextFacets>>();
-  o.add(buildUnnamed306());
-  o.add(buildUnnamed306());
+  o.add(buildUnnamed300());
+  o.add(buildUnnamed300());
   return o;
 }
 
-checkUnnamed307(core.List<core.List<api.ContextFacets>> o) {
+checkUnnamed301(core.List<core.List<api.ContextFacets>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed306(o[0]);
-  checkUnnamed306(o[1]);
+  checkUnnamed300(o[0]);
+  checkUnnamed300(o[1]);
 }
 
 core.int buildCounterContext = 0;
@@ -104,7 +104,7 @@
   var o = new api.Context();
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    o.facets = buildUnnamed307();
+    o.facets = buildUnnamed301();
     o.title = "foo";
   }
   buildCounterContext--;
@@ -114,7 +114,7 @@
 checkContext(api.Context o) {
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    checkUnnamed307(o.facets);
+    checkUnnamed301(o.facets);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterContext--;
@@ -145,14 +145,14 @@
   buildCounterPromotionBodyLines--;
 }
 
-buildUnnamed308() {
+buildUnnamed302() {
   var o = new core.List<api.PromotionBodyLines>();
   o.add(buildPromotionBodyLines());
   o.add(buildPromotionBodyLines());
   return o;
 }
 
-checkUnnamed308(core.List<api.PromotionBodyLines> o) {
+checkUnnamed302(core.List<api.PromotionBodyLines> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotionBodyLines(o[0]);
   checkPromotionBodyLines(o[1]);
@@ -186,7 +186,7 @@
   var o = new api.Promotion();
   buildCounterPromotion++;
   if (buildCounterPromotion < 3) {
-    o.bodyLines = buildUnnamed308();
+    o.bodyLines = buildUnnamed302();
     o.displayLink = "foo";
     o.htmlTitle = "foo";
     o.image = buildPromotionImage();
@@ -200,7 +200,7 @@
 checkPromotion(api.Promotion o) {
   buildCounterPromotion++;
   if (buildCounterPromotion < 3) {
-    checkUnnamed308(o.bodyLines);
+    checkUnnamed302(o.bodyLines);
     unittest.expect(o.displayLink, unittest.equals('foo'));
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
     checkPromotionImage(o.image);
@@ -353,20 +353,20 @@
   buildCounterResultLabels--;
 }
 
-buildUnnamed309() {
+buildUnnamed303() {
   var o = new core.List<api.ResultLabels>();
   o.add(buildResultLabels());
   o.add(buildResultLabels());
   return o;
 }
 
-checkUnnamed309(core.List<api.ResultLabels> o) {
+checkUnnamed303(core.List<api.ResultLabels> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultLabels(o[0]);
   checkResultLabels(o[1]);
 }
 
-buildUnnamed310() {
+buildUnnamed304() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -381,7 +381,7 @@
   return o;
 }
 
-checkUnnamed310(core.Map<core.String, core.Object> o) {
+checkUnnamed304(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));
@@ -395,32 +395,32 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed311() {
+buildUnnamed305() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed310());
-  o.add(buildUnnamed310());
+  o.add(buildUnnamed304());
+  o.add(buildUnnamed304());
   return o;
 }
 
-checkUnnamed311(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed305(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed310(o[0]);
-  checkUnnamed310(o[1]);
+  checkUnnamed304(o[0]);
+  checkUnnamed304(o[1]);
 }
 
-buildUnnamed312() {
+buildUnnamed306() {
   var o = new core
       .Map<core.String, core.List<core.Map<core.String, core.Object>>>();
-  o["x"] = buildUnnamed311();
-  o["y"] = buildUnnamed311();
+  o["x"] = buildUnnamed305();
+  o["y"] = buildUnnamed305();
   return o;
 }
 
-checkUnnamed312(
+checkUnnamed306(
     core.Map<core.String, core.List<core.Map<core.String, core.Object>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed311(o["x"]);
-  checkUnnamed311(o["y"]);
+  checkUnnamed305(o["x"]);
+  checkUnnamed305(o["y"]);
 }
 
 core.int buildCounterResult = 0;
@@ -437,10 +437,10 @@
     o.htmlTitle = "foo";
     o.image = buildResultImage();
     o.kind = "foo";
-    o.labels = buildUnnamed309();
+    o.labels = buildUnnamed303();
     o.link = "foo";
     o.mime = "foo";
-    o.pagemap = buildUnnamed312();
+    o.pagemap = buildUnnamed306();
     o.snippet = "foo";
     o.title = "foo";
   }
@@ -460,66 +460,66 @@
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
     checkResultImage(o.image);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed309(o.labels);
+    checkUnnamed303(o.labels);
     unittest.expect(o.link, unittest.equals('foo'));
     unittest.expect(o.mime, unittest.equals('foo'));
-    checkUnnamed312(o.pagemap);
+    checkUnnamed306(o.pagemap);
     unittest.expect(o.snippet, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterResult--;
 }
 
-buildUnnamed313() {
+buildUnnamed307() {
   var o = new core.List<api.Result>();
   o.add(buildResult());
   o.add(buildResult());
   return o;
 }
 
-checkUnnamed313(core.List<api.Result> o) {
+checkUnnamed307(core.List<api.Result> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResult(o[0]);
   checkResult(o[1]);
 }
 
-buildUnnamed314() {
+buildUnnamed308() {
   var o = new core.List<api.Promotion>();
   o.add(buildPromotion());
   o.add(buildPromotion());
   return o;
 }
 
-checkUnnamed314(core.List<api.Promotion> o) {
+checkUnnamed308(core.List<api.Promotion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotion(o[0]);
   checkPromotion(o[1]);
 }
 
-buildUnnamed315() {
+buildUnnamed309() {
   var o = new core.List<api.Query>();
   o.add(buildQuery());
   o.add(buildQuery());
   return o;
 }
 
-checkUnnamed315(core.List<api.Query> o) {
+checkUnnamed309(core.List<api.Query> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuery(o[0]);
   checkQuery(o[1]);
 }
 
-buildUnnamed316() {
+buildUnnamed310() {
   var o = new core.Map<core.String, core.List<api.Query>>();
-  o["x"] = buildUnnamed315();
-  o["y"] = buildUnnamed315();
+  o["x"] = buildUnnamed309();
+  o["y"] = buildUnnamed309();
   return o;
 }
 
-checkUnnamed316(core.Map<core.String, core.List<api.Query>> o) {
+checkUnnamed310(core.Map<core.String, core.List<api.Query>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed315(o["x"]);
-  checkUnnamed315(o["y"]);
+  checkUnnamed309(o["x"]);
+  checkUnnamed309(o["y"]);
 }
 
 core.int buildCounterSearchSearchInformation = 0;
@@ -595,10 +595,10 @@
   buildCounterSearch++;
   if (buildCounterSearch < 3) {
     o.context = buildContext();
-    o.items = buildUnnamed313();
+    o.items = buildUnnamed307();
     o.kind = "foo";
-    o.promotions = buildUnnamed314();
-    o.queries = buildUnnamed316();
+    o.promotions = buildUnnamed308();
+    o.queries = buildUnnamed310();
     o.searchInformation = buildSearchSearchInformation();
     o.spelling = buildSearchSpelling();
     o.url = buildSearchUrl();
@@ -611,10 +611,10 @@
   buildCounterSearch++;
   if (buildCounterSearch < 3) {
     checkContext(o.context);
-    checkUnnamed313(o.items);
+    checkUnnamed307(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed314(o.promotions);
-    checkUnnamed316(o.queries);
+    checkUnnamed308(o.promotions);
+    checkUnnamed310(o.queries);
     checkSearchSearchInformation(o.searchInformation);
     checkSearchSpelling(o.spelling);
     checkSearchUrl(o.url);
diff --git a/generated/googleapis/test/dataproc/v1_test.dart b/generated/googleapis/test/dataproc/v1_test.dart
index fc3daf5..7efb650 100644
--- a/generated/googleapis/test/dataproc/v1_test.dart
+++ b/generated/googleapis/test/dataproc/v1_test.dart
@@ -86,27 +86,27 @@
   buildCounterCancelJobRequest--;
 }
 
-buildUnnamed542() {
+buildUnnamed540() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed542(core.Map<core.String, core.String> o) {
+checkUnnamed540(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'));
 }
 
-buildUnnamed543() {
+buildUnnamed541() {
   var o = new core.List<api.ClusterStatus>();
   o.add(buildClusterStatus());
   o.add(buildClusterStatus());
   return o;
 }
 
-checkUnnamed543(core.List<api.ClusterStatus> o) {
+checkUnnamed541(core.List<api.ClusterStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkClusterStatus(o[0]);
   checkClusterStatus(o[1]);
@@ -120,11 +120,11 @@
     o.clusterName = "foo";
     o.clusterUuid = "foo";
     o.config = buildClusterConfig();
-    o.labels = buildUnnamed542();
+    o.labels = buildUnnamed540();
     o.metrics = buildClusterMetrics();
     o.projectId = "foo";
     o.status = buildClusterStatus();
-    o.statusHistory = buildUnnamed543();
+    o.statusHistory = buildUnnamed541();
   }
   buildCounterCluster--;
   return o;
@@ -136,23 +136,23 @@
     unittest.expect(o.clusterName, unittest.equals('foo'));
     unittest.expect(o.clusterUuid, unittest.equals('foo'));
     checkClusterConfig(o.config);
-    checkUnnamed542(o.labels);
+    checkUnnamed540(o.labels);
     checkClusterMetrics(o.metrics);
     unittest.expect(o.projectId, unittest.equals('foo'));
     checkClusterStatus(o.status);
-    checkUnnamed543(o.statusHistory);
+    checkUnnamed541(o.statusHistory);
   }
   buildCounterCluster--;
 }
 
-buildUnnamed544() {
+buildUnnamed542() {
   var o = new core.List<api.NodeInitializationAction>();
   o.add(buildNodeInitializationAction());
   o.add(buildNodeInitializationAction());
   return o;
 }
 
-checkUnnamed544(core.List<api.NodeInitializationAction> o) {
+checkUnnamed542(core.List<api.NodeInitializationAction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNodeInitializationAction(o[0]);
   checkNodeInitializationAction(o[1]);
@@ -165,7 +165,7 @@
   if (buildCounterClusterConfig < 3) {
     o.configBucket = "foo";
     o.gceClusterConfig = buildGceClusterConfig();
-    o.initializationActions = buildUnnamed544();
+    o.initializationActions = buildUnnamed542();
     o.masterConfig = buildInstanceGroupConfig();
     o.secondaryWorkerConfig = buildInstanceGroupConfig();
     o.softwareConfig = buildSoftwareConfig();
@@ -180,7 +180,7 @@
   if (buildCounterClusterConfig < 3) {
     unittest.expect(o.configBucket, unittest.equals('foo'));
     checkGceClusterConfig(o.gceClusterConfig);
-    checkUnnamed544(o.initializationActions);
+    checkUnnamed542(o.initializationActions);
     checkInstanceGroupConfig(o.masterConfig);
     checkInstanceGroupConfig(o.secondaryWorkerConfig);
     checkSoftwareConfig(o.softwareConfig);
@@ -189,6 +189,53 @@
   buildCounterClusterConfig--;
 }
 
+buildUnnamed543() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
+  return o;
+}
+
+checkUnnamed543(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'));
+}
+
+buildUnnamed544() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
+  return o;
+}
+
+checkUnnamed544(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'));
+}
+
+core.int buildCounterClusterMetrics = 0;
+buildClusterMetrics() {
+  var o = new api.ClusterMetrics();
+  buildCounterClusterMetrics++;
+  if (buildCounterClusterMetrics < 3) {
+    o.hdfsMetrics = buildUnnamed543();
+    o.yarnMetrics = buildUnnamed544();
+  }
+  buildCounterClusterMetrics--;
+  return o;
+}
+
+checkClusterMetrics(api.ClusterMetrics o) {
+  buildCounterClusterMetrics++;
+  if (buildCounterClusterMetrics < 3) {
+    checkUnnamed543(o.hdfsMetrics);
+    checkUnnamed544(o.yarnMetrics);
+  }
+  buildCounterClusterMetrics--;
+}
+
 buildUnnamed545() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
@@ -203,73 +250,26 @@
 }
 
 buildUnnamed546() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
-  return o;
-}
-
-checkUnnamed546(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'));
-}
-
-core.int buildCounterClusterMetrics = 0;
-buildClusterMetrics() {
-  var o = new api.ClusterMetrics();
-  buildCounterClusterMetrics++;
-  if (buildCounterClusterMetrics < 3) {
-    o.hdfsMetrics = buildUnnamed545();
-    o.yarnMetrics = buildUnnamed546();
-  }
-  buildCounterClusterMetrics--;
-  return o;
-}
-
-checkClusterMetrics(api.ClusterMetrics o) {
-  buildCounterClusterMetrics++;
-  if (buildCounterClusterMetrics < 3) {
-    checkUnnamed545(o.hdfsMetrics);
-    checkUnnamed546(o.yarnMetrics);
-  }
-  buildCounterClusterMetrics--;
-}
-
-buildUnnamed547() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
-  return o;
-}
-
-checkUnnamed547(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'));
-}
-
-buildUnnamed548() {
   var o = new core.List<api.ClusterOperationStatus>();
   o.add(buildClusterOperationStatus());
   o.add(buildClusterOperationStatus());
   return o;
 }
 
-checkUnnamed548(core.List<api.ClusterOperationStatus> o) {
+checkUnnamed546(core.List<api.ClusterOperationStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkClusterOperationStatus(o[0]);
   checkClusterOperationStatus(o[1]);
 }
 
-buildUnnamed549() {
+buildUnnamed547() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed549(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'));
@@ -283,11 +283,11 @@
     o.clusterName = "foo";
     o.clusterUuid = "foo";
     o.description = "foo";
-    o.labels = buildUnnamed547();
+    o.labels = buildUnnamed545();
     o.operationType = "foo";
     o.status = buildClusterOperationStatus();
-    o.statusHistory = buildUnnamed548();
-    o.warnings = buildUnnamed549();
+    o.statusHistory = buildUnnamed546();
+    o.warnings = buildUnnamed547();
   }
   buildCounterClusterOperationMetadata--;
   return o;
@@ -299,11 +299,11 @@
     unittest.expect(o.clusterName, unittest.equals('foo'));
     unittest.expect(o.clusterUuid, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed547(o.labels);
+    checkUnnamed545(o.labels);
     unittest.expect(o.operationType, unittest.equals('foo'));
     checkClusterOperationStatus(o.status);
-    checkUnnamed548(o.statusHistory);
-    checkUnnamed549(o.warnings);
+    checkUnnamed546(o.statusHistory);
+    checkUnnamed547(o.warnings);
   }
   buildCounterClusterOperationMetadata--;
 }
@@ -428,19 +428,78 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed550() {
+buildUnnamed548() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed550(core.Map<core.String, core.String> o) {
+checkUnnamed548(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'));
 }
 
+buildUnnamed549() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed549(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed550() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+core.int buildCounterGceClusterConfig = 0;
+buildGceClusterConfig() {
+  var o = new api.GceClusterConfig();
+  buildCounterGceClusterConfig++;
+  if (buildCounterGceClusterConfig < 3) {
+    o.internalIpOnly = true;
+    o.metadata = buildUnnamed548();
+    o.networkUri = "foo";
+    o.serviceAccount = "foo";
+    o.serviceAccountScopes = buildUnnamed549();
+    o.subnetworkUri = "foo";
+    o.tags = buildUnnamed550();
+    o.zoneUri = "foo";
+  }
+  buildCounterGceClusterConfig--;
+  return o;
+}
+
+checkGceClusterConfig(api.GceClusterConfig o) {
+  buildCounterGceClusterConfig++;
+  if (buildCounterGceClusterConfig < 3) {
+    unittest.expect(o.internalIpOnly, unittest.isTrue);
+    checkUnnamed548(o.metadata);
+    unittest.expect(o.networkUri, unittest.equals('foo'));
+    unittest.expect(o.serviceAccount, unittest.equals('foo'));
+    checkUnnamed549(o.serviceAccountScopes);
+    unittest.expect(o.subnetworkUri, unittest.equals('foo'));
+    checkUnnamed550(o.tags);
+    unittest.expect(o.zoneUri, unittest.equals('foo'));
+  }
+  buildCounterGceClusterConfig--;
+}
+
 buildUnnamed551() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -467,39 +526,6 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterGceClusterConfig = 0;
-buildGceClusterConfig() {
-  var o = new api.GceClusterConfig();
-  buildCounterGceClusterConfig++;
-  if (buildCounterGceClusterConfig < 3) {
-    o.internalIpOnly = true;
-    o.metadata = buildUnnamed550();
-    o.networkUri = "foo";
-    o.serviceAccount = "foo";
-    o.serviceAccountScopes = buildUnnamed551();
-    o.subnetworkUri = "foo";
-    o.tags = buildUnnamed552();
-    o.zoneUri = "foo";
-  }
-  buildCounterGceClusterConfig--;
-  return o;
-}
-
-checkGceClusterConfig(api.GceClusterConfig o) {
-  buildCounterGceClusterConfig++;
-  if (buildCounterGceClusterConfig < 3) {
-    unittest.expect(o.internalIpOnly, unittest.isTrue);
-    checkUnnamed550(o.metadata);
-    unittest.expect(o.networkUri, unittest.equals('foo'));
-    unittest.expect(o.serviceAccount, unittest.equals('foo'));
-    checkUnnamed551(o.serviceAccountScopes);
-    unittest.expect(o.subnetworkUri, unittest.equals('foo'));
-    checkUnnamed552(o.tags);
-    unittest.expect(o.zoneUri, unittest.equals('foo'));
-  }
-  buildCounterGceClusterConfig--;
-}
-
 buildUnnamed553() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -527,16 +553,49 @@
 }
 
 buildUnnamed555() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
   return o;
 }
 
-checkUnnamed555(core.List<core.String> o) {
+checkUnnamed555(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
+  unittest.expect(o["x"], unittest.equals('foo'));
+  unittest.expect(o["y"], unittest.equals('foo'));
+}
+
+core.int buildCounterHadoopJob = 0;
+buildHadoopJob() {
+  var o = new api.HadoopJob();
+  buildCounterHadoopJob++;
+  if (buildCounterHadoopJob < 3) {
+    o.archiveUris = buildUnnamed551();
+    o.args = buildUnnamed552();
+    o.fileUris = buildUnnamed553();
+    o.jarFileUris = buildUnnamed554();
+    o.loggingConfig = buildLoggingConfig();
+    o.mainClass = "foo";
+    o.mainJarFileUri = "foo";
+    o.properties = buildUnnamed555();
+  }
+  buildCounterHadoopJob--;
+  return o;
+}
+
+checkHadoopJob(api.HadoopJob o) {
+  buildCounterHadoopJob++;
+  if (buildCounterHadoopJob < 3) {
+    checkUnnamed551(o.archiveUris);
+    checkUnnamed552(o.args);
+    checkUnnamed553(o.fileUris);
+    checkUnnamed554(o.jarFileUris);
+    checkLoggingConfig(o.loggingConfig);
+    unittest.expect(o.mainClass, unittest.equals('foo'));
+    unittest.expect(o.mainJarFileUri, unittest.equals('foo'));
+    checkUnnamed555(o.properties);
+  }
+  buildCounterHadoopJob--;
 }
 
 buildUnnamed556() {
@@ -565,73 +624,14 @@
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-core.int buildCounterHadoopJob = 0;
-buildHadoopJob() {
-  var o = new api.HadoopJob();
-  buildCounterHadoopJob++;
-  if (buildCounterHadoopJob < 3) {
-    o.archiveUris = buildUnnamed553();
-    o.args = buildUnnamed554();
-    o.fileUris = buildUnnamed555();
-    o.jarFileUris = buildUnnamed556();
-    o.loggingConfig = buildLoggingConfig();
-    o.mainClass = "foo";
-    o.mainJarFileUri = "foo";
-    o.properties = buildUnnamed557();
-  }
-  buildCounterHadoopJob--;
-  return o;
-}
-
-checkHadoopJob(api.HadoopJob o) {
-  buildCounterHadoopJob++;
-  if (buildCounterHadoopJob < 3) {
-    checkUnnamed553(o.archiveUris);
-    checkUnnamed554(o.args);
-    checkUnnamed555(o.fileUris);
-    checkUnnamed556(o.jarFileUris);
-    checkLoggingConfig(o.loggingConfig);
-    unittest.expect(o.mainClass, unittest.equals('foo'));
-    unittest.expect(o.mainJarFileUri, unittest.equals('foo'));
-    checkUnnamed557(o.properties);
-  }
-  buildCounterHadoopJob--;
-}
-
 buildUnnamed558() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed558(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed559() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed559(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'));
-}
-
-buildUnnamed560() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
-  return o;
-}
-
-checkUnnamed560(core.Map<core.String, core.String> o) {
+checkUnnamed558(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'));
@@ -643,11 +643,11 @@
   buildCounterHiveJob++;
   if (buildCounterHiveJob < 3) {
     o.continueOnFailure = true;
-    o.jarFileUris = buildUnnamed558();
-    o.properties = buildUnnamed559();
+    o.jarFileUris = buildUnnamed556();
+    o.properties = buildUnnamed557();
     o.queryFileUri = "foo";
     o.queryList = buildQueryList();
-    o.scriptVariables = buildUnnamed560();
+    o.scriptVariables = buildUnnamed558();
   }
   buildCounterHiveJob--;
   return o;
@@ -657,36 +657,36 @@
   buildCounterHiveJob++;
   if (buildCounterHiveJob < 3) {
     unittest.expect(o.continueOnFailure, unittest.isTrue);
-    checkUnnamed558(o.jarFileUris);
-    checkUnnamed559(o.properties);
+    checkUnnamed556(o.jarFileUris);
+    checkUnnamed557(o.properties);
     unittest.expect(o.queryFileUri, unittest.equals('foo'));
     checkQueryList(o.queryList);
-    checkUnnamed560(o.scriptVariables);
+    checkUnnamed558(o.scriptVariables);
   }
   buildCounterHiveJob--;
 }
 
-buildUnnamed561() {
+buildUnnamed559() {
   var o = new core.List<api.AcceleratorConfig>();
   o.add(buildAcceleratorConfig());
   o.add(buildAcceleratorConfig());
   return o;
 }
 
-checkUnnamed561(core.List<api.AcceleratorConfig> o) {
+checkUnnamed559(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorConfig(o[0]);
   checkAcceleratorConfig(o[1]);
 }
 
-buildUnnamed562() {
+buildUnnamed560() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed562(core.List<core.String> o) {
+checkUnnamed560(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -697,10 +697,10 @@
   var o = new api.InstanceGroupConfig();
   buildCounterInstanceGroupConfig++;
   if (buildCounterInstanceGroupConfig < 3) {
-    o.accelerators = buildUnnamed561();
+    o.accelerators = buildUnnamed559();
     o.diskConfig = buildDiskConfig();
     o.imageUri = "foo";
-    o.instanceNames = buildUnnamed562();
+    o.instanceNames = buildUnnamed560();
     o.isPreemptible = true;
     o.machineTypeUri = "foo";
     o.managedGroupConfig = buildManagedGroupConfig();
@@ -713,10 +713,10 @@
 checkInstanceGroupConfig(api.InstanceGroupConfig o) {
   buildCounterInstanceGroupConfig++;
   if (buildCounterInstanceGroupConfig < 3) {
-    checkUnnamed561(o.accelerators);
+    checkUnnamed559(o.accelerators);
     checkDiskConfig(o.diskConfig);
     unittest.expect(o.imageUri, unittest.equals('foo'));
-    checkUnnamed562(o.instanceNames);
+    checkUnnamed560(o.instanceNames);
     unittest.expect(o.isPreemptible, unittest.isTrue);
     unittest.expect(o.machineTypeUri, unittest.equals('foo'));
     checkManagedGroupConfig(o.managedGroupConfig);
@@ -725,40 +725,40 @@
   buildCounterInstanceGroupConfig--;
 }
 
-buildUnnamed563() {
+buildUnnamed561() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed563(core.Map<core.String, core.String> o) {
+checkUnnamed561(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'));
 }
 
-buildUnnamed564() {
+buildUnnamed562() {
   var o = new core.List<api.JobStatus>();
   o.add(buildJobStatus());
   o.add(buildJobStatus());
   return o;
 }
 
-checkUnnamed564(core.List<api.JobStatus> o) {
+checkUnnamed562(core.List<api.JobStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJobStatus(o[0]);
   checkJobStatus(o[1]);
 }
 
-buildUnnamed565() {
+buildUnnamed563() {
   var o = new core.List<api.YarnApplication>();
   o.add(buildYarnApplication());
   o.add(buildYarnApplication());
   return o;
 }
 
-checkUnnamed565(core.List<api.YarnApplication> o) {
+checkUnnamed563(core.List<api.YarnApplication> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkYarnApplication(o[0]);
   checkYarnApplication(o[1]);
@@ -773,7 +773,7 @@
     o.driverOutputResourceUri = "foo";
     o.hadoopJob = buildHadoopJob();
     o.hiveJob = buildHiveJob();
-    o.labels = buildUnnamed563();
+    o.labels = buildUnnamed561();
     o.pigJob = buildPigJob();
     o.placement = buildJobPlacement();
     o.pysparkJob = buildPySparkJob();
@@ -782,8 +782,8 @@
     o.sparkJob = buildSparkJob();
     o.sparkSqlJob = buildSparkSqlJob();
     o.status = buildJobStatus();
-    o.statusHistory = buildUnnamed564();
-    o.yarnApplications = buildUnnamed565();
+    o.statusHistory = buildUnnamed562();
+    o.yarnApplications = buildUnnamed563();
   }
   buildCounterJob--;
   return o;
@@ -796,7 +796,7 @@
     unittest.expect(o.driverOutputResourceUri, unittest.equals('foo'));
     checkHadoopJob(o.hadoopJob);
     checkHiveJob(o.hiveJob);
-    checkUnnamed563(o.labels);
+    checkUnnamed561(o.labels);
     checkPigJob(o.pigJob);
     checkJobPlacement(o.placement);
     checkPySparkJob(o.pysparkJob);
@@ -805,8 +805,8 @@
     checkSparkJob(o.sparkJob);
     checkSparkSqlJob(o.sparkSqlJob);
     checkJobStatus(o.status);
-    checkUnnamed564(o.statusHistory);
-    checkUnnamed565(o.yarnApplications);
+    checkUnnamed562(o.statusHistory);
+    checkUnnamed563(o.yarnApplications);
   }
   buildCounterJob--;
 }
@@ -897,14 +897,14 @@
   buildCounterJobStatus--;
 }
 
-buildUnnamed566() {
+buildUnnamed564() {
   var o = new core.List<api.Cluster>();
   o.add(buildCluster());
   o.add(buildCluster());
   return o;
 }
 
-checkUnnamed566(core.List<api.Cluster> o) {
+checkUnnamed564(core.List<api.Cluster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCluster(o[0]);
   checkCluster(o[1]);
@@ -915,7 +915,7 @@
   var o = new api.ListClustersResponse();
   buildCounterListClustersResponse++;
   if (buildCounterListClustersResponse < 3) {
-    o.clusters = buildUnnamed566();
+    o.clusters = buildUnnamed564();
     o.nextPageToken = "foo";
   }
   buildCounterListClustersResponse--;
@@ -925,20 +925,20 @@
 checkListClustersResponse(api.ListClustersResponse o) {
   buildCounterListClustersResponse++;
   if (buildCounterListClustersResponse < 3) {
-    checkUnnamed566(o.clusters);
+    checkUnnamed564(o.clusters);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListClustersResponse--;
 }
 
-buildUnnamed567() {
+buildUnnamed565() {
   var o = new core.List<api.Job>();
   o.add(buildJob());
   o.add(buildJob());
   return o;
 }
 
-checkUnnamed567(core.List<api.Job> o) {
+checkUnnamed565(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJob(o[0]);
   checkJob(o[1]);
@@ -949,7 +949,7 @@
   var o = new api.ListJobsResponse();
   buildCounterListJobsResponse++;
   if (buildCounterListJobsResponse < 3) {
-    o.jobs = buildUnnamed567();
+    o.jobs = buildUnnamed565();
     o.nextPageToken = "foo";
   }
   buildCounterListJobsResponse--;
@@ -959,20 +959,20 @@
 checkListJobsResponse(api.ListJobsResponse o) {
   buildCounterListJobsResponse++;
   if (buildCounterListJobsResponse < 3) {
-    checkUnnamed567(o.jobs);
+    checkUnnamed565(o.jobs);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListJobsResponse--;
 }
 
-buildUnnamed568() {
+buildUnnamed566() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed568(core.List<api.Operation> o) {
+checkUnnamed566(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -984,7 +984,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed568();
+    o.operations = buildUnnamed566();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -994,19 +994,19 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed568(o.operations);
+    checkUnnamed566(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed569() {
+buildUnnamed567() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed569(core.Map<core.String, core.String> o) {
+checkUnnamed567(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'));
@@ -1017,7 +1017,7 @@
   var o = new api.LoggingConfig();
   buildCounterLoggingConfig++;
   if (buildCounterLoggingConfig < 3) {
-    o.driverLogLevels = buildUnnamed569();
+    o.driverLogLevels = buildUnnamed567();
   }
   buildCounterLoggingConfig--;
   return o;
@@ -1026,7 +1026,7 @@
 checkLoggingConfig(api.LoggingConfig o) {
   buildCounterLoggingConfig++;
   if (buildCounterLoggingConfig < 3) {
-    checkUnnamed569(o.driverLogLevels);
+    checkUnnamed567(o.driverLogLevels);
   }
   buildCounterLoggingConfig--;
 }
@@ -1073,7 +1073,7 @@
   buildCounterNodeInitializationAction--;
 }
 
-buildUnnamed570() {
+buildUnnamed568() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1088,7 +1088,7 @@
   return o;
 }
 
-checkUnnamed570(core.Map<core.String, core.Object> o) {
+checkUnnamed568(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));
@@ -1102,7 +1102,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed571() {
+buildUnnamed569() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1117,7 +1117,7 @@
   return o;
 }
 
-checkUnnamed571(core.Map<core.String, core.Object> o) {
+checkUnnamed569(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -1138,9 +1138,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed570();
+    o.metadata = buildUnnamed568();
     o.name = "foo";
-    o.response = buildUnnamed571();
+    o.response = buildUnnamed569();
   }
   buildCounterOperation--;
   return o;
@@ -1151,47 +1151,47 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed570(o.metadata);
+    checkUnnamed568(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed571(o.response);
+    checkUnnamed569(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed572() {
+buildUnnamed570() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed572(core.List<core.String> o) {
+checkUnnamed570(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed573() {
+buildUnnamed571() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed573(core.Map<core.String, core.String> o) {
+checkUnnamed571(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'));
 }
 
-buildUnnamed574() {
+buildUnnamed572() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed574(core.Map<core.String, core.String> o) {
+checkUnnamed572(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'));
@@ -1203,12 +1203,12 @@
   buildCounterPigJob++;
   if (buildCounterPigJob < 3) {
     o.continueOnFailure = true;
-    o.jarFileUris = buildUnnamed572();
+    o.jarFileUris = buildUnnamed570();
     o.loggingConfig = buildLoggingConfig();
-    o.properties = buildUnnamed573();
+    o.properties = buildUnnamed571();
     o.queryFileUri = "foo";
     o.queryList = buildQueryList();
-    o.scriptVariables = buildUnnamed574();
+    o.scriptVariables = buildUnnamed572();
   }
   buildCounterPigJob--;
   return o;
@@ -1218,16 +1218,42 @@
   buildCounterPigJob++;
   if (buildCounterPigJob < 3) {
     unittest.expect(o.continueOnFailure, unittest.isTrue);
-    checkUnnamed572(o.jarFileUris);
+    checkUnnamed570(o.jarFileUris);
     checkLoggingConfig(o.loggingConfig);
-    checkUnnamed573(o.properties);
+    checkUnnamed571(o.properties);
     unittest.expect(o.queryFileUri, unittest.equals('foo'));
     checkQueryList(o.queryList);
-    checkUnnamed574(o.scriptVariables);
+    checkUnnamed572(o.scriptVariables);
   }
   buildCounterPigJob--;
 }
 
+buildUnnamed573() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+buildUnnamed574() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
 buildUnnamed575() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1255,16 +1281,16 @@
 }
 
 buildUnnamed577() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
   return o;
 }
 
-checkUnnamed577(core.List<core.String> o) {
+checkUnnamed577(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
+  unittest.expect(o["x"], unittest.equals('foo'));
+  unittest.expect(o["y"], unittest.equals('foo'));
 }
 
 buildUnnamed578() {
@@ -1280,45 +1306,19 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed579() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
-  return o;
-}
-
-checkUnnamed579(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'));
-}
-
-buildUnnamed580() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return 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'));
-}
-
 core.int buildCounterPySparkJob = 0;
 buildPySparkJob() {
   var o = new api.PySparkJob();
   buildCounterPySparkJob++;
   if (buildCounterPySparkJob < 3) {
-    o.archiveUris = buildUnnamed575();
-    o.args = buildUnnamed576();
-    o.fileUris = buildUnnamed577();
-    o.jarFileUris = buildUnnamed578();
+    o.archiveUris = buildUnnamed573();
+    o.args = buildUnnamed574();
+    o.fileUris = buildUnnamed575();
+    o.jarFileUris = buildUnnamed576();
     o.loggingConfig = buildLoggingConfig();
     o.mainPythonFileUri = "foo";
-    o.properties = buildUnnamed579();
-    o.pythonFileUris = buildUnnamed580();
+    o.properties = buildUnnamed577();
+    o.pythonFileUris = buildUnnamed578();
   }
   buildCounterPySparkJob--;
   return o;
@@ -1327,18 +1327,84 @@
 checkPySparkJob(api.PySparkJob o) {
   buildCounterPySparkJob++;
   if (buildCounterPySparkJob < 3) {
-    checkUnnamed575(o.archiveUris);
-    checkUnnamed576(o.args);
-    checkUnnamed577(o.fileUris);
-    checkUnnamed578(o.jarFileUris);
+    checkUnnamed573(o.archiveUris);
+    checkUnnamed574(o.args);
+    checkUnnamed575(o.fileUris);
+    checkUnnamed576(o.jarFileUris);
     checkLoggingConfig(o.loggingConfig);
     unittest.expect(o.mainPythonFileUri, unittest.equals('foo'));
-    checkUnnamed579(o.properties);
-    checkUnnamed580(o.pythonFileUris);
+    checkUnnamed577(o.properties);
+    checkUnnamed578(o.pythonFileUris);
   }
   buildCounterPySparkJob--;
 }
 
+buildUnnamed579() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+core.int buildCounterQueryList = 0;
+buildQueryList() {
+  var o = new api.QueryList();
+  buildCounterQueryList++;
+  if (buildCounterQueryList < 3) {
+    o.queries = buildUnnamed579();
+  }
+  buildCounterQueryList--;
+  return o;
+}
+
+checkQueryList(api.QueryList o) {
+  buildCounterQueryList++;
+  if (buildCounterQueryList < 3) {
+    checkUnnamed579(o.queries);
+  }
+  buildCounterQueryList--;
+}
+
+buildUnnamed580() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
+  return o;
+}
+
+checkUnnamed580(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'));
+}
+
+core.int buildCounterSoftwareConfig = 0;
+buildSoftwareConfig() {
+  var o = new api.SoftwareConfig();
+  buildCounterSoftwareConfig++;
+  if (buildCounterSoftwareConfig < 3) {
+    o.imageVersion = "foo";
+    o.properties = buildUnnamed580();
+  }
+  buildCounterSoftwareConfig--;
+  return o;
+}
+
+checkSoftwareConfig(api.SoftwareConfig o) {
+  buildCounterSoftwareConfig++;
+  if (buildCounterSoftwareConfig < 3) {
+    unittest.expect(o.imageVersion, unittest.equals('foo'));
+    checkUnnamed580(o.properties);
+  }
+  buildCounterSoftwareConfig--;
+}
+
 buildUnnamed581() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1352,57 +1418,17 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterQueryList = 0;
-buildQueryList() {
-  var o = new api.QueryList();
-  buildCounterQueryList++;
-  if (buildCounterQueryList < 3) {
-    o.queries = buildUnnamed581();
-  }
-  buildCounterQueryList--;
-  return o;
-}
-
-checkQueryList(api.QueryList o) {
-  buildCounterQueryList++;
-  if (buildCounterQueryList < 3) {
-    checkUnnamed581(o.queries);
-  }
-  buildCounterQueryList--;
-}
-
 buildUnnamed582() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
   return o;
 }
 
-checkUnnamed582(core.Map<core.String, core.String> o) {
+checkUnnamed582(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o["x"], unittest.equals('foo'));
-  unittest.expect(o["y"], unittest.equals('foo'));
-}
-
-core.int buildCounterSoftwareConfig = 0;
-buildSoftwareConfig() {
-  var o = new api.SoftwareConfig();
-  buildCounterSoftwareConfig++;
-  if (buildCounterSoftwareConfig < 3) {
-    o.imageVersion = "foo";
-    o.properties = buildUnnamed582();
-  }
-  buildCounterSoftwareConfig--;
-  return o;
-}
-
-checkSoftwareConfig(api.SoftwareConfig o) {
-  buildCounterSoftwareConfig++;
-  if (buildCounterSoftwareConfig < 3) {
-    unittest.expect(o.imageVersion, unittest.equals('foo'));
-    checkUnnamed582(o.properties);
-  }
-  buildCounterSoftwareConfig--;
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
 }
 
 buildUnnamed583() {
@@ -1432,16 +1458,49 @@
 }
 
 buildUnnamed585() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
   return o;
 }
 
-checkUnnamed585(core.List<core.String> o) {
+checkUnnamed585(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
+  unittest.expect(o["x"], unittest.equals('foo'));
+  unittest.expect(o["y"], unittest.equals('foo'));
+}
+
+core.int buildCounterSparkJob = 0;
+buildSparkJob() {
+  var o = new api.SparkJob();
+  buildCounterSparkJob++;
+  if (buildCounterSparkJob < 3) {
+    o.archiveUris = buildUnnamed581();
+    o.args = buildUnnamed582();
+    o.fileUris = buildUnnamed583();
+    o.jarFileUris = buildUnnamed584();
+    o.loggingConfig = buildLoggingConfig();
+    o.mainClass = "foo";
+    o.mainJarFileUri = "foo";
+    o.properties = buildUnnamed585();
+  }
+  buildCounterSparkJob--;
+  return o;
+}
+
+checkSparkJob(api.SparkJob o) {
+  buildCounterSparkJob++;
+  if (buildCounterSparkJob < 3) {
+    checkUnnamed581(o.archiveUris);
+    checkUnnamed582(o.args);
+    checkUnnamed583(o.fileUris);
+    checkUnnamed584(o.jarFileUris);
+    checkLoggingConfig(o.loggingConfig);
+    unittest.expect(o.mainClass, unittest.equals('foo'));
+    unittest.expect(o.mainJarFileUri, unittest.equals('foo'));
+    checkUnnamed585(o.properties);
+  }
+  buildCounterSparkJob--;
 }
 
 buildUnnamed586() {
@@ -1470,73 +1529,14 @@
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-core.int buildCounterSparkJob = 0;
-buildSparkJob() {
-  var o = new api.SparkJob();
-  buildCounterSparkJob++;
-  if (buildCounterSparkJob < 3) {
-    o.archiveUris = buildUnnamed583();
-    o.args = buildUnnamed584();
-    o.fileUris = buildUnnamed585();
-    o.jarFileUris = buildUnnamed586();
-    o.loggingConfig = buildLoggingConfig();
-    o.mainClass = "foo";
-    o.mainJarFileUri = "foo";
-    o.properties = buildUnnamed587();
-  }
-  buildCounterSparkJob--;
-  return o;
-}
-
-checkSparkJob(api.SparkJob o) {
-  buildCounterSparkJob++;
-  if (buildCounterSparkJob < 3) {
-    checkUnnamed583(o.archiveUris);
-    checkUnnamed584(o.args);
-    checkUnnamed585(o.fileUris);
-    checkUnnamed586(o.jarFileUris);
-    checkLoggingConfig(o.loggingConfig);
-    unittest.expect(o.mainClass, unittest.equals('foo'));
-    unittest.expect(o.mainJarFileUri, unittest.equals('foo'));
-    checkUnnamed587(o.properties);
-  }
-  buildCounterSparkJob--;
-}
-
 buildUnnamed588() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return 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'));
-}
-
-buildUnnamed589() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed589(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'));
-}
-
-buildUnnamed590() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
-  return o;
-}
-
-checkUnnamed590(core.Map<core.String, core.String> o) {
+checkUnnamed588(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'));
@@ -1547,12 +1547,12 @@
   var o = new api.SparkSqlJob();
   buildCounterSparkSqlJob++;
   if (buildCounterSparkSqlJob < 3) {
-    o.jarFileUris = buildUnnamed588();
+    o.jarFileUris = buildUnnamed586();
     o.loggingConfig = buildLoggingConfig();
-    o.properties = buildUnnamed589();
+    o.properties = buildUnnamed587();
     o.queryFileUri = "foo";
     o.queryList = buildQueryList();
-    o.scriptVariables = buildUnnamed590();
+    o.scriptVariables = buildUnnamed588();
   }
   buildCounterSparkSqlJob--;
   return o;
@@ -1561,17 +1561,17 @@
 checkSparkSqlJob(api.SparkSqlJob o) {
   buildCounterSparkSqlJob++;
   if (buildCounterSparkSqlJob < 3) {
-    checkUnnamed588(o.jarFileUris);
+    checkUnnamed586(o.jarFileUris);
     checkLoggingConfig(o.loggingConfig);
-    checkUnnamed589(o.properties);
+    checkUnnamed587(o.properties);
     unittest.expect(o.queryFileUri, unittest.equals('foo'));
     checkQueryList(o.queryList);
-    checkUnnamed590(o.scriptVariables);
+    checkUnnamed588(o.scriptVariables);
   }
   buildCounterSparkSqlJob--;
 }
 
-buildUnnamed591() {
+buildUnnamed589() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1586,7 +1586,7 @@
   return o;
 }
 
-checkUnnamed591(core.Map<core.String, core.Object> o) {
+checkUnnamed589(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -1600,17 +1600,17 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed592() {
+buildUnnamed590() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed591());
-  o.add(buildUnnamed591());
+  o.add(buildUnnamed589());
+  o.add(buildUnnamed589());
   return o;
 }
 
-checkUnnamed592(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed590(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed591(o[0]);
-  checkUnnamed591(o[1]);
+  checkUnnamed589(o[0]);
+  checkUnnamed589(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1619,7 +1619,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed592();
+    o.details = buildUnnamed590();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1630,7 +1630,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed592(o.details);
+    checkUnnamed590(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -2292,9 +2292,9 @@
           new api.DataprocApi(mock).projects.regions.clusters;
       var arg_projectId = "foo";
       var arg_region = "foo";
+      var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_filter = "foo";
-      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2344,11 +2344,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2359,9 +2359,9 @@
       }), true);
       res
           .list(arg_projectId, arg_region,
+              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
               filter: arg_filter,
-              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListClustersResponse response) {
         checkListClustersResponse(response);
@@ -2376,6 +2376,7 @@
       var arg_projectId = "foo";
       var arg_region = "foo";
       var arg_clusterName = "foo";
+      var arg_gracefulDecommissionTimeout = "foo";
       var arg_updateMask = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2432,6 +2433,8 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["gracefulDecommissionTimeout"].first,
+            unittest.equals(arg_gracefulDecommissionTimeout));
         unittest.expect(
             queryMap["updateMask"].first, unittest.equals(arg_updateMask));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
@@ -2444,7 +2447,9 @@
       }), true);
       res
           .patch(arg_request, arg_projectId, arg_region, arg_clusterName,
-              updateMask: arg_updateMask, $fields: arg_$fields)
+              gracefulDecommissionTimeout: arg_gracefulDecommissionTimeout,
+              updateMask: arg_updateMask,
+              $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
diff --git a/generated/googleapis/test/datastore/v1_test.dart b/generated/googleapis/test/datastore/v1_test.dart
index e80ea23..10af8fa 100644
--- a/generated/googleapis/test/datastore/v1_test.dart
+++ b/generated/googleapis/test/datastore/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed660() {
+buildUnnamed658() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed660(core.List<api.Key> o) {
+checkUnnamed658(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -68,7 +68,7 @@
   var o = new api.AllocateIdsRequest();
   buildCounterAllocateIdsRequest++;
   if (buildCounterAllocateIdsRequest < 3) {
-    o.keys = buildUnnamed660();
+    o.keys = buildUnnamed658();
   }
   buildCounterAllocateIdsRequest--;
   return o;
@@ -77,19 +77,19 @@
 checkAllocateIdsRequest(api.AllocateIdsRequest o) {
   buildCounterAllocateIdsRequest++;
   if (buildCounterAllocateIdsRequest < 3) {
-    checkUnnamed660(o.keys);
+    checkUnnamed658(o.keys);
   }
   buildCounterAllocateIdsRequest--;
 }
 
-buildUnnamed661() {
+buildUnnamed659() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed661(core.List<api.Key> o) {
+checkUnnamed659(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -100,7 +100,7 @@
   var o = new api.AllocateIdsResponse();
   buildCounterAllocateIdsResponse++;
   if (buildCounterAllocateIdsResponse < 3) {
-    o.keys = buildUnnamed661();
+    o.keys = buildUnnamed659();
   }
   buildCounterAllocateIdsResponse--;
   return o;
@@ -109,19 +109,19 @@
 checkAllocateIdsResponse(api.AllocateIdsResponse o) {
   buildCounterAllocateIdsResponse++;
   if (buildCounterAllocateIdsResponse < 3) {
-    checkUnnamed661(o.keys);
+    checkUnnamed659(o.keys);
   }
   buildCounterAllocateIdsResponse--;
 }
 
-buildUnnamed662() {
+buildUnnamed660() {
   var o = new core.List<api.Value>();
   o.add(buildValue());
   o.add(buildValue());
   return o;
 }
 
-checkUnnamed662(core.List<api.Value> o) {
+checkUnnamed660(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o[0]);
   checkValue(o[1]);
@@ -132,7 +132,7 @@
   var o = new api.ArrayValue();
   buildCounterArrayValue++;
   if (buildCounterArrayValue < 3) {
-    o.values = buildUnnamed662();
+    o.values = buildUnnamed660();
   }
   buildCounterArrayValue--;
   return o;
@@ -141,7 +141,7 @@
 checkArrayValue(api.ArrayValue o) {
   buildCounterArrayValue++;
   if (buildCounterArrayValue < 3) {
-    checkUnnamed662(o.values);
+    checkUnnamed660(o.values);
   }
   buildCounterArrayValue--;
 }
@@ -184,14 +184,14 @@
   buildCounterBeginTransactionResponse--;
 }
 
-buildUnnamed663() {
+buildUnnamed661() {
   var o = new core.List<api.Mutation>();
   o.add(buildMutation());
   o.add(buildMutation());
   return o;
 }
 
-checkUnnamed663(core.List<api.Mutation> o) {
+checkUnnamed661(core.List<api.Mutation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMutation(o[0]);
   checkMutation(o[1]);
@@ -203,7 +203,7 @@
   buildCounterCommitRequest++;
   if (buildCounterCommitRequest < 3) {
     o.mode = "foo";
-    o.mutations = buildUnnamed663();
+    o.mutations = buildUnnamed661();
     o.transaction = "foo";
   }
   buildCounterCommitRequest--;
@@ -214,20 +214,20 @@
   buildCounterCommitRequest++;
   if (buildCounterCommitRequest < 3) {
     unittest.expect(o.mode, unittest.equals('foo'));
-    checkUnnamed663(o.mutations);
+    checkUnnamed661(o.mutations);
     unittest.expect(o.transaction, unittest.equals('foo'));
   }
   buildCounterCommitRequest--;
 }
 
-buildUnnamed664() {
+buildUnnamed662() {
   var o = new core.List<api.MutationResult>();
   o.add(buildMutationResult());
   o.add(buildMutationResult());
   return o;
 }
 
-checkUnnamed664(core.List<api.MutationResult> o) {
+checkUnnamed662(core.List<api.MutationResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMutationResult(o[0]);
   checkMutationResult(o[1]);
@@ -239,7 +239,7 @@
   buildCounterCommitResponse++;
   if (buildCounterCommitResponse < 3) {
     o.indexUpdates = 42;
-    o.mutationResults = buildUnnamed664();
+    o.mutationResults = buildUnnamed662();
   }
   buildCounterCommitResponse--;
   return o;
@@ -249,19 +249,19 @@
   buildCounterCommitResponse++;
   if (buildCounterCommitResponse < 3) {
     unittest.expect(o.indexUpdates, unittest.equals(42));
-    checkUnnamed664(o.mutationResults);
+    checkUnnamed662(o.mutationResults);
   }
   buildCounterCommitResponse--;
 }
 
-buildUnnamed665() {
+buildUnnamed663() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed665(core.List<api.Filter> o) {
+checkUnnamed663(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -272,7 +272,7 @@
   var o = new api.CompositeFilter();
   buildCounterCompositeFilter++;
   if (buildCounterCompositeFilter < 3) {
-    o.filters = buildUnnamed665();
+    o.filters = buildUnnamed663();
     o.op = "foo";
   }
   buildCounterCompositeFilter--;
@@ -282,7 +282,7 @@
 checkCompositeFilter(api.CompositeFilter o) {
   buildCounterCompositeFilter++;
   if (buildCounterCompositeFilter < 3) {
-    checkUnnamed665(o.filters);
+    checkUnnamed663(o.filters);
     unittest.expect(o.op, unittest.equals('foo'));
   }
   buildCounterCompositeFilter--;
@@ -303,14 +303,14 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed666() {
+buildUnnamed664() {
   var o = new core.Map<core.String, api.Value>();
   o["x"] = buildValue();
   o["y"] = buildValue();
   return o;
 }
 
-checkUnnamed666(core.Map<core.String, api.Value> o) {
+checkUnnamed664(core.Map<core.String, api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o["x"]);
   checkValue(o["y"]);
@@ -322,7 +322,7 @@
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
     o.key = buildKey();
-    o.properties = buildUnnamed666();
+    o.properties = buildUnnamed664();
   }
   buildCounterEntity--;
   return o;
@@ -332,7 +332,7 @@
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
     checkKey(o.key);
-    checkUnnamed666(o.properties);
+    checkUnnamed664(o.properties);
   }
   buildCounterEntity--;
 }
@@ -381,14 +381,14 @@
   buildCounterFilter--;
 }
 
-buildUnnamed667() {
+buildUnnamed665() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed667(core.Map<core.String, core.String> o) {
+checkUnnamed665(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'));
@@ -400,7 +400,7 @@
   buildCounterGoogleDatastoreAdminV1beta1CommonMetadata++;
   if (buildCounterGoogleDatastoreAdminV1beta1CommonMetadata < 3) {
     o.endTime = "foo";
-    o.labels = buildUnnamed667();
+    o.labels = buildUnnamed665();
     o.operationType = "foo";
     o.startTime = "foo";
     o.state = "foo";
@@ -414,7 +414,7 @@
   buildCounterGoogleDatastoreAdminV1beta1CommonMetadata++;
   if (buildCounterGoogleDatastoreAdminV1beta1CommonMetadata < 3) {
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkUnnamed667(o.labels);
+    checkUnnamed665(o.labels);
     unittest.expect(o.operationType, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -422,27 +422,27 @@
   buildCounterGoogleDatastoreAdminV1beta1CommonMetadata--;
 }
 
-buildUnnamed668() {
+buildUnnamed666() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed668(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'));
 }
 
-buildUnnamed669() {
+buildUnnamed667() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed669(core.List<core.String> o) {
+checkUnnamed667(core.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,8 +453,8 @@
   var o = new api.GoogleDatastoreAdminV1beta1EntityFilter();
   buildCounterGoogleDatastoreAdminV1beta1EntityFilter++;
   if (buildCounterGoogleDatastoreAdminV1beta1EntityFilter < 3) {
-    o.kinds = buildUnnamed668();
-    o.namespaceIds = buildUnnamed669();
+    o.kinds = buildUnnamed666();
+    o.namespaceIds = buildUnnamed667();
   }
   buildCounterGoogleDatastoreAdminV1beta1EntityFilter--;
   return o;
@@ -464,8 +464,8 @@
     api.GoogleDatastoreAdminV1beta1EntityFilter o) {
   buildCounterGoogleDatastoreAdminV1beta1EntityFilter++;
   if (buildCounterGoogleDatastoreAdminV1beta1EntityFilter < 3) {
-    checkUnnamed668(o.kinds);
-    checkUnnamed669(o.namespaceIds);
+    checkUnnamed666(o.kinds);
+    checkUnnamed667(o.namespaceIds);
   }
   buildCounterGoogleDatastoreAdminV1beta1EntityFilter--;
 }
@@ -568,14 +568,14 @@
   buildCounterGoogleDatastoreAdminV1beta1Progress--;
 }
 
-buildUnnamed670() {
+buildUnnamed668() {
   var o = new core.List<api.GoogleLongrunningOperation>();
   o.add(buildGoogleLongrunningOperation());
   o.add(buildGoogleLongrunningOperation());
   return o;
 }
 
-checkUnnamed670(core.List<api.GoogleLongrunningOperation> o) {
+checkUnnamed668(core.List<api.GoogleLongrunningOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleLongrunningOperation(o[0]);
   checkGoogleLongrunningOperation(o[1]);
@@ -587,7 +587,7 @@
   buildCounterGoogleLongrunningListOperationsResponse++;
   if (buildCounterGoogleLongrunningListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed670();
+    o.operations = buildUnnamed668();
   }
   buildCounterGoogleLongrunningListOperationsResponse--;
   return o;
@@ -598,12 +598,12 @@
   buildCounterGoogleLongrunningListOperationsResponse++;
   if (buildCounterGoogleLongrunningListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed670(o.operations);
+    checkUnnamed668(o.operations);
   }
   buildCounterGoogleLongrunningListOperationsResponse--;
 }
 
-buildUnnamed671() {
+buildUnnamed669() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -618,7 +618,7 @@
   return o;
 }
 
-checkUnnamed671(core.Map<core.String, core.Object> o) {
+checkUnnamed669(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));
@@ -632,7 +632,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed672() {
+buildUnnamed670() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -647,7 +647,7 @@
   return o;
 }
 
-checkUnnamed672(core.Map<core.String, core.Object> o) {
+checkUnnamed670(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -668,9 +668,9 @@
   if (buildCounterGoogleLongrunningOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed671();
+    o.metadata = buildUnnamed669();
     o.name = "foo";
-    o.response = buildUnnamed672();
+    o.response = buildUnnamed670();
   }
   buildCounterGoogleLongrunningOperation--;
   return o;
@@ -681,34 +681,34 @@
   if (buildCounterGoogleLongrunningOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed671(o.metadata);
+    checkUnnamed669(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed672(o.response);
+    checkUnnamed670(o.response);
   }
   buildCounterGoogleLongrunningOperation--;
 }
 
-buildUnnamed673() {
+buildUnnamed671() {
   var o = new core.Map<core.String, api.GqlQueryParameter>();
   o["x"] = buildGqlQueryParameter();
   o["y"] = buildGqlQueryParameter();
   return o;
 }
 
-checkUnnamed673(core.Map<core.String, api.GqlQueryParameter> o) {
+checkUnnamed671(core.Map<core.String, api.GqlQueryParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGqlQueryParameter(o["x"]);
   checkGqlQueryParameter(o["y"]);
 }
 
-buildUnnamed674() {
+buildUnnamed672() {
   var o = new core.List<api.GqlQueryParameter>();
   o.add(buildGqlQueryParameter());
   o.add(buildGqlQueryParameter());
   return o;
 }
 
-checkUnnamed674(core.List<api.GqlQueryParameter> o) {
+checkUnnamed672(core.List<api.GqlQueryParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGqlQueryParameter(o[0]);
   checkGqlQueryParameter(o[1]);
@@ -720,8 +720,8 @@
   buildCounterGqlQuery++;
   if (buildCounterGqlQuery < 3) {
     o.allowLiterals = true;
-    o.namedBindings = buildUnnamed673();
-    o.positionalBindings = buildUnnamed674();
+    o.namedBindings = buildUnnamed671();
+    o.positionalBindings = buildUnnamed672();
     o.queryString = "foo";
   }
   buildCounterGqlQuery--;
@@ -732,8 +732,8 @@
   buildCounterGqlQuery++;
   if (buildCounterGqlQuery < 3) {
     unittest.expect(o.allowLiterals, unittest.isTrue);
-    checkUnnamed673(o.namedBindings);
-    checkUnnamed674(o.positionalBindings);
+    checkUnnamed671(o.namedBindings);
+    checkUnnamed672(o.positionalBindings);
     unittest.expect(o.queryString, unittest.equals('foo'));
   }
   buildCounterGqlQuery--;
@@ -760,14 +760,14 @@
   buildCounterGqlQueryParameter--;
 }
 
-buildUnnamed675() {
+buildUnnamed673() {
   var o = new core.List<api.PathElement>();
   o.add(buildPathElement());
   o.add(buildPathElement());
   return o;
 }
 
-checkUnnamed675(core.List<api.PathElement> o) {
+checkUnnamed673(core.List<api.PathElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathElement(o[0]);
   checkPathElement(o[1]);
@@ -779,7 +779,7 @@
   buildCounterKey++;
   if (buildCounterKey < 3) {
     o.partitionId = buildPartitionId();
-    o.path = buildUnnamed675();
+    o.path = buildUnnamed673();
   }
   buildCounterKey--;
   return o;
@@ -789,7 +789,7 @@
   buildCounterKey++;
   if (buildCounterKey < 3) {
     checkPartitionId(o.partitionId);
-    checkUnnamed675(o.path);
+    checkUnnamed673(o.path);
   }
   buildCounterKey--;
 }
@@ -834,14 +834,14 @@
   buildCounterLatLng--;
 }
 
-buildUnnamed676() {
+buildUnnamed674() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed676(core.List<api.Key> o) {
+checkUnnamed674(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -852,7 +852,7 @@
   var o = new api.LookupRequest();
   buildCounterLookupRequest++;
   if (buildCounterLookupRequest < 3) {
-    o.keys = buildUnnamed676();
+    o.keys = buildUnnamed674();
     o.readOptions = buildReadOptions();
   }
   buildCounterLookupRequest--;
@@ -862,46 +862,46 @@
 checkLookupRequest(api.LookupRequest o) {
   buildCounterLookupRequest++;
   if (buildCounterLookupRequest < 3) {
-    checkUnnamed676(o.keys);
+    checkUnnamed674(o.keys);
     checkReadOptions(o.readOptions);
   }
   buildCounterLookupRequest--;
 }
 
-buildUnnamed677() {
+buildUnnamed675() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed677(core.List<api.Key> o) {
+checkUnnamed675(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
 }
 
-buildUnnamed678() {
+buildUnnamed676() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed678(core.List<api.EntityResult> o) {
+checkUnnamed676(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
 }
 
-buildUnnamed679() {
+buildUnnamed677() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed679(core.List<api.EntityResult> o) {
+checkUnnamed677(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
@@ -912,9 +912,9 @@
   var o = new api.LookupResponse();
   buildCounterLookupResponse++;
   if (buildCounterLookupResponse < 3) {
-    o.deferred = buildUnnamed677();
-    o.found = buildUnnamed678();
-    o.missing = buildUnnamed679();
+    o.deferred = buildUnnamed675();
+    o.found = buildUnnamed676();
+    o.missing = buildUnnamed677();
   }
   buildCounterLookupResponse--;
   return o;
@@ -923,9 +923,9 @@
 checkLookupResponse(api.LookupResponse o) {
   buildCounterLookupResponse++;
   if (buildCounterLookupResponse < 3) {
-    checkUnnamed677(o.deferred);
-    checkUnnamed678(o.found);
-    checkUnnamed679(o.missing);
+    checkUnnamed675(o.deferred);
+    checkUnnamed676(o.found);
+    checkUnnamed677(o.missing);
   }
   buildCounterLookupResponse--;
 }
@@ -1106,53 +1106,53 @@
   buildCounterPropertyReference--;
 }
 
-buildUnnamed680() {
+buildUnnamed678() {
   var o = new core.List<api.PropertyReference>();
   o.add(buildPropertyReference());
   o.add(buildPropertyReference());
   return o;
 }
 
-checkUnnamed680(core.List<api.PropertyReference> o) {
+checkUnnamed678(core.List<api.PropertyReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyReference(o[0]);
   checkPropertyReference(o[1]);
 }
 
-buildUnnamed681() {
+buildUnnamed679() {
   var o = new core.List<api.KindExpression>();
   o.add(buildKindExpression());
   o.add(buildKindExpression());
   return o;
 }
 
-checkUnnamed681(core.List<api.KindExpression> o) {
+checkUnnamed679(core.List<api.KindExpression> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKindExpression(o[0]);
   checkKindExpression(o[1]);
 }
 
-buildUnnamed682() {
+buildUnnamed680() {
   var o = new core.List<api.PropertyOrder>();
   o.add(buildPropertyOrder());
   o.add(buildPropertyOrder());
   return o;
 }
 
-checkUnnamed682(core.List<api.PropertyOrder> o) {
+checkUnnamed680(core.List<api.PropertyOrder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyOrder(o[0]);
   checkPropertyOrder(o[1]);
 }
 
-buildUnnamed683() {
+buildUnnamed681() {
   var o = new core.List<api.Projection>();
   o.add(buildProjection());
   o.add(buildProjection());
   return o;
 }
 
-checkUnnamed683(core.List<api.Projection> o) {
+checkUnnamed681(core.List<api.Projection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProjection(o[0]);
   checkProjection(o[1]);
@@ -1163,14 +1163,14 @@
   var o = new api.Query();
   buildCounterQuery++;
   if (buildCounterQuery < 3) {
-    o.distinctOn = buildUnnamed680();
+    o.distinctOn = buildUnnamed678();
     o.endCursor = "foo";
     o.filter = buildFilter();
-    o.kind = buildUnnamed681();
+    o.kind = buildUnnamed679();
     o.limit = 42;
     o.offset = 42;
-    o.order = buildUnnamed682();
-    o.projection = buildUnnamed683();
+    o.order = buildUnnamed680();
+    o.projection = buildUnnamed681();
     o.startCursor = "foo";
   }
   buildCounterQuery--;
@@ -1180,27 +1180,27 @@
 checkQuery(api.Query o) {
   buildCounterQuery++;
   if (buildCounterQuery < 3) {
-    checkUnnamed680(o.distinctOn);
+    checkUnnamed678(o.distinctOn);
     unittest.expect(o.endCursor, unittest.equals('foo'));
     checkFilter(o.filter);
-    checkUnnamed681(o.kind);
+    checkUnnamed679(o.kind);
     unittest.expect(o.limit, unittest.equals(42));
     unittest.expect(o.offset, unittest.equals(42));
-    checkUnnamed682(o.order);
-    checkUnnamed683(o.projection);
+    checkUnnamed680(o.order);
+    checkUnnamed681(o.projection);
     unittest.expect(o.startCursor, unittest.equals('foo'));
   }
   buildCounterQuery--;
 }
 
-buildUnnamed684() {
+buildUnnamed682() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed684(core.List<api.EntityResult> o) {
+checkUnnamed682(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
@@ -1213,7 +1213,7 @@
   if (buildCounterQueryResultBatch < 3) {
     o.endCursor = "foo";
     o.entityResultType = "foo";
-    o.entityResults = buildUnnamed684();
+    o.entityResults = buildUnnamed682();
     o.moreResults = "foo";
     o.skippedCursor = "foo";
     o.skippedResults = 42;
@@ -1228,7 +1228,7 @@
   if (buildCounterQueryResultBatch < 3) {
     unittest.expect(o.endCursor, unittest.equals('foo'));
     unittest.expect(o.entityResultType, unittest.equals('foo'));
-    checkUnnamed684(o.entityResults);
+    checkUnnamed682(o.entityResults);
     unittest.expect(o.moreResults, unittest.equals('foo'));
     unittest.expect(o.skippedCursor, unittest.equals('foo'));
     unittest.expect(o.skippedResults, unittest.equals(42));
@@ -1292,14 +1292,14 @@
   buildCounterReadWrite--;
 }
 
-buildUnnamed685() {
+buildUnnamed683() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed685(core.List<api.Key> o) {
+checkUnnamed683(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -1311,7 +1311,7 @@
   buildCounterReserveIdsRequest++;
   if (buildCounterReserveIdsRequest < 3) {
     o.databaseId = "foo";
-    o.keys = buildUnnamed685();
+    o.keys = buildUnnamed683();
   }
   buildCounterReserveIdsRequest--;
   return o;
@@ -1321,7 +1321,7 @@
   buildCounterReserveIdsRequest++;
   if (buildCounterReserveIdsRequest < 3) {
     unittest.expect(o.databaseId, unittest.equals('foo'));
-    checkUnnamed685(o.keys);
+    checkUnnamed683(o.keys);
   }
   buildCounterReserveIdsRequest--;
 }
@@ -1421,7 +1421,7 @@
   buildCounterRunQueryResponse--;
 }
 
-buildUnnamed686() {
+buildUnnamed684() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1436,7 +1436,7 @@
   return o;
 }
 
-checkUnnamed686(core.Map<core.String, core.Object> o) {
+checkUnnamed684(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -1450,17 +1450,17 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed687() {
+buildUnnamed685() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed686());
-  o.add(buildUnnamed686());
+  o.add(buildUnnamed684());
+  o.add(buildUnnamed684());
   return o;
 }
 
-checkUnnamed687(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed685(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed686(o[0]);
-  checkUnnamed686(o[1]);
+  checkUnnamed684(o[0]);
+  checkUnnamed684(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1469,7 +1469,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed687();
+    o.details = buildUnnamed685();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1480,7 +1480,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed687(o.details);
+    checkUnnamed685(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
diff --git a/generated/googleapis/test/deploymentmanager/v2_test.dart b/generated/googleapis/test/deploymentmanager/v2_test.dart
index 1233b09..9df40ba 100644
--- a/generated/googleapis/test/deploymentmanager/v2_test.dart
+++ b/generated/googleapis/test/deploymentmanager/v2_test.dart
@@ -50,27 +50,27 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed2266() {
+buildUnnamed2291() {
   var o = new core.List<api.AuditLogConfig>();
   o.add(buildAuditLogConfig());
   o.add(buildAuditLogConfig());
   return o;
 }
 
-checkUnnamed2266(core.List<api.AuditLogConfig> o) {
+checkUnnamed2291(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditLogConfig(o[0]);
   checkAuditLogConfig(o[1]);
 }
 
-buildUnnamed2267() {
+buildUnnamed2292() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2267(core.List<core.String> o) {
+checkUnnamed2292(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -81,8 +81,8 @@
   var o = new api.AuditConfig();
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed2266();
-    o.exemptedMembers = buildUnnamed2267();
+    o.auditLogConfigs = buildUnnamed2291();
+    o.exemptedMembers = buildUnnamed2292();
     o.service = "foo";
   }
   buildCounterAuditConfig--;
@@ -92,21 +92,21 @@
 checkAuditConfig(api.AuditConfig o) {
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    checkUnnamed2266(o.auditLogConfigs);
-    checkUnnamed2267(o.exemptedMembers);
+    checkUnnamed2291(o.auditLogConfigs);
+    checkUnnamed2292(o.exemptedMembers);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterAuditConfig--;
 }
 
-buildUnnamed2268() {
+buildUnnamed2293() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2268(core.List<core.String> o) {
+checkUnnamed2293(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -117,7 +117,7 @@
   var o = new api.AuditLogConfig();
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed2268();
+    o.exemptedMembers = buildUnnamed2293();
     o.logType = "foo";
   }
   buildCounterAuditLogConfig--;
@@ -127,7 +127,7 @@
 checkAuditLogConfig(api.AuditLogConfig o) {
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed2268(o.exemptedMembers);
+    checkUnnamed2293(o.exemptedMembers);
     unittest.expect(o.logType, unittest.equals('foo'));
   }
   buildCounterAuditLogConfig--;
@@ -152,14 +152,14 @@
   buildCounterAuthorizationLoggingOptions--;
 }
 
-buildUnnamed2269() {
+buildUnnamed2294() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2269(core.List<core.String> o) {
+checkUnnamed2294(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -171,7 +171,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     o.condition = buildExpr();
-    o.members = buildUnnamed2269();
+    o.members = buildUnnamed2294();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -182,20 +182,20 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     checkExpr(o.condition);
-    checkUnnamed2269(o.members);
+    checkUnnamed2294(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
 }
 
-buildUnnamed2270() {
+buildUnnamed2295() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2270(core.List<core.String> o) {
+checkUnnamed2295(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -211,7 +211,7 @@
     o.svc = "foo";
     o.sys = "foo";
     o.value = "foo";
-    o.values = buildUnnamed2270();
+    o.values = buildUnnamed2295();
   }
   buildCounterCondition--;
   return o;
@@ -225,7 +225,7 @@
     unittest.expect(o.svc, unittest.equals('foo'));
     unittest.expect(o.sys, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
-    checkUnnamed2270(o.values);
+    checkUnnamed2295(o.values);
   }
   buildCounterCondition--;
 }
@@ -249,14 +249,14 @@
   buildCounterConfigFile--;
 }
 
-buildUnnamed2271() {
+buildUnnamed2296() {
   var o = new core.List<api.DeploymentLabelEntry>();
   o.add(buildDeploymentLabelEntry());
   o.add(buildDeploymentLabelEntry());
   return o;
 }
 
-checkUnnamed2271(core.List<api.DeploymentLabelEntry> o) {
+checkUnnamed2296(core.List<api.DeploymentLabelEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeploymentLabelEntry(o[0]);
   checkDeploymentLabelEntry(o[1]);
@@ -271,7 +271,7 @@
     o.fingerprint = "foo";
     o.id = "foo";
     o.insertTime = "foo";
-    o.labels = buildUnnamed2271();
+    o.labels = buildUnnamed2296();
     o.manifest = "foo";
     o.name = "foo";
     o.operation = buildOperation();
@@ -290,7 +290,7 @@
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.insertTime, unittest.equals('foo'));
-    checkUnnamed2271(o.labels);
+    checkUnnamed2296(o.labels);
     unittest.expect(o.manifest, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkOperation(o.operation);
@@ -322,14 +322,14 @@
   buildCounterDeploymentLabelEntry--;
 }
 
-buildUnnamed2272() {
+buildUnnamed2297() {
   var o = new core.List<api.DeploymentUpdateLabelEntry>();
   o.add(buildDeploymentUpdateLabelEntry());
   o.add(buildDeploymentUpdateLabelEntry());
   return o;
 }
 
-checkUnnamed2272(core.List<api.DeploymentUpdateLabelEntry> o) {
+checkUnnamed2297(core.List<api.DeploymentUpdateLabelEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeploymentUpdateLabelEntry(o[0]);
   checkDeploymentUpdateLabelEntry(o[1]);
@@ -341,7 +341,7 @@
   buildCounterDeploymentUpdate++;
   if (buildCounterDeploymentUpdate < 3) {
     o.description = "foo";
-    o.labels = buildUnnamed2272();
+    o.labels = buildUnnamed2297();
     o.manifest = "foo";
   }
   buildCounterDeploymentUpdate--;
@@ -352,7 +352,7 @@
   buildCounterDeploymentUpdate++;
   if (buildCounterDeploymentUpdate < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2272(o.labels);
+    checkUnnamed2297(o.labels);
     unittest.expect(o.manifest, unittest.equals('foo'));
   }
   buildCounterDeploymentUpdate--;
@@ -398,14 +398,14 @@
   buildCounterDeploymentsCancelPreviewRequest--;
 }
 
-buildUnnamed2273() {
+buildUnnamed2298() {
   var o = new core.List<api.Deployment>();
   o.add(buildDeployment());
   o.add(buildDeployment());
   return o;
 }
 
-checkUnnamed2273(core.List<api.Deployment> o) {
+checkUnnamed2298(core.List<api.Deployment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeployment(o[0]);
   checkDeployment(o[1]);
@@ -416,7 +416,7 @@
   var o = new api.DeploymentsListResponse();
   buildCounterDeploymentsListResponse++;
   if (buildCounterDeploymentsListResponse < 3) {
-    o.deployments = buildUnnamed2273();
+    o.deployments = buildUnnamed2298();
     o.nextPageToken = "foo";
   }
   buildCounterDeploymentsListResponse--;
@@ -426,7 +426,7 @@
 checkDeploymentsListResponse(api.DeploymentsListResponse o) {
   buildCounterDeploymentsListResponse++;
   if (buildCounterDeploymentsListResponse < 3) {
-    checkUnnamed2273(o.deployments);
+    checkUnnamed2298(o.deployments);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterDeploymentsListResponse--;
@@ -581,14 +581,14 @@
   buildCounterLogConfigDataAccessOptions--;
 }
 
-buildUnnamed2274() {
+buildUnnamed2299() {
   var o = new core.List<api.ImportFile>();
   o.add(buildImportFile());
   o.add(buildImportFile());
   return o;
 }
 
-checkUnnamed2274(core.List<api.ImportFile> o) {
+checkUnnamed2299(core.List<api.ImportFile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImportFile(o[0]);
   checkImportFile(o[1]);
@@ -602,7 +602,7 @@
     o.config = buildConfigFile();
     o.expandedConfig = "foo";
     o.id = "foo";
-    o.imports = buildUnnamed2274();
+    o.imports = buildUnnamed2299();
     o.insertTime = "foo";
     o.layout = "foo";
     o.name = "foo";
@@ -618,7 +618,7 @@
     checkConfigFile(o.config);
     unittest.expect(o.expandedConfig, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2274(o.imports);
+    checkUnnamed2299(o.imports);
     unittest.expect(o.insertTime, unittest.equals('foo'));
     unittest.expect(o.layout, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -627,14 +627,14 @@
   buildCounterManifest--;
 }
 
-buildUnnamed2275() {
+buildUnnamed2300() {
   var o = new core.List<api.Manifest>();
   o.add(buildManifest());
   o.add(buildManifest());
   return o;
 }
 
-checkUnnamed2275(core.List<api.Manifest> o) {
+checkUnnamed2300(core.List<api.Manifest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManifest(o[0]);
   checkManifest(o[1]);
@@ -645,7 +645,7 @@
   var o = new api.ManifestsListResponse();
   buildCounterManifestsListResponse++;
   if (buildCounterManifestsListResponse < 3) {
-    o.manifests = buildUnnamed2275();
+    o.manifests = buildUnnamed2300();
     o.nextPageToken = "foo";
   }
   buildCounterManifestsListResponse--;
@@ -655,7 +655,7 @@
 checkManifestsListResponse(api.ManifestsListResponse o) {
   buildCounterManifestsListResponse++;
   if (buildCounterManifestsListResponse < 3) {
-    checkUnnamed2275(o.manifests);
+    checkUnnamed2300(o.manifests);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterManifestsListResponse--;
@@ -684,14 +684,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed2276() {
+buildUnnamed2301() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed2276(core.List<api.OperationErrorErrors> o) {
+checkUnnamed2301(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -702,7 +702,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed2276();
+    o.errors = buildUnnamed2301();
   }
   buildCounterOperationError--;
   return o;
@@ -711,7 +711,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed2276(o.errors);
+    checkUnnamed2301(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -737,14 +737,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed2277() {
+buildUnnamed2302() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed2277(core.List<api.OperationWarningsData> o) {
+checkUnnamed2302(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -756,7 +756,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2277();
+    o.data = buildUnnamed2302();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -767,20 +767,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2277(o.data);
+    checkUnnamed2302(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed2278() {
+buildUnnamed2303() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed2278(core.List<api.OperationWarnings> o) {
+checkUnnamed2303(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -812,7 +812,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed2278();
+    o.warnings = buildUnnamed2303();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -843,20 +843,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed2278(o.warnings);
+    checkUnnamed2303(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed2279() {
+buildUnnamed2304() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed2279(core.List<api.Operation> o) {
+checkUnnamed2304(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -868,7 +868,7 @@
   buildCounterOperationsListResponse++;
   if (buildCounterOperationsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed2279();
+    o.operations = buildUnnamed2304();
   }
   buildCounterOperationsListResponse--;
   return o;
@@ -878,45 +878,45 @@
   buildCounterOperationsListResponse++;
   if (buildCounterOperationsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2279(o.operations);
+    checkUnnamed2304(o.operations);
   }
   buildCounterOperationsListResponse--;
 }
 
-buildUnnamed2280() {
+buildUnnamed2305() {
   var o = new core.List<api.AuditConfig>();
   o.add(buildAuditConfig());
   o.add(buildAuditConfig());
   return o;
 }
 
-checkUnnamed2280(core.List<api.AuditConfig> o) {
+checkUnnamed2305(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditConfig(o[0]);
   checkAuditConfig(o[1]);
 }
 
-buildUnnamed2281() {
+buildUnnamed2306() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed2281(core.List<api.Binding> o) {
+checkUnnamed2306(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
 }
 
-buildUnnamed2282() {
+buildUnnamed2307() {
   var o = new core.List<api.Rule>();
   o.add(buildRule());
   o.add(buildRule());
   return o;
 }
 
-checkUnnamed2282(core.List<api.Rule> o) {
+checkUnnamed2307(core.List<api.Rule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRule(o[0]);
   checkRule(o[1]);
@@ -927,11 +927,11 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed2280();
-    o.bindings = buildUnnamed2281();
+    o.auditConfigs = buildUnnamed2305();
+    o.bindings = buildUnnamed2306();
     o.etag = "foo";
     o.iamOwned = true;
-    o.rules = buildUnnamed2282();
+    o.rules = buildUnnamed2307();
     o.version = 42;
   }
   buildCounterPolicy--;
@@ -941,11 +941,11 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed2280(o.auditConfigs);
-    checkUnnamed2281(o.bindings);
+    checkUnnamed2305(o.auditConfigs);
+    checkUnnamed2306(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.iamOwned, unittest.isTrue);
-    checkUnnamed2282(o.rules);
+    checkUnnamed2307(o.rules);
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterPolicy--;
@@ -972,14 +972,14 @@
   buildCounterResourceWarningsData--;
 }
 
-buildUnnamed2283() {
+buildUnnamed2308() {
   var o = new core.List<api.ResourceWarningsData>();
   o.add(buildResourceWarningsData());
   o.add(buildResourceWarningsData());
   return o;
 }
 
-checkUnnamed2283(core.List<api.ResourceWarningsData> o) {
+checkUnnamed2308(core.List<api.ResourceWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceWarningsData(o[0]);
   checkResourceWarningsData(o[1]);
@@ -991,7 +991,7 @@
   buildCounterResourceWarnings++;
   if (buildCounterResourceWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2283();
+    o.data = buildUnnamed2308();
     o.message = "foo";
   }
   buildCounterResourceWarnings--;
@@ -1002,20 +1002,20 @@
   buildCounterResourceWarnings++;
   if (buildCounterResourceWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2283(o.data);
+    checkUnnamed2308(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterResourceWarnings--;
 }
 
-buildUnnamed2284() {
+buildUnnamed2309() {
   var o = new core.List<api.ResourceWarnings>();
   o.add(buildResourceWarnings());
   o.add(buildResourceWarnings());
   return o;
 }
 
-checkUnnamed2284(core.List<api.ResourceWarnings> o) {
+checkUnnamed2309(core.List<api.ResourceWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceWarnings(o[0]);
   checkResourceWarnings(o[1]);
@@ -1037,7 +1037,7 @@
     o.update = buildResourceUpdate();
     o.updateTime = "foo";
     o.url = "foo";
-    o.warnings = buildUnnamed2284();
+    o.warnings = buildUnnamed2309();
   }
   buildCounterResource--;
   return o;
@@ -1057,7 +1057,7 @@
     checkResourceUpdate(o.update);
     unittest.expect(o.updateTime, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
-    checkUnnamed2284(o.warnings);
+    checkUnnamed2309(o.warnings);
   }
   buildCounterResource--;
 }
@@ -1104,14 +1104,14 @@
   buildCounterResourceUpdateErrorErrors--;
 }
 
-buildUnnamed2285() {
+buildUnnamed2310() {
   var o = new core.List<api.ResourceUpdateErrorErrors>();
   o.add(buildResourceUpdateErrorErrors());
   o.add(buildResourceUpdateErrorErrors());
   return o;
 }
 
-checkUnnamed2285(core.List<api.ResourceUpdateErrorErrors> o) {
+checkUnnamed2310(core.List<api.ResourceUpdateErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceUpdateErrorErrors(o[0]);
   checkResourceUpdateErrorErrors(o[1]);
@@ -1122,7 +1122,7 @@
   var o = new api.ResourceUpdateError();
   buildCounterResourceUpdateError++;
   if (buildCounterResourceUpdateError < 3) {
-    o.errors = buildUnnamed2285();
+    o.errors = buildUnnamed2310();
   }
   buildCounterResourceUpdateError--;
   return o;
@@ -1131,7 +1131,7 @@
 checkResourceUpdateError(api.ResourceUpdateError o) {
   buildCounterResourceUpdateError++;
   if (buildCounterResourceUpdateError < 3) {
-    checkUnnamed2285(o.errors);
+    checkUnnamed2310(o.errors);
   }
   buildCounterResourceUpdateError--;
 }
@@ -1157,14 +1157,14 @@
   buildCounterResourceUpdateWarningsData--;
 }
 
-buildUnnamed2286() {
+buildUnnamed2311() {
   var o = new core.List<api.ResourceUpdateWarningsData>();
   o.add(buildResourceUpdateWarningsData());
   o.add(buildResourceUpdateWarningsData());
   return o;
 }
 
-checkUnnamed2286(core.List<api.ResourceUpdateWarningsData> o) {
+checkUnnamed2311(core.List<api.ResourceUpdateWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceUpdateWarningsData(o[0]);
   checkResourceUpdateWarningsData(o[1]);
@@ -1176,7 +1176,7 @@
   buildCounterResourceUpdateWarnings++;
   if (buildCounterResourceUpdateWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2286();
+    o.data = buildUnnamed2311();
     o.message = "foo";
   }
   buildCounterResourceUpdateWarnings--;
@@ -1187,20 +1187,20 @@
   buildCounterResourceUpdateWarnings++;
   if (buildCounterResourceUpdateWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2286(o.data);
+    checkUnnamed2311(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterResourceUpdateWarnings--;
 }
 
-buildUnnamed2287() {
+buildUnnamed2312() {
   var o = new core.List<api.ResourceUpdateWarnings>();
   o.add(buildResourceUpdateWarnings());
   o.add(buildResourceUpdateWarnings());
   return o;
 }
 
-checkUnnamed2287(core.List<api.ResourceUpdateWarnings> o) {
+checkUnnamed2312(core.List<api.ResourceUpdateWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceUpdateWarnings(o[0]);
   checkResourceUpdateWarnings(o[1]);
@@ -1218,7 +1218,7 @@
     o.manifest = "foo";
     o.properties = "foo";
     o.state = "foo";
-    o.warnings = buildUnnamed2287();
+    o.warnings = buildUnnamed2312();
   }
   buildCounterResourceUpdate--;
   return o;
@@ -1234,19 +1234,19 @@
     unittest.expect(o.manifest, unittest.equals('foo'));
     unittest.expect(o.properties, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
-    checkUnnamed2287(o.warnings);
+    checkUnnamed2312(o.warnings);
   }
   buildCounterResourceUpdate--;
 }
 
-buildUnnamed2288() {
+buildUnnamed2313() {
   var o = new core.List<api.Resource>();
   o.add(buildResource());
   o.add(buildResource());
   return o;
 }
 
-checkUnnamed2288(core.List<api.Resource> o) {
+checkUnnamed2313(core.List<api.Resource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResource(o[0]);
   checkResource(o[1]);
@@ -1258,7 +1258,7 @@
   buildCounterResourcesListResponse++;
   if (buildCounterResourcesListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed2288();
+    o.resources = buildUnnamed2313();
   }
   buildCounterResourcesListResponse--;
   return o;
@@ -1268,71 +1268,71 @@
   buildCounterResourcesListResponse++;
   if (buildCounterResourcesListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2288(o.resources);
+    checkUnnamed2313(o.resources);
   }
   buildCounterResourcesListResponse--;
 }
 
-buildUnnamed2289() {
+buildUnnamed2314() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed2289(core.List<api.Condition> o) {
+checkUnnamed2314(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
 }
 
-buildUnnamed2290() {
+buildUnnamed2315() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2290(core.List<core.String> o) {
+checkUnnamed2315(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2291() {
+buildUnnamed2316() {
   var o = new core.List<api.LogConfig>();
   o.add(buildLogConfig());
   o.add(buildLogConfig());
   return o;
 }
 
-checkUnnamed2291(core.List<api.LogConfig> o) {
+checkUnnamed2316(core.List<api.LogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogConfig(o[0]);
   checkLogConfig(o[1]);
 }
 
-buildUnnamed2292() {
+buildUnnamed2317() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2292(core.List<core.String> o) {
+checkUnnamed2317(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2293() {
+buildUnnamed2318() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2293(core.List<core.String> o) {
+checkUnnamed2318(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1344,12 +1344,12 @@
   buildCounterRule++;
   if (buildCounterRule < 3) {
     o.action = "foo";
-    o.conditions = buildUnnamed2289();
+    o.conditions = buildUnnamed2314();
     o.description = "foo";
-    o.ins = buildUnnamed2290();
-    o.logConfigs = buildUnnamed2291();
-    o.notIns = buildUnnamed2292();
-    o.permissions = buildUnnamed2293();
+    o.ins = buildUnnamed2315();
+    o.logConfigs = buildUnnamed2316();
+    o.notIns = buildUnnamed2317();
+    o.permissions = buildUnnamed2318();
   }
   buildCounterRule--;
   return o;
@@ -1359,24 +1359,24 @@
   buildCounterRule++;
   if (buildCounterRule < 3) {
     unittest.expect(o.action, unittest.equals('foo'));
-    checkUnnamed2289(o.conditions);
+    checkUnnamed2314(o.conditions);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2290(o.ins);
-    checkUnnamed2291(o.logConfigs);
-    checkUnnamed2292(o.notIns);
-    checkUnnamed2293(o.permissions);
+    checkUnnamed2315(o.ins);
+    checkUnnamed2316(o.logConfigs);
+    checkUnnamed2317(o.notIns);
+    checkUnnamed2318(o.permissions);
   }
   buildCounterRule--;
 }
 
-buildUnnamed2294() {
+buildUnnamed2319() {
   var o = new core.List<api.ImportFile>();
   o.add(buildImportFile());
   o.add(buildImportFile());
   return o;
 }
 
-checkUnnamed2294(core.List<api.ImportFile> o) {
+checkUnnamed2319(core.List<api.ImportFile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImportFile(o[0]);
   checkImportFile(o[1]);
@@ -1388,7 +1388,7 @@
   buildCounterTargetConfiguration++;
   if (buildCounterTargetConfiguration < 3) {
     o.config = buildConfigFile();
-    o.imports = buildUnnamed2294();
+    o.imports = buildUnnamed2319();
   }
   buildCounterTargetConfiguration--;
   return o;
@@ -1398,19 +1398,19 @@
   buildCounterTargetConfiguration++;
   if (buildCounterTargetConfiguration < 3) {
     checkConfigFile(o.config);
-    checkUnnamed2294(o.imports);
+    checkUnnamed2319(o.imports);
   }
   buildCounterTargetConfiguration--;
 }
 
-buildUnnamed2295() {
+buildUnnamed2320() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2295(core.List<core.String> o) {
+checkUnnamed2320(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1421,7 +1421,7 @@
   var o = new api.TestPermissionsRequest();
   buildCounterTestPermissionsRequest++;
   if (buildCounterTestPermissionsRequest < 3) {
-    o.permissions = buildUnnamed2295();
+    o.permissions = buildUnnamed2320();
   }
   buildCounterTestPermissionsRequest--;
   return o;
@@ -1430,19 +1430,19 @@
 checkTestPermissionsRequest(api.TestPermissionsRequest o) {
   buildCounterTestPermissionsRequest++;
   if (buildCounterTestPermissionsRequest < 3) {
-    checkUnnamed2295(o.permissions);
+    checkUnnamed2320(o.permissions);
   }
   buildCounterTestPermissionsRequest--;
 }
 
-buildUnnamed2296() {
+buildUnnamed2321() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2296(core.List<core.String> o) {
+checkUnnamed2321(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1453,7 +1453,7 @@
   var o = new api.TestPermissionsResponse();
   buildCounterTestPermissionsResponse++;
   if (buildCounterTestPermissionsResponse < 3) {
-    o.permissions = buildUnnamed2296();
+    o.permissions = buildUnnamed2321();
   }
   buildCounterTestPermissionsResponse--;
   return o;
@@ -1462,7 +1462,7 @@
 checkTestPermissionsResponse(api.TestPermissionsResponse o) {
   buildCounterTestPermissionsResponse++;
   if (buildCounterTestPermissionsResponse < 3) {
-    checkUnnamed2296(o.permissions);
+    checkUnnamed2321(o.permissions);
   }
   buildCounterTestPermissionsResponse--;
 }
@@ -1494,14 +1494,14 @@
   buildCounterType--;
 }
 
-buildUnnamed2297() {
+buildUnnamed2322() {
   var o = new core.List<api.Type>();
   o.add(buildType());
   o.add(buildType());
   return o;
 }
 
-checkUnnamed2297(core.List<api.Type> o) {
+checkUnnamed2322(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o[0]);
   checkType(o[1]);
@@ -1513,7 +1513,7 @@
   buildCounterTypesListResponse++;
   if (buildCounterTypesListResponse < 3) {
     o.nextPageToken = "foo";
-    o.types = buildUnnamed2297();
+    o.types = buildUnnamed2322();
   }
   buildCounterTypesListResponse--;
   return o;
@@ -1523,7 +1523,7 @@
   buildCounterTypesListResponse++;
   if (buildCounterTypesListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2297(o.types);
+    checkUnnamed2322(o.types);
   }
   buildCounterTypesListResponse--;
 }
diff --git a/generated/googleapis/test/dfareporting/v2_8_test.dart b/generated/googleapis/test/dfareporting/v2_8_test.dart
index c64abdd..b586592 100644
--- a/generated/googleapis/test/dfareporting/v2_8_test.dart
+++ b/generated/googleapis/test/dfareporting/v2_8_test.dart
@@ -50,27 +50,27 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed3233() {
+buildUnnamed3262() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3233(core.List<core.String> o) {
+checkUnnamed3262(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3234() {
+buildUnnamed3263() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3234(core.List<core.String> o) {
+checkUnnamed3263(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -81,12 +81,12 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.accountPermissionIds = buildUnnamed3233();
+    o.accountPermissionIds = buildUnnamed3262();
     o.accountProfile = "foo";
     o.active = true;
     o.activeAdsLimitTier = "foo";
     o.activeViewOptOut = true;
-    o.availablePermissionIds = buildUnnamed3234();
+    o.availablePermissionIds = buildUnnamed3263();
     o.countryId = "foo";
     o.currencyId = "foo";
     o.defaultCreativeSizeId = "foo";
@@ -108,12 +108,12 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed3233(o.accountPermissionIds);
+    checkUnnamed3262(o.accountPermissionIds);
     unittest.expect(o.accountProfile, unittest.equals('foo'));
     unittest.expect(o.active, unittest.isTrue);
     unittest.expect(o.activeAdsLimitTier, unittest.equals('foo'));
     unittest.expect(o.activeViewOptOut, unittest.isTrue);
-    checkUnnamed3234(o.availablePermissionIds);
+    checkUnnamed3263(o.availablePermissionIds);
     unittest.expect(o.countryId, unittest.equals('foo'));
     unittest.expect(o.currencyId, unittest.equals('foo'));
     unittest.expect(o.defaultCreativeSizeId, unittest.equals('foo'));
@@ -158,14 +158,14 @@
   buildCounterAccountActiveAdSummary--;
 }
 
-buildUnnamed3235() {
+buildUnnamed3264() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3235(core.List<core.String> o) {
+checkUnnamed3264(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -176,7 +176,7 @@
   var o = new api.AccountPermission();
   buildCounterAccountPermission++;
   if (buildCounterAccountPermission < 3) {
-    o.accountProfiles = buildUnnamed3235();
+    o.accountProfiles = buildUnnamed3264();
     o.id = "foo";
     o.kind = "foo";
     o.level = "foo";
@@ -190,7 +190,7 @@
 checkAccountPermission(api.AccountPermission o) {
   buildCounterAccountPermission++;
   if (buildCounterAccountPermission < 3) {
-    checkUnnamed3235(o.accountProfiles);
+    checkUnnamed3264(o.accountProfiles);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
@@ -223,14 +223,14 @@
   buildCounterAccountPermissionGroup--;
 }
 
-buildUnnamed3236() {
+buildUnnamed3265() {
   var o = new core.List<api.AccountPermissionGroup>();
   o.add(buildAccountPermissionGroup());
   o.add(buildAccountPermissionGroup());
   return o;
 }
 
-checkUnnamed3236(core.List<api.AccountPermissionGroup> o) {
+checkUnnamed3265(core.List<api.AccountPermissionGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountPermissionGroup(o[0]);
   checkAccountPermissionGroup(o[1]);
@@ -241,7 +241,7 @@
   var o = new api.AccountPermissionGroupsListResponse();
   buildCounterAccountPermissionGroupsListResponse++;
   if (buildCounterAccountPermissionGroupsListResponse < 3) {
-    o.accountPermissionGroups = buildUnnamed3236();
+    o.accountPermissionGroups = buildUnnamed3265();
     o.kind = "foo";
   }
   buildCounterAccountPermissionGroupsListResponse--;
@@ -252,20 +252,20 @@
     api.AccountPermissionGroupsListResponse o) {
   buildCounterAccountPermissionGroupsListResponse++;
   if (buildCounterAccountPermissionGroupsListResponse < 3) {
-    checkUnnamed3236(o.accountPermissionGroups);
+    checkUnnamed3265(o.accountPermissionGroups);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountPermissionGroupsListResponse--;
 }
 
-buildUnnamed3237() {
+buildUnnamed3266() {
   var o = new core.List<api.AccountPermission>();
   o.add(buildAccountPermission());
   o.add(buildAccountPermission());
   return o;
 }
 
-checkUnnamed3237(core.List<api.AccountPermission> o) {
+checkUnnamed3266(core.List<api.AccountPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountPermission(o[0]);
   checkAccountPermission(o[1]);
@@ -276,7 +276,7 @@
   var o = new api.AccountPermissionsListResponse();
   buildCounterAccountPermissionsListResponse++;
   if (buildCounterAccountPermissionsListResponse < 3) {
-    o.accountPermissions = buildUnnamed3237();
+    o.accountPermissions = buildUnnamed3266();
     o.kind = "foo";
   }
   buildCounterAccountPermissionsListResponse--;
@@ -286,7 +286,7 @@
 checkAccountPermissionsListResponse(api.AccountPermissionsListResponse o) {
   buildCounterAccountPermissionsListResponse++;
   if (buildCounterAccountPermissionsListResponse < 3) {
-    checkUnnamed3237(o.accountPermissions);
+    checkUnnamed3266(o.accountPermissions);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountPermissionsListResponse--;
@@ -341,14 +341,14 @@
   buildCounterAccountUserProfile--;
 }
 
-buildUnnamed3238() {
+buildUnnamed3267() {
   var o = new core.List<api.AccountUserProfile>();
   o.add(buildAccountUserProfile());
   o.add(buildAccountUserProfile());
   return o;
 }
 
-checkUnnamed3238(core.List<api.AccountUserProfile> o) {
+checkUnnamed3267(core.List<api.AccountUserProfile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountUserProfile(o[0]);
   checkAccountUserProfile(o[1]);
@@ -359,7 +359,7 @@
   var o = new api.AccountUserProfilesListResponse();
   buildCounterAccountUserProfilesListResponse++;
   if (buildCounterAccountUserProfilesListResponse < 3) {
-    o.accountUserProfiles = buildUnnamed3238();
+    o.accountUserProfiles = buildUnnamed3267();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -370,21 +370,21 @@
 checkAccountUserProfilesListResponse(api.AccountUserProfilesListResponse o) {
   buildCounterAccountUserProfilesListResponse++;
   if (buildCounterAccountUserProfilesListResponse < 3) {
-    checkUnnamed3238(o.accountUserProfiles);
+    checkUnnamed3267(o.accountUserProfiles);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAccountUserProfilesListResponse--;
 }
 
-buildUnnamed3239() {
+buildUnnamed3268() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed3239(core.List<api.Account> o) {
+checkUnnamed3268(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -395,7 +395,7 @@
   var o = new api.AccountsListResponse();
   buildCounterAccountsListResponse++;
   if (buildCounterAccountsListResponse < 3) {
-    o.accounts = buildUnnamed3239();
+    o.accounts = buildUnnamed3268();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -406,34 +406,34 @@
 checkAccountsListResponse(api.AccountsListResponse o) {
   buildCounterAccountsListResponse++;
   if (buildCounterAccountsListResponse < 3) {
-    checkUnnamed3239(o.accounts);
+    checkUnnamed3268(o.accounts);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAccountsListResponse--;
 }
 
-buildUnnamed3240() {
+buildUnnamed3269() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed3240(core.List<api.DimensionValue> o) {
+checkUnnamed3269(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed3241() {
+buildUnnamed3270() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3241(core.List<core.String> o) {
+checkUnnamed3270(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -444,9 +444,9 @@
   var o = new api.Activities();
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
-    o.filters = buildUnnamed3240();
+    o.filters = buildUnnamed3269();
     o.kind = "foo";
-    o.metricNames = buildUnnamed3241();
+    o.metricNames = buildUnnamed3270();
   }
   buildCounterActivities--;
   return o;
@@ -455,47 +455,47 @@
 checkActivities(api.Activities o) {
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
-    checkUnnamed3240(o.filters);
+    checkUnnamed3269(o.filters);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3241(o.metricNames);
+    checkUnnamed3270(o.metricNames);
   }
   buildCounterActivities--;
 }
 
-buildUnnamed3242() {
+buildUnnamed3271() {
   var o = new core.List<api.CreativeGroupAssignment>();
   o.add(buildCreativeGroupAssignment());
   o.add(buildCreativeGroupAssignment());
   return o;
 }
 
-checkUnnamed3242(core.List<api.CreativeGroupAssignment> o) {
+checkUnnamed3271(core.List<api.CreativeGroupAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeGroupAssignment(o[0]);
   checkCreativeGroupAssignment(o[1]);
 }
 
-buildUnnamed3243() {
+buildUnnamed3272() {
   var o = new core.List<api.EventTagOverride>();
   o.add(buildEventTagOverride());
   o.add(buildEventTagOverride());
   return o;
 }
 
-checkUnnamed3243(core.List<api.EventTagOverride> o) {
+checkUnnamed3272(core.List<api.EventTagOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventTagOverride(o[0]);
   checkEventTagOverride(o[1]);
 }
 
-buildUnnamed3244() {
+buildUnnamed3273() {
   var o = new core.List<api.PlacementAssignment>();
   o.add(buildPlacementAssignment());
   o.add(buildPlacementAssignment());
   return o;
 }
 
-checkUnnamed3244(core.List<api.PlacementAssignment> o) {
+checkUnnamed3273(core.List<api.PlacementAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlacementAssignment(o[0]);
   checkPlacementAssignment(o[1]);
@@ -519,7 +519,7 @@
     o.comments = "foo";
     o.compatibility = "foo";
     o.createInfo = buildLastModifiedInfo();
-    o.creativeGroupAssignments = buildUnnamed3242();
+    o.creativeGroupAssignments = buildUnnamed3271();
     o.creativeRotation = buildCreativeRotation();
     o.dayPartTargeting = buildDayPartTargeting();
     o.defaultClickThroughEventTagProperties =
@@ -527,7 +527,7 @@
     o.deliverySchedule = buildDeliverySchedule();
     o.dynamicClickTracker = true;
     o.endTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.eventTagOverrides = buildUnnamed3243();
+    o.eventTagOverrides = buildUnnamed3272();
     o.geoTargeting = buildGeoTargeting();
     o.id = "foo";
     o.idDimensionValue = buildDimensionValue();
@@ -536,7 +536,7 @@
     o.languageTargeting = buildLanguageTargeting();
     o.lastModifiedInfo = buildLastModifiedInfo();
     o.name = "foo";
-    o.placementAssignments = buildUnnamed3244();
+    o.placementAssignments = buildUnnamed3273();
     o.remarketingListExpression = buildListTargetingExpression();
     o.size = buildSize();
     o.sslCompliant = true;
@@ -567,7 +567,7 @@
     unittest.expect(o.comments, unittest.equals('foo'));
     unittest.expect(o.compatibility, unittest.equals('foo'));
     checkLastModifiedInfo(o.createInfo);
-    checkUnnamed3242(o.creativeGroupAssignments);
+    checkUnnamed3271(o.creativeGroupAssignments);
     checkCreativeRotation(o.creativeRotation);
     checkDayPartTargeting(o.dayPartTargeting);
     checkDefaultClickThroughEventTagProperties(
@@ -576,7 +576,7 @@
     unittest.expect(o.dynamicClickTracker, unittest.isTrue);
     unittest.expect(
         o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed3243(o.eventTagOverrides);
+    checkUnnamed3272(o.eventTagOverrides);
     checkGeoTargeting(o.geoTargeting);
     unittest.expect(o.id, unittest.equals('foo'));
     checkDimensionValue(o.idDimensionValue);
@@ -585,7 +585,7 @@
     checkLanguageTargeting(o.languageTargeting);
     checkLastModifiedInfo(o.lastModifiedInfo);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3244(o.placementAssignments);
+    checkUnnamed3273(o.placementAssignments);
     checkListTargetingExpression(o.remarketingListExpression);
     checkSize(o.size);
     unittest.expect(o.sslCompliant, unittest.isTrue);
@@ -658,14 +658,14 @@
   buildCounterAdSlot--;
 }
 
-buildUnnamed3245() {
+buildUnnamed3274() {
   var o = new core.List<api.Ad>();
   o.add(buildAd());
   o.add(buildAd());
   return o;
 }
 
-checkUnnamed3245(core.List<api.Ad> o) {
+checkUnnamed3274(core.List<api.Ad> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAd(o[0]);
   checkAd(o[1]);
@@ -676,7 +676,7 @@
   var o = new api.AdsListResponse();
   buildCounterAdsListResponse++;
   if (buildCounterAdsListResponse < 3) {
-    o.ads = buildUnnamed3245();
+    o.ads = buildUnnamed3274();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -687,7 +687,7 @@
 checkAdsListResponse(api.AdsListResponse o) {
   buildCounterAdsListResponse++;
   if (buildCounterAdsListResponse < 3) {
-    checkUnnamed3245(o.ads);
+    checkUnnamed3274(o.ads);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -767,14 +767,14 @@
   buildCounterAdvertiserGroup--;
 }
 
-buildUnnamed3246() {
+buildUnnamed3275() {
   var o = new core.List<api.AdvertiserGroup>();
   o.add(buildAdvertiserGroup());
   o.add(buildAdvertiserGroup());
   return o;
 }
 
-checkUnnamed3246(core.List<api.AdvertiserGroup> o) {
+checkUnnamed3275(core.List<api.AdvertiserGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdvertiserGroup(o[0]);
   checkAdvertiserGroup(o[1]);
@@ -785,7 +785,7 @@
   var o = new api.AdvertiserGroupsListResponse();
   buildCounterAdvertiserGroupsListResponse++;
   if (buildCounterAdvertiserGroupsListResponse < 3) {
-    o.advertiserGroups = buildUnnamed3246();
+    o.advertiserGroups = buildUnnamed3275();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -796,21 +796,21 @@
 checkAdvertiserGroupsListResponse(api.AdvertiserGroupsListResponse o) {
   buildCounterAdvertiserGroupsListResponse++;
   if (buildCounterAdvertiserGroupsListResponse < 3) {
-    checkUnnamed3246(o.advertiserGroups);
+    checkUnnamed3275(o.advertiserGroups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAdvertiserGroupsListResponse--;
 }
 
-buildUnnamed3247() {
+buildUnnamed3276() {
   var o = new core.List<api.Advertiser>();
   o.add(buildAdvertiser());
   o.add(buildAdvertiser());
   return o;
 }
 
-checkUnnamed3247(core.List<api.Advertiser> o) {
+checkUnnamed3276(core.List<api.Advertiser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdvertiser(o[0]);
   checkAdvertiser(o[1]);
@@ -821,7 +821,7 @@
   var o = new api.AdvertisersListResponse();
   buildCounterAdvertisersListResponse++;
   if (buildCounterAdvertisersListResponse < 3) {
-    o.advertisers = buildUnnamed3247();
+    o.advertisers = buildUnnamed3276();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -832,7 +832,7 @@
 checkAdvertisersListResponse(api.AdvertisersListResponse o) {
   buildCounterAdvertisersListResponse++;
   if (buildCounterAdvertisersListResponse < 3) {
-    checkUnnamed3247(o.advertisers);
+    checkUnnamed3276(o.advertisers);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -862,14 +862,14 @@
   buildCounterAudienceSegment--;
 }
 
-buildUnnamed3248() {
+buildUnnamed3277() {
   var o = new core.List<api.AudienceSegment>();
   o.add(buildAudienceSegment());
   o.add(buildAudienceSegment());
   return o;
 }
 
-checkUnnamed3248(core.List<api.AudienceSegment> o) {
+checkUnnamed3277(core.List<api.AudienceSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAudienceSegment(o[0]);
   checkAudienceSegment(o[1]);
@@ -880,7 +880,7 @@
   var o = new api.AudienceSegmentGroup();
   buildCounterAudienceSegmentGroup++;
   if (buildCounterAudienceSegmentGroup < 3) {
-    o.audienceSegments = buildUnnamed3248();
+    o.audienceSegments = buildUnnamed3277();
     o.id = "foo";
     o.name = "foo";
   }
@@ -891,7 +891,7 @@
 checkAudienceSegmentGroup(api.AudienceSegmentGroup o) {
   buildCounterAudienceSegmentGroup++;
   if (buildCounterAudienceSegmentGroup < 3) {
-    checkUnnamed3248(o.audienceSegments);
+    checkUnnamed3277(o.audienceSegments);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
   }
@@ -927,14 +927,14 @@
   buildCounterBrowser--;
 }
 
-buildUnnamed3249() {
+buildUnnamed3278() {
   var o = new core.List<api.Browser>();
   o.add(buildBrowser());
   o.add(buildBrowser());
   return o;
 }
 
-checkUnnamed3249(core.List<api.Browser> o) {
+checkUnnamed3278(core.List<api.Browser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBrowser(o[0]);
   checkBrowser(o[1]);
@@ -945,7 +945,7 @@
   var o = new api.BrowsersListResponse();
   buildCounterBrowsersListResponse++;
   if (buildCounterBrowsersListResponse < 3) {
-    o.browsers = buildUnnamed3249();
+    o.browsers = buildUnnamed3278();
     o.kind = "foo";
   }
   buildCounterBrowsersListResponse--;
@@ -955,72 +955,72 @@
 checkBrowsersListResponse(api.BrowsersListResponse o) {
   buildCounterBrowsersListResponse++;
   if (buildCounterBrowsersListResponse < 3) {
-    checkUnnamed3249(o.browsers);
+    checkUnnamed3278(o.browsers);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBrowsersListResponse--;
 }
 
-buildUnnamed3250() {
+buildUnnamed3279() {
   var o = new core.List<api.CreativeOptimizationConfiguration>();
   o.add(buildCreativeOptimizationConfiguration());
   o.add(buildCreativeOptimizationConfiguration());
   return o;
 }
 
-checkUnnamed3250(core.List<api.CreativeOptimizationConfiguration> o) {
+checkUnnamed3279(core.List<api.CreativeOptimizationConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeOptimizationConfiguration(o[0]);
   checkCreativeOptimizationConfiguration(o[1]);
 }
 
-buildUnnamed3251() {
+buildUnnamed3280() {
   var o = new core.List<api.AudienceSegmentGroup>();
   o.add(buildAudienceSegmentGroup());
   o.add(buildAudienceSegmentGroup());
   return o;
 }
 
-checkUnnamed3251(core.List<api.AudienceSegmentGroup> o) {
+checkUnnamed3280(core.List<api.AudienceSegmentGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAudienceSegmentGroup(o[0]);
   checkAudienceSegmentGroup(o[1]);
 }
 
-buildUnnamed3252() {
+buildUnnamed3281() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3252(core.List<core.String> o) {
+checkUnnamed3281(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3253() {
+buildUnnamed3282() {
   var o = new core.List<api.EventTagOverride>();
   o.add(buildEventTagOverride());
   o.add(buildEventTagOverride());
   return o;
 }
 
-checkUnnamed3253(core.List<api.EventTagOverride> o) {
+checkUnnamed3282(core.List<api.EventTagOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventTagOverride(o[0]);
   checkEventTagOverride(o[1]);
 }
 
-buildUnnamed3254() {
+buildUnnamed3283() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3254(core.List<core.String> o) {
+checkUnnamed3283(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1033,23 +1033,23 @@
   if (buildCounterCampaign < 3) {
     o.accountId = "foo";
     o.adBlockingConfiguration = buildAdBlockingConfiguration();
-    o.additionalCreativeOptimizationConfigurations = buildUnnamed3250();
+    o.additionalCreativeOptimizationConfigurations = buildUnnamed3279();
     o.advertiserGroupId = "foo";
     o.advertiserId = "foo";
     o.advertiserIdDimensionValue = buildDimensionValue();
     o.archived = true;
-    o.audienceSegmentGroups = buildUnnamed3251();
+    o.audienceSegmentGroups = buildUnnamed3280();
     o.billingInvoiceCode = "foo";
     o.clickThroughUrlSuffixProperties = buildClickThroughUrlSuffixProperties();
     o.comment = "foo";
     o.createInfo = buildLastModifiedInfo();
-    o.creativeGroupIds = buildUnnamed3252();
+    o.creativeGroupIds = buildUnnamed3281();
     o.creativeOptimizationConfiguration =
         buildCreativeOptimizationConfiguration();
     o.defaultClickThroughEventTagProperties =
         buildDefaultClickThroughEventTagProperties();
     o.endDate = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.eventTagOverrides = buildUnnamed3253();
+    o.eventTagOverrides = buildUnnamed3282();
     o.externalId = "foo";
     o.id = "foo";
     o.idDimensionValue = buildDimensionValue();
@@ -1060,7 +1060,7 @@
     o.nielsenOcrEnabled = true;
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.subaccountId = "foo";
-    o.traffickerEmails = buildUnnamed3254();
+    o.traffickerEmails = buildUnnamed3283();
   }
   buildCounterCampaign--;
   return o;
@@ -1071,23 +1071,23 @@
   if (buildCounterCampaign < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     checkAdBlockingConfiguration(o.adBlockingConfiguration);
-    checkUnnamed3250(o.additionalCreativeOptimizationConfigurations);
+    checkUnnamed3279(o.additionalCreativeOptimizationConfigurations);
     unittest.expect(o.advertiserGroupId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
     checkDimensionValue(o.advertiserIdDimensionValue);
     unittest.expect(o.archived, unittest.isTrue);
-    checkUnnamed3251(o.audienceSegmentGroups);
+    checkUnnamed3280(o.audienceSegmentGroups);
     unittest.expect(o.billingInvoiceCode, unittest.equals('foo'));
     checkClickThroughUrlSuffixProperties(o.clickThroughUrlSuffixProperties);
     unittest.expect(o.comment, unittest.equals('foo'));
     checkLastModifiedInfo(o.createInfo);
-    checkUnnamed3252(o.creativeGroupIds);
+    checkUnnamed3281(o.creativeGroupIds);
     checkCreativeOptimizationConfiguration(o.creativeOptimizationConfiguration);
     checkDefaultClickThroughEventTagProperties(
         o.defaultClickThroughEventTagProperties);
     unittest.expect(
         o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed3253(o.eventTagOverrides);
+    checkUnnamed3282(o.eventTagOverrides);
     unittest.expect(o.externalId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkDimensionValue(o.idDimensionValue);
@@ -1099,7 +1099,7 @@
     unittest.expect(o.startDate,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.subaccountId, unittest.equals('foo'));
-    checkUnnamed3254(o.traffickerEmails);
+    checkUnnamed3283(o.traffickerEmails);
   }
   buildCounterCampaign--;
 }
@@ -1125,14 +1125,14 @@
   buildCounterCampaignCreativeAssociation--;
 }
 
-buildUnnamed3255() {
+buildUnnamed3284() {
   var o = new core.List<api.CampaignCreativeAssociation>();
   o.add(buildCampaignCreativeAssociation());
   o.add(buildCampaignCreativeAssociation());
   return o;
 }
 
-checkUnnamed3255(core.List<api.CampaignCreativeAssociation> o) {
+checkUnnamed3284(core.List<api.CampaignCreativeAssociation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCampaignCreativeAssociation(o[0]);
   checkCampaignCreativeAssociation(o[1]);
@@ -1143,7 +1143,7 @@
   var o = new api.CampaignCreativeAssociationsListResponse();
   buildCounterCampaignCreativeAssociationsListResponse++;
   if (buildCounterCampaignCreativeAssociationsListResponse < 3) {
-    o.campaignCreativeAssociations = buildUnnamed3255();
+    o.campaignCreativeAssociations = buildUnnamed3284();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1155,21 +1155,21 @@
     api.CampaignCreativeAssociationsListResponse o) {
   buildCounterCampaignCreativeAssociationsListResponse++;
   if (buildCounterCampaignCreativeAssociationsListResponse < 3) {
-    checkUnnamed3255(o.campaignCreativeAssociations);
+    checkUnnamed3284(o.campaignCreativeAssociations);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCampaignCreativeAssociationsListResponse--;
 }
 
-buildUnnamed3256() {
+buildUnnamed3285() {
   var o = new core.List<api.Campaign>();
   o.add(buildCampaign());
   o.add(buildCampaign());
   return o;
 }
 
-checkUnnamed3256(core.List<api.Campaign> o) {
+checkUnnamed3285(core.List<api.Campaign> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCampaign(o[0]);
   checkCampaign(o[1]);
@@ -1180,7 +1180,7 @@
   var o = new api.CampaignsListResponse();
   buildCounterCampaignsListResponse++;
   if (buildCounterCampaignsListResponse < 3) {
-    o.campaigns = buildUnnamed3256();
+    o.campaigns = buildUnnamed3285();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1191,7 +1191,7 @@
 checkCampaignsListResponse(api.CampaignsListResponse o) {
   buildCounterCampaignsListResponse++;
   if (buildCounterCampaignsListResponse < 3) {
-    checkUnnamed3256(o.campaigns);
+    checkUnnamed3285(o.campaigns);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1244,14 +1244,14 @@
   buildCounterChangeLog--;
 }
 
-buildUnnamed3257() {
+buildUnnamed3286() {
   var o = new core.List<api.ChangeLog>();
   o.add(buildChangeLog());
   o.add(buildChangeLog());
   return o;
 }
 
-checkUnnamed3257(core.List<api.ChangeLog> o) {
+checkUnnamed3286(core.List<api.ChangeLog> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChangeLog(o[0]);
   checkChangeLog(o[1]);
@@ -1262,7 +1262,7 @@
   var o = new api.ChangeLogsListResponse();
   buildCounterChangeLogsListResponse++;
   if (buildCounterChangeLogsListResponse < 3) {
-    o.changeLogs = buildUnnamed3257();
+    o.changeLogs = buildUnnamed3286();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1273,21 +1273,21 @@
 checkChangeLogsListResponse(api.ChangeLogsListResponse o) {
   buildCounterChangeLogsListResponse++;
   if (buildCounterChangeLogsListResponse < 3) {
-    checkUnnamed3257(o.changeLogs);
+    checkUnnamed3286(o.changeLogs);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterChangeLogsListResponse--;
 }
 
-buildUnnamed3258() {
+buildUnnamed3287() {
   var o = new core.List<api.City>();
   o.add(buildCity());
   o.add(buildCity());
   return o;
 }
 
-checkUnnamed3258(core.List<api.City> o) {
+checkUnnamed3287(core.List<api.City> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCity(o[0]);
   checkCity(o[1]);
@@ -1298,7 +1298,7 @@
   var o = new api.CitiesListResponse();
   buildCounterCitiesListResponse++;
   if (buildCounterCitiesListResponse < 3) {
-    o.cities = buildUnnamed3258();
+    o.cities = buildUnnamed3287();
     o.kind = "foo";
   }
   buildCounterCitiesListResponse--;
@@ -1308,7 +1308,7 @@
 checkCitiesListResponse(api.CitiesListResponse o) {
   buildCounterCitiesListResponse++;
   if (buildCounterCitiesListResponse < 3) {
-    checkUnnamed3258(o.cities);
+    checkUnnamed3287(o.cities);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCitiesListResponse--;
@@ -1439,14 +1439,14 @@
   buildCounterCompanionClickThroughOverride--;
 }
 
-buildUnnamed3259() {
+buildUnnamed3288() {
   var o = new core.List<api.Size>();
   o.add(buildSize());
   o.add(buildSize());
   return o;
 }
 
-checkUnnamed3259(core.List<api.Size> o) {
+checkUnnamed3288(core.List<api.Size> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSize(o[0]);
   checkSize(o[1]);
@@ -1458,7 +1458,7 @@
   buildCounterCompanionSetting++;
   if (buildCounterCompanionSetting < 3) {
     o.companionsDisabled = true;
-    o.enabledSizes = buildUnnamed3259();
+    o.enabledSizes = buildUnnamed3288();
     o.imageOnly = true;
     o.kind = "foo";
   }
@@ -1470,7 +1470,7 @@
   buildCounterCompanionSetting++;
   if (buildCounterCompanionSetting < 3) {
     unittest.expect(o.companionsDisabled, unittest.isTrue);
-    checkUnnamed3259(o.enabledSizes);
+    checkUnnamed3288(o.enabledSizes);
     unittest.expect(o.imageOnly, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
@@ -1534,14 +1534,14 @@
   buildCounterConnectionType--;
 }
 
-buildUnnamed3260() {
+buildUnnamed3289() {
   var o = new core.List<api.ConnectionType>();
   o.add(buildConnectionType());
   o.add(buildConnectionType());
   return o;
 }
 
-checkUnnamed3260(core.List<api.ConnectionType> o) {
+checkUnnamed3289(core.List<api.ConnectionType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConnectionType(o[0]);
   checkConnectionType(o[1]);
@@ -1552,7 +1552,7 @@
   var o = new api.ConnectionTypesListResponse();
   buildCounterConnectionTypesListResponse++;
   if (buildCounterConnectionTypesListResponse < 3) {
-    o.connectionTypes = buildUnnamed3260();
+    o.connectionTypes = buildUnnamed3289();
     o.kind = "foo";
   }
   buildCounterConnectionTypesListResponse--;
@@ -1562,20 +1562,20 @@
 checkConnectionTypesListResponse(api.ConnectionTypesListResponse o) {
   buildCounterConnectionTypesListResponse++;
   if (buildCounterConnectionTypesListResponse < 3) {
-    checkUnnamed3260(o.connectionTypes);
+    checkUnnamed3289(o.connectionTypes);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConnectionTypesListResponse--;
 }
 
-buildUnnamed3261() {
+buildUnnamed3290() {
   var o = new core.List<api.ContentCategory>();
   o.add(buildContentCategory());
   o.add(buildContentCategory());
   return o;
 }
 
-checkUnnamed3261(core.List<api.ContentCategory> o) {
+checkUnnamed3290(core.List<api.ContentCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContentCategory(o[0]);
   checkContentCategory(o[1]);
@@ -1586,7 +1586,7 @@
   var o = new api.ContentCategoriesListResponse();
   buildCounterContentCategoriesListResponse++;
   if (buildCounterContentCategoriesListResponse < 3) {
-    o.contentCategories = buildUnnamed3261();
+    o.contentCategories = buildUnnamed3290();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1597,7 +1597,7 @@
 checkContentCategoriesListResponse(api.ContentCategoriesListResponse o) {
   buildCounterContentCategoriesListResponse++;
   if (buildCounterContentCategoriesListResponse < 3) {
-    checkUnnamed3261(o.contentCategories);
+    checkUnnamed3290(o.contentCategories);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1629,27 +1629,27 @@
   buildCounterContentCategory--;
 }
 
-buildUnnamed3262() {
+buildUnnamed3291() {
   var o = new core.List<api.CustomFloodlightVariable>();
   o.add(buildCustomFloodlightVariable());
   o.add(buildCustomFloodlightVariable());
   return o;
 }
 
-checkUnnamed3262(core.List<api.CustomFloodlightVariable> o) {
+checkUnnamed3291(core.List<api.CustomFloodlightVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomFloodlightVariable(o[0]);
   checkCustomFloodlightVariable(o[1]);
 }
 
-buildUnnamed3263() {
+buildUnnamed3292() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3263(core.List<core.String> o) {
+checkUnnamed3292(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1661,9 +1661,9 @@
   buildCounterConversion++;
   if (buildCounterConversion < 3) {
     o.childDirectedTreatment = true;
-    o.customVariables = buildUnnamed3262();
+    o.customVariables = buildUnnamed3291();
     o.encryptedUserId = "foo";
-    o.encryptedUserIdCandidates = buildUnnamed3263();
+    o.encryptedUserIdCandidates = buildUnnamed3292();
     o.floodlightActivityId = "foo";
     o.floodlightConfigurationId = "foo";
     o.gclid = "foo";
@@ -1683,9 +1683,9 @@
   buildCounterConversion++;
   if (buildCounterConversion < 3) {
     unittest.expect(o.childDirectedTreatment, unittest.isTrue);
-    checkUnnamed3262(o.customVariables);
+    checkUnnamed3291(o.customVariables);
     unittest.expect(o.encryptedUserId, unittest.equals('foo'));
-    checkUnnamed3263(o.encryptedUserIdCandidates);
+    checkUnnamed3292(o.encryptedUserIdCandidates);
     unittest.expect(o.floodlightActivityId, unittest.equals('foo'));
     unittest.expect(o.floodlightConfigurationId, unittest.equals('foo'));
     unittest.expect(o.gclid, unittest.equals('foo'));
@@ -1723,14 +1723,14 @@
   buildCounterConversionError--;
 }
 
-buildUnnamed3264() {
+buildUnnamed3293() {
   var o = new core.List<api.ConversionError>();
   o.add(buildConversionError());
   o.add(buildConversionError());
   return o;
 }
 
-checkUnnamed3264(core.List<api.ConversionError> o) {
+checkUnnamed3293(core.List<api.ConversionError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversionError(o[0]);
   checkConversionError(o[1]);
@@ -1742,7 +1742,7 @@
   buildCounterConversionStatus++;
   if (buildCounterConversionStatus < 3) {
     o.conversion = buildConversion();
-    o.errors = buildUnnamed3264();
+    o.errors = buildUnnamed3293();
     o.kind = "foo";
   }
   buildCounterConversionStatus--;
@@ -1753,20 +1753,20 @@
   buildCounterConversionStatus++;
   if (buildCounterConversionStatus < 3) {
     checkConversion(o.conversion);
-    checkUnnamed3264(o.errors);
+    checkUnnamed3293(o.errors);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionStatus--;
 }
 
-buildUnnamed3265() {
+buildUnnamed3294() {
   var o = new core.List<api.Conversion>();
   o.add(buildConversion());
   o.add(buildConversion());
   return o;
 }
 
-checkUnnamed3265(core.List<api.Conversion> o) {
+checkUnnamed3294(core.List<api.Conversion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversion(o[0]);
   checkConversion(o[1]);
@@ -1777,7 +1777,7 @@
   var o = new api.ConversionsBatchInsertRequest();
   buildCounterConversionsBatchInsertRequest++;
   if (buildCounterConversionsBatchInsertRequest < 3) {
-    o.conversions = buildUnnamed3265();
+    o.conversions = buildUnnamed3294();
     o.encryptionInfo = buildEncryptionInfo();
     o.kind = "foo";
   }
@@ -1788,21 +1788,21 @@
 checkConversionsBatchInsertRequest(api.ConversionsBatchInsertRequest o) {
   buildCounterConversionsBatchInsertRequest++;
   if (buildCounterConversionsBatchInsertRequest < 3) {
-    checkUnnamed3265(o.conversions);
+    checkUnnamed3294(o.conversions);
     checkEncryptionInfo(o.encryptionInfo);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionsBatchInsertRequest--;
 }
 
-buildUnnamed3266() {
+buildUnnamed3295() {
   var o = new core.List<api.ConversionStatus>();
   o.add(buildConversionStatus());
   o.add(buildConversionStatus());
   return o;
 }
 
-checkUnnamed3266(core.List<api.ConversionStatus> o) {
+checkUnnamed3295(core.List<api.ConversionStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversionStatus(o[0]);
   checkConversionStatus(o[1]);
@@ -1815,7 +1815,7 @@
   if (buildCounterConversionsBatchInsertResponse < 3) {
     o.hasFailures = true;
     o.kind = "foo";
-    o.status = buildUnnamed3266();
+    o.status = buildUnnamed3295();
   }
   buildCounterConversionsBatchInsertResponse--;
   return o;
@@ -1826,19 +1826,19 @@
   if (buildCounterConversionsBatchInsertResponse < 3) {
     unittest.expect(o.hasFailures, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3266(o.status);
+    checkUnnamed3295(o.status);
   }
   buildCounterConversionsBatchInsertResponse--;
 }
 
-buildUnnamed3267() {
+buildUnnamed3296() {
   var o = new core.List<api.Conversion>();
   o.add(buildConversion());
   o.add(buildConversion());
   return o;
 }
 
-checkUnnamed3267(core.List<api.Conversion> o) {
+checkUnnamed3296(core.List<api.Conversion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversion(o[0]);
   checkConversion(o[1]);
@@ -1849,7 +1849,7 @@
   var o = new api.ConversionsBatchUpdateRequest();
   buildCounterConversionsBatchUpdateRequest++;
   if (buildCounterConversionsBatchUpdateRequest < 3) {
-    o.conversions = buildUnnamed3267();
+    o.conversions = buildUnnamed3296();
     o.encryptionInfo = buildEncryptionInfo();
     o.kind = "foo";
   }
@@ -1860,21 +1860,21 @@
 checkConversionsBatchUpdateRequest(api.ConversionsBatchUpdateRequest o) {
   buildCounterConversionsBatchUpdateRequest++;
   if (buildCounterConversionsBatchUpdateRequest < 3) {
-    checkUnnamed3267(o.conversions);
+    checkUnnamed3296(o.conversions);
     checkEncryptionInfo(o.encryptionInfo);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionsBatchUpdateRequest--;
 }
 
-buildUnnamed3268() {
+buildUnnamed3297() {
   var o = new core.List<api.ConversionStatus>();
   o.add(buildConversionStatus());
   o.add(buildConversionStatus());
   return o;
 }
 
-checkUnnamed3268(core.List<api.ConversionStatus> o) {
+checkUnnamed3297(core.List<api.ConversionStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversionStatus(o[0]);
   checkConversionStatus(o[1]);
@@ -1887,7 +1887,7 @@
   if (buildCounterConversionsBatchUpdateResponse < 3) {
     o.hasFailures = true;
     o.kind = "foo";
-    o.status = buildUnnamed3268();
+    o.status = buildUnnamed3297();
   }
   buildCounterConversionsBatchUpdateResponse--;
   return o;
@@ -1898,19 +1898,19 @@
   if (buildCounterConversionsBatchUpdateResponse < 3) {
     unittest.expect(o.hasFailures, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3268(o.status);
+    checkUnnamed3297(o.status);
   }
   buildCounterConversionsBatchUpdateResponse--;
 }
 
-buildUnnamed3269() {
+buildUnnamed3298() {
   var o = new core.List<api.Country>();
   o.add(buildCountry());
   o.add(buildCountry());
   return o;
 }
 
-checkUnnamed3269(core.List<api.Country> o) {
+checkUnnamed3298(core.List<api.Country> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCountry(o[0]);
   checkCountry(o[1]);
@@ -1921,7 +1921,7 @@
   var o = new api.CountriesListResponse();
   buildCounterCountriesListResponse++;
   if (buildCounterCountriesListResponse < 3) {
-    o.countries = buildUnnamed3269();
+    o.countries = buildUnnamed3298();
     o.kind = "foo";
   }
   buildCounterCountriesListResponse--;
@@ -1931,7 +1931,7 @@
 checkCountriesListResponse(api.CountriesListResponse o) {
   buildCounterCountriesListResponse++;
   if (buildCounterCountriesListResponse < 3) {
-    checkUnnamed3269(o.countries);
+    checkUnnamed3298(o.countries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCountriesListResponse--;
@@ -1964,157 +1964,157 @@
   buildCounterCountry--;
 }
 
-buildUnnamed3270() {
+buildUnnamed3299() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3270(core.List<core.String> o) {
+checkUnnamed3299(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3271() {
+buildUnnamed3300() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3271(core.List<core.String> o) {
+checkUnnamed3300(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3272() {
+buildUnnamed3301() {
   var o = new core.List<api.ClickTag>();
   o.add(buildClickTag());
   o.add(buildClickTag());
   return o;
 }
 
-checkUnnamed3272(core.List<api.ClickTag> o) {
+checkUnnamed3301(core.List<api.ClickTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkClickTag(o[0]);
   checkClickTag(o[1]);
 }
 
-buildUnnamed3273() {
+buildUnnamed3302() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3273(core.List<core.String> o) {
+checkUnnamed3302(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3274() {
+buildUnnamed3303() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3274(core.List<core.String> o) {
+checkUnnamed3303(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3275() {
+buildUnnamed3304() {
   var o = new core.List<api.CreativeCustomEvent>();
   o.add(buildCreativeCustomEvent());
   o.add(buildCreativeCustomEvent());
   return o;
 }
 
-checkUnnamed3275(core.List<api.CreativeCustomEvent> o) {
+checkUnnamed3304(core.List<api.CreativeCustomEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeCustomEvent(o[0]);
   checkCreativeCustomEvent(o[1]);
 }
 
-buildUnnamed3276() {
+buildUnnamed3305() {
   var o = new core.List<api.CreativeAsset>();
   o.add(buildCreativeAsset());
   o.add(buildCreativeAsset());
   return o;
 }
 
-checkUnnamed3276(core.List<api.CreativeAsset> o) {
+checkUnnamed3305(core.List<api.CreativeAsset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeAsset(o[0]);
   checkCreativeAsset(o[1]);
 }
 
-buildUnnamed3277() {
+buildUnnamed3306() {
   var o = new core.List<api.CreativeFieldAssignment>();
   o.add(buildCreativeFieldAssignment());
   o.add(buildCreativeFieldAssignment());
   return o;
 }
 
-checkUnnamed3277(core.List<api.CreativeFieldAssignment> o) {
+checkUnnamed3306(core.List<api.CreativeFieldAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeFieldAssignment(o[0]);
   checkCreativeFieldAssignment(o[1]);
 }
 
-buildUnnamed3278() {
+buildUnnamed3307() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3278(core.List<core.String> o) {
+checkUnnamed3307(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3279() {
+buildUnnamed3308() {
   var o = new core.List<api.CreativeCustomEvent>();
   o.add(buildCreativeCustomEvent());
   o.add(buildCreativeCustomEvent());
   return o;
 }
 
-checkUnnamed3279(core.List<api.CreativeCustomEvent> o) {
+checkUnnamed3308(core.List<api.CreativeCustomEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeCustomEvent(o[0]);
   checkCreativeCustomEvent(o[1]);
 }
 
-buildUnnamed3280() {
+buildUnnamed3309() {
   var o = new core.List<api.ThirdPartyTrackingUrl>();
   o.add(buildThirdPartyTrackingUrl());
   o.add(buildThirdPartyTrackingUrl());
   return o;
 }
 
-checkUnnamed3280(core.List<api.ThirdPartyTrackingUrl> o) {
+checkUnnamed3309(core.List<api.ThirdPartyTrackingUrl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThirdPartyTrackingUrl(o[0]);
   checkThirdPartyTrackingUrl(o[1]);
 }
 
-buildUnnamed3281() {
+buildUnnamed3310() {
   var o = new core.List<api.CreativeCustomEvent>();
   o.add(buildCreativeCustomEvent());
   o.add(buildCreativeCustomEvent());
   return o;
 }
 
-checkUnnamed3281(core.List<api.CreativeCustomEvent> o) {
+checkUnnamed3310(core.List<api.CreativeCustomEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeCustomEvent(o[0]);
   checkCreativeCustomEvent(o[1]);
@@ -2128,7 +2128,7 @@
     o.accountId = "foo";
     o.active = true;
     o.adParameters = "foo";
-    o.adTagKeys = buildUnnamed3270();
+    o.adTagKeys = buildUnnamed3299();
     o.advertiserId = "foo";
     o.allowScriptAccess = true;
     o.archived = true;
@@ -2138,21 +2138,21 @@
     o.autoAdvanceImages = true;
     o.backgroundColor = "foo";
     o.backupImageClickThroughUrl = "foo";
-    o.backupImageFeatures = buildUnnamed3271();
+    o.backupImageFeatures = buildUnnamed3300();
     o.backupImageReportingLabel = "foo";
     o.backupImageTargetWindow = buildTargetWindow();
-    o.clickTags = buildUnnamed3272();
+    o.clickTags = buildUnnamed3301();
     o.commercialId = "foo";
-    o.companionCreatives = buildUnnamed3273();
-    o.compatibility = buildUnnamed3274();
+    o.companionCreatives = buildUnnamed3302();
+    o.compatibility = buildUnnamed3303();
     o.convertFlashToHtml5 = true;
-    o.counterCustomEvents = buildUnnamed3275();
+    o.counterCustomEvents = buildUnnamed3304();
     o.creativeAssetSelection = buildCreativeAssetSelection();
-    o.creativeAssets = buildUnnamed3276();
-    o.creativeFieldAssignments = buildUnnamed3277();
-    o.customKeyValues = buildUnnamed3278();
+    o.creativeAssets = buildUnnamed3305();
+    o.creativeFieldAssignments = buildUnnamed3306();
+    o.customKeyValues = buildUnnamed3307();
     o.dynamicAssetSelection = true;
-    o.exitCustomEvents = buildUnnamed3279();
+    o.exitCustomEvents = buildUnnamed3308();
     o.fsCommand = buildFsCommand();
     o.htmlCode = "foo";
     o.htmlCodeLocked = true;
@@ -2180,8 +2180,8 @@
     o.subaccountId = "foo";
     o.thirdPartyBackupImageImpressionsUrl = "foo";
     o.thirdPartyRichMediaImpressionsUrl = "foo";
-    o.thirdPartyUrls = buildUnnamed3280();
-    o.timerCustomEvents = buildUnnamed3281();
+    o.thirdPartyUrls = buildUnnamed3309();
+    o.timerCustomEvents = buildUnnamed3310();
     o.totalFileSize = "foo";
     o.type = "foo";
     o.universalAdId = buildUniversalAdId();
@@ -2199,7 +2199,7 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.active, unittest.isTrue);
     unittest.expect(o.adParameters, unittest.equals('foo'));
-    checkUnnamed3270(o.adTagKeys);
+    checkUnnamed3299(o.adTagKeys);
     unittest.expect(o.advertiserId, unittest.equals('foo'));
     unittest.expect(o.allowScriptAccess, unittest.isTrue);
     unittest.expect(o.archived, unittest.isTrue);
@@ -2209,21 +2209,21 @@
     unittest.expect(o.autoAdvanceImages, unittest.isTrue);
     unittest.expect(o.backgroundColor, unittest.equals('foo'));
     unittest.expect(o.backupImageClickThroughUrl, unittest.equals('foo'));
-    checkUnnamed3271(o.backupImageFeatures);
+    checkUnnamed3300(o.backupImageFeatures);
     unittest.expect(o.backupImageReportingLabel, unittest.equals('foo'));
     checkTargetWindow(o.backupImageTargetWindow);
-    checkUnnamed3272(o.clickTags);
+    checkUnnamed3301(o.clickTags);
     unittest.expect(o.commercialId, unittest.equals('foo'));
-    checkUnnamed3273(o.companionCreatives);
-    checkUnnamed3274(o.compatibility);
+    checkUnnamed3302(o.companionCreatives);
+    checkUnnamed3303(o.compatibility);
     unittest.expect(o.convertFlashToHtml5, unittest.isTrue);
-    checkUnnamed3275(o.counterCustomEvents);
+    checkUnnamed3304(o.counterCustomEvents);
     checkCreativeAssetSelection(o.creativeAssetSelection);
-    checkUnnamed3276(o.creativeAssets);
-    checkUnnamed3277(o.creativeFieldAssignments);
-    checkUnnamed3278(o.customKeyValues);
+    checkUnnamed3305(o.creativeAssets);
+    checkUnnamed3306(o.creativeFieldAssignments);
+    checkUnnamed3307(o.customKeyValues);
     unittest.expect(o.dynamicAssetSelection, unittest.isTrue);
-    checkUnnamed3279(o.exitCustomEvents);
+    checkUnnamed3308(o.exitCustomEvents);
     checkFsCommand(o.fsCommand);
     unittest.expect(o.htmlCode, unittest.equals('foo'));
     unittest.expect(o.htmlCodeLocked, unittest.isTrue);
@@ -2253,8 +2253,8 @@
         o.thirdPartyBackupImageImpressionsUrl, unittest.equals('foo'));
     unittest.expect(
         o.thirdPartyRichMediaImpressionsUrl, unittest.equals('foo'));
-    checkUnnamed3280(o.thirdPartyUrls);
-    checkUnnamed3281(o.timerCustomEvents);
+    checkUnnamed3309(o.thirdPartyUrls);
+    checkUnnamed3310(o.timerCustomEvents);
     unittest.expect(o.totalFileSize, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     checkUniversalAdId(o.universalAdId);
@@ -2265,27 +2265,27 @@
   buildCounterCreative--;
 }
 
-buildUnnamed3282() {
+buildUnnamed3311() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3282(core.List<core.String> o) {
+checkUnnamed3311(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3283() {
+buildUnnamed3312() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3283(core.List<core.String> o) {
+checkUnnamed3312(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2305,9 +2305,9 @@
     o.bitRate = 42;
     o.childAssetType = "foo";
     o.collapsedSize = buildSize();
-    o.companionCreativeIds = buildUnnamed3282();
+    o.companionCreativeIds = buildUnnamed3311();
     o.customStartTimeValue = 42;
-    o.detectedFeatures = buildUnnamed3283();
+    o.detectedFeatures = buildUnnamed3312();
     o.displayType = "foo";
     o.duration = 42;
     o.durationType = "foo";
@@ -2357,9 +2357,9 @@
     unittest.expect(o.bitRate, unittest.equals(42));
     unittest.expect(o.childAssetType, unittest.equals('foo'));
     checkSize(o.collapsedSize);
-    checkUnnamed3282(o.companionCreativeIds);
+    checkUnnamed3311(o.companionCreativeIds);
     unittest.expect(o.customStartTimeValue, unittest.equals(42));
-    checkUnnamed3283(o.detectedFeatures);
+    checkUnnamed3312(o.detectedFeatures);
     unittest.expect(o.displayType, unittest.equals('foo'));
     unittest.expect(o.duration, unittest.equals(42));
     unittest.expect(o.durationType, unittest.equals('foo'));
@@ -2417,40 +2417,40 @@
   buildCounterCreativeAssetId--;
 }
 
-buildUnnamed3284() {
+buildUnnamed3313() {
   var o = new core.List<api.ClickTag>();
   o.add(buildClickTag());
   o.add(buildClickTag());
   return o;
 }
 
-checkUnnamed3284(core.List<api.ClickTag> o) {
+checkUnnamed3313(core.List<api.ClickTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkClickTag(o[0]);
   checkClickTag(o[1]);
 }
 
-buildUnnamed3285() {
+buildUnnamed3314() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3285(core.List<core.String> o) {
+checkUnnamed3314(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3286() {
+buildUnnamed3315() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3286(core.List<core.String> o) {
+checkUnnamed3315(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2462,12 +2462,12 @@
   buildCounterCreativeAssetMetadata++;
   if (buildCounterCreativeAssetMetadata < 3) {
     o.assetIdentifier = buildCreativeAssetId();
-    o.clickTags = buildUnnamed3284();
-    o.detectedFeatures = buildUnnamed3285();
+    o.clickTags = buildUnnamed3313();
+    o.detectedFeatures = buildUnnamed3314();
     o.id = "foo";
     o.idDimensionValue = buildDimensionValue();
     o.kind = "foo";
-    o.warnedValidationRules = buildUnnamed3286();
+    o.warnedValidationRules = buildUnnamed3315();
   }
   buildCounterCreativeAssetMetadata--;
   return o;
@@ -2477,24 +2477,24 @@
   buildCounterCreativeAssetMetadata++;
   if (buildCounterCreativeAssetMetadata < 3) {
     checkCreativeAssetId(o.assetIdentifier);
-    checkUnnamed3284(o.clickTags);
-    checkUnnamed3285(o.detectedFeatures);
+    checkUnnamed3313(o.clickTags);
+    checkUnnamed3314(o.detectedFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
     checkDimensionValue(o.idDimensionValue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3286(o.warnedValidationRules);
+    checkUnnamed3315(o.warnedValidationRules);
   }
   buildCounterCreativeAssetMetadata--;
 }
 
-buildUnnamed3287() {
+buildUnnamed3316() {
   var o = new core.List<api.Rule>();
   o.add(buildRule());
   o.add(buildRule());
   return o;
 }
 
-checkUnnamed3287(core.List<api.Rule> o) {
+checkUnnamed3316(core.List<api.Rule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRule(o[0]);
   checkRule(o[1]);
@@ -2506,7 +2506,7 @@
   buildCounterCreativeAssetSelection++;
   if (buildCounterCreativeAssetSelection < 3) {
     o.defaultAssetId = "foo";
-    o.rules = buildUnnamed3287();
+    o.rules = buildUnnamed3316();
   }
   buildCounterCreativeAssetSelection--;
   return o;
@@ -2516,45 +2516,45 @@
   buildCounterCreativeAssetSelection++;
   if (buildCounterCreativeAssetSelection < 3) {
     unittest.expect(o.defaultAssetId, unittest.equals('foo'));
-    checkUnnamed3287(o.rules);
+    checkUnnamed3316(o.rules);
   }
   buildCounterCreativeAssetSelection--;
 }
 
-buildUnnamed3288() {
+buildUnnamed3317() {
   var o = new core.List<api.CompanionClickThroughOverride>();
   o.add(buildCompanionClickThroughOverride());
   o.add(buildCompanionClickThroughOverride());
   return o;
 }
 
-checkUnnamed3288(core.List<api.CompanionClickThroughOverride> o) {
+checkUnnamed3317(core.List<api.CompanionClickThroughOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCompanionClickThroughOverride(o[0]);
   checkCompanionClickThroughOverride(o[1]);
 }
 
-buildUnnamed3289() {
+buildUnnamed3318() {
   var o = new core.List<api.CreativeGroupAssignment>();
   o.add(buildCreativeGroupAssignment());
   o.add(buildCreativeGroupAssignment());
   return o;
 }
 
-checkUnnamed3289(core.List<api.CreativeGroupAssignment> o) {
+checkUnnamed3318(core.List<api.CreativeGroupAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeGroupAssignment(o[0]);
   checkCreativeGroupAssignment(o[1]);
 }
 
-buildUnnamed3290() {
+buildUnnamed3319() {
   var o = new core.List<api.RichMediaExitOverride>();
   o.add(buildRichMediaExitOverride());
   o.add(buildRichMediaExitOverride());
   return o;
 }
 
-checkUnnamed3290(core.List<api.RichMediaExitOverride> o) {
+checkUnnamed3319(core.List<api.RichMediaExitOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRichMediaExitOverride(o[0]);
   checkRichMediaExitOverride(o[1]);
@@ -2568,12 +2568,12 @@
     o.active = true;
     o.applyEventTags = true;
     o.clickThroughUrl = buildClickThroughUrl();
-    o.companionCreativeOverrides = buildUnnamed3288();
-    o.creativeGroupAssignments = buildUnnamed3289();
+    o.companionCreativeOverrides = buildUnnamed3317();
+    o.creativeGroupAssignments = buildUnnamed3318();
     o.creativeId = "foo";
     o.creativeIdDimensionValue = buildDimensionValue();
     o.endTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.richMediaExitOverrides = buildUnnamed3290();
+    o.richMediaExitOverrides = buildUnnamed3319();
     o.sequence = 42;
     o.sslCompliant = true;
     o.startTime = core.DateTime.parse("2002-02-27T14:01:02");
@@ -2589,13 +2589,13 @@
     unittest.expect(o.active, unittest.isTrue);
     unittest.expect(o.applyEventTags, unittest.isTrue);
     checkClickThroughUrl(o.clickThroughUrl);
-    checkUnnamed3288(o.companionCreativeOverrides);
-    checkUnnamed3289(o.creativeGroupAssignments);
+    checkUnnamed3317(o.companionCreativeOverrides);
+    checkUnnamed3318(o.creativeGroupAssignments);
     unittest.expect(o.creativeId, unittest.equals('foo'));
     checkDimensionValue(o.creativeIdDimensionValue);
     unittest.expect(
         o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed3290(o.richMediaExitOverrides);
+    checkUnnamed3319(o.richMediaExitOverrides);
     unittest.expect(o.sequence, unittest.equals(42));
     unittest.expect(o.sslCompliant, unittest.isTrue);
     unittest.expect(o.startTime,
@@ -2717,14 +2717,14 @@
   buildCounterCreativeFieldValue--;
 }
 
-buildUnnamed3291() {
+buildUnnamed3320() {
   var o = new core.List<api.CreativeFieldValue>();
   o.add(buildCreativeFieldValue());
   o.add(buildCreativeFieldValue());
   return o;
 }
 
-checkUnnamed3291(core.List<api.CreativeFieldValue> o) {
+checkUnnamed3320(core.List<api.CreativeFieldValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeFieldValue(o[0]);
   checkCreativeFieldValue(o[1]);
@@ -2735,7 +2735,7 @@
   var o = new api.CreativeFieldValuesListResponse();
   buildCounterCreativeFieldValuesListResponse++;
   if (buildCounterCreativeFieldValuesListResponse < 3) {
-    o.creativeFieldValues = buildUnnamed3291();
+    o.creativeFieldValues = buildUnnamed3320();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2746,21 +2746,21 @@
 checkCreativeFieldValuesListResponse(api.CreativeFieldValuesListResponse o) {
   buildCounterCreativeFieldValuesListResponse++;
   if (buildCounterCreativeFieldValuesListResponse < 3) {
-    checkUnnamed3291(o.creativeFieldValues);
+    checkUnnamed3320(o.creativeFieldValues);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCreativeFieldValuesListResponse--;
 }
 
-buildUnnamed3292() {
+buildUnnamed3321() {
   var o = new core.List<api.CreativeField>();
   o.add(buildCreativeField());
   o.add(buildCreativeField());
   return o;
 }
 
-checkUnnamed3292(core.List<api.CreativeField> o) {
+checkUnnamed3321(core.List<api.CreativeField> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeField(o[0]);
   checkCreativeField(o[1]);
@@ -2771,7 +2771,7 @@
   var o = new api.CreativeFieldsListResponse();
   buildCounterCreativeFieldsListResponse++;
   if (buildCounterCreativeFieldsListResponse < 3) {
-    o.creativeFields = buildUnnamed3292();
+    o.creativeFields = buildUnnamed3321();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2782,7 +2782,7 @@
 checkCreativeFieldsListResponse(api.CreativeFieldsListResponse o) {
   buildCounterCreativeFieldsListResponse++;
   if (buildCounterCreativeFieldsListResponse < 3) {
-    checkUnnamed3292(o.creativeFields);
+    checkUnnamed3321(o.creativeFields);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -2843,14 +2843,14 @@
   buildCounterCreativeGroupAssignment--;
 }
 
-buildUnnamed3293() {
+buildUnnamed3322() {
   var o = new core.List<api.CreativeGroup>();
   o.add(buildCreativeGroup());
   o.add(buildCreativeGroup());
   return o;
 }
 
-checkUnnamed3293(core.List<api.CreativeGroup> o) {
+checkUnnamed3322(core.List<api.CreativeGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeGroup(o[0]);
   checkCreativeGroup(o[1]);
@@ -2861,7 +2861,7 @@
   var o = new api.CreativeGroupsListResponse();
   buildCounterCreativeGroupsListResponse++;
   if (buildCounterCreativeGroupsListResponse < 3) {
-    o.creativeGroups = buildUnnamed3293();
+    o.creativeGroups = buildUnnamed3322();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2872,21 +2872,21 @@
 checkCreativeGroupsListResponse(api.CreativeGroupsListResponse o) {
   buildCounterCreativeGroupsListResponse++;
   if (buildCounterCreativeGroupsListResponse < 3) {
-    checkUnnamed3293(o.creativeGroups);
+    checkUnnamed3322(o.creativeGroups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCreativeGroupsListResponse--;
 }
 
-buildUnnamed3294() {
+buildUnnamed3323() {
   var o = new core.List<api.OptimizationActivity>();
   o.add(buildOptimizationActivity());
   o.add(buildOptimizationActivity());
   return o;
 }
 
-checkUnnamed3294(core.List<api.OptimizationActivity> o) {
+checkUnnamed3323(core.List<api.OptimizationActivity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOptimizationActivity(o[0]);
   checkOptimizationActivity(o[1]);
@@ -2899,7 +2899,7 @@
   if (buildCounterCreativeOptimizationConfiguration < 3) {
     o.id = "foo";
     o.name = "foo";
-    o.optimizationActivitys = buildUnnamed3294();
+    o.optimizationActivitys = buildUnnamed3323();
     o.optimizationModel = "foo";
   }
   buildCounterCreativeOptimizationConfiguration--;
@@ -2912,20 +2912,20 @@
   if (buildCounterCreativeOptimizationConfiguration < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3294(o.optimizationActivitys);
+    checkUnnamed3323(o.optimizationActivitys);
     unittest.expect(o.optimizationModel, unittest.equals('foo'));
   }
   buildCounterCreativeOptimizationConfiguration--;
 }
 
-buildUnnamed3295() {
+buildUnnamed3324() {
   var o = new core.List<api.CreativeAssignment>();
   o.add(buildCreativeAssignment());
   o.add(buildCreativeAssignment());
   return o;
 }
 
-checkUnnamed3295(core.List<api.CreativeAssignment> o) {
+checkUnnamed3324(core.List<api.CreativeAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeAssignment(o[0]);
   checkCreativeAssignment(o[1]);
@@ -2936,7 +2936,7 @@
   var o = new api.CreativeRotation();
   buildCounterCreativeRotation++;
   if (buildCounterCreativeRotation < 3) {
-    o.creativeAssignments = buildUnnamed3295();
+    o.creativeAssignments = buildUnnamed3324();
     o.creativeOptimizationConfigurationId = "foo";
     o.type = "foo";
     o.weightCalculationStrategy = "foo";
@@ -2948,7 +2948,7 @@
 checkCreativeRotation(api.CreativeRotation o) {
   buildCounterCreativeRotation++;
   if (buildCounterCreativeRotation < 3) {
-    checkUnnamed3295(o.creativeAssignments);
+    checkUnnamed3324(o.creativeAssignments);
     unittest.expect(
         o.creativeOptimizationConfigurationId, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -2978,14 +2978,14 @@
   buildCounterCreativeSettings--;
 }
 
-buildUnnamed3296() {
+buildUnnamed3325() {
   var o = new core.List<api.Creative>();
   o.add(buildCreative());
   o.add(buildCreative());
   return o;
 }
 
-checkUnnamed3296(core.List<api.Creative> o) {
+checkUnnamed3325(core.List<api.Creative> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreative(o[0]);
   checkCreative(o[1]);
@@ -2996,7 +2996,7 @@
   var o = new api.CreativesListResponse();
   buildCounterCreativesListResponse++;
   if (buildCounterCreativesListResponse < 3) {
-    o.creatives = buildUnnamed3296();
+    o.creatives = buildUnnamed3325();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3007,60 +3007,60 @@
 checkCreativesListResponse(api.CreativesListResponse o) {
   buildCounterCreativesListResponse++;
   if (buildCounterCreativesListResponse < 3) {
-    checkUnnamed3296(o.creatives);
+    checkUnnamed3325(o.creatives);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCreativesListResponse--;
 }
 
-buildUnnamed3297() {
+buildUnnamed3326() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed3297(core.List<api.Dimension> o) {
+checkUnnamed3326(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed3298() {
+buildUnnamed3327() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed3298(core.List<api.Dimension> o) {
+checkUnnamed3327(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed3299() {
+buildUnnamed3328() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed3299(core.List<api.Metric> o) {
+checkUnnamed3328(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed3300() {
+buildUnnamed3329() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed3300(core.List<api.Metric> o) {
+checkUnnamed3329(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -3071,11 +3071,11 @@
   var o = new api.CrossDimensionReachReportCompatibleFields();
   buildCounterCrossDimensionReachReportCompatibleFields++;
   if (buildCounterCrossDimensionReachReportCompatibleFields < 3) {
-    o.breakdown = buildUnnamed3297();
-    o.dimensionFilters = buildUnnamed3298();
+    o.breakdown = buildUnnamed3326();
+    o.dimensionFilters = buildUnnamed3327();
     o.kind = "foo";
-    o.metrics = buildUnnamed3299();
-    o.overlapMetrics = buildUnnamed3300();
+    o.metrics = buildUnnamed3328();
+    o.overlapMetrics = buildUnnamed3329();
   }
   buildCounterCrossDimensionReachReportCompatibleFields--;
   return o;
@@ -3085,11 +3085,11 @@
     api.CrossDimensionReachReportCompatibleFields o) {
   buildCounterCrossDimensionReachReportCompatibleFields++;
   if (buildCounterCrossDimensionReachReportCompatibleFields < 3) {
-    checkUnnamed3297(o.breakdown);
-    checkUnnamed3298(o.dimensionFilters);
+    checkUnnamed3326(o.breakdown);
+    checkUnnamed3327(o.dimensionFilters);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3299(o.metrics);
-    checkUnnamed3300(o.overlapMetrics);
+    checkUnnamed3328(o.metrics);
+    checkUnnamed3329(o.overlapMetrics);
   }
   buildCounterCrossDimensionReachReportCompatibleFields--;
 }
@@ -3117,14 +3117,14 @@
   buildCounterCustomFloodlightVariable--;
 }
 
-buildUnnamed3301() {
+buildUnnamed3330() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed3301(core.List<api.DimensionValue> o) {
+checkUnnamed3330(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
@@ -3135,7 +3135,7 @@
   var o = new api.CustomRichMediaEvents();
   buildCounterCustomRichMediaEvents++;
   if (buildCounterCustomRichMediaEvents < 3) {
-    o.filteredEventIds = buildUnnamed3301();
+    o.filteredEventIds = buildUnnamed3330();
     o.kind = "foo";
   }
   buildCounterCustomRichMediaEvents--;
@@ -3145,7 +3145,7 @@
 checkCustomRichMediaEvents(api.CustomRichMediaEvents o) {
   buildCounterCustomRichMediaEvents++;
   if (buildCounterCustomRichMediaEvents < 3) {
-    checkUnnamed3301(o.filteredEventIds);
+    checkUnnamed3330(o.filteredEventIds);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomRichMediaEvents--;
@@ -3178,27 +3178,27 @@
   buildCounterDateRange--;
 }
 
-buildUnnamed3302() {
+buildUnnamed3331() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3302(core.List<core.String> o) {
+checkUnnamed3331(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3303() {
+buildUnnamed3332() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed3303(core.List<core.int> o) {
+checkUnnamed3332(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));
@@ -3209,8 +3209,8 @@
   var o = new api.DayPartTargeting();
   buildCounterDayPartTargeting++;
   if (buildCounterDayPartTargeting < 3) {
-    o.daysOfWeek = buildUnnamed3302();
-    o.hoursOfDay = buildUnnamed3303();
+    o.daysOfWeek = buildUnnamed3331();
+    o.hoursOfDay = buildUnnamed3332();
     o.userLocalTime = true;
   }
   buildCounterDayPartTargeting--;
@@ -3220,8 +3220,8 @@
 checkDayPartTargeting(api.DayPartTargeting o) {
   buildCounterDayPartTargeting++;
   if (buildCounterDayPartTargeting < 3) {
-    checkUnnamed3302(o.daysOfWeek);
-    checkUnnamed3303(o.hoursOfDay);
+    checkUnnamed3331(o.daysOfWeek);
+    checkUnnamed3332(o.hoursOfDay);
     unittest.expect(o.userLocalTime, unittest.isTrue);
   }
   buildCounterDayPartTargeting--;
@@ -3374,14 +3374,14 @@
   buildCounterDimensionValue--;
 }
 
-buildUnnamed3304() {
+buildUnnamed3333() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed3304(core.List<api.DimensionValue> o) {
+checkUnnamed3333(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
@@ -3393,7 +3393,7 @@
   buildCounterDimensionValueList++;
   if (buildCounterDimensionValueList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed3304();
+    o.items = buildUnnamed3333();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3405,21 +3405,21 @@
   buildCounterDimensionValueList++;
   if (buildCounterDimensionValueList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed3304(o.items);
+    checkUnnamed3333(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterDimensionValueList--;
 }
 
-buildUnnamed3305() {
+buildUnnamed3334() {
   var o = new core.List<api.DimensionFilter>();
   o.add(buildDimensionFilter());
   o.add(buildDimensionFilter());
   return o;
 }
 
-checkUnnamed3305(core.List<api.DimensionFilter> o) {
+checkUnnamed3334(core.List<api.DimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionFilter(o[0]);
   checkDimensionFilter(o[1]);
@@ -3432,7 +3432,7 @@
   if (buildCounterDimensionValueRequest < 3) {
     o.dimensionName = "foo";
     o.endDate = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.filters = buildUnnamed3305();
+    o.filters = buildUnnamed3334();
     o.kind = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
   }
@@ -3446,7 +3446,7 @@
     unittest.expect(o.dimensionName, unittest.equals('foo'));
     unittest.expect(
         o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed3305(o.filters);
+    checkUnnamed3334(o.filters);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.startDate,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
@@ -3454,40 +3454,40 @@
   buildCounterDimensionValueRequest--;
 }
 
-buildUnnamed3306() {
+buildUnnamed3335() {
   var o = new core.List<api.DirectorySiteContactAssignment>();
   o.add(buildDirectorySiteContactAssignment());
   o.add(buildDirectorySiteContactAssignment());
   return o;
 }
 
-checkUnnamed3306(core.List<api.DirectorySiteContactAssignment> o) {
+checkUnnamed3335(core.List<api.DirectorySiteContactAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectorySiteContactAssignment(o[0]);
   checkDirectorySiteContactAssignment(o[1]);
 }
 
-buildUnnamed3307() {
+buildUnnamed3336() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3307(core.List<core.String> o) {
+checkUnnamed3336(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3308() {
+buildUnnamed3337() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3308(core.List<core.String> o) {
+checkUnnamed3337(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3499,14 +3499,14 @@
   buildCounterDirectorySite++;
   if (buildCounterDirectorySite < 3) {
     o.active = true;
-    o.contactAssignments = buildUnnamed3306();
+    o.contactAssignments = buildUnnamed3335();
     o.countryId = "foo";
     o.currencyId = "foo";
     o.description = "foo";
     o.id = "foo";
     o.idDimensionValue = buildDimensionValue();
-    o.inpageTagFormats = buildUnnamed3307();
-    o.interstitialTagFormats = buildUnnamed3308();
+    o.inpageTagFormats = buildUnnamed3336();
+    o.interstitialTagFormats = buildUnnamed3337();
     o.kind = "foo";
     o.name = "foo";
     o.parentId = "foo";
@@ -3521,14 +3521,14 @@
   buildCounterDirectorySite++;
   if (buildCounterDirectorySite < 3) {
     unittest.expect(o.active, unittest.isTrue);
-    checkUnnamed3306(o.contactAssignments);
+    checkUnnamed3335(o.contactAssignments);
     unittest.expect(o.countryId, unittest.equals('foo'));
     unittest.expect(o.currencyId, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkDimensionValue(o.idDimensionValue);
-    checkUnnamed3307(o.inpageTagFormats);
-    checkUnnamed3308(o.interstitialTagFormats);
+    checkUnnamed3336(o.inpageTagFormats);
+    checkUnnamed3337(o.interstitialTagFormats);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parentId, unittest.equals('foo'));
@@ -3596,14 +3596,14 @@
   buildCounterDirectorySiteContactAssignment--;
 }
 
-buildUnnamed3309() {
+buildUnnamed3338() {
   var o = new core.List<api.DirectorySiteContact>();
   o.add(buildDirectorySiteContact());
   o.add(buildDirectorySiteContact());
   return o;
 }
 
-checkUnnamed3309(core.List<api.DirectorySiteContact> o) {
+checkUnnamed3338(core.List<api.DirectorySiteContact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectorySiteContact(o[0]);
   checkDirectorySiteContact(o[1]);
@@ -3614,7 +3614,7 @@
   var o = new api.DirectorySiteContactsListResponse();
   buildCounterDirectorySiteContactsListResponse++;
   if (buildCounterDirectorySiteContactsListResponse < 3) {
-    o.directorySiteContacts = buildUnnamed3309();
+    o.directorySiteContacts = buildUnnamed3338();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3626,7 +3626,7 @@
     api.DirectorySiteContactsListResponse o) {
   buildCounterDirectorySiteContactsListResponse++;
   if (buildCounterDirectorySiteContactsListResponse < 3) {
-    checkUnnamed3309(o.directorySiteContacts);
+    checkUnnamed3338(o.directorySiteContacts);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -3664,14 +3664,14 @@
   buildCounterDirectorySiteSettings--;
 }
 
-buildUnnamed3310() {
+buildUnnamed3339() {
   var o = new core.List<api.DirectorySite>();
   o.add(buildDirectorySite());
   o.add(buildDirectorySite());
   return o;
 }
 
-checkUnnamed3310(core.List<api.DirectorySite> o) {
+checkUnnamed3339(core.List<api.DirectorySite> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectorySite(o[0]);
   checkDirectorySite(o[1]);
@@ -3682,7 +3682,7 @@
   var o = new api.DirectorySitesListResponse();
   buildCounterDirectorySitesListResponse++;
   if (buildCounterDirectorySitesListResponse < 3) {
-    o.directorySites = buildUnnamed3310();
+    o.directorySites = buildUnnamed3339();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3693,7 +3693,7 @@
 checkDirectorySitesListResponse(api.DirectorySitesListResponse o) {
   buildCounterDirectorySitesListResponse++;
   if (buildCounterDirectorySitesListResponse < 3) {
-    checkUnnamed3310(o.directorySites);
+    checkUnnamed3339(o.directorySites);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -3725,14 +3725,14 @@
   buildCounterDynamicTargetingKey--;
 }
 
-buildUnnamed3311() {
+buildUnnamed3340() {
   var o = new core.List<api.DynamicTargetingKey>();
   o.add(buildDynamicTargetingKey());
   o.add(buildDynamicTargetingKey());
   return o;
 }
 
-checkUnnamed3311(core.List<api.DynamicTargetingKey> o) {
+checkUnnamed3340(core.List<api.DynamicTargetingKey> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDynamicTargetingKey(o[0]);
   checkDynamicTargetingKey(o[1]);
@@ -3743,7 +3743,7 @@
   var o = new api.DynamicTargetingKeysListResponse();
   buildCounterDynamicTargetingKeysListResponse++;
   if (buildCounterDynamicTargetingKeysListResponse < 3) {
-    o.dynamicTargetingKeys = buildUnnamed3311();
+    o.dynamicTargetingKeys = buildUnnamed3340();
     o.kind = "foo";
   }
   buildCounterDynamicTargetingKeysListResponse--;
@@ -3753,7 +3753,7 @@
 checkDynamicTargetingKeysListResponse(api.DynamicTargetingKeysListResponse o) {
   buildCounterDynamicTargetingKeysListResponse++;
   if (buildCounterDynamicTargetingKeysListResponse < 3) {
-    checkUnnamed3311(o.dynamicTargetingKeys);
+    checkUnnamed3340(o.dynamicTargetingKeys);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDynamicTargetingKeysListResponse--;
@@ -3784,14 +3784,14 @@
   buildCounterEncryptionInfo--;
 }
 
-buildUnnamed3312() {
+buildUnnamed3341() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3312(core.List<core.String> o) {
+checkUnnamed3341(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3813,7 +3813,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.siteFilterType = "foo";
-    o.siteIds = buildUnnamed3312();
+    o.siteIds = buildUnnamed3341();
     o.sslCompliant = true;
     o.status = "foo";
     o.subaccountId = "foo";
@@ -3839,7 +3839,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.siteFilterType, unittest.equals('foo'));
-    checkUnnamed3312(o.siteIds);
+    checkUnnamed3341(o.siteIds);
     unittest.expect(o.sslCompliant, unittest.isTrue);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.subaccountId, unittest.equals('foo'));
@@ -3871,14 +3871,14 @@
   buildCounterEventTagOverride--;
 }
 
-buildUnnamed3313() {
+buildUnnamed3342() {
   var o = new core.List<api.EventTag>();
   o.add(buildEventTag());
   o.add(buildEventTag());
   return o;
 }
 
-checkUnnamed3313(core.List<api.EventTag> o) {
+checkUnnamed3342(core.List<api.EventTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventTag(o[0]);
   checkEventTag(o[1]);
@@ -3889,7 +3889,7 @@
   var o = new api.EventTagsListResponse();
   buildCounterEventTagsListResponse++;
   if (buildCounterEventTagsListResponse < 3) {
-    o.eventTags = buildUnnamed3313();
+    o.eventTags = buildUnnamed3342();
     o.kind = "foo";
   }
   buildCounterEventTagsListResponse--;
@@ -3899,7 +3899,7 @@
 checkEventTagsListResponse(api.EventTagsListResponse o) {
   buildCounterEventTagsListResponse++;
   if (buildCounterEventTagsListResponse < 3) {
-    checkUnnamed3313(o.eventTags);
+    checkUnnamed3342(o.eventTags);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterEventTagsListResponse--;
@@ -3963,14 +3963,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed3314() {
+buildUnnamed3343() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed3314(core.List<api.File> o) {
+checkUnnamed3343(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -3982,7 +3982,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed3314();
+    o.items = buildUnnamed3343();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3994,7 +3994,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed3314(o.items);
+    checkUnnamed3343(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -4050,14 +4050,14 @@
   buildCounterFloodlightActivitiesGenerateTagResponse--;
 }
 
-buildUnnamed3315() {
+buildUnnamed3344() {
   var o = new core.List<api.FloodlightActivity>();
   o.add(buildFloodlightActivity());
   o.add(buildFloodlightActivity());
   return o;
 }
 
-checkUnnamed3315(core.List<api.FloodlightActivity> o) {
+checkUnnamed3344(core.List<api.FloodlightActivity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFloodlightActivity(o[0]);
   checkFloodlightActivity(o[1]);
@@ -4068,7 +4068,7 @@
   var o = new api.FloodlightActivitiesListResponse();
   buildCounterFloodlightActivitiesListResponse++;
   if (buildCounterFloodlightActivitiesListResponse < 3) {
-    o.floodlightActivities = buildUnnamed3315();
+    o.floodlightActivities = buildUnnamed3344();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -4079,47 +4079,47 @@
 checkFloodlightActivitiesListResponse(api.FloodlightActivitiesListResponse o) {
   buildCounterFloodlightActivitiesListResponse++;
   if (buildCounterFloodlightActivitiesListResponse < 3) {
-    checkUnnamed3315(o.floodlightActivities);
+    checkUnnamed3344(o.floodlightActivities);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterFloodlightActivitiesListResponse--;
 }
 
-buildUnnamed3316() {
+buildUnnamed3345() {
   var o = new core.List<api.FloodlightActivityDynamicTag>();
   o.add(buildFloodlightActivityDynamicTag());
   o.add(buildFloodlightActivityDynamicTag());
   return o;
 }
 
-checkUnnamed3316(core.List<api.FloodlightActivityDynamicTag> o) {
+checkUnnamed3345(core.List<api.FloodlightActivityDynamicTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFloodlightActivityDynamicTag(o[0]);
   checkFloodlightActivityDynamicTag(o[1]);
 }
 
-buildUnnamed3317() {
+buildUnnamed3346() {
   var o = new core.List<api.FloodlightActivityPublisherDynamicTag>();
   o.add(buildFloodlightActivityPublisherDynamicTag());
   o.add(buildFloodlightActivityPublisherDynamicTag());
   return o;
 }
 
-checkUnnamed3317(core.List<api.FloodlightActivityPublisherDynamicTag> o) {
+checkUnnamed3346(core.List<api.FloodlightActivityPublisherDynamicTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFloodlightActivityPublisherDynamicTag(o[0]);
   checkFloodlightActivityPublisherDynamicTag(o[1]);
 }
 
-buildUnnamed3318() {
+buildUnnamed3347() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3318(core.List<core.String> o) {
+checkUnnamed3347(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -4135,7 +4135,7 @@
     o.advertiserIdDimensionValue = buildDimensionValue();
     o.cacheBustingType = "foo";
     o.countingMethod = "foo";
-    o.defaultTags = buildUnnamed3316();
+    o.defaultTags = buildUnnamed3345();
     o.expectedUrl = "foo";
     o.floodlightActivityGroupId = "foo";
     o.floodlightActivityGroupName = "foo";
@@ -4150,14 +4150,14 @@
     o.kind = "foo";
     o.name = "foo";
     o.notes = "foo";
-    o.publisherTags = buildUnnamed3317();
+    o.publisherTags = buildUnnamed3346();
     o.secure = true;
     o.sslCompliant = true;
     o.sslRequired = true;
     o.subaccountId = "foo";
     o.tagFormat = "foo";
     o.tagString = "foo";
-    o.userDefinedVariableTypes = buildUnnamed3318();
+    o.userDefinedVariableTypes = buildUnnamed3347();
   }
   buildCounterFloodlightActivity--;
   return o;
@@ -4171,7 +4171,7 @@
     checkDimensionValue(o.advertiserIdDimensionValue);
     unittest.expect(o.cacheBustingType, unittest.equals('foo'));
     unittest.expect(o.countingMethod, unittest.equals('foo'));
-    checkUnnamed3316(o.defaultTags);
+    checkUnnamed3345(o.defaultTags);
     unittest.expect(o.expectedUrl, unittest.equals('foo'));
     unittest.expect(o.floodlightActivityGroupId, unittest.equals('foo'));
     unittest.expect(o.floodlightActivityGroupName, unittest.equals('foo'));
@@ -4186,14 +4186,14 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkUnnamed3317(o.publisherTags);
+    checkUnnamed3346(o.publisherTags);
     unittest.expect(o.secure, unittest.isTrue);
     unittest.expect(o.sslCompliant, unittest.isTrue);
     unittest.expect(o.sslRequired, unittest.isTrue);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
     unittest.expect(o.tagFormat, unittest.equals('foo'));
     unittest.expect(o.tagString, unittest.equals('foo'));
-    checkUnnamed3318(o.userDefinedVariableTypes);
+    checkUnnamed3347(o.userDefinedVariableTypes);
   }
   buildCounterFloodlightActivity--;
 }
@@ -4262,14 +4262,14 @@
   buildCounterFloodlightActivityGroup--;
 }
 
-buildUnnamed3319() {
+buildUnnamed3348() {
   var o = new core.List<api.FloodlightActivityGroup>();
   o.add(buildFloodlightActivityGroup());
   o.add(buildFloodlightActivityGroup());
   return o;
 }
 
-checkUnnamed3319(core.List<api.FloodlightActivityGroup> o) {
+checkUnnamed3348(core.List<api.FloodlightActivityGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFloodlightActivityGroup(o[0]);
   checkFloodlightActivityGroup(o[1]);
@@ -4280,7 +4280,7 @@
   var o = new api.FloodlightActivityGroupsListResponse();
   buildCounterFloodlightActivityGroupsListResponse++;
   if (buildCounterFloodlightActivityGroupsListResponse < 3) {
-    o.floodlightActivityGroups = buildUnnamed3319();
+    o.floodlightActivityGroups = buildUnnamed3348();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -4292,7 +4292,7 @@
     api.FloodlightActivityGroupsListResponse o) {
   buildCounterFloodlightActivityGroupsListResponse++;
   if (buildCounterFloodlightActivityGroupsListResponse < 3) {
-    checkUnnamed3319(o.floodlightActivityGroups);
+    checkUnnamed3348(o.floodlightActivityGroups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -4329,27 +4329,27 @@
   buildCounterFloodlightActivityPublisherDynamicTag--;
 }
 
-buildUnnamed3320() {
+buildUnnamed3349() {
   var o = new core.List<api.ThirdPartyAuthenticationToken>();
   o.add(buildThirdPartyAuthenticationToken());
   o.add(buildThirdPartyAuthenticationToken());
   return o;
 }
 
-checkUnnamed3320(core.List<api.ThirdPartyAuthenticationToken> o) {
+checkUnnamed3349(core.List<api.ThirdPartyAuthenticationToken> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThirdPartyAuthenticationToken(o[0]);
   checkThirdPartyAuthenticationToken(o[1]);
 }
 
-buildUnnamed3321() {
+buildUnnamed3350() {
   var o = new core.List<api.UserDefinedVariableConfiguration>();
   o.add(buildUserDefinedVariableConfiguration());
   o.add(buildUserDefinedVariableConfiguration());
   return o;
 }
 
-checkUnnamed3321(core.List<api.UserDefinedVariableConfiguration> o) {
+checkUnnamed3350(core.List<api.UserDefinedVariableConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserDefinedVariableConfiguration(o[0]);
   checkUserDefinedVariableConfiguration(o[1]);
@@ -4375,8 +4375,8 @@
     o.omnitureSettings = buildOmnitureSettings();
     o.subaccountId = "foo";
     o.tagSettings = buildTagSettings();
-    o.thirdPartyAuthenticationTokens = buildUnnamed3320();
-    o.userDefinedVariableConfigurations = buildUnnamed3321();
+    o.thirdPartyAuthenticationTokens = buildUnnamed3349();
+    o.userDefinedVariableConfigurations = buildUnnamed3350();
   }
   buildCounterFloodlightConfiguration--;
   return o;
@@ -4401,20 +4401,20 @@
     checkOmnitureSettings(o.omnitureSettings);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
     checkTagSettings(o.tagSettings);
-    checkUnnamed3320(o.thirdPartyAuthenticationTokens);
-    checkUnnamed3321(o.userDefinedVariableConfigurations);
+    checkUnnamed3349(o.thirdPartyAuthenticationTokens);
+    checkUnnamed3350(o.userDefinedVariableConfigurations);
   }
   buildCounterFloodlightConfiguration--;
 }
 
-buildUnnamed3322() {
+buildUnnamed3351() {
   var o = new core.List<api.FloodlightConfiguration>();
   o.add(buildFloodlightConfiguration());
   o.add(buildFloodlightConfiguration());
   return o;
 }
 
-checkUnnamed3322(core.List<api.FloodlightConfiguration> o) {
+checkUnnamed3351(core.List<api.FloodlightConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFloodlightConfiguration(o[0]);
   checkFloodlightConfiguration(o[1]);
@@ -4425,7 +4425,7 @@
   var o = new api.FloodlightConfigurationsListResponse();
   buildCounterFloodlightConfigurationsListResponse++;
   if (buildCounterFloodlightConfigurationsListResponse < 3) {
-    o.floodlightConfigurations = buildUnnamed3322();
+    o.floodlightConfigurations = buildUnnamed3351();
     o.kind = "foo";
   }
   buildCounterFloodlightConfigurationsListResponse--;
@@ -4436,46 +4436,46 @@
     api.FloodlightConfigurationsListResponse o) {
   buildCounterFloodlightConfigurationsListResponse++;
   if (buildCounterFloodlightConfigurationsListResponse < 3) {
-    checkUnnamed3322(o.floodlightConfigurations);
+    checkUnnamed3351(o.floodlightConfigurations);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterFloodlightConfigurationsListResponse--;
 }
 
-buildUnnamed3323() {
+buildUnnamed3352() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed3323(core.List<api.Dimension> o) {
+checkUnnamed3352(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed3324() {
+buildUnnamed3353() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed3324(core.List<api.Dimension> o) {
+checkUnnamed3353(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed3325() {
+buildUnnamed3354() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed3325(core.List<api.Metric> o) {
+checkUnnamed3354(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -4486,10 +4486,10 @@
   var o = new api.FloodlightReportCompatibleFields();
   buildCounterFloodlightReportCompatibleFields++;
   if (buildCounterFloodlightReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed3323();
-    o.dimensions = buildUnnamed3324();
+    o.dimensionFilters = buildUnnamed3352();
+    o.dimensions = buildUnnamed3353();
     o.kind = "foo";
-    o.metrics = buildUnnamed3325();
+    o.metrics = buildUnnamed3354();
   }
   buildCounterFloodlightReportCompatibleFields--;
   return o;
@@ -4498,10 +4498,10 @@
 checkFloodlightReportCompatibleFields(api.FloodlightReportCompatibleFields o) {
   buildCounterFloodlightReportCompatibleFields++;
   if (buildCounterFloodlightReportCompatibleFields < 3) {
-    checkUnnamed3323(o.dimensionFilters);
-    checkUnnamed3324(o.dimensions);
+    checkUnnamed3352(o.dimensionFilters);
+    checkUnnamed3353(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3325(o.metrics);
+    checkUnnamed3354(o.metrics);
   }
   buildCounterFloodlightReportCompatibleFields--;
 }
@@ -4554,66 +4554,66 @@
   buildCounterFsCommand--;
 }
 
-buildUnnamed3326() {
+buildUnnamed3355() {
   var o = new core.List<api.City>();
   o.add(buildCity());
   o.add(buildCity());
   return o;
 }
 
-checkUnnamed3326(core.List<api.City> o) {
+checkUnnamed3355(core.List<api.City> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCity(o[0]);
   checkCity(o[1]);
 }
 
-buildUnnamed3327() {
+buildUnnamed3356() {
   var o = new core.List<api.Country>();
   o.add(buildCountry());
   o.add(buildCountry());
   return o;
 }
 
-checkUnnamed3327(core.List<api.Country> o) {
+checkUnnamed3356(core.List<api.Country> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCountry(o[0]);
   checkCountry(o[1]);
 }
 
-buildUnnamed3328() {
+buildUnnamed3357() {
   var o = new core.List<api.Metro>();
   o.add(buildMetro());
   o.add(buildMetro());
   return o;
 }
 
-checkUnnamed3328(core.List<api.Metro> o) {
+checkUnnamed3357(core.List<api.Metro> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetro(o[0]);
   checkMetro(o[1]);
 }
 
-buildUnnamed3329() {
+buildUnnamed3358() {
   var o = new core.List<api.PostalCode>();
   o.add(buildPostalCode());
   o.add(buildPostalCode());
   return o;
 }
 
-checkUnnamed3329(core.List<api.PostalCode> o) {
+checkUnnamed3358(core.List<api.PostalCode> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostalCode(o[0]);
   checkPostalCode(o[1]);
 }
 
-buildUnnamed3330() {
+buildUnnamed3359() {
   var o = new core.List<api.Region>();
   o.add(buildRegion());
   o.add(buildRegion());
   return o;
 }
 
-checkUnnamed3330(core.List<api.Region> o) {
+checkUnnamed3359(core.List<api.Region> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegion(o[0]);
   checkRegion(o[1]);
@@ -4624,12 +4624,12 @@
   var o = new api.GeoTargeting();
   buildCounterGeoTargeting++;
   if (buildCounterGeoTargeting < 3) {
-    o.cities = buildUnnamed3326();
-    o.countries = buildUnnamed3327();
+    o.cities = buildUnnamed3355();
+    o.countries = buildUnnamed3356();
     o.excludeCountries = true;
-    o.metros = buildUnnamed3328();
-    o.postalCodes = buildUnnamed3329();
-    o.regions = buildUnnamed3330();
+    o.metros = buildUnnamed3357();
+    o.postalCodes = buildUnnamed3358();
+    o.regions = buildUnnamed3359();
   }
   buildCounterGeoTargeting--;
   return o;
@@ -4638,24 +4638,24 @@
 checkGeoTargeting(api.GeoTargeting o) {
   buildCounterGeoTargeting++;
   if (buildCounterGeoTargeting < 3) {
-    checkUnnamed3326(o.cities);
-    checkUnnamed3327(o.countries);
+    checkUnnamed3355(o.cities);
+    checkUnnamed3356(o.countries);
     unittest.expect(o.excludeCountries, unittest.isTrue);
-    checkUnnamed3328(o.metros);
-    checkUnnamed3329(o.postalCodes);
-    checkUnnamed3330(o.regions);
+    checkUnnamed3357(o.metros);
+    checkUnnamed3358(o.postalCodes);
+    checkUnnamed3359(o.regions);
   }
   buildCounterGeoTargeting--;
 }
 
-buildUnnamed3331() {
+buildUnnamed3360() {
   var o = new core.List<api.AdSlot>();
   o.add(buildAdSlot());
   o.add(buildAdSlot());
   return o;
 }
 
-checkUnnamed3331(core.List<api.AdSlot> o) {
+checkUnnamed3360(core.List<api.AdSlot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdSlot(o[0]);
   checkAdSlot(o[1]);
@@ -4667,7 +4667,7 @@
   buildCounterInventoryItem++;
   if (buildCounterInventoryItem < 3) {
     o.accountId = "foo";
-    o.adSlots = buildUnnamed3331();
+    o.adSlots = buildUnnamed3360();
     o.advertiserId = "foo";
     o.contentCategoryId = "foo";
     o.estimatedClickThroughRate = "foo";
@@ -4695,7 +4695,7 @@
   buildCounterInventoryItem++;
   if (buildCounterInventoryItem < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed3331(o.adSlots);
+    checkUnnamed3360(o.adSlots);
     unittest.expect(o.advertiserId, unittest.equals('foo'));
     unittest.expect(o.contentCategoryId, unittest.equals('foo'));
     unittest.expect(o.estimatedClickThroughRate, unittest.equals('foo'));
@@ -4718,14 +4718,14 @@
   buildCounterInventoryItem--;
 }
 
-buildUnnamed3332() {
+buildUnnamed3361() {
   var o = new core.List<api.InventoryItem>();
   o.add(buildInventoryItem());
   o.add(buildInventoryItem());
   return o;
 }
 
-checkUnnamed3332(core.List<api.InventoryItem> o) {
+checkUnnamed3361(core.List<api.InventoryItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInventoryItem(o[0]);
   checkInventoryItem(o[1]);
@@ -4736,7 +4736,7 @@
   var o = new api.InventoryItemsListResponse();
   buildCounterInventoryItemsListResponse++;
   if (buildCounterInventoryItemsListResponse < 3) {
-    o.inventoryItems = buildUnnamed3332();
+    o.inventoryItems = buildUnnamed3361();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -4747,7 +4747,7 @@
 checkInventoryItemsListResponse(api.InventoryItemsListResponse o) {
   buildCounterInventoryItemsListResponse++;
   if (buildCounterInventoryItemsListResponse < 3) {
-    checkUnnamed3332(o.inventoryItems);
+    checkUnnamed3361(o.inventoryItems);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -4800,14 +4800,14 @@
   buildCounterLandingPage--;
 }
 
-buildUnnamed3333() {
+buildUnnamed3362() {
   var o = new core.List<api.LandingPage>();
   o.add(buildLandingPage());
   o.add(buildLandingPage());
   return o;
 }
 
-checkUnnamed3333(core.List<api.LandingPage> o) {
+checkUnnamed3362(core.List<api.LandingPage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLandingPage(o[0]);
   checkLandingPage(o[1]);
@@ -4819,7 +4819,7 @@
   buildCounterLandingPagesListResponse++;
   if (buildCounterLandingPagesListResponse < 3) {
     o.kind = "foo";
-    o.landingPages = buildUnnamed3333();
+    o.landingPages = buildUnnamed3362();
   }
   buildCounterLandingPagesListResponse--;
   return o;
@@ -4829,7 +4829,7 @@
   buildCounterLandingPagesListResponse++;
   if (buildCounterLandingPagesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3333(o.landingPages);
+    checkUnnamed3362(o.landingPages);
   }
   buildCounterLandingPagesListResponse--;
 }
@@ -4859,14 +4859,14 @@
   buildCounterLanguage--;
 }
 
-buildUnnamed3334() {
+buildUnnamed3363() {
   var o = new core.List<api.Language>();
   o.add(buildLanguage());
   o.add(buildLanguage());
   return o;
 }
 
-checkUnnamed3334(core.List<api.Language> o) {
+checkUnnamed3363(core.List<api.Language> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLanguage(o[0]);
   checkLanguage(o[1]);
@@ -4877,7 +4877,7 @@
   var o = new api.LanguageTargeting();
   buildCounterLanguageTargeting++;
   if (buildCounterLanguageTargeting < 3) {
-    o.languages = buildUnnamed3334();
+    o.languages = buildUnnamed3363();
   }
   buildCounterLanguageTargeting--;
   return o;
@@ -4886,19 +4886,19 @@
 checkLanguageTargeting(api.LanguageTargeting o) {
   buildCounterLanguageTargeting++;
   if (buildCounterLanguageTargeting < 3) {
-    checkUnnamed3334(o.languages);
+    checkUnnamed3363(o.languages);
   }
   buildCounterLanguageTargeting--;
 }
 
-buildUnnamed3335() {
+buildUnnamed3364() {
   var o = new core.List<api.Language>();
   o.add(buildLanguage());
   o.add(buildLanguage());
   return o;
 }
 
-checkUnnamed3335(core.List<api.Language> o) {
+checkUnnamed3364(core.List<api.Language> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLanguage(o[0]);
   checkLanguage(o[1]);
@@ -4910,7 +4910,7 @@
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
     o.kind = "foo";
-    o.languages = buildUnnamed3335();
+    o.languages = buildUnnamed3364();
   }
   buildCounterLanguagesListResponse--;
   return o;
@@ -4920,7 +4920,7 @@
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3335(o.languages);
+    checkUnnamed3364(o.languages);
   }
   buildCounterLanguagesListResponse--;
 }
@@ -4944,14 +4944,14 @@
   buildCounterLastModifiedInfo--;
 }
 
-buildUnnamed3336() {
+buildUnnamed3365() {
   var o = new core.List<api.ListPopulationTerm>();
   o.add(buildListPopulationTerm());
   o.add(buildListPopulationTerm());
   return o;
 }
 
-checkUnnamed3336(core.List<api.ListPopulationTerm> o) {
+checkUnnamed3365(core.List<api.ListPopulationTerm> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListPopulationTerm(o[0]);
   checkListPopulationTerm(o[1]);
@@ -4962,7 +4962,7 @@
   var o = new api.ListPopulationClause();
   buildCounterListPopulationClause++;
   if (buildCounterListPopulationClause < 3) {
-    o.terms = buildUnnamed3336();
+    o.terms = buildUnnamed3365();
   }
   buildCounterListPopulationClause--;
   return o;
@@ -4971,19 +4971,19 @@
 checkListPopulationClause(api.ListPopulationClause o) {
   buildCounterListPopulationClause++;
   if (buildCounterListPopulationClause < 3) {
-    checkUnnamed3336(o.terms);
+    checkUnnamed3365(o.terms);
   }
   buildCounterListPopulationClause--;
 }
 
-buildUnnamed3337() {
+buildUnnamed3366() {
   var o = new core.List<api.ListPopulationClause>();
   o.add(buildListPopulationClause());
   o.add(buildListPopulationClause());
   return o;
 }
 
-checkUnnamed3337(core.List<api.ListPopulationClause> o) {
+checkUnnamed3366(core.List<api.ListPopulationClause> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListPopulationClause(o[0]);
   checkListPopulationClause(o[1]);
@@ -4996,7 +4996,7 @@
   if (buildCounterListPopulationRule < 3) {
     o.floodlightActivityId = "foo";
     o.floodlightActivityName = "foo";
-    o.listPopulationClauses = buildUnnamed3337();
+    o.listPopulationClauses = buildUnnamed3366();
   }
   buildCounterListPopulationRule--;
   return o;
@@ -5007,7 +5007,7 @@
   if (buildCounterListPopulationRule < 3) {
     unittest.expect(o.floodlightActivityId, unittest.equals('foo'));
     unittest.expect(o.floodlightActivityName, unittest.equals('foo'));
-    checkUnnamed3337(o.listPopulationClauses);
+    checkUnnamed3366(o.listPopulationClauses);
   }
   buildCounterListPopulationRule--;
 }
@@ -5137,14 +5137,14 @@
   buildCounterMetro--;
 }
 
-buildUnnamed3338() {
+buildUnnamed3367() {
   var o = new core.List<api.Metro>();
   o.add(buildMetro());
   o.add(buildMetro());
   return o;
 }
 
-checkUnnamed3338(core.List<api.Metro> o) {
+checkUnnamed3367(core.List<api.Metro> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetro(o[0]);
   checkMetro(o[1]);
@@ -5156,7 +5156,7 @@
   buildCounterMetrosListResponse++;
   if (buildCounterMetrosListResponse < 3) {
     o.kind = "foo";
-    o.metros = buildUnnamed3338();
+    o.metros = buildUnnamed3367();
   }
   buildCounterMetrosListResponse--;
   return o;
@@ -5166,7 +5166,7 @@
   buildCounterMetrosListResponse++;
   if (buildCounterMetrosListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3338(o.metros);
+    checkUnnamed3367(o.metros);
   }
   buildCounterMetrosListResponse--;
 }
@@ -5198,14 +5198,14 @@
   buildCounterMobileCarrier--;
 }
 
-buildUnnamed3339() {
+buildUnnamed3368() {
   var o = new core.List<api.MobileCarrier>();
   o.add(buildMobileCarrier());
   o.add(buildMobileCarrier());
   return o;
 }
 
-checkUnnamed3339(core.List<api.MobileCarrier> o) {
+checkUnnamed3368(core.List<api.MobileCarrier> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileCarrier(o[0]);
   checkMobileCarrier(o[1]);
@@ -5217,7 +5217,7 @@
   buildCounterMobileCarriersListResponse++;
   if (buildCounterMobileCarriersListResponse < 3) {
     o.kind = "foo";
-    o.mobileCarriers = buildUnnamed3339();
+    o.mobileCarriers = buildUnnamed3368();
   }
   buildCounterMobileCarriersListResponse--;
   return o;
@@ -5227,19 +5227,19 @@
   buildCounterMobileCarriersListResponse++;
   if (buildCounterMobileCarriersListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3339(o.mobileCarriers);
+    checkUnnamed3368(o.mobileCarriers);
   }
   buildCounterMobileCarriersListResponse--;
 }
 
-buildUnnamed3340() {
+buildUnnamed3369() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3340(core.List<core.String> o) {
+checkUnnamed3369(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5251,7 +5251,7 @@
   buildCounterObjectFilter++;
   if (buildCounterObjectFilter < 3) {
     o.kind = "foo";
-    o.objectIds = buildUnnamed3340();
+    o.objectIds = buildUnnamed3369();
     o.status = "foo";
   }
   buildCounterObjectFilter--;
@@ -5262,7 +5262,7 @@
   buildCounterObjectFilter++;
   if (buildCounterObjectFilter < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3340(o.objectIds);
+    checkUnnamed3369(o.objectIds);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterObjectFilter--;
@@ -5366,14 +5366,14 @@
   buildCounterOperatingSystemVersion--;
 }
 
-buildUnnamed3341() {
+buildUnnamed3370() {
   var o = new core.List<api.OperatingSystemVersion>();
   o.add(buildOperatingSystemVersion());
   o.add(buildOperatingSystemVersion());
   return o;
 }
 
-checkUnnamed3341(core.List<api.OperatingSystemVersion> o) {
+checkUnnamed3370(core.List<api.OperatingSystemVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperatingSystemVersion(o[0]);
   checkOperatingSystemVersion(o[1]);
@@ -5385,7 +5385,7 @@
   buildCounterOperatingSystemVersionsListResponse++;
   if (buildCounterOperatingSystemVersionsListResponse < 3) {
     o.kind = "foo";
-    o.operatingSystemVersions = buildUnnamed3341();
+    o.operatingSystemVersions = buildUnnamed3370();
   }
   buildCounterOperatingSystemVersionsListResponse--;
   return o;
@@ -5396,19 +5396,19 @@
   buildCounterOperatingSystemVersionsListResponse++;
   if (buildCounterOperatingSystemVersionsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3341(o.operatingSystemVersions);
+    checkUnnamed3370(o.operatingSystemVersions);
   }
   buildCounterOperatingSystemVersionsListResponse--;
 }
 
-buildUnnamed3342() {
+buildUnnamed3371() {
   var o = new core.List<api.OperatingSystem>();
   o.add(buildOperatingSystem());
   o.add(buildOperatingSystem());
   return o;
 }
 
-checkUnnamed3342(core.List<api.OperatingSystem> o) {
+checkUnnamed3371(core.List<api.OperatingSystem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperatingSystem(o[0]);
   checkOperatingSystem(o[1]);
@@ -5420,7 +5420,7 @@
   buildCounterOperatingSystemsListResponse++;
   if (buildCounterOperatingSystemsListResponse < 3) {
     o.kind = "foo";
-    o.operatingSystems = buildUnnamed3342();
+    o.operatingSystems = buildUnnamed3371();
   }
   buildCounterOperatingSystemsListResponse--;
   return o;
@@ -5430,7 +5430,7 @@
   buildCounterOperatingSystemsListResponse++;
   if (buildCounterOperatingSystemsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3342(o.operatingSystems);
+    checkUnnamed3371(o.operatingSystems);
   }
   buildCounterOperatingSystemsListResponse--;
 }
@@ -5458,53 +5458,53 @@
   buildCounterOptimizationActivity--;
 }
 
-buildUnnamed3343() {
+buildUnnamed3372() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3343(core.List<core.String> o) {
+checkUnnamed3372(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3344() {
+buildUnnamed3373() {
   var o = new core.List<api.OrderContact>();
   o.add(buildOrderContact());
   o.add(buildOrderContact());
   return o;
 }
 
-checkUnnamed3344(core.List<api.OrderContact> o) {
+checkUnnamed3373(core.List<api.OrderContact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderContact(o[0]);
   checkOrderContact(o[1]);
 }
 
-buildUnnamed3345() {
+buildUnnamed3374() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3345(core.List<core.String> o) {
+checkUnnamed3374(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3346() {
+buildUnnamed3375() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3346(core.List<core.String> o) {
+checkUnnamed3375(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5517,11 +5517,11 @@
   if (buildCounterOrder < 3) {
     o.accountId = "foo";
     o.advertiserId = "foo";
-    o.approverUserProfileIds = buildUnnamed3343();
+    o.approverUserProfileIds = buildUnnamed3372();
     o.buyerInvoiceId = "foo";
     o.buyerOrganizationName = "foo";
     o.comments = "foo";
-    o.contacts = buildUnnamed3344();
+    o.contacts = buildUnnamed3373();
     o.id = "foo";
     o.kind = "foo";
     o.lastModifiedInfo = buildLastModifiedInfo();
@@ -5531,8 +5531,8 @@
     o.projectId = "foo";
     o.sellerOrderId = "foo";
     o.sellerOrganizationName = "foo";
-    o.siteId = buildUnnamed3345();
-    o.siteNames = buildUnnamed3346();
+    o.siteId = buildUnnamed3374();
+    o.siteNames = buildUnnamed3375();
     o.subaccountId = "foo";
     o.termsAndConditions = "foo";
   }
@@ -5545,11 +5545,11 @@
   if (buildCounterOrder < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkUnnamed3343(o.approverUserProfileIds);
+    checkUnnamed3372(o.approverUserProfileIds);
     unittest.expect(o.buyerInvoiceId, unittest.equals('foo'));
     unittest.expect(o.buyerOrganizationName, unittest.equals('foo'));
     unittest.expect(o.comments, unittest.equals('foo'));
-    checkUnnamed3344(o.contacts);
+    checkUnnamed3373(o.contacts);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkLastModifiedInfo(o.lastModifiedInfo);
@@ -5559,8 +5559,8 @@
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.sellerOrderId, unittest.equals('foo'));
     unittest.expect(o.sellerOrganizationName, unittest.equals('foo'));
-    checkUnnamed3345(o.siteId);
-    checkUnnamed3346(o.siteNames);
+    checkUnnamed3374(o.siteId);
+    checkUnnamed3375(o.siteNames);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
     unittest.expect(o.termsAndConditions, unittest.equals('foo'));
   }
@@ -5594,27 +5594,27 @@
   buildCounterOrderContact--;
 }
 
-buildUnnamed3347() {
+buildUnnamed3376() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3347(core.List<core.String> o) {
+checkUnnamed3376(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3348() {
+buildUnnamed3377() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3348(core.List<core.String> o) {
+checkUnnamed3377(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5628,13 +5628,13 @@
     o.accountId = "foo";
     o.advertiserId = "foo";
     o.amendedOrderDocumentId = "foo";
-    o.approvedByUserProfileIds = buildUnnamed3347();
+    o.approvedByUserProfileIds = buildUnnamed3376();
     o.cancelled = true;
     o.createdInfo = buildLastModifiedInfo();
     o.effectiveDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.id = "foo";
     o.kind = "foo";
-    o.lastSentRecipients = buildUnnamed3348();
+    o.lastSentRecipients = buildUnnamed3377();
     o.lastSentTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.orderId = "foo";
     o.projectId = "foo";
@@ -5653,14 +5653,14 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
     unittest.expect(o.amendedOrderDocumentId, unittest.equals('foo'));
-    checkUnnamed3347(o.approvedByUserProfileIds);
+    checkUnnamed3376(o.approvedByUserProfileIds);
     unittest.expect(o.cancelled, unittest.isTrue);
     checkLastModifiedInfo(o.createdInfo);
     unittest.expect(o.effectiveDate,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3348(o.lastSentRecipients);
+    checkUnnamed3377(o.lastSentRecipients);
     unittest.expect(o.lastSentTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.orderId, unittest.equals('foo'));
@@ -5673,14 +5673,14 @@
   buildCounterOrderDocument--;
 }
 
-buildUnnamed3349() {
+buildUnnamed3378() {
   var o = new core.List<api.OrderDocument>();
   o.add(buildOrderDocument());
   o.add(buildOrderDocument());
   return o;
 }
 
-checkUnnamed3349(core.List<api.OrderDocument> o) {
+checkUnnamed3378(core.List<api.OrderDocument> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderDocument(o[0]);
   checkOrderDocument(o[1]);
@@ -5693,7 +5693,7 @@
   if (buildCounterOrderDocumentsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.orderDocuments = buildUnnamed3349();
+    o.orderDocuments = buildUnnamed3378();
   }
   buildCounterOrderDocumentsListResponse--;
   return o;
@@ -5704,19 +5704,19 @@
   if (buildCounterOrderDocumentsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3349(o.orderDocuments);
+    checkUnnamed3378(o.orderDocuments);
   }
   buildCounterOrderDocumentsListResponse--;
 }
 
-buildUnnamed3350() {
+buildUnnamed3379() {
   var o = new core.List<api.Order>();
   o.add(buildOrder());
   o.add(buildOrder());
   return o;
 }
 
-checkUnnamed3350(core.List<api.Order> o) {
+checkUnnamed3379(core.List<api.Order> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrder(o[0]);
   checkOrder(o[1]);
@@ -5729,7 +5729,7 @@
   if (buildCounterOrdersListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.orders = buildUnnamed3350();
+    o.orders = buildUnnamed3379();
   }
   buildCounterOrdersListResponse--;
   return o;
@@ -5740,58 +5740,58 @@
   if (buildCounterOrdersListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3350(o.orders);
+    checkUnnamed3379(o.orders);
   }
   buildCounterOrdersListResponse--;
 }
 
-buildUnnamed3351() {
+buildUnnamed3380() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed3351(core.List<api.Dimension> o) {
+checkUnnamed3380(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed3352() {
+buildUnnamed3381() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed3352(core.List<api.Dimension> o) {
+checkUnnamed3381(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed3353() {
+buildUnnamed3382() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed3353(core.List<api.Metric> o) {
+checkUnnamed3382(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed3354() {
+buildUnnamed3383() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed3354(core.List<api.Dimension> o) {
+checkUnnamed3383(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
@@ -5802,11 +5802,11 @@
   var o = new api.PathToConversionReportCompatibleFields();
   buildCounterPathToConversionReportCompatibleFields++;
   if (buildCounterPathToConversionReportCompatibleFields < 3) {
-    o.conversionDimensions = buildUnnamed3351();
-    o.customFloodlightVariables = buildUnnamed3352();
+    o.conversionDimensions = buildUnnamed3380();
+    o.customFloodlightVariables = buildUnnamed3381();
     o.kind = "foo";
-    o.metrics = buildUnnamed3353();
-    o.perInteractionDimensions = buildUnnamed3354();
+    o.metrics = buildUnnamed3382();
+    o.perInteractionDimensions = buildUnnamed3383();
   }
   buildCounterPathToConversionReportCompatibleFields--;
   return o;
@@ -5816,23 +5816,23 @@
     api.PathToConversionReportCompatibleFields o) {
   buildCounterPathToConversionReportCompatibleFields++;
   if (buildCounterPathToConversionReportCompatibleFields < 3) {
-    checkUnnamed3351(o.conversionDimensions);
-    checkUnnamed3352(o.customFloodlightVariables);
+    checkUnnamed3380(o.conversionDimensions);
+    checkUnnamed3381(o.customFloodlightVariables);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3353(o.metrics);
-    checkUnnamed3354(o.perInteractionDimensions);
+    checkUnnamed3382(o.metrics);
+    checkUnnamed3383(o.perInteractionDimensions);
   }
   buildCounterPathToConversionReportCompatibleFields--;
 }
 
-buildUnnamed3355() {
+buildUnnamed3384() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3355(core.List<core.String> o) {
+checkUnnamed3384(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5878,7 +5878,7 @@
     o.sslRequired = true;
     o.status = "foo";
     o.subaccountId = "foo";
-    o.tagFormats = buildUnnamed3355();
+    o.tagFormats = buildUnnamed3384();
     o.tagSetting = buildTagSetting();
     o.videoActiveViewOptOut = true;
     o.videoSettings = buildVideoSettings();
@@ -5926,7 +5926,7 @@
     unittest.expect(o.sslRequired, unittest.isTrue);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.subaccountId, unittest.equals('foo'));
-    checkUnnamed3355(o.tagFormats);
+    checkUnnamed3384(o.tagFormats);
     checkTagSetting(o.tagSetting);
     unittest.expect(o.videoActiveViewOptOut, unittest.isTrue);
     checkVideoSettings(o.videoSettings);
@@ -5960,14 +5960,14 @@
   buildCounterPlacementAssignment--;
 }
 
-buildUnnamed3356() {
+buildUnnamed3385() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3356(core.List<core.String> o) {
+checkUnnamed3385(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5984,7 +5984,7 @@
     o.archived = true;
     o.campaignId = "foo";
     o.campaignIdDimensionValue = buildDimensionValue();
-    o.childPlacementIds = buildUnnamed3356();
+    o.childPlacementIds = buildUnnamed3385();
     o.comment = "foo";
     o.contentCategoryId = "foo";
     o.createInfo = buildLastModifiedInfo();
@@ -6018,7 +6018,7 @@
     unittest.expect(o.archived, unittest.isTrue);
     unittest.expect(o.campaignId, unittest.equals('foo'));
     checkDimensionValue(o.campaignIdDimensionValue);
-    checkUnnamed3356(o.childPlacementIds);
+    checkUnnamed3385(o.childPlacementIds);
     unittest.expect(o.comment, unittest.equals('foo'));
     unittest.expect(o.contentCategoryId, unittest.equals('foo'));
     checkLastModifiedInfo(o.createInfo);
@@ -6042,14 +6042,14 @@
   buildCounterPlacementGroup--;
 }
 
-buildUnnamed3357() {
+buildUnnamed3386() {
   var o = new core.List<api.PlacementGroup>();
   o.add(buildPlacementGroup());
   o.add(buildPlacementGroup());
   return o;
 }
 
-checkUnnamed3357(core.List<api.PlacementGroup> o) {
+checkUnnamed3386(core.List<api.PlacementGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlacementGroup(o[0]);
   checkPlacementGroup(o[1]);
@@ -6062,7 +6062,7 @@
   if (buildCounterPlacementGroupsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.placementGroups = buildUnnamed3357();
+    o.placementGroups = buildUnnamed3386();
   }
   buildCounterPlacementGroupsListResponse--;
   return o;
@@ -6073,19 +6073,19 @@
   if (buildCounterPlacementGroupsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3357(o.placementGroups);
+    checkUnnamed3386(o.placementGroups);
   }
   buildCounterPlacementGroupsListResponse--;
 }
 
-buildUnnamed3358() {
+buildUnnamed3387() {
   var o = new core.List<api.PlacementStrategy>();
   o.add(buildPlacementStrategy());
   o.add(buildPlacementStrategy());
   return o;
 }
 
-checkUnnamed3358(core.List<api.PlacementStrategy> o) {
+checkUnnamed3387(core.List<api.PlacementStrategy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlacementStrategy(o[0]);
   checkPlacementStrategy(o[1]);
@@ -6098,7 +6098,7 @@
   if (buildCounterPlacementStrategiesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.placementStrategies = buildUnnamed3358();
+    o.placementStrategies = buildUnnamed3387();
   }
   buildCounterPlacementStrategiesListResponse--;
   return o;
@@ -6109,7 +6109,7 @@
   if (buildCounterPlacementStrategiesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3358(o.placementStrategies);
+    checkUnnamed3387(o.placementStrategies);
   }
   buildCounterPlacementStrategiesListResponse--;
 }
@@ -6139,14 +6139,14 @@
   buildCounterPlacementStrategy--;
 }
 
-buildUnnamed3359() {
+buildUnnamed3388() {
   var o = new core.List<api.TagData>();
   o.add(buildTagData());
   o.add(buildTagData());
   return o;
 }
 
-checkUnnamed3359(core.List<api.TagData> o) {
+checkUnnamed3388(core.List<api.TagData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTagData(o[0]);
   checkTagData(o[1]);
@@ -6158,7 +6158,7 @@
   buildCounterPlacementTag++;
   if (buildCounterPlacementTag < 3) {
     o.placementId = "foo";
-    o.tagDatas = buildUnnamed3359();
+    o.tagDatas = buildUnnamed3388();
   }
   buildCounterPlacementTag--;
   return o;
@@ -6168,19 +6168,19 @@
   buildCounterPlacementTag++;
   if (buildCounterPlacementTag < 3) {
     unittest.expect(o.placementId, unittest.equals('foo'));
-    checkUnnamed3359(o.tagDatas);
+    checkUnnamed3388(o.tagDatas);
   }
   buildCounterPlacementTag--;
 }
 
-buildUnnamed3360() {
+buildUnnamed3389() {
   var o = new core.List<api.PlacementTag>();
   o.add(buildPlacementTag());
   o.add(buildPlacementTag());
   return o;
 }
 
-checkUnnamed3360(core.List<api.PlacementTag> o) {
+checkUnnamed3389(core.List<api.PlacementTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlacementTag(o[0]);
   checkPlacementTag(o[1]);
@@ -6192,7 +6192,7 @@
   buildCounterPlacementsGenerateTagsResponse++;
   if (buildCounterPlacementsGenerateTagsResponse < 3) {
     o.kind = "foo";
-    o.placementTags = buildUnnamed3360();
+    o.placementTags = buildUnnamed3389();
   }
   buildCounterPlacementsGenerateTagsResponse--;
   return o;
@@ -6202,19 +6202,19 @@
   buildCounterPlacementsGenerateTagsResponse++;
   if (buildCounterPlacementsGenerateTagsResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3360(o.placementTags);
+    checkUnnamed3389(o.placementTags);
   }
   buildCounterPlacementsGenerateTagsResponse--;
 }
 
-buildUnnamed3361() {
+buildUnnamed3390() {
   var o = new core.List<api.Placement>();
   o.add(buildPlacement());
   o.add(buildPlacement());
   return o;
 }
 
-checkUnnamed3361(core.List<api.Placement> o) {
+checkUnnamed3390(core.List<api.Placement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlacement(o[0]);
   checkPlacement(o[1]);
@@ -6227,7 +6227,7 @@
   if (buildCounterPlacementsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.placements = buildUnnamed3361();
+    o.placements = buildUnnamed3390();
   }
   buildCounterPlacementsListResponse--;
   return o;
@@ -6238,7 +6238,7 @@
   if (buildCounterPlacementsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3361(o.placements);
+    checkUnnamed3390(o.placements);
   }
   buildCounterPlacementsListResponse--;
 }
@@ -6266,14 +6266,14 @@
   buildCounterPlatformType--;
 }
 
-buildUnnamed3362() {
+buildUnnamed3391() {
   var o = new core.List<api.PlatformType>();
   o.add(buildPlatformType());
   o.add(buildPlatformType());
   return o;
 }
 
-checkUnnamed3362(core.List<api.PlatformType> o) {
+checkUnnamed3391(core.List<api.PlatformType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlatformType(o[0]);
   checkPlatformType(o[1]);
@@ -6285,7 +6285,7 @@
   buildCounterPlatformTypesListResponse++;
   if (buildCounterPlatformTypesListResponse < 3) {
     o.kind = "foo";
-    o.platformTypes = buildUnnamed3362();
+    o.platformTypes = buildUnnamed3391();
   }
   buildCounterPlatformTypesListResponse--;
   return o;
@@ -6295,7 +6295,7 @@
   buildCounterPlatformTypesListResponse++;
   if (buildCounterPlatformTypesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3362(o.platformTypes);
+    checkUnnamed3391(o.platformTypes);
   }
   buildCounterPlatformTypesListResponse--;
 }
@@ -6362,14 +6362,14 @@
   buildCounterPostalCode--;
 }
 
-buildUnnamed3363() {
+buildUnnamed3392() {
   var o = new core.List<api.PostalCode>();
   o.add(buildPostalCode());
   o.add(buildPostalCode());
   return o;
 }
 
-checkUnnamed3363(core.List<api.PostalCode> o) {
+checkUnnamed3392(core.List<api.PostalCode> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostalCode(o[0]);
   checkPostalCode(o[1]);
@@ -6381,7 +6381,7 @@
   buildCounterPostalCodesListResponse++;
   if (buildCounterPostalCodesListResponse < 3) {
     o.kind = "foo";
-    o.postalCodes = buildUnnamed3363();
+    o.postalCodes = buildUnnamed3392();
   }
   buildCounterPostalCodesListResponse--;
   return o;
@@ -6391,19 +6391,19 @@
   buildCounterPostalCodesListResponse++;
   if (buildCounterPostalCodesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3363(o.postalCodes);
+    checkUnnamed3392(o.postalCodes);
   }
   buildCounterPostalCodesListResponse--;
 }
 
-buildUnnamed3364() {
+buildUnnamed3393() {
   var o = new core.List<api.Flight>();
   o.add(buildFlight());
   o.add(buildFlight());
   return o;
 }
 
-checkUnnamed3364(core.List<api.Flight> o) {
+checkUnnamed3393(core.List<api.Flight> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFlight(o[0]);
   checkFlight(o[1]);
@@ -6416,7 +6416,7 @@
   if (buildCounterPricing < 3) {
     o.capCostType = "foo";
     o.endDate = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.flights = buildUnnamed3364();
+    o.flights = buildUnnamed3393();
     o.groupType = "foo";
     o.pricingType = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
@@ -6431,7 +6431,7 @@
     unittest.expect(o.capCostType, unittest.equals('foo'));
     unittest.expect(
         o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed3364(o.flights);
+    checkUnnamed3393(o.flights);
     unittest.expect(o.groupType, unittest.equals('foo'));
     unittest.expect(o.pricingType, unittest.equals('foo'));
     unittest.expect(o.startDate,
@@ -6440,14 +6440,14 @@
   buildCounterPricing--;
 }
 
-buildUnnamed3365() {
+buildUnnamed3394() {
   var o = new core.List<api.PricingSchedulePricingPeriod>();
   o.add(buildPricingSchedulePricingPeriod());
   o.add(buildPricingSchedulePricingPeriod());
   return o;
 }
 
-checkUnnamed3365(core.List<api.PricingSchedulePricingPeriod> o) {
+checkUnnamed3394(core.List<api.PricingSchedulePricingPeriod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPricingSchedulePricingPeriod(o[0]);
   checkPricingSchedulePricingPeriod(o[1]);
@@ -6463,7 +6463,7 @@
     o.endDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.flighted = true;
     o.floodlightActivityId = "foo";
-    o.pricingPeriods = buildUnnamed3365();
+    o.pricingPeriods = buildUnnamed3394();
     o.pricingType = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.testingStartDate = core.DateTime.parse("2002-02-27T14:01:02Z");
@@ -6481,7 +6481,7 @@
         o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.flighted, unittest.isTrue);
     unittest.expect(o.floodlightActivityId, unittest.equals('foo'));
-    checkUnnamed3365(o.pricingPeriods);
+    checkUnnamed3394(o.pricingPeriods);
     unittest.expect(o.pricingType, unittest.equals('foo'));
     unittest.expect(o.startDate,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
@@ -6583,14 +6583,14 @@
   buildCounterProject--;
 }
 
-buildUnnamed3366() {
+buildUnnamed3395() {
   var o = new core.List<api.Project>();
   o.add(buildProject());
   o.add(buildProject());
   return o;
 }
 
-checkUnnamed3366(core.List<api.Project> o) {
+checkUnnamed3395(core.List<api.Project> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProject(o[0]);
   checkProject(o[1]);
@@ -6603,7 +6603,7 @@
   if (buildCounterProjectsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.projects = buildUnnamed3366();
+    o.projects = buildUnnamed3395();
   }
   buildCounterProjectsListResponse--;
   return o;
@@ -6614,71 +6614,71 @@
   if (buildCounterProjectsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3366(o.projects);
+    checkUnnamed3395(o.projects);
   }
   buildCounterProjectsListResponse--;
 }
 
-buildUnnamed3367() {
+buildUnnamed3396() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed3367(core.List<api.Dimension> o) {
+checkUnnamed3396(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed3368() {
+buildUnnamed3397() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed3368(core.List<api.Dimension> o) {
+checkUnnamed3397(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed3369() {
+buildUnnamed3398() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed3369(core.List<api.Metric> o) {
+checkUnnamed3398(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed3370() {
+buildUnnamed3399() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed3370(core.List<api.Metric> o) {
+checkUnnamed3399(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed3371() {
+buildUnnamed3400() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed3371(core.List<api.Metric> o) {
+checkUnnamed3400(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -6689,12 +6689,12 @@
   var o = new api.ReachReportCompatibleFields();
   buildCounterReachReportCompatibleFields++;
   if (buildCounterReachReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed3367();
-    o.dimensions = buildUnnamed3368();
+    o.dimensionFilters = buildUnnamed3396();
+    o.dimensions = buildUnnamed3397();
     o.kind = "foo";
-    o.metrics = buildUnnamed3369();
-    o.pivotedActivityMetrics = buildUnnamed3370();
-    o.reachByFrequencyMetrics = buildUnnamed3371();
+    o.metrics = buildUnnamed3398();
+    o.pivotedActivityMetrics = buildUnnamed3399();
+    o.reachByFrequencyMetrics = buildUnnamed3400();
   }
   buildCounterReachReportCompatibleFields--;
   return o;
@@ -6703,12 +6703,12 @@
 checkReachReportCompatibleFields(api.ReachReportCompatibleFields o) {
   buildCounterReachReportCompatibleFields++;
   if (buildCounterReachReportCompatibleFields < 3) {
-    checkUnnamed3367(o.dimensionFilters);
-    checkUnnamed3368(o.dimensions);
+    checkUnnamed3396(o.dimensionFilters);
+    checkUnnamed3397(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3369(o.metrics);
-    checkUnnamed3370(o.pivotedActivityMetrics);
-    checkUnnamed3371(o.reachByFrequencyMetrics);
+    checkUnnamed3398(o.metrics);
+    checkUnnamed3399(o.pivotedActivityMetrics);
+    checkUnnamed3400(o.reachByFrequencyMetrics);
   }
   buildCounterReachReportCompatibleFields--;
 }
@@ -6765,14 +6765,14 @@
   buildCounterRegion--;
 }
 
-buildUnnamed3372() {
+buildUnnamed3401() {
   var o = new core.List<api.Region>();
   o.add(buildRegion());
   o.add(buildRegion());
   return o;
 }
 
-checkUnnamed3372(core.List<api.Region> o) {
+checkUnnamed3401(core.List<api.Region> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegion(o[0]);
   checkRegion(o[1]);
@@ -6784,7 +6784,7 @@
   buildCounterRegionsListResponse++;
   if (buildCounterRegionsListResponse < 3) {
     o.kind = "foo";
-    o.regions = buildUnnamed3372();
+    o.regions = buildUnnamed3401();
   }
   buildCounterRegionsListResponse--;
   return o;
@@ -6794,7 +6794,7 @@
   buildCounterRegionsListResponse++;
   if (buildCounterRegionsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3372(o.regions);
+    checkUnnamed3401(o.regions);
   }
   buildCounterRegionsListResponse--;
 }
@@ -6842,27 +6842,27 @@
   buildCounterRemarketingList--;
 }
 
-buildUnnamed3373() {
+buildUnnamed3402() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3373(core.List<core.String> o) {
+checkUnnamed3402(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3374() {
+buildUnnamed3403() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3374(core.List<core.String> o) {
+checkUnnamed3403(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -6875,8 +6875,8 @@
   if (buildCounterRemarketingListShare < 3) {
     o.kind = "foo";
     o.remarketingListId = "foo";
-    o.sharedAccountIds = buildUnnamed3373();
-    o.sharedAdvertiserIds = buildUnnamed3374();
+    o.sharedAccountIds = buildUnnamed3402();
+    o.sharedAdvertiserIds = buildUnnamed3403();
   }
   buildCounterRemarketingListShare--;
   return o;
@@ -6887,20 +6887,20 @@
   if (buildCounterRemarketingListShare < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.remarketingListId, unittest.equals('foo'));
-    checkUnnamed3373(o.sharedAccountIds);
-    checkUnnamed3374(o.sharedAdvertiserIds);
+    checkUnnamed3402(o.sharedAccountIds);
+    checkUnnamed3403(o.sharedAdvertiserIds);
   }
   buildCounterRemarketingListShare--;
 }
 
-buildUnnamed3375() {
+buildUnnamed3404() {
   var o = new core.List<api.RemarketingList>();
   o.add(buildRemarketingList());
   o.add(buildRemarketingList());
   return o;
 }
 
-checkUnnamed3375(core.List<api.RemarketingList> o) {
+checkUnnamed3404(core.List<api.RemarketingList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRemarketingList(o[0]);
   checkRemarketingList(o[1]);
@@ -6913,7 +6913,7 @@
   if (buildCounterRemarketingListsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.remarketingLists = buildUnnamed3375();
+    o.remarketingLists = buildUnnamed3404();
   }
   buildCounterRemarketingListsListResponse--;
   return o;
@@ -6924,45 +6924,45 @@
   if (buildCounterRemarketingListsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3375(o.remarketingLists);
+    checkUnnamed3404(o.remarketingLists);
   }
   buildCounterRemarketingListsListResponse--;
 }
 
-buildUnnamed3376() {
+buildUnnamed3405() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed3376(core.List<api.DimensionValue> o) {
+checkUnnamed3405(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed3377() {
+buildUnnamed3406() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed3377(core.List<api.SortedDimension> o) {
+checkUnnamed3406(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed3378() {
+buildUnnamed3407() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3378(core.List<core.String> o) {
+checkUnnamed3407(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -6976,9 +6976,9 @@
     o.activities = buildActivities();
     o.customRichMediaEvents = buildCustomRichMediaEvents();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed3376();
-    o.dimensions = buildUnnamed3377();
-    o.metricNames = buildUnnamed3378();
+    o.dimensionFilters = buildUnnamed3405();
+    o.dimensions = buildUnnamed3406();
+    o.metricNames = buildUnnamed3407();
   }
   buildCounterReportCriteria--;
   return o;
@@ -6990,60 +6990,60 @@
     checkActivities(o.activities);
     checkCustomRichMediaEvents(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed3376(o.dimensionFilters);
-    checkUnnamed3377(o.dimensions);
-    checkUnnamed3378(o.metricNames);
+    checkUnnamed3405(o.dimensionFilters);
+    checkUnnamed3406(o.dimensions);
+    checkUnnamed3407(o.metricNames);
   }
   buildCounterReportCriteria--;
 }
 
-buildUnnamed3379() {
+buildUnnamed3408() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed3379(core.List<api.SortedDimension> o) {
+checkUnnamed3408(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed3380() {
+buildUnnamed3409() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed3380(core.List<api.DimensionValue> o) {
+checkUnnamed3409(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed3381() {
+buildUnnamed3410() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3381(core.List<core.String> o) {
+checkUnnamed3410(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3382() {
+buildUnnamed3411() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3382(core.List<core.String> o) {
+checkUnnamed3411(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -7054,12 +7054,12 @@
   var o = new api.ReportCrossDimensionReachCriteria();
   buildCounterReportCrossDimensionReachCriteria++;
   if (buildCounterReportCrossDimensionReachCriteria < 3) {
-    o.breakdown = buildUnnamed3379();
+    o.breakdown = buildUnnamed3408();
     o.dateRange = buildDateRange();
     o.dimension = "foo";
-    o.dimensionFilters = buildUnnamed3380();
-    o.metricNames = buildUnnamed3381();
-    o.overlapMetricNames = buildUnnamed3382();
+    o.dimensionFilters = buildUnnamed3409();
+    o.metricNames = buildUnnamed3410();
+    o.overlapMetricNames = buildUnnamed3411();
     o.pivoted = true;
   }
   buildCounterReportCrossDimensionReachCriteria--;
@@ -7070,25 +7070,25 @@
     api.ReportCrossDimensionReachCriteria o) {
   buildCounterReportCrossDimensionReachCriteria++;
   if (buildCounterReportCrossDimensionReachCriteria < 3) {
-    checkUnnamed3379(o.breakdown);
+    checkUnnamed3408(o.breakdown);
     checkDateRange(o.dateRange);
     unittest.expect(o.dimension, unittest.equals('foo'));
-    checkUnnamed3380(o.dimensionFilters);
-    checkUnnamed3381(o.metricNames);
-    checkUnnamed3382(o.overlapMetricNames);
+    checkUnnamed3409(o.dimensionFilters);
+    checkUnnamed3410(o.metricNames);
+    checkUnnamed3411(o.overlapMetricNames);
     unittest.expect(o.pivoted, unittest.isTrue);
   }
   buildCounterReportCrossDimensionReachCriteria--;
 }
 
-buildUnnamed3383() {
+buildUnnamed3412() {
   var o = new core.List<api.Recipient>();
   o.add(buildRecipient());
   o.add(buildRecipient());
   return o;
 }
 
-checkUnnamed3383(core.List<api.Recipient> o) {
+checkUnnamed3412(core.List<api.Recipient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRecipient(o[0]);
   checkRecipient(o[1]);
@@ -7102,7 +7102,7 @@
     o.emailOwner = true;
     o.emailOwnerDeliveryType = "foo";
     o.message = "foo";
-    o.recipients = buildUnnamed3383();
+    o.recipients = buildUnnamed3412();
   }
   buildCounterReportDelivery--;
   return o;
@@ -7114,58 +7114,58 @@
     unittest.expect(o.emailOwner, unittest.isTrue);
     unittest.expect(o.emailOwnerDeliveryType, unittest.equals('foo'));
     unittest.expect(o.message, unittest.equals('foo'));
-    checkUnnamed3383(o.recipients);
+    checkUnnamed3412(o.recipients);
   }
   buildCounterReportDelivery--;
 }
 
-buildUnnamed3384() {
+buildUnnamed3413() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed3384(core.List<api.DimensionValue> o) {
+checkUnnamed3413(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed3385() {
+buildUnnamed3414() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed3385(core.List<api.DimensionValue> o) {
+checkUnnamed3414(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed3386() {
+buildUnnamed3415() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed3386(core.List<api.SortedDimension> o) {
+checkUnnamed3415(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed3387() {
+buildUnnamed3416() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3387(core.List<core.String> o) {
+checkUnnamed3416(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -7200,12 +7200,12 @@
   var o = new api.ReportFloodlightCriteria();
   buildCounterReportFloodlightCriteria++;
   if (buildCounterReportFloodlightCriteria < 3) {
-    o.customRichMediaEvents = buildUnnamed3384();
+    o.customRichMediaEvents = buildUnnamed3413();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed3385();
-    o.dimensions = buildUnnamed3386();
+    o.dimensionFilters = buildUnnamed3414();
+    o.dimensions = buildUnnamed3415();
     o.floodlightConfigId = buildDimensionValue();
-    o.metricNames = buildUnnamed3387();
+    o.metricNames = buildUnnamed3416();
     o.reportProperties = buildReportFloodlightCriteriaReportProperties();
   }
   buildCounterReportFloodlightCriteria--;
@@ -7215,90 +7215,90 @@
 checkReportFloodlightCriteria(api.ReportFloodlightCriteria o) {
   buildCounterReportFloodlightCriteria++;
   if (buildCounterReportFloodlightCriteria < 3) {
-    checkUnnamed3384(o.customRichMediaEvents);
+    checkUnnamed3413(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed3385(o.dimensionFilters);
-    checkUnnamed3386(o.dimensions);
+    checkUnnamed3414(o.dimensionFilters);
+    checkUnnamed3415(o.dimensions);
     checkDimensionValue(o.floodlightConfigId);
-    checkUnnamed3387(o.metricNames);
+    checkUnnamed3416(o.metricNames);
     checkReportFloodlightCriteriaReportProperties(o.reportProperties);
   }
   buildCounterReportFloodlightCriteria--;
 }
 
-buildUnnamed3388() {
+buildUnnamed3417() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed3388(core.List<api.DimensionValue> o) {
+checkUnnamed3417(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed3389() {
+buildUnnamed3418() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed3389(core.List<api.SortedDimension> o) {
+checkUnnamed3418(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed3390() {
+buildUnnamed3419() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed3390(core.List<api.SortedDimension> o) {
+checkUnnamed3419(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed3391() {
+buildUnnamed3420() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed3391(core.List<api.DimensionValue> o) {
+checkUnnamed3420(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed3392() {
+buildUnnamed3421() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3392(core.List<core.String> o) {
+checkUnnamed3421(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3393() {
+buildUnnamed3422() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed3393(core.List<api.SortedDimension> o) {
+checkUnnamed3422(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
@@ -7345,14 +7345,14 @@
   var o = new api.ReportPathToConversionCriteria();
   buildCounterReportPathToConversionCriteria++;
   if (buildCounterReportPathToConversionCriteria < 3) {
-    o.activityFilters = buildUnnamed3388();
-    o.conversionDimensions = buildUnnamed3389();
-    o.customFloodlightVariables = buildUnnamed3390();
-    o.customRichMediaEvents = buildUnnamed3391();
+    o.activityFilters = buildUnnamed3417();
+    o.conversionDimensions = buildUnnamed3418();
+    o.customFloodlightVariables = buildUnnamed3419();
+    o.customRichMediaEvents = buildUnnamed3420();
     o.dateRange = buildDateRange();
     o.floodlightConfigId = buildDimensionValue();
-    o.metricNames = buildUnnamed3392();
-    o.perInteractionDimensions = buildUnnamed3393();
+    o.metricNames = buildUnnamed3421();
+    o.perInteractionDimensions = buildUnnamed3422();
     o.reportProperties = buildReportPathToConversionCriteriaReportProperties();
   }
   buildCounterReportPathToConversionCriteria--;
@@ -7362,66 +7362,66 @@
 checkReportPathToConversionCriteria(api.ReportPathToConversionCriteria o) {
   buildCounterReportPathToConversionCriteria++;
   if (buildCounterReportPathToConversionCriteria < 3) {
-    checkUnnamed3388(o.activityFilters);
-    checkUnnamed3389(o.conversionDimensions);
-    checkUnnamed3390(o.customFloodlightVariables);
-    checkUnnamed3391(o.customRichMediaEvents);
+    checkUnnamed3417(o.activityFilters);
+    checkUnnamed3418(o.conversionDimensions);
+    checkUnnamed3419(o.customFloodlightVariables);
+    checkUnnamed3420(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
     checkDimensionValue(o.floodlightConfigId);
-    checkUnnamed3392(o.metricNames);
-    checkUnnamed3393(o.perInteractionDimensions);
+    checkUnnamed3421(o.metricNames);
+    checkUnnamed3422(o.perInteractionDimensions);
     checkReportPathToConversionCriteriaReportProperties(o.reportProperties);
   }
   buildCounterReportPathToConversionCriteria--;
 }
 
-buildUnnamed3394() {
+buildUnnamed3423() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed3394(core.List<api.DimensionValue> o) {
+checkUnnamed3423(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed3395() {
+buildUnnamed3424() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed3395(core.List<api.SortedDimension> o) {
+checkUnnamed3424(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed3396() {
+buildUnnamed3425() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3396(core.List<core.String> o) {
+checkUnnamed3425(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3397() {
+buildUnnamed3426() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3397(core.List<core.String> o) {
+checkUnnamed3426(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -7435,11 +7435,11 @@
     o.activities = buildActivities();
     o.customRichMediaEvents = buildCustomRichMediaEvents();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed3394();
-    o.dimensions = buildUnnamed3395();
+    o.dimensionFilters = buildUnnamed3423();
+    o.dimensions = buildUnnamed3424();
     o.enableAllDimensionCombinations = true;
-    o.metricNames = buildUnnamed3396();
-    o.reachByFrequencyMetricNames = buildUnnamed3397();
+    o.metricNames = buildUnnamed3425();
+    o.reachByFrequencyMetricNames = buildUnnamed3426();
   }
   buildCounterReportReachCriteria--;
   return o;
@@ -7451,23 +7451,23 @@
     checkActivities(o.activities);
     checkCustomRichMediaEvents(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed3394(o.dimensionFilters);
-    checkUnnamed3395(o.dimensions);
+    checkUnnamed3423(o.dimensionFilters);
+    checkUnnamed3424(o.dimensions);
     unittest.expect(o.enableAllDimensionCombinations, unittest.isTrue);
-    checkUnnamed3396(o.metricNames);
-    checkUnnamed3397(o.reachByFrequencyMetricNames);
+    checkUnnamed3425(o.metricNames);
+    checkUnnamed3426(o.reachByFrequencyMetricNames);
   }
   buildCounterReportReachCriteria--;
 }
 
-buildUnnamed3398() {
+buildUnnamed3427() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3398(core.List<core.String> o) {
+checkUnnamed3427(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -7482,7 +7482,7 @@
     o.every = 42;
     o.expirationDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.repeats = "foo";
-    o.repeatsOnWeekDays = buildUnnamed3398();
+    o.repeatsOnWeekDays = buildUnnamed3427();
     o.runsOnDayOfMonth = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
   }
@@ -7498,7 +7498,7 @@
     unittest.expect(o.expirationDate,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.repeats, unittest.equals('foo'));
-    checkUnnamed3398(o.repeatsOnWeekDays);
+    checkUnnamed3427(o.repeatsOnWeekDays);
     unittest.expect(o.runsOnDayOfMonth, unittest.equals('foo'));
     unittest.expect(o.startDate,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
@@ -7559,53 +7559,53 @@
   buildCounterReport--;
 }
 
-buildUnnamed3399() {
+buildUnnamed3428() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed3399(core.List<api.Dimension> o) {
+checkUnnamed3428(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed3400() {
+buildUnnamed3429() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed3400(core.List<api.Dimension> o) {
+checkUnnamed3429(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed3401() {
+buildUnnamed3430() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed3401(core.List<api.Metric> o) {
+checkUnnamed3430(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed3402() {
+buildUnnamed3431() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed3402(core.List<api.Metric> o) {
+checkUnnamed3431(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -7616,11 +7616,11 @@
   var o = new api.ReportCompatibleFields();
   buildCounterReportCompatibleFields++;
   if (buildCounterReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed3399();
-    o.dimensions = buildUnnamed3400();
+    o.dimensionFilters = buildUnnamed3428();
+    o.dimensions = buildUnnamed3429();
     o.kind = "foo";
-    o.metrics = buildUnnamed3401();
-    o.pivotedActivityMetrics = buildUnnamed3402();
+    o.metrics = buildUnnamed3430();
+    o.pivotedActivityMetrics = buildUnnamed3431();
   }
   buildCounterReportCompatibleFields--;
   return o;
@@ -7629,23 +7629,23 @@
 checkReportCompatibleFields(api.ReportCompatibleFields o) {
   buildCounterReportCompatibleFields++;
   if (buildCounterReportCompatibleFields < 3) {
-    checkUnnamed3399(o.dimensionFilters);
-    checkUnnamed3400(o.dimensions);
+    checkUnnamed3428(o.dimensionFilters);
+    checkUnnamed3429(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3401(o.metrics);
-    checkUnnamed3402(o.pivotedActivityMetrics);
+    checkUnnamed3430(o.metrics);
+    checkUnnamed3431(o.pivotedActivityMetrics);
   }
   buildCounterReportCompatibleFields--;
 }
 
-buildUnnamed3403() {
+buildUnnamed3432() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed3403(core.List<api.Report> o) {
+checkUnnamed3432(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -7657,7 +7657,7 @@
   buildCounterReportList++;
   if (buildCounterReportList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed3403();
+    o.items = buildUnnamed3432();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -7669,7 +7669,7 @@
   buildCounterReportList++;
   if (buildCounterReportList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed3403(o.items);
+    checkUnnamed3432(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -7745,14 +7745,14 @@
   buildCounterRule--;
 }
 
-buildUnnamed3404() {
+buildUnnamed3433() {
   var o = new core.List<api.SiteContact>();
   o.add(buildSiteContact());
   o.add(buildSiteContact());
   return o;
 }
 
-checkUnnamed3404(core.List<api.SiteContact> o) {
+checkUnnamed3433(core.List<api.SiteContact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSiteContact(o[0]);
   checkSiteContact(o[1]);
@@ -7772,7 +7772,7 @@
     o.keyName = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.siteContacts = buildUnnamed3404();
+    o.siteContacts = buildUnnamed3433();
     o.siteSettings = buildSiteSettings();
     o.subaccountId = "foo";
   }
@@ -7792,7 +7792,7 @@
     unittest.expect(o.keyName, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3404(o.siteContacts);
+    checkUnnamed3433(o.siteContacts);
     checkSiteSettings(o.siteSettings);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
   }
@@ -7865,14 +7865,14 @@
   buildCounterSiteSettings--;
 }
 
-buildUnnamed3405() {
+buildUnnamed3434() {
   var o = new core.List<api.Site>();
   o.add(buildSite());
   o.add(buildSite());
   return o;
 }
 
-checkUnnamed3405(core.List<api.Site> o) {
+checkUnnamed3434(core.List<api.Site> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSite(o[0]);
   checkSite(o[1]);
@@ -7885,7 +7885,7 @@
   if (buildCounterSitesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.sites = buildUnnamed3405();
+    o.sites = buildUnnamed3434();
   }
   buildCounterSitesListResponse--;
   return o;
@@ -7896,7 +7896,7 @@
   if (buildCounterSitesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3405(o.sites);
+    checkUnnamed3434(o.sites);
   }
   buildCounterSitesListResponse--;
 }
@@ -7928,14 +7928,14 @@
   buildCounterSize--;
 }
 
-buildUnnamed3406() {
+buildUnnamed3435() {
   var o = new core.List<api.Size>();
   o.add(buildSize());
   o.add(buildSize());
   return o;
 }
 
-checkUnnamed3406(core.List<api.Size> o) {
+checkUnnamed3435(core.List<api.Size> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSize(o[0]);
   checkSize(o[1]);
@@ -7947,7 +7947,7 @@
   buildCounterSizesListResponse++;
   if (buildCounterSizesListResponse < 3) {
     o.kind = "foo";
-    o.sizes = buildUnnamed3406();
+    o.sizes = buildUnnamed3435();
   }
   buildCounterSizesListResponse--;
   return o;
@@ -7957,7 +7957,7 @@
   buildCounterSizesListResponse++;
   if (buildCounterSizesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3406(o.sizes);
+    checkUnnamed3435(o.sizes);
   }
   buildCounterSizesListResponse--;
 }
@@ -8010,14 +8010,14 @@
   buildCounterSortedDimension--;
 }
 
-buildUnnamed3407() {
+buildUnnamed3436() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3407(core.List<core.String> o) {
+checkUnnamed3436(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -8029,7 +8029,7 @@
   buildCounterSubaccount++;
   if (buildCounterSubaccount < 3) {
     o.accountId = "foo";
-    o.availablePermissionIds = buildUnnamed3407();
+    o.availablePermissionIds = buildUnnamed3436();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -8042,7 +8042,7 @@
   buildCounterSubaccount++;
   if (buildCounterSubaccount < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed3407(o.availablePermissionIds);
+    checkUnnamed3436(o.availablePermissionIds);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -8050,14 +8050,14 @@
   buildCounterSubaccount--;
 }
 
-buildUnnamed3408() {
+buildUnnamed3437() {
   var o = new core.List<api.Subaccount>();
   o.add(buildSubaccount());
   o.add(buildSubaccount());
   return o;
 }
 
-checkUnnamed3408(core.List<api.Subaccount> o) {
+checkUnnamed3437(core.List<api.Subaccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubaccount(o[0]);
   checkSubaccount(o[1]);
@@ -8070,7 +8070,7 @@
   if (buildCounterSubaccountsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.subaccounts = buildUnnamed3408();
+    o.subaccounts = buildUnnamed3437();
   }
   buildCounterSubaccountsListResponse--;
   return o;
@@ -8081,7 +8081,7 @@
   if (buildCounterSubaccountsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3408(o.subaccounts);
+    checkUnnamed3437(o.subaccounts);
   }
   buildCounterSubaccountsListResponse--;
 }
@@ -8221,14 +8221,14 @@
   buildCounterTargetableRemarketingList--;
 }
 
-buildUnnamed3409() {
+buildUnnamed3438() {
   var o = new core.List<api.TargetableRemarketingList>();
   o.add(buildTargetableRemarketingList());
   o.add(buildTargetableRemarketingList());
   return o;
 }
 
-checkUnnamed3409(core.List<api.TargetableRemarketingList> o) {
+checkUnnamed3438(core.List<api.TargetableRemarketingList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetableRemarketingList(o[0]);
   checkTargetableRemarketingList(o[1]);
@@ -8241,7 +8241,7 @@
   if (buildCounterTargetableRemarketingListsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.targetableRemarketingLists = buildUnnamed3409();
+    o.targetableRemarketingLists = buildUnnamed3438();
   }
   buildCounterTargetableRemarketingListsListResponse--;
   return o;
@@ -8253,7 +8253,7 @@
   if (buildCounterTargetableRemarketingListsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3409(o.targetableRemarketingLists);
+    checkUnnamed3438(o.targetableRemarketingLists);
   }
   buildCounterTargetableRemarketingListsListResponse--;
 }
@@ -8301,14 +8301,14 @@
   buildCounterTargetingTemplate--;
 }
 
-buildUnnamed3410() {
+buildUnnamed3439() {
   var o = new core.List<api.TargetingTemplate>();
   o.add(buildTargetingTemplate());
   o.add(buildTargetingTemplate());
   return o;
 }
 
-checkUnnamed3410(core.List<api.TargetingTemplate> o) {
+checkUnnamed3439(core.List<api.TargetingTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetingTemplate(o[0]);
   checkTargetingTemplate(o[1]);
@@ -8321,7 +8321,7 @@
   if (buildCounterTargetingTemplatesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.targetingTemplates = buildUnnamed3410();
+    o.targetingTemplates = buildUnnamed3439();
   }
   buildCounterTargetingTemplatesListResponse--;
   return o;
@@ -8332,84 +8332,84 @@
   if (buildCounterTargetingTemplatesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3410(o.targetingTemplates);
+    checkUnnamed3439(o.targetingTemplates);
   }
   buildCounterTargetingTemplatesListResponse--;
 }
 
-buildUnnamed3411() {
+buildUnnamed3440() {
   var o = new core.List<api.Browser>();
   o.add(buildBrowser());
   o.add(buildBrowser());
   return o;
 }
 
-checkUnnamed3411(core.List<api.Browser> o) {
+checkUnnamed3440(core.List<api.Browser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBrowser(o[0]);
   checkBrowser(o[1]);
 }
 
-buildUnnamed3412() {
+buildUnnamed3441() {
   var o = new core.List<api.ConnectionType>();
   o.add(buildConnectionType());
   o.add(buildConnectionType());
   return o;
 }
 
-checkUnnamed3412(core.List<api.ConnectionType> o) {
+checkUnnamed3441(core.List<api.ConnectionType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConnectionType(o[0]);
   checkConnectionType(o[1]);
 }
 
-buildUnnamed3413() {
+buildUnnamed3442() {
   var o = new core.List<api.MobileCarrier>();
   o.add(buildMobileCarrier());
   o.add(buildMobileCarrier());
   return o;
 }
 
-checkUnnamed3413(core.List<api.MobileCarrier> o) {
+checkUnnamed3442(core.List<api.MobileCarrier> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileCarrier(o[0]);
   checkMobileCarrier(o[1]);
 }
 
-buildUnnamed3414() {
+buildUnnamed3443() {
   var o = new core.List<api.OperatingSystemVersion>();
   o.add(buildOperatingSystemVersion());
   o.add(buildOperatingSystemVersion());
   return o;
 }
 
-checkUnnamed3414(core.List<api.OperatingSystemVersion> o) {
+checkUnnamed3443(core.List<api.OperatingSystemVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperatingSystemVersion(o[0]);
   checkOperatingSystemVersion(o[1]);
 }
 
-buildUnnamed3415() {
+buildUnnamed3444() {
   var o = new core.List<api.OperatingSystem>();
   o.add(buildOperatingSystem());
   o.add(buildOperatingSystem());
   return o;
 }
 
-checkUnnamed3415(core.List<api.OperatingSystem> o) {
+checkUnnamed3444(core.List<api.OperatingSystem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperatingSystem(o[0]);
   checkOperatingSystem(o[1]);
 }
 
-buildUnnamed3416() {
+buildUnnamed3445() {
   var o = new core.List<api.PlatformType>();
   o.add(buildPlatformType());
   o.add(buildPlatformType());
   return o;
 }
 
-checkUnnamed3416(core.List<api.PlatformType> o) {
+checkUnnamed3445(core.List<api.PlatformType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlatformType(o[0]);
   checkPlatformType(o[1]);
@@ -8420,12 +8420,12 @@
   var o = new api.TechnologyTargeting();
   buildCounterTechnologyTargeting++;
   if (buildCounterTechnologyTargeting < 3) {
-    o.browsers = buildUnnamed3411();
-    o.connectionTypes = buildUnnamed3412();
-    o.mobileCarriers = buildUnnamed3413();
-    o.operatingSystemVersions = buildUnnamed3414();
-    o.operatingSystems = buildUnnamed3415();
-    o.platformTypes = buildUnnamed3416();
+    o.browsers = buildUnnamed3440();
+    o.connectionTypes = buildUnnamed3441();
+    o.mobileCarriers = buildUnnamed3442();
+    o.operatingSystemVersions = buildUnnamed3443();
+    o.operatingSystems = buildUnnamed3444();
+    o.platformTypes = buildUnnamed3445();
   }
   buildCounterTechnologyTargeting--;
   return o;
@@ -8434,12 +8434,12 @@
 checkTechnologyTargeting(api.TechnologyTargeting o) {
   buildCounterTechnologyTargeting++;
   if (buildCounterTechnologyTargeting < 3) {
-    checkUnnamed3411(o.browsers);
-    checkUnnamed3412(o.connectionTypes);
-    checkUnnamed3413(o.mobileCarriers);
-    checkUnnamed3414(o.operatingSystemVersions);
-    checkUnnamed3415(o.operatingSystems);
-    checkUnnamed3416(o.platformTypes);
+    checkUnnamed3440(o.browsers);
+    checkUnnamed3441(o.connectionTypes);
+    checkUnnamed3442(o.mobileCarriers);
+    checkUnnamed3443(o.operatingSystemVersions);
+    checkUnnamed3444(o.operatingSystems);
+    checkUnnamed3445(o.platformTypes);
   }
   buildCounterTechnologyTargeting--;
 }
@@ -8486,14 +8486,14 @@
   buildCounterThirdPartyTrackingUrl--;
 }
 
-buildUnnamed3417() {
+buildUnnamed3446() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed3417(core.List<core.int> o) {
+checkUnnamed3446(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));
@@ -8504,7 +8504,7 @@
   var o = new api.TranscodeSetting();
   buildCounterTranscodeSetting++;
   if (buildCounterTranscodeSetting < 3) {
-    o.enabledVideoFormats = buildUnnamed3417();
+    o.enabledVideoFormats = buildUnnamed3446();
     o.kind = "foo";
   }
   buildCounterTranscodeSetting--;
@@ -8514,7 +8514,7 @@
 checkTranscodeSetting(api.TranscodeSetting o) {
   buildCounterTranscodeSetting++;
   if (buildCounterTranscodeSetting < 3) {
-    checkUnnamed3417(o.enabledVideoFormats);
+    checkUnnamed3446(o.enabledVideoFormats);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTranscodeSetting--;
@@ -8597,14 +8597,14 @@
   buildCounterUserProfile--;
 }
 
-buildUnnamed3418() {
+buildUnnamed3447() {
   var o = new core.List<api.UserProfile>();
   o.add(buildUserProfile());
   o.add(buildUserProfile());
   return o;
 }
 
-checkUnnamed3418(core.List<api.UserProfile> o) {
+checkUnnamed3447(core.List<api.UserProfile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserProfile(o[0]);
   checkUserProfile(o[1]);
@@ -8616,7 +8616,7 @@
   buildCounterUserProfileList++;
   if (buildCounterUserProfileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed3418();
+    o.items = buildUnnamed3447();
     o.kind = "foo";
   }
   buildCounterUserProfileList--;
@@ -8627,20 +8627,20 @@
   buildCounterUserProfileList++;
   if (buildCounterUserProfileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed3418(o.items);
+    checkUnnamed3447(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterUserProfileList--;
 }
 
-buildUnnamed3419() {
+buildUnnamed3448() {
   var o = new core.List<api.UserRolePermission>();
   o.add(buildUserRolePermission());
   o.add(buildUserRolePermission());
   return o;
 }
 
-checkUnnamed3419(core.List<api.UserRolePermission> o) {
+checkUnnamed3448(core.List<api.UserRolePermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserRolePermission(o[0]);
   checkUserRolePermission(o[1]);
@@ -8657,7 +8657,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.parentUserRoleId = "foo";
-    o.permissions = buildUnnamed3419();
+    o.permissions = buildUnnamed3448();
     o.subaccountId = "foo";
   }
   buildCounterUserRole--;
@@ -8673,7 +8673,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parentUserRoleId, unittest.equals('foo'));
-    checkUnnamed3419(o.permissions);
+    checkUnnamed3448(o.permissions);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
   }
   buildCounterUserRole--;
@@ -8729,14 +8729,14 @@
   buildCounterUserRolePermissionGroup--;
 }
 
-buildUnnamed3420() {
+buildUnnamed3449() {
   var o = new core.List<api.UserRolePermissionGroup>();
   o.add(buildUserRolePermissionGroup());
   o.add(buildUserRolePermissionGroup());
   return o;
 }
 
-checkUnnamed3420(core.List<api.UserRolePermissionGroup> o) {
+checkUnnamed3449(core.List<api.UserRolePermissionGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserRolePermissionGroup(o[0]);
   checkUserRolePermissionGroup(o[1]);
@@ -8748,7 +8748,7 @@
   buildCounterUserRolePermissionGroupsListResponse++;
   if (buildCounterUserRolePermissionGroupsListResponse < 3) {
     o.kind = "foo";
-    o.userRolePermissionGroups = buildUnnamed3420();
+    o.userRolePermissionGroups = buildUnnamed3449();
   }
   buildCounterUserRolePermissionGroupsListResponse--;
   return o;
@@ -8759,19 +8759,19 @@
   buildCounterUserRolePermissionGroupsListResponse++;
   if (buildCounterUserRolePermissionGroupsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3420(o.userRolePermissionGroups);
+    checkUnnamed3449(o.userRolePermissionGroups);
   }
   buildCounterUserRolePermissionGroupsListResponse--;
 }
 
-buildUnnamed3421() {
+buildUnnamed3450() {
   var o = new core.List<api.UserRolePermission>();
   o.add(buildUserRolePermission());
   o.add(buildUserRolePermission());
   return o;
 }
 
-checkUnnamed3421(core.List<api.UserRolePermission> o) {
+checkUnnamed3450(core.List<api.UserRolePermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserRolePermission(o[0]);
   checkUserRolePermission(o[1]);
@@ -8783,7 +8783,7 @@
   buildCounterUserRolePermissionsListResponse++;
   if (buildCounterUserRolePermissionsListResponse < 3) {
     o.kind = "foo";
-    o.userRolePermissions = buildUnnamed3421();
+    o.userRolePermissions = buildUnnamed3450();
   }
   buildCounterUserRolePermissionsListResponse--;
   return o;
@@ -8793,19 +8793,19 @@
   buildCounterUserRolePermissionsListResponse++;
   if (buildCounterUserRolePermissionsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3421(o.userRolePermissions);
+    checkUnnamed3450(o.userRolePermissions);
   }
   buildCounterUserRolePermissionsListResponse--;
 }
 
-buildUnnamed3422() {
+buildUnnamed3451() {
   var o = new core.List<api.UserRole>();
   o.add(buildUserRole());
   o.add(buildUserRole());
   return o;
 }
 
-checkUnnamed3422(core.List<api.UserRole> o) {
+checkUnnamed3451(core.List<api.UserRole> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserRole(o[0]);
   checkUserRole(o[1]);
@@ -8818,7 +8818,7 @@
   if (buildCounterUserRolesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.userRoles = buildUnnamed3422();
+    o.userRoles = buildUnnamed3451();
   }
   buildCounterUserRolesListResponse--;
   return o;
@@ -8829,7 +8829,7 @@
   if (buildCounterUserRolesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3422(o.userRoles);
+    checkUnnamed3451(o.userRoles);
   }
   buildCounterUserRolesListResponse--;
 }
@@ -8861,14 +8861,14 @@
   buildCounterVideoFormat--;
 }
 
-buildUnnamed3423() {
+buildUnnamed3452() {
   var o = new core.List<api.VideoFormat>();
   o.add(buildVideoFormat());
   o.add(buildVideoFormat());
   return o;
 }
 
-checkUnnamed3423(core.List<api.VideoFormat> o) {
+checkUnnamed3452(core.List<api.VideoFormat> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFormat(o[0]);
   checkVideoFormat(o[1]);
@@ -8880,7 +8880,7 @@
   buildCounterVideoFormatsListResponse++;
   if (buildCounterVideoFormatsListResponse < 3) {
     o.kind = "foo";
-    o.videoFormats = buildUnnamed3423();
+    o.videoFormats = buildUnnamed3452();
   }
   buildCounterVideoFormatsListResponse--;
   return o;
@@ -8890,7 +8890,7 @@
   buildCounterVideoFormatsListResponse++;
   if (buildCounterVideoFormatsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3423(o.videoFormats);
+    checkUnnamed3452(o.videoFormats);
   }
   buildCounterVideoFormatsListResponse--;
 }
@@ -8941,383 +8941,6 @@
   buildCounterVideoSettings--;
 }
 
-buildUnnamed3424() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3424(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3425() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3425(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3426() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3426(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3427() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3427(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3428() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3428(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3429() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3429(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3430() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3430(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3431() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3431(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3432() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3432(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3433() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3433(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3434() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3434(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3435() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3435(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3436() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3436(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3437() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3437(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3438() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3438(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3439() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3439(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3440() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3440(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3441() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3441(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3442() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3442(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3443() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3443(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3444() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3444(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3445() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3445(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3446() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3446(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3447() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3447(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3448() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3448(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3449() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3449(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3450() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3450(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3451() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3451(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed3452() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed3452(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed3453() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -10085,6 +9708,383 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed3512() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3512(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3513() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3513(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3514() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3514(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3515() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3515(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3516() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3516(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3517() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3517(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3518() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3518(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3519() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3519(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3520() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3520(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3521() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3521(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3522() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3522(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3523() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3523(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3524() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3524(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3525() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3525(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3526() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3526(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3527() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3527(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3528() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3528(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3529() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3529(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3530() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3530(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3531() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3531(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3532() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3532(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3533() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3533(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3534() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3534(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3535() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3535(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3536() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3536(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3537() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3537(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3538() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3538(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3539() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3539(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed3540() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3540(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 main() {
   unittest.group("obj-schema-Account", () {
     unittest.test("to-json--from-json", () {
@@ -12332,7 +12332,7 @@
           new api.DfareportingApi(mock).accountUserProfiles;
       var arg_profileId = "foo";
       var arg_active = true;
-      var arg_ids = buildUnnamed3424();
+      var arg_ids = buildUnnamed3453();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -12635,7 +12635,7 @@
       api.AccountsResourceApi res = new api.DfareportingApi(mock).accounts;
       var arg_profileId = "foo";
       var arg_active = true;
-      var arg_ids = buildUnnamed3425();
+      var arg_ids = buildUnnamed3454();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -12995,26 +12995,26 @@
       var arg_active = true;
       var arg_advertiserId = "foo";
       var arg_archived = true;
-      var arg_audienceSegmentIds = buildUnnamed3426();
-      var arg_campaignIds = buildUnnamed3427();
+      var arg_audienceSegmentIds = buildUnnamed3455();
+      var arg_campaignIds = buildUnnamed3456();
       var arg_compatibility = "foo";
-      var arg_creativeIds = buildUnnamed3428();
-      var arg_creativeOptimizationConfigurationIds = buildUnnamed3429();
+      var arg_creativeIds = buildUnnamed3457();
+      var arg_creativeOptimizationConfigurationIds = buildUnnamed3458();
       var arg_dynamicClickTracker = true;
-      var arg_ids = buildUnnamed3430();
-      var arg_landingPageIds = buildUnnamed3431();
+      var arg_ids = buildUnnamed3459();
+      var arg_landingPageIds = buildUnnamed3460();
       var arg_maxResults = 42;
       var arg_overriddenEventTagId = "foo";
       var arg_pageToken = "foo";
-      var arg_placementIds = buildUnnamed3432();
-      var arg_remarketingListIds = buildUnnamed3433();
+      var arg_placementIds = buildUnnamed3461();
+      var arg_remarketingListIds = buildUnnamed3462();
       var arg_searchString = "foo";
-      var arg_sizeIds = buildUnnamed3434();
+      var arg_sizeIds = buildUnnamed3463();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_sslCompliant = true;
       var arg_sslRequired = true;
-      var arg_type = buildUnnamed3435();
+      var arg_type = buildUnnamed3464();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -13481,7 +13481,7 @@
       api.AdvertiserGroupsResourceApi res =
           new api.DfareportingApi(mock).advertiserGroups;
       var arg_profileId = "foo";
-      var arg_ids = buildUnnamed3436();
+      var arg_ids = buildUnnamed3465();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -13841,9 +13841,9 @@
       api.AdvertisersResourceApi res =
           new api.DfareportingApi(mock).advertisers;
       var arg_profileId = "foo";
-      var arg_advertiserGroupIds = buildUnnamed3437();
-      var arg_floodlightConfigurationIds = buildUnnamed3438();
-      var arg_ids = buildUnnamed3439();
+      var arg_advertiserGroupIds = buildUnnamed3466();
+      var arg_floodlightConfigurationIds = buildUnnamed3467();
+      var arg_ids = buildUnnamed3468();
       var arg_includeAdvertisersWithoutGroupsOnly = true;
       var arg_maxResults = 42;
       var arg_onlyParent = true;
@@ -14462,12 +14462,12 @@
       var mock = new HttpServerMock();
       api.CampaignsResourceApi res = new api.DfareportingApi(mock).campaigns;
       var arg_profileId = "foo";
-      var arg_advertiserGroupIds = buildUnnamed3440();
-      var arg_advertiserIds = buildUnnamed3441();
+      var arg_advertiserGroupIds = buildUnnamed3469();
+      var arg_advertiserIds = buildUnnamed3470();
       var arg_archived = true;
       var arg_atLeastOneOptimizationActivity = true;
-      var arg_excludedIds = buildUnnamed3442();
-      var arg_ids = buildUnnamed3443();
+      var arg_excludedIds = buildUnnamed3471();
+      var arg_ids = buildUnnamed3472();
       var arg_maxResults = 42;
       var arg_overriddenEventTagId = "foo";
       var arg_pageToken = "foo";
@@ -14780,15 +14780,15 @@
       api.ChangeLogsResourceApi res = new api.DfareportingApi(mock).changeLogs;
       var arg_profileId = "foo";
       var arg_action = "foo";
-      var arg_ids = buildUnnamed3444();
+      var arg_ids = buildUnnamed3473();
       var arg_maxChangeTime = "foo";
       var arg_maxResults = 42;
       var arg_minChangeTime = "foo";
-      var arg_objectIds = buildUnnamed3445();
+      var arg_objectIds = buildUnnamed3474();
       var arg_objectType = "foo";
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
-      var arg_userProfileIds = buildUnnamed3446();
+      var arg_userProfileIds = buildUnnamed3475();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -14881,10 +14881,10 @@
       var mock = new HttpServerMock();
       api.CitiesResourceApi res = new api.DfareportingApi(mock).cities;
       var arg_profileId = "foo";
-      var arg_countryDartIds = buildUnnamed3447();
-      var arg_dartIds = buildUnnamed3448();
+      var arg_countryDartIds = buildUnnamed3476();
+      var arg_dartIds = buildUnnamed3477();
       var arg_namePrefix = "foo";
-      var arg_regionDartIds = buildUnnamed3449();
+      var arg_regionDartIds = buildUnnamed3478();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -15292,7 +15292,7 @@
       api.ContentCategoriesResourceApi res =
           new api.DfareportingApi(mock).contentCategories;
       var arg_profileId = "foo";
-      var arg_ids = buildUnnamed3450();
+      var arg_ids = buildUnnamed3479();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -16097,7 +16097,7 @@
           new api.DfareportingApi(mock).creativeFieldValues;
       var arg_profileId = "foo";
       var arg_creativeFieldId = "foo";
-      var arg_ids = buildUnnamed3451();
+      var arg_ids = buildUnnamed3480();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -16553,8 +16553,8 @@
       api.CreativeFieldsResourceApi res =
           new api.DfareportingApi(mock).creativeFields;
       var arg_profileId = "foo";
-      var arg_advertiserIds = buildUnnamed3452();
-      var arg_ids = buildUnnamed3453();
+      var arg_advertiserIds = buildUnnamed3481();
+      var arg_ids = buildUnnamed3482();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -16917,9 +16917,9 @@
       api.CreativeGroupsResourceApi res =
           new api.DfareportingApi(mock).creativeGroups;
       var arg_profileId = "foo";
-      var arg_advertiserIds = buildUnnamed3454();
+      var arg_advertiserIds = buildUnnamed3483();
       var arg_groupNumber = 42;
-      var arg_ids = buildUnnamed3455();
+      var arg_ids = buildUnnamed3484();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -17286,18 +17286,18 @@
       var arg_advertiserId = "foo";
       var arg_archived = true;
       var arg_campaignId = "foo";
-      var arg_companionCreativeIds = buildUnnamed3456();
-      var arg_creativeFieldIds = buildUnnamed3457();
-      var arg_ids = buildUnnamed3458();
+      var arg_companionCreativeIds = buildUnnamed3485();
+      var arg_creativeFieldIds = buildUnnamed3486();
+      var arg_ids = buildUnnamed3487();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
-      var arg_renderingIds = buildUnnamed3459();
+      var arg_renderingIds = buildUnnamed3488();
       var arg_searchString = "foo";
-      var arg_sizeIds = buildUnnamed3460();
+      var arg_sizeIds = buildUnnamed3489();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_studioCreativeId = "foo";
-      var arg_types = buildUnnamed3461();
+      var arg_types = buildUnnamed3490();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -17688,8 +17688,8 @@
       api.DirectorySiteContactsResourceApi res =
           new api.DfareportingApi(mock).directorySiteContacts;
       var arg_profileId = "foo";
-      var arg_directorySiteIds = buildUnnamed3462();
-      var arg_ids = buildUnnamed3463();
+      var arg_directorySiteIds = buildUnnamed3491();
+      var arg_ids = buildUnnamed3492();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -17923,7 +17923,7 @@
       var arg_active = true;
       var arg_countryId = "foo";
       var arg_dfpNetworkCode = "foo";
-      var arg_ids = buildUnnamed3464();
+      var arg_ids = buildUnnamed3493();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_parentId = "foo";
@@ -18176,7 +18176,7 @@
           new api.DfareportingApi(mock).dynamicTargetingKeys;
       var arg_profileId = "foo";
       var arg_advertiserId = "foo";
-      var arg_names = buildUnnamed3465();
+      var arg_names = buildUnnamed3494();
       var arg_objectId = "foo";
       var arg_objectType = "foo";
       var arg_$fields = "foo";
@@ -18457,8 +18457,8 @@
       var arg_campaignId = "foo";
       var arg_definitionsOnly = true;
       var arg_enabled = true;
-      var arg_eventTagTypes = buildUnnamed3466();
-      var arg_ids = buildUnnamed3467();
+      var arg_eventTagTypes = buildUnnamed3495();
+      var arg_ids = buildUnnamed3496();
       var arg_searchString = "foo";
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
@@ -19113,12 +19113,12 @@
           new api.DfareportingApi(mock).floodlightActivities;
       var arg_profileId = "foo";
       var arg_advertiserId = "foo";
-      var arg_floodlightActivityGroupIds = buildUnnamed3468();
+      var arg_floodlightActivityGroupIds = buildUnnamed3497();
       var arg_floodlightActivityGroupName = "foo";
       var arg_floodlightActivityGroupTagString = "foo";
       var arg_floodlightActivityGroupType = "foo";
       var arg_floodlightConfigurationId = "foo";
-      var arg_ids = buildUnnamed3469();
+      var arg_ids = buildUnnamed3498();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -19503,7 +19503,7 @@
       var arg_profileId = "foo";
       var arg_advertiserId = "foo";
       var arg_floodlightConfigurationId = "foo";
-      var arg_ids = buildUnnamed3470();
+      var arg_ids = buildUnnamed3499();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -19806,7 +19806,7 @@
       api.FloodlightConfigurationsResourceApi res =
           new api.DfareportingApi(mock).floodlightConfigurations;
       var arg_profileId = "foo";
-      var arg_ids = buildUnnamed3471();
+      var arg_ids = buildUnnamed3500();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -20087,12 +20087,12 @@
           new api.DfareportingApi(mock).inventoryItems;
       var arg_profileId = "foo";
       var arg_projectId = "foo";
-      var arg_ids = buildUnnamed3472();
+      var arg_ids = buildUnnamed3501();
       var arg_inPlan = true;
       var arg_maxResults = 42;
-      var arg_orderId = buildUnnamed3473();
+      var arg_orderId = buildUnnamed3502();
       var arg_pageToken = "foo";
-      var arg_siteId = buildUnnamed3474();
+      var arg_siteId = buildUnnamed3503();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_type = "foo";
@@ -21259,12 +21259,12 @@
       var arg_profileId = "foo";
       var arg_projectId = "foo";
       var arg_approved = true;
-      var arg_ids = buildUnnamed3475();
+      var arg_ids = buildUnnamed3504();
       var arg_maxResults = 42;
-      var arg_orderId = buildUnnamed3476();
+      var arg_orderId = buildUnnamed3505();
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
-      var arg_siteId = buildUnnamed3477();
+      var arg_siteId = buildUnnamed3506();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_$fields = "foo";
@@ -21443,11 +21443,11 @@
       api.OrdersResourceApi res = new api.DfareportingApi(mock).orders;
       var arg_profileId = "foo";
       var arg_projectId = "foo";
-      var arg_ids = buildUnnamed3478();
+      var arg_ids = buildUnnamed3507();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
-      var arg_siteId = buildUnnamed3479();
+      var arg_siteId = buildUnnamed3508();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_$fields = "foo";
@@ -21678,12 +21678,12 @@
       api.PlacementGroupsResourceApi res =
           new api.DfareportingApi(mock).placementGroups;
       var arg_profileId = "foo";
-      var arg_advertiserIds = buildUnnamed3480();
+      var arg_advertiserIds = buildUnnamed3509();
       var arg_archived = true;
-      var arg_campaignIds = buildUnnamed3481();
-      var arg_contentCategoryIds = buildUnnamed3482();
-      var arg_directorySiteIds = buildUnnamed3483();
-      var arg_ids = buildUnnamed3484();
+      var arg_campaignIds = buildUnnamed3510();
+      var arg_contentCategoryIds = buildUnnamed3511();
+      var arg_directorySiteIds = buildUnnamed3512();
+      var arg_ids = buildUnnamed3513();
       var arg_maxEndDate = "foo";
       var arg_maxResults = 42;
       var arg_maxStartDate = "foo";
@@ -21691,10 +21691,10 @@
       var arg_minStartDate = "foo";
       var arg_pageToken = "foo";
       var arg_placementGroupType = "foo";
-      var arg_placementStrategyIds = buildUnnamed3485();
-      var arg_pricingTypes = buildUnnamed3486();
+      var arg_placementStrategyIds = buildUnnamed3514();
+      var arg_pricingTypes = buildUnnamed3515();
       var arg_searchString = "foo";
-      var arg_siteIds = buildUnnamed3487();
+      var arg_siteIds = buildUnnamed3516();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_$fields = "foo";
@@ -22154,7 +22154,7 @@
       api.PlacementStrategiesResourceApi res =
           new api.DfareportingApi(mock).placementStrategies;
       var arg_profileId = "foo";
-      var arg_ids = buildUnnamed3488();
+      var arg_ids = buildUnnamed3517();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -22380,8 +22380,8 @@
       api.PlacementsResourceApi res = new api.DfareportingApi(mock).placements;
       var arg_profileId = "foo";
       var arg_campaignId = "foo";
-      var arg_placementIds = buildUnnamed3489();
-      var arg_tagFormats = buildUnnamed3490();
+      var arg_placementIds = buildUnnamed3518();
+      var arg_tagFormats = buildUnnamed3519();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -22587,14 +22587,14 @@
       var mock = new HttpServerMock();
       api.PlacementsResourceApi res = new api.DfareportingApi(mock).placements;
       var arg_profileId = "foo";
-      var arg_advertiserIds = buildUnnamed3491();
+      var arg_advertiserIds = buildUnnamed3520();
       var arg_archived = true;
-      var arg_campaignIds = buildUnnamed3492();
-      var arg_compatibilities = buildUnnamed3493();
-      var arg_contentCategoryIds = buildUnnamed3494();
-      var arg_directorySiteIds = buildUnnamed3495();
-      var arg_groupIds = buildUnnamed3496();
-      var arg_ids = buildUnnamed3497();
+      var arg_campaignIds = buildUnnamed3521();
+      var arg_compatibilities = buildUnnamed3522();
+      var arg_contentCategoryIds = buildUnnamed3523();
+      var arg_directorySiteIds = buildUnnamed3524();
+      var arg_groupIds = buildUnnamed3525();
+      var arg_ids = buildUnnamed3526();
       var arg_maxEndDate = "foo";
       var arg_maxResults = 42;
       var arg_maxStartDate = "foo";
@@ -22602,11 +22602,11 @@
       var arg_minStartDate = "foo";
       var arg_pageToken = "foo";
       var arg_paymentSource = "foo";
-      var arg_placementStrategyIds = buildUnnamed3498();
-      var arg_pricingTypes = buildUnnamed3499();
+      var arg_placementStrategyIds = buildUnnamed3527();
+      var arg_pricingTypes = buildUnnamed3528();
       var arg_searchString = "foo";
-      var arg_siteIds = buildUnnamed3500();
-      var arg_sizeIds = buildUnnamed3501();
+      var arg_siteIds = buildUnnamed3529();
+      var arg_sizeIds = buildUnnamed3530();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_$fields = "foo";
@@ -23199,8 +23199,8 @@
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.DfareportingApi(mock).projects;
       var arg_profileId = "foo";
-      var arg_advertiserIds = buildUnnamed3502();
-      var arg_ids = buildUnnamed3503();
+      var arg_advertiserIds = buildUnnamed3531();
+      var arg_ids = buildUnnamed3532();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -24804,9 +24804,9 @@
       var arg_acceptsPublisherPaidPlacements = true;
       var arg_adWordsSite = true;
       var arg_approved = true;
-      var arg_campaignIds = buildUnnamed3504();
-      var arg_directorySiteIds = buildUnnamed3505();
-      var arg_ids = buildUnnamed3506();
+      var arg_campaignIds = buildUnnamed3533();
+      var arg_directorySiteIds = buildUnnamed3534();
+      var arg_ids = buildUnnamed3535();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -25193,7 +25193,7 @@
       var arg_profileId = "foo";
       var arg_height = 42;
       var arg_iabStandard = true;
-      var arg_ids = buildUnnamed3507();
+      var arg_ids = buildUnnamed3536();
       var arg_width = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -25406,7 +25406,7 @@
       api.SubaccountsResourceApi res =
           new api.DfareportingApi(mock).subaccounts;
       var arg_profileId = "foo";
-      var arg_ids = buildUnnamed3508();
+      var arg_ids = buildUnnamed3537();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -25926,7 +25926,7 @@
           new api.DfareportingApi(mock).targetingTemplates;
       var arg_profileId = "foo";
       var arg_advertiserId = "foo";
-      var arg_ids = buildUnnamed3509();
+      var arg_ids = buildUnnamed3538();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -26466,7 +26466,7 @@
       api.UserRolePermissionsResourceApi res =
           new api.DfareportingApi(mock).userRolePermissions;
       var arg_profileId = "foo";
-      var arg_ids = buildUnnamed3510();
+      var arg_ids = buildUnnamed3539();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -26728,7 +26728,7 @@
       api.UserRolesResourceApi res = new api.DfareportingApi(mock).userRoles;
       var arg_profileId = "foo";
       var arg_accountUserRoleOnly = true;
-      var arg_ids = buildUnnamed3511();
+      var arg_ids = buildUnnamed3540();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
diff --git a/generated/googleapis/test/dfareporting/v3_0_test.dart b/generated/googleapis/test/dfareporting/v3_0_test.dart
index c7ffe12..b65aa6b 100644
--- a/generated/googleapis/test/dfareporting/v3_0_test.dart
+++ b/generated/googleapis/test/dfareporting/v3_0_test.dart
@@ -50,27 +50,27 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed2679() {
+buildUnnamed2704() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2679(core.List<core.String> o) {
+checkUnnamed2704(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2680() {
+buildUnnamed2705() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2680(core.List<core.String> o) {
+checkUnnamed2705(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -81,12 +81,12 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.accountPermissionIds = buildUnnamed2679();
+    o.accountPermissionIds = buildUnnamed2704();
     o.accountProfile = "foo";
     o.active = true;
     o.activeAdsLimitTier = "foo";
     o.activeViewOptOut = true;
-    o.availablePermissionIds = buildUnnamed2680();
+    o.availablePermissionIds = buildUnnamed2705();
     o.countryId = "foo";
     o.currencyId = "foo";
     o.defaultCreativeSizeId = "foo";
@@ -108,12 +108,12 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed2679(o.accountPermissionIds);
+    checkUnnamed2704(o.accountPermissionIds);
     unittest.expect(o.accountProfile, unittest.equals('foo'));
     unittest.expect(o.active, unittest.isTrue);
     unittest.expect(o.activeAdsLimitTier, unittest.equals('foo'));
     unittest.expect(o.activeViewOptOut, unittest.isTrue);
-    checkUnnamed2680(o.availablePermissionIds);
+    checkUnnamed2705(o.availablePermissionIds);
     unittest.expect(o.countryId, unittest.equals('foo'));
     unittest.expect(o.currencyId, unittest.equals('foo'));
     unittest.expect(o.defaultCreativeSizeId, unittest.equals('foo'));
@@ -158,14 +158,14 @@
   buildCounterAccountActiveAdSummary--;
 }
 
-buildUnnamed2681() {
+buildUnnamed2706() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2681(core.List<core.String> o) {
+checkUnnamed2706(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -176,7 +176,7 @@
   var o = new api.AccountPermission();
   buildCounterAccountPermission++;
   if (buildCounterAccountPermission < 3) {
-    o.accountProfiles = buildUnnamed2681();
+    o.accountProfiles = buildUnnamed2706();
     o.id = "foo";
     o.kind = "foo";
     o.level = "foo";
@@ -190,7 +190,7 @@
 checkAccountPermission(api.AccountPermission o) {
   buildCounterAccountPermission++;
   if (buildCounterAccountPermission < 3) {
-    checkUnnamed2681(o.accountProfiles);
+    checkUnnamed2706(o.accountProfiles);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
@@ -223,14 +223,14 @@
   buildCounterAccountPermissionGroup--;
 }
 
-buildUnnamed2682() {
+buildUnnamed2707() {
   var o = new core.List<api.AccountPermissionGroup>();
   o.add(buildAccountPermissionGroup());
   o.add(buildAccountPermissionGroup());
   return o;
 }
 
-checkUnnamed2682(core.List<api.AccountPermissionGroup> o) {
+checkUnnamed2707(core.List<api.AccountPermissionGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountPermissionGroup(o[0]);
   checkAccountPermissionGroup(o[1]);
@@ -241,7 +241,7 @@
   var o = new api.AccountPermissionGroupsListResponse();
   buildCounterAccountPermissionGroupsListResponse++;
   if (buildCounterAccountPermissionGroupsListResponse < 3) {
-    o.accountPermissionGroups = buildUnnamed2682();
+    o.accountPermissionGroups = buildUnnamed2707();
     o.kind = "foo";
   }
   buildCounterAccountPermissionGroupsListResponse--;
@@ -252,20 +252,20 @@
     api.AccountPermissionGroupsListResponse o) {
   buildCounterAccountPermissionGroupsListResponse++;
   if (buildCounterAccountPermissionGroupsListResponse < 3) {
-    checkUnnamed2682(o.accountPermissionGroups);
+    checkUnnamed2707(o.accountPermissionGroups);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountPermissionGroupsListResponse--;
 }
 
-buildUnnamed2683() {
+buildUnnamed2708() {
   var o = new core.List<api.AccountPermission>();
   o.add(buildAccountPermission());
   o.add(buildAccountPermission());
   return o;
 }
 
-checkUnnamed2683(core.List<api.AccountPermission> o) {
+checkUnnamed2708(core.List<api.AccountPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountPermission(o[0]);
   checkAccountPermission(o[1]);
@@ -276,7 +276,7 @@
   var o = new api.AccountPermissionsListResponse();
   buildCounterAccountPermissionsListResponse++;
   if (buildCounterAccountPermissionsListResponse < 3) {
-    o.accountPermissions = buildUnnamed2683();
+    o.accountPermissions = buildUnnamed2708();
     o.kind = "foo";
   }
   buildCounterAccountPermissionsListResponse--;
@@ -286,7 +286,7 @@
 checkAccountPermissionsListResponse(api.AccountPermissionsListResponse o) {
   buildCounterAccountPermissionsListResponse++;
   if (buildCounterAccountPermissionsListResponse < 3) {
-    checkUnnamed2683(o.accountPermissions);
+    checkUnnamed2708(o.accountPermissions);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountPermissionsListResponse--;
@@ -341,14 +341,14 @@
   buildCounterAccountUserProfile--;
 }
 
-buildUnnamed2684() {
+buildUnnamed2709() {
   var o = new core.List<api.AccountUserProfile>();
   o.add(buildAccountUserProfile());
   o.add(buildAccountUserProfile());
   return o;
 }
 
-checkUnnamed2684(core.List<api.AccountUserProfile> o) {
+checkUnnamed2709(core.List<api.AccountUserProfile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountUserProfile(o[0]);
   checkAccountUserProfile(o[1]);
@@ -359,7 +359,7 @@
   var o = new api.AccountUserProfilesListResponse();
   buildCounterAccountUserProfilesListResponse++;
   if (buildCounterAccountUserProfilesListResponse < 3) {
-    o.accountUserProfiles = buildUnnamed2684();
+    o.accountUserProfiles = buildUnnamed2709();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -370,21 +370,21 @@
 checkAccountUserProfilesListResponse(api.AccountUserProfilesListResponse o) {
   buildCounterAccountUserProfilesListResponse++;
   if (buildCounterAccountUserProfilesListResponse < 3) {
-    checkUnnamed2684(o.accountUserProfiles);
+    checkUnnamed2709(o.accountUserProfiles);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAccountUserProfilesListResponse--;
 }
 
-buildUnnamed2685() {
+buildUnnamed2710() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed2685(core.List<api.Account> o) {
+checkUnnamed2710(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -395,7 +395,7 @@
   var o = new api.AccountsListResponse();
   buildCounterAccountsListResponse++;
   if (buildCounterAccountsListResponse < 3) {
-    o.accounts = buildUnnamed2685();
+    o.accounts = buildUnnamed2710();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -406,34 +406,34 @@
 checkAccountsListResponse(api.AccountsListResponse o) {
   buildCounterAccountsListResponse++;
   if (buildCounterAccountsListResponse < 3) {
-    checkUnnamed2685(o.accounts);
+    checkUnnamed2710(o.accounts);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAccountsListResponse--;
 }
 
-buildUnnamed2686() {
+buildUnnamed2711() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed2686(core.List<api.DimensionValue> o) {
+checkUnnamed2711(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed2687() {
+buildUnnamed2712() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2687(core.List<core.String> o) {
+checkUnnamed2712(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -444,9 +444,9 @@
   var o = new api.Activities();
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
-    o.filters = buildUnnamed2686();
+    o.filters = buildUnnamed2711();
     o.kind = "foo";
-    o.metricNames = buildUnnamed2687();
+    o.metricNames = buildUnnamed2712();
   }
   buildCounterActivities--;
   return o;
@@ -455,47 +455,47 @@
 checkActivities(api.Activities o) {
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
-    checkUnnamed2686(o.filters);
+    checkUnnamed2711(o.filters);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2687(o.metricNames);
+    checkUnnamed2712(o.metricNames);
   }
   buildCounterActivities--;
 }
 
-buildUnnamed2688() {
+buildUnnamed2713() {
   var o = new core.List<api.CreativeGroupAssignment>();
   o.add(buildCreativeGroupAssignment());
   o.add(buildCreativeGroupAssignment());
   return o;
 }
 
-checkUnnamed2688(core.List<api.CreativeGroupAssignment> o) {
+checkUnnamed2713(core.List<api.CreativeGroupAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeGroupAssignment(o[0]);
   checkCreativeGroupAssignment(o[1]);
 }
 
-buildUnnamed2689() {
+buildUnnamed2714() {
   var o = new core.List<api.EventTagOverride>();
   o.add(buildEventTagOverride());
   o.add(buildEventTagOverride());
   return o;
 }
 
-checkUnnamed2689(core.List<api.EventTagOverride> o) {
+checkUnnamed2714(core.List<api.EventTagOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventTagOverride(o[0]);
   checkEventTagOverride(o[1]);
 }
 
-buildUnnamed2690() {
+buildUnnamed2715() {
   var o = new core.List<api.PlacementAssignment>();
   o.add(buildPlacementAssignment());
   o.add(buildPlacementAssignment());
   return o;
 }
 
-checkUnnamed2690(core.List<api.PlacementAssignment> o) {
+checkUnnamed2715(core.List<api.PlacementAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlacementAssignment(o[0]);
   checkPlacementAssignment(o[1]);
@@ -519,7 +519,7 @@
     o.comments = "foo";
     o.compatibility = "foo";
     o.createInfo = buildLastModifiedInfo();
-    o.creativeGroupAssignments = buildUnnamed2688();
+    o.creativeGroupAssignments = buildUnnamed2713();
     o.creativeRotation = buildCreativeRotation();
     o.dayPartTargeting = buildDayPartTargeting();
     o.defaultClickThroughEventTagProperties =
@@ -527,7 +527,7 @@
     o.deliverySchedule = buildDeliverySchedule();
     o.dynamicClickTracker = true;
     o.endTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.eventTagOverrides = buildUnnamed2689();
+    o.eventTagOverrides = buildUnnamed2714();
     o.geoTargeting = buildGeoTargeting();
     o.id = "foo";
     o.idDimensionValue = buildDimensionValue();
@@ -536,7 +536,7 @@
     o.languageTargeting = buildLanguageTargeting();
     o.lastModifiedInfo = buildLastModifiedInfo();
     o.name = "foo";
-    o.placementAssignments = buildUnnamed2690();
+    o.placementAssignments = buildUnnamed2715();
     o.remarketingListExpression = buildListTargetingExpression();
     o.size = buildSize();
     o.sslCompliant = true;
@@ -567,7 +567,7 @@
     unittest.expect(o.comments, unittest.equals('foo'));
     unittest.expect(o.compatibility, unittest.equals('foo'));
     checkLastModifiedInfo(o.createInfo);
-    checkUnnamed2688(o.creativeGroupAssignments);
+    checkUnnamed2713(o.creativeGroupAssignments);
     checkCreativeRotation(o.creativeRotation);
     checkDayPartTargeting(o.dayPartTargeting);
     checkDefaultClickThroughEventTagProperties(
@@ -576,7 +576,7 @@
     unittest.expect(o.dynamicClickTracker, unittest.isTrue);
     unittest.expect(
         o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed2689(o.eventTagOverrides);
+    checkUnnamed2714(o.eventTagOverrides);
     checkGeoTargeting(o.geoTargeting);
     unittest.expect(o.id, unittest.equals('foo'));
     checkDimensionValue(o.idDimensionValue);
@@ -585,7 +585,7 @@
     checkLanguageTargeting(o.languageTargeting);
     checkLastModifiedInfo(o.lastModifiedInfo);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2690(o.placementAssignments);
+    checkUnnamed2715(o.placementAssignments);
     checkListTargetingExpression(o.remarketingListExpression);
     checkSize(o.size);
     unittest.expect(o.sslCompliant, unittest.isTrue);
@@ -658,14 +658,14 @@
   buildCounterAdSlot--;
 }
 
-buildUnnamed2691() {
+buildUnnamed2716() {
   var o = new core.List<api.Ad>();
   o.add(buildAd());
   o.add(buildAd());
   return o;
 }
 
-checkUnnamed2691(core.List<api.Ad> o) {
+checkUnnamed2716(core.List<api.Ad> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAd(o[0]);
   checkAd(o[1]);
@@ -676,7 +676,7 @@
   var o = new api.AdsListResponse();
   buildCounterAdsListResponse++;
   if (buildCounterAdsListResponse < 3) {
-    o.ads = buildUnnamed2691();
+    o.ads = buildUnnamed2716();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -687,7 +687,7 @@
 checkAdsListResponse(api.AdsListResponse o) {
   buildCounterAdsListResponse++;
   if (buildCounterAdsListResponse < 3) {
-    checkUnnamed2691(o.ads);
+    checkUnnamed2716(o.ads);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -767,14 +767,14 @@
   buildCounterAdvertiserGroup--;
 }
 
-buildUnnamed2692() {
+buildUnnamed2717() {
   var o = new core.List<api.AdvertiserGroup>();
   o.add(buildAdvertiserGroup());
   o.add(buildAdvertiserGroup());
   return o;
 }
 
-checkUnnamed2692(core.List<api.AdvertiserGroup> o) {
+checkUnnamed2717(core.List<api.AdvertiserGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdvertiserGroup(o[0]);
   checkAdvertiserGroup(o[1]);
@@ -785,7 +785,7 @@
   var o = new api.AdvertiserGroupsListResponse();
   buildCounterAdvertiserGroupsListResponse++;
   if (buildCounterAdvertiserGroupsListResponse < 3) {
-    o.advertiserGroups = buildUnnamed2692();
+    o.advertiserGroups = buildUnnamed2717();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -796,21 +796,21 @@
 checkAdvertiserGroupsListResponse(api.AdvertiserGroupsListResponse o) {
   buildCounterAdvertiserGroupsListResponse++;
   if (buildCounterAdvertiserGroupsListResponse < 3) {
-    checkUnnamed2692(o.advertiserGroups);
+    checkUnnamed2717(o.advertiserGroups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAdvertiserGroupsListResponse--;
 }
 
-buildUnnamed2693() {
+buildUnnamed2718() {
   var o = new core.List<api.LandingPage>();
   o.add(buildLandingPage());
   o.add(buildLandingPage());
   return o;
 }
 
-checkUnnamed2693(core.List<api.LandingPage> o) {
+checkUnnamed2718(core.List<api.LandingPage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLandingPage(o[0]);
   checkLandingPage(o[1]);
@@ -822,7 +822,7 @@
   buildCounterAdvertiserLandingPagesListResponse++;
   if (buildCounterAdvertiserLandingPagesListResponse < 3) {
     o.kind = "foo";
-    o.landingPages = buildUnnamed2693();
+    o.landingPages = buildUnnamed2718();
     o.nextPageToken = "foo";
   }
   buildCounterAdvertiserLandingPagesListResponse--;
@@ -834,20 +834,20 @@
   buildCounterAdvertiserLandingPagesListResponse++;
   if (buildCounterAdvertiserLandingPagesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2693(o.landingPages);
+    checkUnnamed2718(o.landingPages);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAdvertiserLandingPagesListResponse--;
 }
 
-buildUnnamed2694() {
+buildUnnamed2719() {
   var o = new core.List<api.Advertiser>();
   o.add(buildAdvertiser());
   o.add(buildAdvertiser());
   return o;
 }
 
-checkUnnamed2694(core.List<api.Advertiser> o) {
+checkUnnamed2719(core.List<api.Advertiser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdvertiser(o[0]);
   checkAdvertiser(o[1]);
@@ -858,7 +858,7 @@
   var o = new api.AdvertisersListResponse();
   buildCounterAdvertisersListResponse++;
   if (buildCounterAdvertisersListResponse < 3) {
-    o.advertisers = buildUnnamed2694();
+    o.advertisers = buildUnnamed2719();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -869,7 +869,7 @@
 checkAdvertisersListResponse(api.AdvertisersListResponse o) {
   buildCounterAdvertisersListResponse++;
   if (buildCounterAdvertisersListResponse < 3) {
-    checkUnnamed2694(o.advertisers);
+    checkUnnamed2719(o.advertisers);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -899,14 +899,14 @@
   buildCounterAudienceSegment--;
 }
 
-buildUnnamed2695() {
+buildUnnamed2720() {
   var o = new core.List<api.AudienceSegment>();
   o.add(buildAudienceSegment());
   o.add(buildAudienceSegment());
   return o;
 }
 
-checkUnnamed2695(core.List<api.AudienceSegment> o) {
+checkUnnamed2720(core.List<api.AudienceSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAudienceSegment(o[0]);
   checkAudienceSegment(o[1]);
@@ -917,7 +917,7 @@
   var o = new api.AudienceSegmentGroup();
   buildCounterAudienceSegmentGroup++;
   if (buildCounterAudienceSegmentGroup < 3) {
-    o.audienceSegments = buildUnnamed2695();
+    o.audienceSegments = buildUnnamed2720();
     o.id = "foo";
     o.name = "foo";
   }
@@ -928,7 +928,7 @@
 checkAudienceSegmentGroup(api.AudienceSegmentGroup o) {
   buildCounterAudienceSegmentGroup++;
   if (buildCounterAudienceSegmentGroup < 3) {
-    checkUnnamed2695(o.audienceSegments);
+    checkUnnamed2720(o.audienceSegments);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
   }
@@ -964,14 +964,14 @@
   buildCounterBrowser--;
 }
 
-buildUnnamed2696() {
+buildUnnamed2721() {
   var o = new core.List<api.Browser>();
   o.add(buildBrowser());
   o.add(buildBrowser());
   return o;
 }
 
-checkUnnamed2696(core.List<api.Browser> o) {
+checkUnnamed2721(core.List<api.Browser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBrowser(o[0]);
   checkBrowser(o[1]);
@@ -982,7 +982,7 @@
   var o = new api.BrowsersListResponse();
   buildCounterBrowsersListResponse++;
   if (buildCounterBrowsersListResponse < 3) {
-    o.browsers = buildUnnamed2696();
+    o.browsers = buildUnnamed2721();
     o.kind = "foo";
   }
   buildCounterBrowsersListResponse--;
@@ -992,72 +992,72 @@
 checkBrowsersListResponse(api.BrowsersListResponse o) {
   buildCounterBrowsersListResponse++;
   if (buildCounterBrowsersListResponse < 3) {
-    checkUnnamed2696(o.browsers);
+    checkUnnamed2721(o.browsers);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBrowsersListResponse--;
 }
 
-buildUnnamed2697() {
+buildUnnamed2722() {
   var o = new core.List<api.CreativeOptimizationConfiguration>();
   o.add(buildCreativeOptimizationConfiguration());
   o.add(buildCreativeOptimizationConfiguration());
   return o;
 }
 
-checkUnnamed2697(core.List<api.CreativeOptimizationConfiguration> o) {
+checkUnnamed2722(core.List<api.CreativeOptimizationConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeOptimizationConfiguration(o[0]);
   checkCreativeOptimizationConfiguration(o[1]);
 }
 
-buildUnnamed2698() {
+buildUnnamed2723() {
   var o = new core.List<api.AudienceSegmentGroup>();
   o.add(buildAudienceSegmentGroup());
   o.add(buildAudienceSegmentGroup());
   return o;
 }
 
-checkUnnamed2698(core.List<api.AudienceSegmentGroup> o) {
+checkUnnamed2723(core.List<api.AudienceSegmentGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAudienceSegmentGroup(o[0]);
   checkAudienceSegmentGroup(o[1]);
 }
 
-buildUnnamed2699() {
+buildUnnamed2724() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2699(core.List<core.String> o) {
+checkUnnamed2724(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2700() {
+buildUnnamed2725() {
   var o = new core.List<api.EventTagOverride>();
   o.add(buildEventTagOverride());
   o.add(buildEventTagOverride());
   return o;
 }
 
-checkUnnamed2700(core.List<api.EventTagOverride> o) {
+checkUnnamed2725(core.List<api.EventTagOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventTagOverride(o[0]);
   checkEventTagOverride(o[1]);
 }
 
-buildUnnamed2701() {
+buildUnnamed2726() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2701(core.List<core.String> o) {
+checkUnnamed2726(core.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,24 +1070,24 @@
   if (buildCounterCampaign < 3) {
     o.accountId = "foo";
     o.adBlockingConfiguration = buildAdBlockingConfiguration();
-    o.additionalCreativeOptimizationConfigurations = buildUnnamed2697();
+    o.additionalCreativeOptimizationConfigurations = buildUnnamed2722();
     o.advertiserGroupId = "foo";
     o.advertiserId = "foo";
     o.advertiserIdDimensionValue = buildDimensionValue();
     o.archived = true;
-    o.audienceSegmentGroups = buildUnnamed2698();
+    o.audienceSegmentGroups = buildUnnamed2723();
     o.billingInvoiceCode = "foo";
     o.clickThroughUrlSuffixProperties = buildClickThroughUrlSuffixProperties();
     o.comment = "foo";
     o.createInfo = buildLastModifiedInfo();
-    o.creativeGroupIds = buildUnnamed2699();
+    o.creativeGroupIds = buildUnnamed2724();
     o.creativeOptimizationConfiguration =
         buildCreativeOptimizationConfiguration();
     o.defaultClickThroughEventTagProperties =
         buildDefaultClickThroughEventTagProperties();
     o.defaultLandingPageId = "foo";
     o.endDate = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.eventTagOverrides = buildUnnamed2700();
+    o.eventTagOverrides = buildUnnamed2725();
     o.externalId = "foo";
     o.id = "foo";
     o.idDimensionValue = buildDimensionValue();
@@ -1098,7 +1098,7 @@
     o.nielsenOcrEnabled = true;
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.subaccountId = "foo";
-    o.traffickerEmails = buildUnnamed2701();
+    o.traffickerEmails = buildUnnamed2726();
   }
   buildCounterCampaign--;
   return o;
@@ -1109,24 +1109,24 @@
   if (buildCounterCampaign < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     checkAdBlockingConfiguration(o.adBlockingConfiguration);
-    checkUnnamed2697(o.additionalCreativeOptimizationConfigurations);
+    checkUnnamed2722(o.additionalCreativeOptimizationConfigurations);
     unittest.expect(o.advertiserGroupId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
     checkDimensionValue(o.advertiserIdDimensionValue);
     unittest.expect(o.archived, unittest.isTrue);
-    checkUnnamed2698(o.audienceSegmentGroups);
+    checkUnnamed2723(o.audienceSegmentGroups);
     unittest.expect(o.billingInvoiceCode, unittest.equals('foo'));
     checkClickThroughUrlSuffixProperties(o.clickThroughUrlSuffixProperties);
     unittest.expect(o.comment, unittest.equals('foo'));
     checkLastModifiedInfo(o.createInfo);
-    checkUnnamed2699(o.creativeGroupIds);
+    checkUnnamed2724(o.creativeGroupIds);
     checkCreativeOptimizationConfiguration(o.creativeOptimizationConfiguration);
     checkDefaultClickThroughEventTagProperties(
         o.defaultClickThroughEventTagProperties);
     unittest.expect(o.defaultLandingPageId, unittest.equals('foo'));
     unittest.expect(
         o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed2700(o.eventTagOverrides);
+    checkUnnamed2725(o.eventTagOverrides);
     unittest.expect(o.externalId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkDimensionValue(o.idDimensionValue);
@@ -1138,7 +1138,7 @@
     unittest.expect(o.startDate,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.subaccountId, unittest.equals('foo'));
-    checkUnnamed2701(o.traffickerEmails);
+    checkUnnamed2726(o.traffickerEmails);
   }
   buildCounterCampaign--;
 }
@@ -1164,14 +1164,14 @@
   buildCounterCampaignCreativeAssociation--;
 }
 
-buildUnnamed2702() {
+buildUnnamed2727() {
   var o = new core.List<api.CampaignCreativeAssociation>();
   o.add(buildCampaignCreativeAssociation());
   o.add(buildCampaignCreativeAssociation());
   return o;
 }
 
-checkUnnamed2702(core.List<api.CampaignCreativeAssociation> o) {
+checkUnnamed2727(core.List<api.CampaignCreativeAssociation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCampaignCreativeAssociation(o[0]);
   checkCampaignCreativeAssociation(o[1]);
@@ -1182,7 +1182,7 @@
   var o = new api.CampaignCreativeAssociationsListResponse();
   buildCounterCampaignCreativeAssociationsListResponse++;
   if (buildCounterCampaignCreativeAssociationsListResponse < 3) {
-    o.campaignCreativeAssociations = buildUnnamed2702();
+    o.campaignCreativeAssociations = buildUnnamed2727();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1194,21 +1194,21 @@
     api.CampaignCreativeAssociationsListResponse o) {
   buildCounterCampaignCreativeAssociationsListResponse++;
   if (buildCounterCampaignCreativeAssociationsListResponse < 3) {
-    checkUnnamed2702(o.campaignCreativeAssociations);
+    checkUnnamed2727(o.campaignCreativeAssociations);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCampaignCreativeAssociationsListResponse--;
 }
 
-buildUnnamed2703() {
+buildUnnamed2728() {
   var o = new core.List<api.Campaign>();
   o.add(buildCampaign());
   o.add(buildCampaign());
   return o;
 }
 
-checkUnnamed2703(core.List<api.Campaign> o) {
+checkUnnamed2728(core.List<api.Campaign> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCampaign(o[0]);
   checkCampaign(o[1]);
@@ -1219,7 +1219,7 @@
   var o = new api.CampaignsListResponse();
   buildCounterCampaignsListResponse++;
   if (buildCounterCampaignsListResponse < 3) {
-    o.campaigns = buildUnnamed2703();
+    o.campaigns = buildUnnamed2728();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1230,7 +1230,7 @@
 checkCampaignsListResponse(api.CampaignsListResponse o) {
   buildCounterCampaignsListResponse++;
   if (buildCounterCampaignsListResponse < 3) {
-    checkUnnamed2703(o.campaigns);
+    checkUnnamed2728(o.campaigns);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1283,14 +1283,14 @@
   buildCounterChangeLog--;
 }
 
-buildUnnamed2704() {
+buildUnnamed2729() {
   var o = new core.List<api.ChangeLog>();
   o.add(buildChangeLog());
   o.add(buildChangeLog());
   return o;
 }
 
-checkUnnamed2704(core.List<api.ChangeLog> o) {
+checkUnnamed2729(core.List<api.ChangeLog> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChangeLog(o[0]);
   checkChangeLog(o[1]);
@@ -1301,7 +1301,7 @@
   var o = new api.ChangeLogsListResponse();
   buildCounterChangeLogsListResponse++;
   if (buildCounterChangeLogsListResponse < 3) {
-    o.changeLogs = buildUnnamed2704();
+    o.changeLogs = buildUnnamed2729();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1312,21 +1312,21 @@
 checkChangeLogsListResponse(api.ChangeLogsListResponse o) {
   buildCounterChangeLogsListResponse++;
   if (buildCounterChangeLogsListResponse < 3) {
-    checkUnnamed2704(o.changeLogs);
+    checkUnnamed2729(o.changeLogs);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterChangeLogsListResponse--;
 }
 
-buildUnnamed2705() {
+buildUnnamed2730() {
   var o = new core.List<api.City>();
   o.add(buildCity());
   o.add(buildCity());
   return o;
 }
 
-checkUnnamed2705(core.List<api.City> o) {
+checkUnnamed2730(core.List<api.City> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCity(o[0]);
   checkCity(o[1]);
@@ -1337,7 +1337,7 @@
   var o = new api.CitiesListResponse();
   buildCounterCitiesListResponse++;
   if (buildCounterCitiesListResponse < 3) {
-    o.cities = buildUnnamed2705();
+    o.cities = buildUnnamed2730();
     o.kind = "foo";
   }
   buildCounterCitiesListResponse--;
@@ -1347,7 +1347,7 @@
 checkCitiesListResponse(api.CitiesListResponse o) {
   buildCounterCitiesListResponse++;
   if (buildCounterCitiesListResponse < 3) {
-    checkUnnamed2705(o.cities);
+    checkUnnamed2730(o.cities);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCitiesListResponse--;
@@ -1478,14 +1478,14 @@
   buildCounterCompanionClickThroughOverride--;
 }
 
-buildUnnamed2706() {
+buildUnnamed2731() {
   var o = new core.List<api.Size>();
   o.add(buildSize());
   o.add(buildSize());
   return o;
 }
 
-checkUnnamed2706(core.List<api.Size> o) {
+checkUnnamed2731(core.List<api.Size> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSize(o[0]);
   checkSize(o[1]);
@@ -1497,7 +1497,7 @@
   buildCounterCompanionSetting++;
   if (buildCounterCompanionSetting < 3) {
     o.companionsDisabled = true;
-    o.enabledSizes = buildUnnamed2706();
+    o.enabledSizes = buildUnnamed2731();
     o.imageOnly = true;
     o.kind = "foo";
   }
@@ -1509,7 +1509,7 @@
   buildCounterCompanionSetting++;
   if (buildCounterCompanionSetting < 3) {
     unittest.expect(o.companionsDisabled, unittest.isTrue);
-    checkUnnamed2706(o.enabledSizes);
+    checkUnnamed2731(o.enabledSizes);
     unittest.expect(o.imageOnly, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
@@ -1573,14 +1573,14 @@
   buildCounterConnectionType--;
 }
 
-buildUnnamed2707() {
+buildUnnamed2732() {
   var o = new core.List<api.ConnectionType>();
   o.add(buildConnectionType());
   o.add(buildConnectionType());
   return o;
 }
 
-checkUnnamed2707(core.List<api.ConnectionType> o) {
+checkUnnamed2732(core.List<api.ConnectionType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConnectionType(o[0]);
   checkConnectionType(o[1]);
@@ -1591,7 +1591,7 @@
   var o = new api.ConnectionTypesListResponse();
   buildCounterConnectionTypesListResponse++;
   if (buildCounterConnectionTypesListResponse < 3) {
-    o.connectionTypes = buildUnnamed2707();
+    o.connectionTypes = buildUnnamed2732();
     o.kind = "foo";
   }
   buildCounterConnectionTypesListResponse--;
@@ -1601,20 +1601,20 @@
 checkConnectionTypesListResponse(api.ConnectionTypesListResponse o) {
   buildCounterConnectionTypesListResponse++;
   if (buildCounterConnectionTypesListResponse < 3) {
-    checkUnnamed2707(o.connectionTypes);
+    checkUnnamed2732(o.connectionTypes);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConnectionTypesListResponse--;
 }
 
-buildUnnamed2708() {
+buildUnnamed2733() {
   var o = new core.List<api.ContentCategory>();
   o.add(buildContentCategory());
   o.add(buildContentCategory());
   return o;
 }
 
-checkUnnamed2708(core.List<api.ContentCategory> o) {
+checkUnnamed2733(core.List<api.ContentCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContentCategory(o[0]);
   checkContentCategory(o[1]);
@@ -1625,7 +1625,7 @@
   var o = new api.ContentCategoriesListResponse();
   buildCounterContentCategoriesListResponse++;
   if (buildCounterContentCategoriesListResponse < 3) {
-    o.contentCategories = buildUnnamed2708();
+    o.contentCategories = buildUnnamed2733();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1636,7 +1636,7 @@
 checkContentCategoriesListResponse(api.ContentCategoriesListResponse o) {
   buildCounterContentCategoriesListResponse++;
   if (buildCounterContentCategoriesListResponse < 3) {
-    checkUnnamed2708(o.contentCategories);
+    checkUnnamed2733(o.contentCategories);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1668,27 +1668,27 @@
   buildCounterContentCategory--;
 }
 
-buildUnnamed2709() {
+buildUnnamed2734() {
   var o = new core.List<api.CustomFloodlightVariable>();
   o.add(buildCustomFloodlightVariable());
   o.add(buildCustomFloodlightVariable());
   return o;
 }
 
-checkUnnamed2709(core.List<api.CustomFloodlightVariable> o) {
+checkUnnamed2734(core.List<api.CustomFloodlightVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomFloodlightVariable(o[0]);
   checkCustomFloodlightVariable(o[1]);
 }
 
-buildUnnamed2710() {
+buildUnnamed2735() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2710(core.List<core.String> o) {
+checkUnnamed2735(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1700,9 +1700,9 @@
   buildCounterConversion++;
   if (buildCounterConversion < 3) {
     o.childDirectedTreatment = true;
-    o.customVariables = buildUnnamed2709();
+    o.customVariables = buildUnnamed2734();
     o.encryptedUserId = "foo";
-    o.encryptedUserIdCandidates = buildUnnamed2710();
+    o.encryptedUserIdCandidates = buildUnnamed2735();
     o.floodlightActivityId = "foo";
     o.floodlightConfigurationId = "foo";
     o.gclid = "foo";
@@ -1722,9 +1722,9 @@
   buildCounterConversion++;
   if (buildCounterConversion < 3) {
     unittest.expect(o.childDirectedTreatment, unittest.isTrue);
-    checkUnnamed2709(o.customVariables);
+    checkUnnamed2734(o.customVariables);
     unittest.expect(o.encryptedUserId, unittest.equals('foo'));
-    checkUnnamed2710(o.encryptedUserIdCandidates);
+    checkUnnamed2735(o.encryptedUserIdCandidates);
     unittest.expect(o.floodlightActivityId, unittest.equals('foo'));
     unittest.expect(o.floodlightConfigurationId, unittest.equals('foo'));
     unittest.expect(o.gclid, unittest.equals('foo'));
@@ -1762,14 +1762,14 @@
   buildCounterConversionError--;
 }
 
-buildUnnamed2711() {
+buildUnnamed2736() {
   var o = new core.List<api.ConversionError>();
   o.add(buildConversionError());
   o.add(buildConversionError());
   return o;
 }
 
-checkUnnamed2711(core.List<api.ConversionError> o) {
+checkUnnamed2736(core.List<api.ConversionError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversionError(o[0]);
   checkConversionError(o[1]);
@@ -1781,7 +1781,7 @@
   buildCounterConversionStatus++;
   if (buildCounterConversionStatus < 3) {
     o.conversion = buildConversion();
-    o.errors = buildUnnamed2711();
+    o.errors = buildUnnamed2736();
     o.kind = "foo";
   }
   buildCounterConversionStatus--;
@@ -1792,20 +1792,20 @@
   buildCounterConversionStatus++;
   if (buildCounterConversionStatus < 3) {
     checkConversion(o.conversion);
-    checkUnnamed2711(o.errors);
+    checkUnnamed2736(o.errors);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionStatus--;
 }
 
-buildUnnamed2712() {
+buildUnnamed2737() {
   var o = new core.List<api.Conversion>();
   o.add(buildConversion());
   o.add(buildConversion());
   return o;
 }
 
-checkUnnamed2712(core.List<api.Conversion> o) {
+checkUnnamed2737(core.List<api.Conversion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversion(o[0]);
   checkConversion(o[1]);
@@ -1816,7 +1816,7 @@
   var o = new api.ConversionsBatchInsertRequest();
   buildCounterConversionsBatchInsertRequest++;
   if (buildCounterConversionsBatchInsertRequest < 3) {
-    o.conversions = buildUnnamed2712();
+    o.conversions = buildUnnamed2737();
     o.encryptionInfo = buildEncryptionInfo();
     o.kind = "foo";
   }
@@ -1827,21 +1827,21 @@
 checkConversionsBatchInsertRequest(api.ConversionsBatchInsertRequest o) {
   buildCounterConversionsBatchInsertRequest++;
   if (buildCounterConversionsBatchInsertRequest < 3) {
-    checkUnnamed2712(o.conversions);
+    checkUnnamed2737(o.conversions);
     checkEncryptionInfo(o.encryptionInfo);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionsBatchInsertRequest--;
 }
 
-buildUnnamed2713() {
+buildUnnamed2738() {
   var o = new core.List<api.ConversionStatus>();
   o.add(buildConversionStatus());
   o.add(buildConversionStatus());
   return o;
 }
 
-checkUnnamed2713(core.List<api.ConversionStatus> o) {
+checkUnnamed2738(core.List<api.ConversionStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversionStatus(o[0]);
   checkConversionStatus(o[1]);
@@ -1854,7 +1854,7 @@
   if (buildCounterConversionsBatchInsertResponse < 3) {
     o.hasFailures = true;
     o.kind = "foo";
-    o.status = buildUnnamed2713();
+    o.status = buildUnnamed2738();
   }
   buildCounterConversionsBatchInsertResponse--;
   return o;
@@ -1865,19 +1865,19 @@
   if (buildCounterConversionsBatchInsertResponse < 3) {
     unittest.expect(o.hasFailures, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2713(o.status);
+    checkUnnamed2738(o.status);
   }
   buildCounterConversionsBatchInsertResponse--;
 }
 
-buildUnnamed2714() {
+buildUnnamed2739() {
   var o = new core.List<api.Conversion>();
   o.add(buildConversion());
   o.add(buildConversion());
   return o;
 }
 
-checkUnnamed2714(core.List<api.Conversion> o) {
+checkUnnamed2739(core.List<api.Conversion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversion(o[0]);
   checkConversion(o[1]);
@@ -1888,7 +1888,7 @@
   var o = new api.ConversionsBatchUpdateRequest();
   buildCounterConversionsBatchUpdateRequest++;
   if (buildCounterConversionsBatchUpdateRequest < 3) {
-    o.conversions = buildUnnamed2714();
+    o.conversions = buildUnnamed2739();
     o.encryptionInfo = buildEncryptionInfo();
     o.kind = "foo";
   }
@@ -1899,21 +1899,21 @@
 checkConversionsBatchUpdateRequest(api.ConversionsBatchUpdateRequest o) {
   buildCounterConversionsBatchUpdateRequest++;
   if (buildCounterConversionsBatchUpdateRequest < 3) {
-    checkUnnamed2714(o.conversions);
+    checkUnnamed2739(o.conversions);
     checkEncryptionInfo(o.encryptionInfo);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionsBatchUpdateRequest--;
 }
 
-buildUnnamed2715() {
+buildUnnamed2740() {
   var o = new core.List<api.ConversionStatus>();
   o.add(buildConversionStatus());
   o.add(buildConversionStatus());
   return o;
 }
 
-checkUnnamed2715(core.List<api.ConversionStatus> o) {
+checkUnnamed2740(core.List<api.ConversionStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversionStatus(o[0]);
   checkConversionStatus(o[1]);
@@ -1926,7 +1926,7 @@
   if (buildCounterConversionsBatchUpdateResponse < 3) {
     o.hasFailures = true;
     o.kind = "foo";
-    o.status = buildUnnamed2715();
+    o.status = buildUnnamed2740();
   }
   buildCounterConversionsBatchUpdateResponse--;
   return o;
@@ -1937,19 +1937,19 @@
   if (buildCounterConversionsBatchUpdateResponse < 3) {
     unittest.expect(o.hasFailures, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2715(o.status);
+    checkUnnamed2740(o.status);
   }
   buildCounterConversionsBatchUpdateResponse--;
 }
 
-buildUnnamed2716() {
+buildUnnamed2741() {
   var o = new core.List<api.Country>();
   o.add(buildCountry());
   o.add(buildCountry());
   return o;
 }
 
-checkUnnamed2716(core.List<api.Country> o) {
+checkUnnamed2741(core.List<api.Country> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCountry(o[0]);
   checkCountry(o[1]);
@@ -1960,7 +1960,7 @@
   var o = new api.CountriesListResponse();
   buildCounterCountriesListResponse++;
   if (buildCounterCountriesListResponse < 3) {
-    o.countries = buildUnnamed2716();
+    o.countries = buildUnnamed2741();
     o.kind = "foo";
   }
   buildCounterCountriesListResponse--;
@@ -1970,7 +1970,7 @@
 checkCountriesListResponse(api.CountriesListResponse o) {
   buildCounterCountriesListResponse++;
   if (buildCounterCountriesListResponse < 3) {
-    checkUnnamed2716(o.countries);
+    checkUnnamed2741(o.countries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCountriesListResponse--;
@@ -2003,157 +2003,157 @@
   buildCounterCountry--;
 }
 
-buildUnnamed2717() {
+buildUnnamed2742() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2717(core.List<core.String> o) {
+checkUnnamed2742(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2718() {
+buildUnnamed2743() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2718(core.List<core.String> o) {
+checkUnnamed2743(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2719() {
+buildUnnamed2744() {
   var o = new core.List<api.ClickTag>();
   o.add(buildClickTag());
   o.add(buildClickTag());
   return o;
 }
 
-checkUnnamed2719(core.List<api.ClickTag> o) {
+checkUnnamed2744(core.List<api.ClickTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkClickTag(o[0]);
   checkClickTag(o[1]);
 }
 
-buildUnnamed2720() {
+buildUnnamed2745() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2720(core.List<core.String> o) {
+checkUnnamed2745(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2721() {
+buildUnnamed2746() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2721(core.List<core.String> o) {
+checkUnnamed2746(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2722() {
+buildUnnamed2747() {
   var o = new core.List<api.CreativeCustomEvent>();
   o.add(buildCreativeCustomEvent());
   o.add(buildCreativeCustomEvent());
   return o;
 }
 
-checkUnnamed2722(core.List<api.CreativeCustomEvent> o) {
+checkUnnamed2747(core.List<api.CreativeCustomEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeCustomEvent(o[0]);
   checkCreativeCustomEvent(o[1]);
 }
 
-buildUnnamed2723() {
+buildUnnamed2748() {
   var o = new core.List<api.CreativeAsset>();
   o.add(buildCreativeAsset());
   o.add(buildCreativeAsset());
   return o;
 }
 
-checkUnnamed2723(core.List<api.CreativeAsset> o) {
+checkUnnamed2748(core.List<api.CreativeAsset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeAsset(o[0]);
   checkCreativeAsset(o[1]);
 }
 
-buildUnnamed2724() {
+buildUnnamed2749() {
   var o = new core.List<api.CreativeFieldAssignment>();
   o.add(buildCreativeFieldAssignment());
   o.add(buildCreativeFieldAssignment());
   return o;
 }
 
-checkUnnamed2724(core.List<api.CreativeFieldAssignment> o) {
+checkUnnamed2749(core.List<api.CreativeFieldAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeFieldAssignment(o[0]);
   checkCreativeFieldAssignment(o[1]);
 }
 
-buildUnnamed2725() {
+buildUnnamed2750() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2725(core.List<core.String> o) {
+checkUnnamed2750(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2726() {
+buildUnnamed2751() {
   var o = new core.List<api.CreativeCustomEvent>();
   o.add(buildCreativeCustomEvent());
   o.add(buildCreativeCustomEvent());
   return o;
 }
 
-checkUnnamed2726(core.List<api.CreativeCustomEvent> o) {
+checkUnnamed2751(core.List<api.CreativeCustomEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeCustomEvent(o[0]);
   checkCreativeCustomEvent(o[1]);
 }
 
-buildUnnamed2727() {
+buildUnnamed2752() {
   var o = new core.List<api.ThirdPartyTrackingUrl>();
   o.add(buildThirdPartyTrackingUrl());
   o.add(buildThirdPartyTrackingUrl());
   return o;
 }
 
-checkUnnamed2727(core.List<api.ThirdPartyTrackingUrl> o) {
+checkUnnamed2752(core.List<api.ThirdPartyTrackingUrl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThirdPartyTrackingUrl(o[0]);
   checkThirdPartyTrackingUrl(o[1]);
 }
 
-buildUnnamed2728() {
+buildUnnamed2753() {
   var o = new core.List<api.CreativeCustomEvent>();
   o.add(buildCreativeCustomEvent());
   o.add(buildCreativeCustomEvent());
   return o;
 }
 
-checkUnnamed2728(core.List<api.CreativeCustomEvent> o) {
+checkUnnamed2753(core.List<api.CreativeCustomEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeCustomEvent(o[0]);
   checkCreativeCustomEvent(o[1]);
@@ -2167,7 +2167,7 @@
     o.accountId = "foo";
     o.active = true;
     o.adParameters = "foo";
-    o.adTagKeys = buildUnnamed2717();
+    o.adTagKeys = buildUnnamed2742();
     o.advertiserId = "foo";
     o.allowScriptAccess = true;
     o.archived = true;
@@ -2177,21 +2177,21 @@
     o.autoAdvanceImages = true;
     o.backgroundColor = "foo";
     o.backupImageClickThroughUrl = buildCreativeClickThroughUrl();
-    o.backupImageFeatures = buildUnnamed2718();
+    o.backupImageFeatures = buildUnnamed2743();
     o.backupImageReportingLabel = "foo";
     o.backupImageTargetWindow = buildTargetWindow();
-    o.clickTags = buildUnnamed2719();
+    o.clickTags = buildUnnamed2744();
     o.commercialId = "foo";
-    o.companionCreatives = buildUnnamed2720();
-    o.compatibility = buildUnnamed2721();
+    o.companionCreatives = buildUnnamed2745();
+    o.compatibility = buildUnnamed2746();
     o.convertFlashToHtml5 = true;
-    o.counterCustomEvents = buildUnnamed2722();
+    o.counterCustomEvents = buildUnnamed2747();
     o.creativeAssetSelection = buildCreativeAssetSelection();
-    o.creativeAssets = buildUnnamed2723();
-    o.creativeFieldAssignments = buildUnnamed2724();
-    o.customKeyValues = buildUnnamed2725();
+    o.creativeAssets = buildUnnamed2748();
+    o.creativeFieldAssignments = buildUnnamed2749();
+    o.customKeyValues = buildUnnamed2750();
     o.dynamicAssetSelection = true;
-    o.exitCustomEvents = buildUnnamed2726();
+    o.exitCustomEvents = buildUnnamed2751();
     o.fsCommand = buildFsCommand();
     o.htmlCode = "foo";
     o.htmlCodeLocked = true;
@@ -2220,8 +2220,8 @@
     o.subaccountId = "foo";
     o.thirdPartyBackupImageImpressionsUrl = "foo";
     o.thirdPartyRichMediaImpressionsUrl = "foo";
-    o.thirdPartyUrls = buildUnnamed2727();
-    o.timerCustomEvents = buildUnnamed2728();
+    o.thirdPartyUrls = buildUnnamed2752();
+    o.timerCustomEvents = buildUnnamed2753();
     o.totalFileSize = "foo";
     o.type = "foo";
     o.universalAdId = buildUniversalAdId();
@@ -2239,7 +2239,7 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.active, unittest.isTrue);
     unittest.expect(o.adParameters, unittest.equals('foo'));
-    checkUnnamed2717(o.adTagKeys);
+    checkUnnamed2742(o.adTagKeys);
     unittest.expect(o.advertiserId, unittest.equals('foo'));
     unittest.expect(o.allowScriptAccess, unittest.isTrue);
     unittest.expect(o.archived, unittest.isTrue);
@@ -2249,21 +2249,21 @@
     unittest.expect(o.autoAdvanceImages, unittest.isTrue);
     unittest.expect(o.backgroundColor, unittest.equals('foo'));
     checkCreativeClickThroughUrl(o.backupImageClickThroughUrl);
-    checkUnnamed2718(o.backupImageFeatures);
+    checkUnnamed2743(o.backupImageFeatures);
     unittest.expect(o.backupImageReportingLabel, unittest.equals('foo'));
     checkTargetWindow(o.backupImageTargetWindow);
-    checkUnnamed2719(o.clickTags);
+    checkUnnamed2744(o.clickTags);
     unittest.expect(o.commercialId, unittest.equals('foo'));
-    checkUnnamed2720(o.companionCreatives);
-    checkUnnamed2721(o.compatibility);
+    checkUnnamed2745(o.companionCreatives);
+    checkUnnamed2746(o.compatibility);
     unittest.expect(o.convertFlashToHtml5, unittest.isTrue);
-    checkUnnamed2722(o.counterCustomEvents);
+    checkUnnamed2747(o.counterCustomEvents);
     checkCreativeAssetSelection(o.creativeAssetSelection);
-    checkUnnamed2723(o.creativeAssets);
-    checkUnnamed2724(o.creativeFieldAssignments);
-    checkUnnamed2725(o.customKeyValues);
+    checkUnnamed2748(o.creativeAssets);
+    checkUnnamed2749(o.creativeFieldAssignments);
+    checkUnnamed2750(o.customKeyValues);
     unittest.expect(o.dynamicAssetSelection, unittest.isTrue);
-    checkUnnamed2726(o.exitCustomEvents);
+    checkUnnamed2751(o.exitCustomEvents);
     checkFsCommand(o.fsCommand);
     unittest.expect(o.htmlCode, unittest.equals('foo'));
     unittest.expect(o.htmlCodeLocked, unittest.isTrue);
@@ -2294,8 +2294,8 @@
         o.thirdPartyBackupImageImpressionsUrl, unittest.equals('foo'));
     unittest.expect(
         o.thirdPartyRichMediaImpressionsUrl, unittest.equals('foo'));
-    checkUnnamed2727(o.thirdPartyUrls);
-    checkUnnamed2728(o.timerCustomEvents);
+    checkUnnamed2752(o.thirdPartyUrls);
+    checkUnnamed2753(o.timerCustomEvents);
     unittest.expect(o.totalFileSize, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     checkUniversalAdId(o.universalAdId);
@@ -2306,27 +2306,27 @@
   buildCounterCreative--;
 }
 
-buildUnnamed2729() {
+buildUnnamed2754() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2729(core.List<core.String> o) {
+checkUnnamed2754(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2730() {
+buildUnnamed2755() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2730(core.List<core.String> o) {
+checkUnnamed2755(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2346,9 +2346,9 @@
     o.bitRate = 42;
     o.childAssetType = "foo";
     o.collapsedSize = buildSize();
-    o.companionCreativeIds = buildUnnamed2729();
+    o.companionCreativeIds = buildUnnamed2754();
     o.customStartTimeValue = 42;
-    o.detectedFeatures = buildUnnamed2730();
+    o.detectedFeatures = buildUnnamed2755();
     o.displayType = "foo";
     o.duration = 42;
     o.durationType = "foo";
@@ -2399,9 +2399,9 @@
     unittest.expect(o.bitRate, unittest.equals(42));
     unittest.expect(o.childAssetType, unittest.equals('foo'));
     checkSize(o.collapsedSize);
-    checkUnnamed2729(o.companionCreativeIds);
+    checkUnnamed2754(o.companionCreativeIds);
     unittest.expect(o.customStartTimeValue, unittest.equals(42));
-    checkUnnamed2730(o.detectedFeatures);
+    checkUnnamed2755(o.detectedFeatures);
     unittest.expect(o.displayType, unittest.equals('foo'));
     unittest.expect(o.duration, unittest.equals(42));
     unittest.expect(o.durationType, unittest.equals('foo'));
@@ -2460,40 +2460,40 @@
   buildCounterCreativeAssetId--;
 }
 
-buildUnnamed2731() {
+buildUnnamed2756() {
   var o = new core.List<api.ClickTag>();
   o.add(buildClickTag());
   o.add(buildClickTag());
   return o;
 }
 
-checkUnnamed2731(core.List<api.ClickTag> o) {
+checkUnnamed2756(core.List<api.ClickTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkClickTag(o[0]);
   checkClickTag(o[1]);
 }
 
-buildUnnamed2732() {
+buildUnnamed2757() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2732(core.List<core.String> o) {
+checkUnnamed2757(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2733() {
+buildUnnamed2758() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2733(core.List<core.String> o) {
+checkUnnamed2758(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2505,12 +2505,12 @@
   buildCounterCreativeAssetMetadata++;
   if (buildCounterCreativeAssetMetadata < 3) {
     o.assetIdentifier = buildCreativeAssetId();
-    o.clickTags = buildUnnamed2731();
-    o.detectedFeatures = buildUnnamed2732();
+    o.clickTags = buildUnnamed2756();
+    o.detectedFeatures = buildUnnamed2757();
     o.id = "foo";
     o.idDimensionValue = buildDimensionValue();
     o.kind = "foo";
-    o.warnedValidationRules = buildUnnamed2733();
+    o.warnedValidationRules = buildUnnamed2758();
   }
   buildCounterCreativeAssetMetadata--;
   return o;
@@ -2520,24 +2520,24 @@
   buildCounterCreativeAssetMetadata++;
   if (buildCounterCreativeAssetMetadata < 3) {
     checkCreativeAssetId(o.assetIdentifier);
-    checkUnnamed2731(o.clickTags);
-    checkUnnamed2732(o.detectedFeatures);
+    checkUnnamed2756(o.clickTags);
+    checkUnnamed2757(o.detectedFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
     checkDimensionValue(o.idDimensionValue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2733(o.warnedValidationRules);
+    checkUnnamed2758(o.warnedValidationRules);
   }
   buildCounterCreativeAssetMetadata--;
 }
 
-buildUnnamed2734() {
+buildUnnamed2759() {
   var o = new core.List<api.Rule>();
   o.add(buildRule());
   o.add(buildRule());
   return o;
 }
 
-checkUnnamed2734(core.List<api.Rule> o) {
+checkUnnamed2759(core.List<api.Rule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRule(o[0]);
   checkRule(o[1]);
@@ -2549,7 +2549,7 @@
   buildCounterCreativeAssetSelection++;
   if (buildCounterCreativeAssetSelection < 3) {
     o.defaultAssetId = "foo";
-    o.rules = buildUnnamed2734();
+    o.rules = buildUnnamed2759();
   }
   buildCounterCreativeAssetSelection--;
   return o;
@@ -2559,45 +2559,45 @@
   buildCounterCreativeAssetSelection++;
   if (buildCounterCreativeAssetSelection < 3) {
     unittest.expect(o.defaultAssetId, unittest.equals('foo'));
-    checkUnnamed2734(o.rules);
+    checkUnnamed2759(o.rules);
   }
   buildCounterCreativeAssetSelection--;
 }
 
-buildUnnamed2735() {
+buildUnnamed2760() {
   var o = new core.List<api.CompanionClickThroughOverride>();
   o.add(buildCompanionClickThroughOverride());
   o.add(buildCompanionClickThroughOverride());
   return o;
 }
 
-checkUnnamed2735(core.List<api.CompanionClickThroughOverride> o) {
+checkUnnamed2760(core.List<api.CompanionClickThroughOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCompanionClickThroughOverride(o[0]);
   checkCompanionClickThroughOverride(o[1]);
 }
 
-buildUnnamed2736() {
+buildUnnamed2761() {
   var o = new core.List<api.CreativeGroupAssignment>();
   o.add(buildCreativeGroupAssignment());
   o.add(buildCreativeGroupAssignment());
   return o;
 }
 
-checkUnnamed2736(core.List<api.CreativeGroupAssignment> o) {
+checkUnnamed2761(core.List<api.CreativeGroupAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeGroupAssignment(o[0]);
   checkCreativeGroupAssignment(o[1]);
 }
 
-buildUnnamed2737() {
+buildUnnamed2762() {
   var o = new core.List<api.RichMediaExitOverride>();
   o.add(buildRichMediaExitOverride());
   o.add(buildRichMediaExitOverride());
   return o;
 }
 
-checkUnnamed2737(core.List<api.RichMediaExitOverride> o) {
+checkUnnamed2762(core.List<api.RichMediaExitOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRichMediaExitOverride(o[0]);
   checkRichMediaExitOverride(o[1]);
@@ -2611,12 +2611,12 @@
     o.active = true;
     o.applyEventTags = true;
     o.clickThroughUrl = buildClickThroughUrl();
-    o.companionCreativeOverrides = buildUnnamed2735();
-    o.creativeGroupAssignments = buildUnnamed2736();
+    o.companionCreativeOverrides = buildUnnamed2760();
+    o.creativeGroupAssignments = buildUnnamed2761();
     o.creativeId = "foo";
     o.creativeIdDimensionValue = buildDimensionValue();
     o.endTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.richMediaExitOverrides = buildUnnamed2737();
+    o.richMediaExitOverrides = buildUnnamed2762();
     o.sequence = 42;
     o.sslCompliant = true;
     o.startTime = core.DateTime.parse("2002-02-27T14:01:02");
@@ -2632,13 +2632,13 @@
     unittest.expect(o.active, unittest.isTrue);
     unittest.expect(o.applyEventTags, unittest.isTrue);
     checkClickThroughUrl(o.clickThroughUrl);
-    checkUnnamed2735(o.companionCreativeOverrides);
-    checkUnnamed2736(o.creativeGroupAssignments);
+    checkUnnamed2760(o.companionCreativeOverrides);
+    checkUnnamed2761(o.creativeGroupAssignments);
     unittest.expect(o.creativeId, unittest.equals('foo'));
     checkDimensionValue(o.creativeIdDimensionValue);
     unittest.expect(
         o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed2737(o.richMediaExitOverrides);
+    checkUnnamed2762(o.richMediaExitOverrides);
     unittest.expect(o.sequence, unittest.equals(42));
     unittest.expect(o.sslCompliant, unittest.isTrue);
     unittest.expect(o.startTime,
@@ -2783,14 +2783,14 @@
   buildCounterCreativeFieldValue--;
 }
 
-buildUnnamed2738() {
+buildUnnamed2763() {
   var o = new core.List<api.CreativeFieldValue>();
   o.add(buildCreativeFieldValue());
   o.add(buildCreativeFieldValue());
   return o;
 }
 
-checkUnnamed2738(core.List<api.CreativeFieldValue> o) {
+checkUnnamed2763(core.List<api.CreativeFieldValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeFieldValue(o[0]);
   checkCreativeFieldValue(o[1]);
@@ -2801,7 +2801,7 @@
   var o = new api.CreativeFieldValuesListResponse();
   buildCounterCreativeFieldValuesListResponse++;
   if (buildCounterCreativeFieldValuesListResponse < 3) {
-    o.creativeFieldValues = buildUnnamed2738();
+    o.creativeFieldValues = buildUnnamed2763();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2812,21 +2812,21 @@
 checkCreativeFieldValuesListResponse(api.CreativeFieldValuesListResponse o) {
   buildCounterCreativeFieldValuesListResponse++;
   if (buildCounterCreativeFieldValuesListResponse < 3) {
-    checkUnnamed2738(o.creativeFieldValues);
+    checkUnnamed2763(o.creativeFieldValues);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCreativeFieldValuesListResponse--;
 }
 
-buildUnnamed2739() {
+buildUnnamed2764() {
   var o = new core.List<api.CreativeField>();
   o.add(buildCreativeField());
   o.add(buildCreativeField());
   return o;
 }
 
-checkUnnamed2739(core.List<api.CreativeField> o) {
+checkUnnamed2764(core.List<api.CreativeField> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeField(o[0]);
   checkCreativeField(o[1]);
@@ -2837,7 +2837,7 @@
   var o = new api.CreativeFieldsListResponse();
   buildCounterCreativeFieldsListResponse++;
   if (buildCounterCreativeFieldsListResponse < 3) {
-    o.creativeFields = buildUnnamed2739();
+    o.creativeFields = buildUnnamed2764();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2848,7 +2848,7 @@
 checkCreativeFieldsListResponse(api.CreativeFieldsListResponse o) {
   buildCounterCreativeFieldsListResponse++;
   if (buildCounterCreativeFieldsListResponse < 3) {
-    checkUnnamed2739(o.creativeFields);
+    checkUnnamed2764(o.creativeFields);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -2909,14 +2909,14 @@
   buildCounterCreativeGroupAssignment--;
 }
 
-buildUnnamed2740() {
+buildUnnamed2765() {
   var o = new core.List<api.CreativeGroup>();
   o.add(buildCreativeGroup());
   o.add(buildCreativeGroup());
   return o;
 }
 
-checkUnnamed2740(core.List<api.CreativeGroup> o) {
+checkUnnamed2765(core.List<api.CreativeGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeGroup(o[0]);
   checkCreativeGroup(o[1]);
@@ -2927,7 +2927,7 @@
   var o = new api.CreativeGroupsListResponse();
   buildCounterCreativeGroupsListResponse++;
   if (buildCounterCreativeGroupsListResponse < 3) {
-    o.creativeGroups = buildUnnamed2740();
+    o.creativeGroups = buildUnnamed2765();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2938,21 +2938,21 @@
 checkCreativeGroupsListResponse(api.CreativeGroupsListResponse o) {
   buildCounterCreativeGroupsListResponse++;
   if (buildCounterCreativeGroupsListResponse < 3) {
-    checkUnnamed2740(o.creativeGroups);
+    checkUnnamed2765(o.creativeGroups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCreativeGroupsListResponse--;
 }
 
-buildUnnamed2741() {
+buildUnnamed2766() {
   var o = new core.List<api.OptimizationActivity>();
   o.add(buildOptimizationActivity());
   o.add(buildOptimizationActivity());
   return o;
 }
 
-checkUnnamed2741(core.List<api.OptimizationActivity> o) {
+checkUnnamed2766(core.List<api.OptimizationActivity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOptimizationActivity(o[0]);
   checkOptimizationActivity(o[1]);
@@ -2965,7 +2965,7 @@
   if (buildCounterCreativeOptimizationConfiguration < 3) {
     o.id = "foo";
     o.name = "foo";
-    o.optimizationActivitys = buildUnnamed2741();
+    o.optimizationActivitys = buildUnnamed2766();
     o.optimizationModel = "foo";
   }
   buildCounterCreativeOptimizationConfiguration--;
@@ -2978,20 +2978,20 @@
   if (buildCounterCreativeOptimizationConfiguration < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2741(o.optimizationActivitys);
+    checkUnnamed2766(o.optimizationActivitys);
     unittest.expect(o.optimizationModel, unittest.equals('foo'));
   }
   buildCounterCreativeOptimizationConfiguration--;
 }
 
-buildUnnamed2742() {
+buildUnnamed2767() {
   var o = new core.List<api.CreativeAssignment>();
   o.add(buildCreativeAssignment());
   o.add(buildCreativeAssignment());
   return o;
 }
 
-checkUnnamed2742(core.List<api.CreativeAssignment> o) {
+checkUnnamed2767(core.List<api.CreativeAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeAssignment(o[0]);
   checkCreativeAssignment(o[1]);
@@ -3002,7 +3002,7 @@
   var o = new api.CreativeRotation();
   buildCounterCreativeRotation++;
   if (buildCounterCreativeRotation < 3) {
-    o.creativeAssignments = buildUnnamed2742();
+    o.creativeAssignments = buildUnnamed2767();
     o.creativeOptimizationConfigurationId = "foo";
     o.type = "foo";
     o.weightCalculationStrategy = "foo";
@@ -3014,7 +3014,7 @@
 checkCreativeRotation(api.CreativeRotation o) {
   buildCounterCreativeRotation++;
   if (buildCounterCreativeRotation < 3) {
-    checkUnnamed2742(o.creativeAssignments);
+    checkUnnamed2767(o.creativeAssignments);
     unittest.expect(
         o.creativeOptimizationConfigurationId, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -3044,14 +3044,14 @@
   buildCounterCreativeSettings--;
 }
 
-buildUnnamed2743() {
+buildUnnamed2768() {
   var o = new core.List<api.Creative>();
   o.add(buildCreative());
   o.add(buildCreative());
   return o;
 }
 
-checkUnnamed2743(core.List<api.Creative> o) {
+checkUnnamed2768(core.List<api.Creative> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreative(o[0]);
   checkCreative(o[1]);
@@ -3062,7 +3062,7 @@
   var o = new api.CreativesListResponse();
   buildCounterCreativesListResponse++;
   if (buildCounterCreativesListResponse < 3) {
-    o.creatives = buildUnnamed2743();
+    o.creatives = buildUnnamed2768();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3073,60 +3073,60 @@
 checkCreativesListResponse(api.CreativesListResponse o) {
   buildCounterCreativesListResponse++;
   if (buildCounterCreativesListResponse < 3) {
-    checkUnnamed2743(o.creatives);
+    checkUnnamed2768(o.creatives);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCreativesListResponse--;
 }
 
-buildUnnamed2744() {
+buildUnnamed2769() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed2744(core.List<api.Dimension> o) {
+checkUnnamed2769(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed2745() {
+buildUnnamed2770() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed2745(core.List<api.Dimension> o) {
+checkUnnamed2770(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed2746() {
+buildUnnamed2771() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed2746(core.List<api.Metric> o) {
+checkUnnamed2771(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed2747() {
+buildUnnamed2772() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed2747(core.List<api.Metric> o) {
+checkUnnamed2772(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -3137,11 +3137,11 @@
   var o = new api.CrossDimensionReachReportCompatibleFields();
   buildCounterCrossDimensionReachReportCompatibleFields++;
   if (buildCounterCrossDimensionReachReportCompatibleFields < 3) {
-    o.breakdown = buildUnnamed2744();
-    o.dimensionFilters = buildUnnamed2745();
+    o.breakdown = buildUnnamed2769();
+    o.dimensionFilters = buildUnnamed2770();
     o.kind = "foo";
-    o.metrics = buildUnnamed2746();
-    o.overlapMetrics = buildUnnamed2747();
+    o.metrics = buildUnnamed2771();
+    o.overlapMetrics = buildUnnamed2772();
   }
   buildCounterCrossDimensionReachReportCompatibleFields--;
   return o;
@@ -3151,11 +3151,11 @@
     api.CrossDimensionReachReportCompatibleFields o) {
   buildCounterCrossDimensionReachReportCompatibleFields++;
   if (buildCounterCrossDimensionReachReportCompatibleFields < 3) {
-    checkUnnamed2744(o.breakdown);
-    checkUnnamed2745(o.dimensionFilters);
+    checkUnnamed2769(o.breakdown);
+    checkUnnamed2770(o.dimensionFilters);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2746(o.metrics);
-    checkUnnamed2747(o.overlapMetrics);
+    checkUnnamed2771(o.metrics);
+    checkUnnamed2772(o.overlapMetrics);
   }
   buildCounterCrossDimensionReachReportCompatibleFields--;
 }
@@ -3183,14 +3183,14 @@
   buildCounterCustomFloodlightVariable--;
 }
 
-buildUnnamed2748() {
+buildUnnamed2773() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed2748(core.List<api.DimensionValue> o) {
+checkUnnamed2773(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
@@ -3201,7 +3201,7 @@
   var o = new api.CustomRichMediaEvents();
   buildCounterCustomRichMediaEvents++;
   if (buildCounterCustomRichMediaEvents < 3) {
-    o.filteredEventIds = buildUnnamed2748();
+    o.filteredEventIds = buildUnnamed2773();
     o.kind = "foo";
   }
   buildCounterCustomRichMediaEvents--;
@@ -3211,7 +3211,7 @@
 checkCustomRichMediaEvents(api.CustomRichMediaEvents o) {
   buildCounterCustomRichMediaEvents++;
   if (buildCounterCustomRichMediaEvents < 3) {
-    checkUnnamed2748(o.filteredEventIds);
+    checkUnnamed2773(o.filteredEventIds);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomRichMediaEvents--;
@@ -3244,27 +3244,27 @@
   buildCounterDateRange--;
 }
 
-buildUnnamed2749() {
+buildUnnamed2774() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2749(core.List<core.String> o) {
+checkUnnamed2774(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2750() {
+buildUnnamed2775() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2750(core.List<core.int> o) {
+checkUnnamed2775(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));
@@ -3275,8 +3275,8 @@
   var o = new api.DayPartTargeting();
   buildCounterDayPartTargeting++;
   if (buildCounterDayPartTargeting < 3) {
-    o.daysOfWeek = buildUnnamed2749();
-    o.hoursOfDay = buildUnnamed2750();
+    o.daysOfWeek = buildUnnamed2774();
+    o.hoursOfDay = buildUnnamed2775();
     o.userLocalTime = true;
   }
   buildCounterDayPartTargeting--;
@@ -3286,8 +3286,8 @@
 checkDayPartTargeting(api.DayPartTargeting o) {
   buildCounterDayPartTargeting++;
   if (buildCounterDayPartTargeting < 3) {
-    checkUnnamed2749(o.daysOfWeek);
-    checkUnnamed2750(o.hoursOfDay);
+    checkUnnamed2774(o.daysOfWeek);
+    checkUnnamed2775(o.hoursOfDay);
     unittest.expect(o.userLocalTime, unittest.isTrue);
   }
   buildCounterDayPartTargeting--;
@@ -3440,14 +3440,14 @@
   buildCounterDimensionValue--;
 }
 
-buildUnnamed2751() {
+buildUnnamed2776() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed2751(core.List<api.DimensionValue> o) {
+checkUnnamed2776(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
@@ -3459,7 +3459,7 @@
   buildCounterDimensionValueList++;
   if (buildCounterDimensionValueList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed2751();
+    o.items = buildUnnamed2776();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3471,21 +3471,21 @@
   buildCounterDimensionValueList++;
   if (buildCounterDimensionValueList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed2751(o.items);
+    checkUnnamed2776(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterDimensionValueList--;
 }
 
-buildUnnamed2752() {
+buildUnnamed2777() {
   var o = new core.List<api.DimensionFilter>();
   o.add(buildDimensionFilter());
   o.add(buildDimensionFilter());
   return o;
 }
 
-checkUnnamed2752(core.List<api.DimensionFilter> o) {
+checkUnnamed2777(core.List<api.DimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionFilter(o[0]);
   checkDimensionFilter(o[1]);
@@ -3498,7 +3498,7 @@
   if (buildCounterDimensionValueRequest < 3) {
     o.dimensionName = "foo";
     o.endDate = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.filters = buildUnnamed2752();
+    o.filters = buildUnnamed2777();
     o.kind = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
   }
@@ -3512,7 +3512,7 @@
     unittest.expect(o.dimensionName, unittest.equals('foo'));
     unittest.expect(
         o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed2752(o.filters);
+    checkUnnamed2777(o.filters);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.startDate,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
@@ -3520,40 +3520,40 @@
   buildCounterDimensionValueRequest--;
 }
 
-buildUnnamed2753() {
+buildUnnamed2778() {
   var o = new core.List<api.DirectorySiteContactAssignment>();
   o.add(buildDirectorySiteContactAssignment());
   o.add(buildDirectorySiteContactAssignment());
   return o;
 }
 
-checkUnnamed2753(core.List<api.DirectorySiteContactAssignment> o) {
+checkUnnamed2778(core.List<api.DirectorySiteContactAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectorySiteContactAssignment(o[0]);
   checkDirectorySiteContactAssignment(o[1]);
 }
 
-buildUnnamed2754() {
+buildUnnamed2779() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2754(core.List<core.String> o) {
+checkUnnamed2779(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2755() {
+buildUnnamed2780() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2755(core.List<core.String> o) {
+checkUnnamed2780(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3565,14 +3565,14 @@
   buildCounterDirectorySite++;
   if (buildCounterDirectorySite < 3) {
     o.active = true;
-    o.contactAssignments = buildUnnamed2753();
+    o.contactAssignments = buildUnnamed2778();
     o.countryId = "foo";
     o.currencyId = "foo";
     o.description = "foo";
     o.id = "foo";
     o.idDimensionValue = buildDimensionValue();
-    o.inpageTagFormats = buildUnnamed2754();
-    o.interstitialTagFormats = buildUnnamed2755();
+    o.inpageTagFormats = buildUnnamed2779();
+    o.interstitialTagFormats = buildUnnamed2780();
     o.kind = "foo";
     o.name = "foo";
     o.parentId = "foo";
@@ -3587,14 +3587,14 @@
   buildCounterDirectorySite++;
   if (buildCounterDirectorySite < 3) {
     unittest.expect(o.active, unittest.isTrue);
-    checkUnnamed2753(o.contactAssignments);
+    checkUnnamed2778(o.contactAssignments);
     unittest.expect(o.countryId, unittest.equals('foo'));
     unittest.expect(o.currencyId, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkDimensionValue(o.idDimensionValue);
-    checkUnnamed2754(o.inpageTagFormats);
-    checkUnnamed2755(o.interstitialTagFormats);
+    checkUnnamed2779(o.inpageTagFormats);
+    checkUnnamed2780(o.interstitialTagFormats);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parentId, unittest.equals('foo'));
@@ -3662,14 +3662,14 @@
   buildCounterDirectorySiteContactAssignment--;
 }
 
-buildUnnamed2756() {
+buildUnnamed2781() {
   var o = new core.List<api.DirectorySiteContact>();
   o.add(buildDirectorySiteContact());
   o.add(buildDirectorySiteContact());
   return o;
 }
 
-checkUnnamed2756(core.List<api.DirectorySiteContact> o) {
+checkUnnamed2781(core.List<api.DirectorySiteContact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectorySiteContact(o[0]);
   checkDirectorySiteContact(o[1]);
@@ -3680,7 +3680,7 @@
   var o = new api.DirectorySiteContactsListResponse();
   buildCounterDirectorySiteContactsListResponse++;
   if (buildCounterDirectorySiteContactsListResponse < 3) {
-    o.directorySiteContacts = buildUnnamed2756();
+    o.directorySiteContacts = buildUnnamed2781();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3692,7 +3692,7 @@
     api.DirectorySiteContactsListResponse o) {
   buildCounterDirectorySiteContactsListResponse++;
   if (buildCounterDirectorySiteContactsListResponse < 3) {
-    checkUnnamed2756(o.directorySiteContacts);
+    checkUnnamed2781(o.directorySiteContacts);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -3730,14 +3730,14 @@
   buildCounterDirectorySiteSettings--;
 }
 
-buildUnnamed2757() {
+buildUnnamed2782() {
   var o = new core.List<api.DirectorySite>();
   o.add(buildDirectorySite());
   o.add(buildDirectorySite());
   return o;
 }
 
-checkUnnamed2757(core.List<api.DirectorySite> o) {
+checkUnnamed2782(core.List<api.DirectorySite> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectorySite(o[0]);
   checkDirectorySite(o[1]);
@@ -3748,7 +3748,7 @@
   var o = new api.DirectorySitesListResponse();
   buildCounterDirectorySitesListResponse++;
   if (buildCounterDirectorySitesListResponse < 3) {
-    o.directorySites = buildUnnamed2757();
+    o.directorySites = buildUnnamed2782();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3759,7 +3759,7 @@
 checkDirectorySitesListResponse(api.DirectorySitesListResponse o) {
   buildCounterDirectorySitesListResponse++;
   if (buildCounterDirectorySitesListResponse < 3) {
-    checkUnnamed2757(o.directorySites);
+    checkUnnamed2782(o.directorySites);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -3791,14 +3791,14 @@
   buildCounterDynamicTargetingKey--;
 }
 
-buildUnnamed2758() {
+buildUnnamed2783() {
   var o = new core.List<api.DynamicTargetingKey>();
   o.add(buildDynamicTargetingKey());
   o.add(buildDynamicTargetingKey());
   return o;
 }
 
-checkUnnamed2758(core.List<api.DynamicTargetingKey> o) {
+checkUnnamed2783(core.List<api.DynamicTargetingKey> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDynamicTargetingKey(o[0]);
   checkDynamicTargetingKey(o[1]);
@@ -3809,7 +3809,7 @@
   var o = new api.DynamicTargetingKeysListResponse();
   buildCounterDynamicTargetingKeysListResponse++;
   if (buildCounterDynamicTargetingKeysListResponse < 3) {
-    o.dynamicTargetingKeys = buildUnnamed2758();
+    o.dynamicTargetingKeys = buildUnnamed2783();
     o.kind = "foo";
   }
   buildCounterDynamicTargetingKeysListResponse--;
@@ -3819,7 +3819,7 @@
 checkDynamicTargetingKeysListResponse(api.DynamicTargetingKeysListResponse o) {
   buildCounterDynamicTargetingKeysListResponse++;
   if (buildCounterDynamicTargetingKeysListResponse < 3) {
-    checkUnnamed2758(o.dynamicTargetingKeys);
+    checkUnnamed2783(o.dynamicTargetingKeys);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDynamicTargetingKeysListResponse--;
@@ -3850,14 +3850,14 @@
   buildCounterEncryptionInfo--;
 }
 
-buildUnnamed2759() {
+buildUnnamed2784() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2759(core.List<core.String> o) {
+checkUnnamed2784(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3879,7 +3879,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.siteFilterType = "foo";
-    o.siteIds = buildUnnamed2759();
+    o.siteIds = buildUnnamed2784();
     o.sslCompliant = true;
     o.status = "foo";
     o.subaccountId = "foo";
@@ -3905,7 +3905,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.siteFilterType, unittest.equals('foo'));
-    checkUnnamed2759(o.siteIds);
+    checkUnnamed2784(o.siteIds);
     unittest.expect(o.sslCompliant, unittest.isTrue);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.subaccountId, unittest.equals('foo'));
@@ -3937,14 +3937,14 @@
   buildCounterEventTagOverride--;
 }
 
-buildUnnamed2760() {
+buildUnnamed2785() {
   var o = new core.List<api.EventTag>();
   o.add(buildEventTag());
   o.add(buildEventTag());
   return o;
 }
 
-checkUnnamed2760(core.List<api.EventTag> o) {
+checkUnnamed2785(core.List<api.EventTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventTag(o[0]);
   checkEventTag(o[1]);
@@ -3955,7 +3955,7 @@
   var o = new api.EventTagsListResponse();
   buildCounterEventTagsListResponse++;
   if (buildCounterEventTagsListResponse < 3) {
-    o.eventTags = buildUnnamed2760();
+    o.eventTags = buildUnnamed2785();
     o.kind = "foo";
   }
   buildCounterEventTagsListResponse--;
@@ -3965,7 +3965,7 @@
 checkEventTagsListResponse(api.EventTagsListResponse o) {
   buildCounterEventTagsListResponse++;
   if (buildCounterEventTagsListResponse < 3) {
-    checkUnnamed2760(o.eventTags);
+    checkUnnamed2785(o.eventTags);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterEventTagsListResponse--;
@@ -4029,14 +4029,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed2761() {
+buildUnnamed2786() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed2761(core.List<api.File> o) {
+checkUnnamed2786(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -4048,7 +4048,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed2761();
+    o.items = buildUnnamed2786();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -4060,7 +4060,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed2761(o.items);
+    checkUnnamed2786(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -4118,14 +4118,14 @@
   buildCounterFloodlightActivitiesGenerateTagResponse--;
 }
 
-buildUnnamed2762() {
+buildUnnamed2787() {
   var o = new core.List<api.FloodlightActivity>();
   o.add(buildFloodlightActivity());
   o.add(buildFloodlightActivity());
   return o;
 }
 
-checkUnnamed2762(core.List<api.FloodlightActivity> o) {
+checkUnnamed2787(core.List<api.FloodlightActivity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFloodlightActivity(o[0]);
   checkFloodlightActivity(o[1]);
@@ -4136,7 +4136,7 @@
   var o = new api.FloodlightActivitiesListResponse();
   buildCounterFloodlightActivitiesListResponse++;
   if (buildCounterFloodlightActivitiesListResponse < 3) {
-    o.floodlightActivities = buildUnnamed2762();
+    o.floodlightActivities = buildUnnamed2787();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -4147,47 +4147,47 @@
 checkFloodlightActivitiesListResponse(api.FloodlightActivitiesListResponse o) {
   buildCounterFloodlightActivitiesListResponse++;
   if (buildCounterFloodlightActivitiesListResponse < 3) {
-    checkUnnamed2762(o.floodlightActivities);
+    checkUnnamed2787(o.floodlightActivities);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterFloodlightActivitiesListResponse--;
 }
 
-buildUnnamed2763() {
+buildUnnamed2788() {
   var o = new core.List<api.FloodlightActivityDynamicTag>();
   o.add(buildFloodlightActivityDynamicTag());
   o.add(buildFloodlightActivityDynamicTag());
   return o;
 }
 
-checkUnnamed2763(core.List<api.FloodlightActivityDynamicTag> o) {
+checkUnnamed2788(core.List<api.FloodlightActivityDynamicTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFloodlightActivityDynamicTag(o[0]);
   checkFloodlightActivityDynamicTag(o[1]);
 }
 
-buildUnnamed2764() {
+buildUnnamed2789() {
   var o = new core.List<api.FloodlightActivityPublisherDynamicTag>();
   o.add(buildFloodlightActivityPublisherDynamicTag());
   o.add(buildFloodlightActivityPublisherDynamicTag());
   return o;
 }
 
-checkUnnamed2764(core.List<api.FloodlightActivityPublisherDynamicTag> o) {
+checkUnnamed2789(core.List<api.FloodlightActivityPublisherDynamicTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFloodlightActivityPublisherDynamicTag(o[0]);
   checkFloodlightActivityPublisherDynamicTag(o[1]);
 }
 
-buildUnnamed2765() {
+buildUnnamed2790() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2765(core.List<core.String> o) {
+checkUnnamed2790(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -4203,7 +4203,7 @@
     o.advertiserIdDimensionValue = buildDimensionValue();
     o.cacheBustingType = "foo";
     o.countingMethod = "foo";
-    o.defaultTags = buildUnnamed2763();
+    o.defaultTags = buildUnnamed2788();
     o.expectedUrl = "foo";
     o.floodlightActivityGroupId = "foo";
     o.floodlightActivityGroupName = "foo";
@@ -4218,14 +4218,14 @@
     o.kind = "foo";
     o.name = "foo";
     o.notes = "foo";
-    o.publisherTags = buildUnnamed2764();
+    o.publisherTags = buildUnnamed2789();
     o.secure = true;
     o.sslCompliant = true;
     o.sslRequired = true;
     o.subaccountId = "foo";
     o.tagFormat = "foo";
     o.tagString = "foo";
-    o.userDefinedVariableTypes = buildUnnamed2765();
+    o.userDefinedVariableTypes = buildUnnamed2790();
   }
   buildCounterFloodlightActivity--;
   return o;
@@ -4239,7 +4239,7 @@
     checkDimensionValue(o.advertiserIdDimensionValue);
     unittest.expect(o.cacheBustingType, unittest.equals('foo'));
     unittest.expect(o.countingMethod, unittest.equals('foo'));
-    checkUnnamed2763(o.defaultTags);
+    checkUnnamed2788(o.defaultTags);
     unittest.expect(o.expectedUrl, unittest.equals('foo'));
     unittest.expect(o.floodlightActivityGroupId, unittest.equals('foo'));
     unittest.expect(o.floodlightActivityGroupName, unittest.equals('foo'));
@@ -4254,14 +4254,14 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkUnnamed2764(o.publisherTags);
+    checkUnnamed2789(o.publisherTags);
     unittest.expect(o.secure, unittest.isTrue);
     unittest.expect(o.sslCompliant, unittest.isTrue);
     unittest.expect(o.sslRequired, unittest.isTrue);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
     unittest.expect(o.tagFormat, unittest.equals('foo'));
     unittest.expect(o.tagString, unittest.equals('foo'));
-    checkUnnamed2765(o.userDefinedVariableTypes);
+    checkUnnamed2790(o.userDefinedVariableTypes);
   }
   buildCounterFloodlightActivity--;
 }
@@ -4330,14 +4330,14 @@
   buildCounterFloodlightActivityGroup--;
 }
 
-buildUnnamed2766() {
+buildUnnamed2791() {
   var o = new core.List<api.FloodlightActivityGroup>();
   o.add(buildFloodlightActivityGroup());
   o.add(buildFloodlightActivityGroup());
   return o;
 }
 
-checkUnnamed2766(core.List<api.FloodlightActivityGroup> o) {
+checkUnnamed2791(core.List<api.FloodlightActivityGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFloodlightActivityGroup(o[0]);
   checkFloodlightActivityGroup(o[1]);
@@ -4348,7 +4348,7 @@
   var o = new api.FloodlightActivityGroupsListResponse();
   buildCounterFloodlightActivityGroupsListResponse++;
   if (buildCounterFloodlightActivityGroupsListResponse < 3) {
-    o.floodlightActivityGroups = buildUnnamed2766();
+    o.floodlightActivityGroups = buildUnnamed2791();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -4360,7 +4360,7 @@
     api.FloodlightActivityGroupsListResponse o) {
   buildCounterFloodlightActivityGroupsListResponse++;
   if (buildCounterFloodlightActivityGroupsListResponse < 3) {
-    checkUnnamed2766(o.floodlightActivityGroups);
+    checkUnnamed2791(o.floodlightActivityGroups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -4397,27 +4397,27 @@
   buildCounterFloodlightActivityPublisherDynamicTag--;
 }
 
-buildUnnamed2767() {
+buildUnnamed2792() {
   var o = new core.List<api.ThirdPartyAuthenticationToken>();
   o.add(buildThirdPartyAuthenticationToken());
   o.add(buildThirdPartyAuthenticationToken());
   return o;
 }
 
-checkUnnamed2767(core.List<api.ThirdPartyAuthenticationToken> o) {
+checkUnnamed2792(core.List<api.ThirdPartyAuthenticationToken> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThirdPartyAuthenticationToken(o[0]);
   checkThirdPartyAuthenticationToken(o[1]);
 }
 
-buildUnnamed2768() {
+buildUnnamed2793() {
   var o = new core.List<api.UserDefinedVariableConfiguration>();
   o.add(buildUserDefinedVariableConfiguration());
   o.add(buildUserDefinedVariableConfiguration());
   return o;
 }
 
-checkUnnamed2768(core.List<api.UserDefinedVariableConfiguration> o) {
+checkUnnamed2793(core.List<api.UserDefinedVariableConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserDefinedVariableConfiguration(o[0]);
   checkUserDefinedVariableConfiguration(o[1]);
@@ -4443,8 +4443,8 @@
     o.omnitureSettings = buildOmnitureSettings();
     o.subaccountId = "foo";
     o.tagSettings = buildTagSettings();
-    o.thirdPartyAuthenticationTokens = buildUnnamed2767();
-    o.userDefinedVariableConfigurations = buildUnnamed2768();
+    o.thirdPartyAuthenticationTokens = buildUnnamed2792();
+    o.userDefinedVariableConfigurations = buildUnnamed2793();
   }
   buildCounterFloodlightConfiguration--;
   return o;
@@ -4469,20 +4469,20 @@
     checkOmnitureSettings(o.omnitureSettings);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
     checkTagSettings(o.tagSettings);
-    checkUnnamed2767(o.thirdPartyAuthenticationTokens);
-    checkUnnamed2768(o.userDefinedVariableConfigurations);
+    checkUnnamed2792(o.thirdPartyAuthenticationTokens);
+    checkUnnamed2793(o.userDefinedVariableConfigurations);
   }
   buildCounterFloodlightConfiguration--;
 }
 
-buildUnnamed2769() {
+buildUnnamed2794() {
   var o = new core.List<api.FloodlightConfiguration>();
   o.add(buildFloodlightConfiguration());
   o.add(buildFloodlightConfiguration());
   return o;
 }
 
-checkUnnamed2769(core.List<api.FloodlightConfiguration> o) {
+checkUnnamed2794(core.List<api.FloodlightConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFloodlightConfiguration(o[0]);
   checkFloodlightConfiguration(o[1]);
@@ -4493,7 +4493,7 @@
   var o = new api.FloodlightConfigurationsListResponse();
   buildCounterFloodlightConfigurationsListResponse++;
   if (buildCounterFloodlightConfigurationsListResponse < 3) {
-    o.floodlightConfigurations = buildUnnamed2769();
+    o.floodlightConfigurations = buildUnnamed2794();
     o.kind = "foo";
   }
   buildCounterFloodlightConfigurationsListResponse--;
@@ -4504,46 +4504,46 @@
     api.FloodlightConfigurationsListResponse o) {
   buildCounterFloodlightConfigurationsListResponse++;
   if (buildCounterFloodlightConfigurationsListResponse < 3) {
-    checkUnnamed2769(o.floodlightConfigurations);
+    checkUnnamed2794(o.floodlightConfigurations);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterFloodlightConfigurationsListResponse--;
 }
 
-buildUnnamed2770() {
+buildUnnamed2795() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed2770(core.List<api.Dimension> o) {
+checkUnnamed2795(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed2771() {
+buildUnnamed2796() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed2771(core.List<api.Dimension> o) {
+checkUnnamed2796(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed2772() {
+buildUnnamed2797() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed2772(core.List<api.Metric> o) {
+checkUnnamed2797(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -4554,10 +4554,10 @@
   var o = new api.FloodlightReportCompatibleFields();
   buildCounterFloodlightReportCompatibleFields++;
   if (buildCounterFloodlightReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed2770();
-    o.dimensions = buildUnnamed2771();
+    o.dimensionFilters = buildUnnamed2795();
+    o.dimensions = buildUnnamed2796();
     o.kind = "foo";
-    o.metrics = buildUnnamed2772();
+    o.metrics = buildUnnamed2797();
   }
   buildCounterFloodlightReportCompatibleFields--;
   return o;
@@ -4566,10 +4566,10 @@
 checkFloodlightReportCompatibleFields(api.FloodlightReportCompatibleFields o) {
   buildCounterFloodlightReportCompatibleFields++;
   if (buildCounterFloodlightReportCompatibleFields < 3) {
-    checkUnnamed2770(o.dimensionFilters);
-    checkUnnamed2771(o.dimensions);
+    checkUnnamed2795(o.dimensionFilters);
+    checkUnnamed2796(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2772(o.metrics);
+    checkUnnamed2797(o.metrics);
   }
   buildCounterFloodlightReportCompatibleFields--;
 }
@@ -4622,66 +4622,66 @@
   buildCounterFsCommand--;
 }
 
-buildUnnamed2773() {
+buildUnnamed2798() {
   var o = new core.List<api.City>();
   o.add(buildCity());
   o.add(buildCity());
   return o;
 }
 
-checkUnnamed2773(core.List<api.City> o) {
+checkUnnamed2798(core.List<api.City> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCity(o[0]);
   checkCity(o[1]);
 }
 
-buildUnnamed2774() {
+buildUnnamed2799() {
   var o = new core.List<api.Country>();
   o.add(buildCountry());
   o.add(buildCountry());
   return o;
 }
 
-checkUnnamed2774(core.List<api.Country> o) {
+checkUnnamed2799(core.List<api.Country> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCountry(o[0]);
   checkCountry(o[1]);
 }
 
-buildUnnamed2775() {
+buildUnnamed2800() {
   var o = new core.List<api.Metro>();
   o.add(buildMetro());
   o.add(buildMetro());
   return o;
 }
 
-checkUnnamed2775(core.List<api.Metro> o) {
+checkUnnamed2800(core.List<api.Metro> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetro(o[0]);
   checkMetro(o[1]);
 }
 
-buildUnnamed2776() {
+buildUnnamed2801() {
   var o = new core.List<api.PostalCode>();
   o.add(buildPostalCode());
   o.add(buildPostalCode());
   return o;
 }
 
-checkUnnamed2776(core.List<api.PostalCode> o) {
+checkUnnamed2801(core.List<api.PostalCode> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostalCode(o[0]);
   checkPostalCode(o[1]);
 }
 
-buildUnnamed2777() {
+buildUnnamed2802() {
   var o = new core.List<api.Region>();
   o.add(buildRegion());
   o.add(buildRegion());
   return o;
 }
 
-checkUnnamed2777(core.List<api.Region> o) {
+checkUnnamed2802(core.List<api.Region> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegion(o[0]);
   checkRegion(o[1]);
@@ -4692,12 +4692,12 @@
   var o = new api.GeoTargeting();
   buildCounterGeoTargeting++;
   if (buildCounterGeoTargeting < 3) {
-    o.cities = buildUnnamed2773();
-    o.countries = buildUnnamed2774();
+    o.cities = buildUnnamed2798();
+    o.countries = buildUnnamed2799();
     o.excludeCountries = true;
-    o.metros = buildUnnamed2775();
-    o.postalCodes = buildUnnamed2776();
-    o.regions = buildUnnamed2777();
+    o.metros = buildUnnamed2800();
+    o.postalCodes = buildUnnamed2801();
+    o.regions = buildUnnamed2802();
   }
   buildCounterGeoTargeting--;
   return o;
@@ -4706,24 +4706,24 @@
 checkGeoTargeting(api.GeoTargeting o) {
   buildCounterGeoTargeting++;
   if (buildCounterGeoTargeting < 3) {
-    checkUnnamed2773(o.cities);
-    checkUnnamed2774(o.countries);
+    checkUnnamed2798(o.cities);
+    checkUnnamed2799(o.countries);
     unittest.expect(o.excludeCountries, unittest.isTrue);
-    checkUnnamed2775(o.metros);
-    checkUnnamed2776(o.postalCodes);
-    checkUnnamed2777(o.regions);
+    checkUnnamed2800(o.metros);
+    checkUnnamed2801(o.postalCodes);
+    checkUnnamed2802(o.regions);
   }
   buildCounterGeoTargeting--;
 }
 
-buildUnnamed2778() {
+buildUnnamed2803() {
   var o = new core.List<api.AdSlot>();
   o.add(buildAdSlot());
   o.add(buildAdSlot());
   return o;
 }
 
-checkUnnamed2778(core.List<api.AdSlot> o) {
+checkUnnamed2803(core.List<api.AdSlot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdSlot(o[0]);
   checkAdSlot(o[1]);
@@ -4735,7 +4735,7 @@
   buildCounterInventoryItem++;
   if (buildCounterInventoryItem < 3) {
     o.accountId = "foo";
-    o.adSlots = buildUnnamed2778();
+    o.adSlots = buildUnnamed2803();
     o.advertiserId = "foo";
     o.contentCategoryId = "foo";
     o.estimatedClickThroughRate = "foo";
@@ -4763,7 +4763,7 @@
   buildCounterInventoryItem++;
   if (buildCounterInventoryItem < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed2778(o.adSlots);
+    checkUnnamed2803(o.adSlots);
     unittest.expect(o.advertiserId, unittest.equals('foo'));
     unittest.expect(o.contentCategoryId, unittest.equals('foo'));
     unittest.expect(o.estimatedClickThroughRate, unittest.equals('foo'));
@@ -4786,14 +4786,14 @@
   buildCounterInventoryItem--;
 }
 
-buildUnnamed2779() {
+buildUnnamed2804() {
   var o = new core.List<api.InventoryItem>();
   o.add(buildInventoryItem());
   o.add(buildInventoryItem());
   return o;
 }
 
-checkUnnamed2779(core.List<api.InventoryItem> o) {
+checkUnnamed2804(core.List<api.InventoryItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInventoryItem(o[0]);
   checkInventoryItem(o[1]);
@@ -4804,7 +4804,7 @@
   var o = new api.InventoryItemsListResponse();
   buildCounterInventoryItemsListResponse++;
   if (buildCounterInventoryItemsListResponse < 3) {
-    o.inventoryItems = buildUnnamed2779();
+    o.inventoryItems = buildUnnamed2804();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -4815,7 +4815,7 @@
 checkInventoryItemsListResponse(api.InventoryItemsListResponse o) {
   buildCounterInventoryItemsListResponse++;
   if (buildCounterInventoryItemsListResponse < 3) {
-    checkUnnamed2779(o.inventoryItems);
+    checkUnnamed2804(o.inventoryItems);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -4895,14 +4895,14 @@
   buildCounterLanguage--;
 }
 
-buildUnnamed2780() {
+buildUnnamed2805() {
   var o = new core.List<api.Language>();
   o.add(buildLanguage());
   o.add(buildLanguage());
   return o;
 }
 
-checkUnnamed2780(core.List<api.Language> o) {
+checkUnnamed2805(core.List<api.Language> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLanguage(o[0]);
   checkLanguage(o[1]);
@@ -4913,7 +4913,7 @@
   var o = new api.LanguageTargeting();
   buildCounterLanguageTargeting++;
   if (buildCounterLanguageTargeting < 3) {
-    o.languages = buildUnnamed2780();
+    o.languages = buildUnnamed2805();
   }
   buildCounterLanguageTargeting--;
   return o;
@@ -4922,19 +4922,19 @@
 checkLanguageTargeting(api.LanguageTargeting o) {
   buildCounterLanguageTargeting++;
   if (buildCounterLanguageTargeting < 3) {
-    checkUnnamed2780(o.languages);
+    checkUnnamed2805(o.languages);
   }
   buildCounterLanguageTargeting--;
 }
 
-buildUnnamed2781() {
+buildUnnamed2806() {
   var o = new core.List<api.Language>();
   o.add(buildLanguage());
   o.add(buildLanguage());
   return o;
 }
 
-checkUnnamed2781(core.List<api.Language> o) {
+checkUnnamed2806(core.List<api.Language> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLanguage(o[0]);
   checkLanguage(o[1]);
@@ -4946,7 +4946,7 @@
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
     o.kind = "foo";
-    o.languages = buildUnnamed2781();
+    o.languages = buildUnnamed2806();
   }
   buildCounterLanguagesListResponse--;
   return o;
@@ -4956,7 +4956,7 @@
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2781(o.languages);
+    checkUnnamed2806(o.languages);
   }
   buildCounterLanguagesListResponse--;
 }
@@ -4980,14 +4980,14 @@
   buildCounterLastModifiedInfo--;
 }
 
-buildUnnamed2782() {
+buildUnnamed2807() {
   var o = new core.List<api.ListPopulationTerm>();
   o.add(buildListPopulationTerm());
   o.add(buildListPopulationTerm());
   return o;
 }
 
-checkUnnamed2782(core.List<api.ListPopulationTerm> o) {
+checkUnnamed2807(core.List<api.ListPopulationTerm> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListPopulationTerm(o[0]);
   checkListPopulationTerm(o[1]);
@@ -4998,7 +4998,7 @@
   var o = new api.ListPopulationClause();
   buildCounterListPopulationClause++;
   if (buildCounterListPopulationClause < 3) {
-    o.terms = buildUnnamed2782();
+    o.terms = buildUnnamed2807();
   }
   buildCounterListPopulationClause--;
   return o;
@@ -5007,19 +5007,19 @@
 checkListPopulationClause(api.ListPopulationClause o) {
   buildCounterListPopulationClause++;
   if (buildCounterListPopulationClause < 3) {
-    checkUnnamed2782(o.terms);
+    checkUnnamed2807(o.terms);
   }
   buildCounterListPopulationClause--;
 }
 
-buildUnnamed2783() {
+buildUnnamed2808() {
   var o = new core.List<api.ListPopulationClause>();
   o.add(buildListPopulationClause());
   o.add(buildListPopulationClause());
   return o;
 }
 
-checkUnnamed2783(core.List<api.ListPopulationClause> o) {
+checkUnnamed2808(core.List<api.ListPopulationClause> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListPopulationClause(o[0]);
   checkListPopulationClause(o[1]);
@@ -5032,7 +5032,7 @@
   if (buildCounterListPopulationRule < 3) {
     o.floodlightActivityId = "foo";
     o.floodlightActivityName = "foo";
-    o.listPopulationClauses = buildUnnamed2783();
+    o.listPopulationClauses = buildUnnamed2808();
   }
   buildCounterListPopulationRule--;
   return o;
@@ -5043,7 +5043,7 @@
   if (buildCounterListPopulationRule < 3) {
     unittest.expect(o.floodlightActivityId, unittest.equals('foo'));
     unittest.expect(o.floodlightActivityName, unittest.equals('foo'));
-    checkUnnamed2783(o.listPopulationClauses);
+    checkUnnamed2808(o.listPopulationClauses);
   }
   buildCounterListPopulationRule--;
 }
@@ -5173,14 +5173,14 @@
   buildCounterMetro--;
 }
 
-buildUnnamed2784() {
+buildUnnamed2809() {
   var o = new core.List<api.Metro>();
   o.add(buildMetro());
   o.add(buildMetro());
   return o;
 }
 
-checkUnnamed2784(core.List<api.Metro> o) {
+checkUnnamed2809(core.List<api.Metro> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetro(o[0]);
   checkMetro(o[1]);
@@ -5192,7 +5192,7 @@
   buildCounterMetrosListResponse++;
   if (buildCounterMetrosListResponse < 3) {
     o.kind = "foo";
-    o.metros = buildUnnamed2784();
+    o.metros = buildUnnamed2809();
   }
   buildCounterMetrosListResponse--;
   return o;
@@ -5202,7 +5202,7 @@
   buildCounterMetrosListResponse++;
   if (buildCounterMetrosListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2784(o.metros);
+    checkUnnamed2809(o.metros);
   }
   buildCounterMetrosListResponse--;
 }
@@ -5234,14 +5234,14 @@
   buildCounterMobileCarrier--;
 }
 
-buildUnnamed2785() {
+buildUnnamed2810() {
   var o = new core.List<api.MobileCarrier>();
   o.add(buildMobileCarrier());
   o.add(buildMobileCarrier());
   return o;
 }
 
-checkUnnamed2785(core.List<api.MobileCarrier> o) {
+checkUnnamed2810(core.List<api.MobileCarrier> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileCarrier(o[0]);
   checkMobileCarrier(o[1]);
@@ -5253,7 +5253,7 @@
   buildCounterMobileCarriersListResponse++;
   if (buildCounterMobileCarriersListResponse < 3) {
     o.kind = "foo";
-    o.mobileCarriers = buildUnnamed2785();
+    o.mobileCarriers = buildUnnamed2810();
   }
   buildCounterMobileCarriersListResponse--;
   return o;
@@ -5263,19 +5263,19 @@
   buildCounterMobileCarriersListResponse++;
   if (buildCounterMobileCarriersListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2785(o.mobileCarriers);
+    checkUnnamed2810(o.mobileCarriers);
   }
   buildCounterMobileCarriersListResponse--;
 }
 
-buildUnnamed2786() {
+buildUnnamed2811() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2786(core.List<core.String> o) {
+checkUnnamed2811(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5287,7 +5287,7 @@
   buildCounterObjectFilter++;
   if (buildCounterObjectFilter < 3) {
     o.kind = "foo";
-    o.objectIds = buildUnnamed2786();
+    o.objectIds = buildUnnamed2811();
     o.status = "foo";
   }
   buildCounterObjectFilter--;
@@ -5298,7 +5298,7 @@
   buildCounterObjectFilter++;
   if (buildCounterObjectFilter < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2786(o.objectIds);
+    checkUnnamed2811(o.objectIds);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterObjectFilter--;
@@ -5402,14 +5402,14 @@
   buildCounterOperatingSystemVersion--;
 }
 
-buildUnnamed2787() {
+buildUnnamed2812() {
   var o = new core.List<api.OperatingSystemVersion>();
   o.add(buildOperatingSystemVersion());
   o.add(buildOperatingSystemVersion());
   return o;
 }
 
-checkUnnamed2787(core.List<api.OperatingSystemVersion> o) {
+checkUnnamed2812(core.List<api.OperatingSystemVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperatingSystemVersion(o[0]);
   checkOperatingSystemVersion(o[1]);
@@ -5421,7 +5421,7 @@
   buildCounterOperatingSystemVersionsListResponse++;
   if (buildCounterOperatingSystemVersionsListResponse < 3) {
     o.kind = "foo";
-    o.operatingSystemVersions = buildUnnamed2787();
+    o.operatingSystemVersions = buildUnnamed2812();
   }
   buildCounterOperatingSystemVersionsListResponse--;
   return o;
@@ -5432,19 +5432,19 @@
   buildCounterOperatingSystemVersionsListResponse++;
   if (buildCounterOperatingSystemVersionsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2787(o.operatingSystemVersions);
+    checkUnnamed2812(o.operatingSystemVersions);
   }
   buildCounterOperatingSystemVersionsListResponse--;
 }
 
-buildUnnamed2788() {
+buildUnnamed2813() {
   var o = new core.List<api.OperatingSystem>();
   o.add(buildOperatingSystem());
   o.add(buildOperatingSystem());
   return o;
 }
 
-checkUnnamed2788(core.List<api.OperatingSystem> o) {
+checkUnnamed2813(core.List<api.OperatingSystem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperatingSystem(o[0]);
   checkOperatingSystem(o[1]);
@@ -5456,7 +5456,7 @@
   buildCounterOperatingSystemsListResponse++;
   if (buildCounterOperatingSystemsListResponse < 3) {
     o.kind = "foo";
-    o.operatingSystems = buildUnnamed2788();
+    o.operatingSystems = buildUnnamed2813();
   }
   buildCounterOperatingSystemsListResponse--;
   return o;
@@ -5466,7 +5466,7 @@
   buildCounterOperatingSystemsListResponse++;
   if (buildCounterOperatingSystemsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2788(o.operatingSystems);
+    checkUnnamed2813(o.operatingSystems);
   }
   buildCounterOperatingSystemsListResponse--;
 }
@@ -5494,53 +5494,53 @@
   buildCounterOptimizationActivity--;
 }
 
-buildUnnamed2789() {
+buildUnnamed2814() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2789(core.List<core.String> o) {
+checkUnnamed2814(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2790() {
+buildUnnamed2815() {
   var o = new core.List<api.OrderContact>();
   o.add(buildOrderContact());
   o.add(buildOrderContact());
   return o;
 }
 
-checkUnnamed2790(core.List<api.OrderContact> o) {
+checkUnnamed2815(core.List<api.OrderContact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderContact(o[0]);
   checkOrderContact(o[1]);
 }
 
-buildUnnamed2791() {
+buildUnnamed2816() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2791(core.List<core.String> o) {
+checkUnnamed2816(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2792() {
+buildUnnamed2817() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2792(core.List<core.String> o) {
+checkUnnamed2817(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5553,11 +5553,11 @@
   if (buildCounterOrder < 3) {
     o.accountId = "foo";
     o.advertiserId = "foo";
-    o.approverUserProfileIds = buildUnnamed2789();
+    o.approverUserProfileIds = buildUnnamed2814();
     o.buyerInvoiceId = "foo";
     o.buyerOrganizationName = "foo";
     o.comments = "foo";
-    o.contacts = buildUnnamed2790();
+    o.contacts = buildUnnamed2815();
     o.id = "foo";
     o.kind = "foo";
     o.lastModifiedInfo = buildLastModifiedInfo();
@@ -5567,8 +5567,8 @@
     o.projectId = "foo";
     o.sellerOrderId = "foo";
     o.sellerOrganizationName = "foo";
-    o.siteId = buildUnnamed2791();
-    o.siteNames = buildUnnamed2792();
+    o.siteId = buildUnnamed2816();
+    o.siteNames = buildUnnamed2817();
     o.subaccountId = "foo";
     o.termsAndConditions = "foo";
   }
@@ -5581,11 +5581,11 @@
   if (buildCounterOrder < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkUnnamed2789(o.approverUserProfileIds);
+    checkUnnamed2814(o.approverUserProfileIds);
     unittest.expect(o.buyerInvoiceId, unittest.equals('foo'));
     unittest.expect(o.buyerOrganizationName, unittest.equals('foo'));
     unittest.expect(o.comments, unittest.equals('foo'));
-    checkUnnamed2790(o.contacts);
+    checkUnnamed2815(o.contacts);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkLastModifiedInfo(o.lastModifiedInfo);
@@ -5595,8 +5595,8 @@
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.sellerOrderId, unittest.equals('foo'));
     unittest.expect(o.sellerOrganizationName, unittest.equals('foo'));
-    checkUnnamed2791(o.siteId);
-    checkUnnamed2792(o.siteNames);
+    checkUnnamed2816(o.siteId);
+    checkUnnamed2817(o.siteNames);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
     unittest.expect(o.termsAndConditions, unittest.equals('foo'));
   }
@@ -5630,27 +5630,27 @@
   buildCounterOrderContact--;
 }
 
-buildUnnamed2793() {
+buildUnnamed2818() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2793(core.List<core.String> o) {
+checkUnnamed2818(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2794() {
+buildUnnamed2819() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2794(core.List<core.String> o) {
+checkUnnamed2819(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5664,13 +5664,13 @@
     o.accountId = "foo";
     o.advertiserId = "foo";
     o.amendedOrderDocumentId = "foo";
-    o.approvedByUserProfileIds = buildUnnamed2793();
+    o.approvedByUserProfileIds = buildUnnamed2818();
     o.cancelled = true;
     o.createdInfo = buildLastModifiedInfo();
     o.effectiveDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.id = "foo";
     o.kind = "foo";
-    o.lastSentRecipients = buildUnnamed2794();
+    o.lastSentRecipients = buildUnnamed2819();
     o.lastSentTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.orderId = "foo";
     o.projectId = "foo";
@@ -5689,14 +5689,14 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
     unittest.expect(o.amendedOrderDocumentId, unittest.equals('foo'));
-    checkUnnamed2793(o.approvedByUserProfileIds);
+    checkUnnamed2818(o.approvedByUserProfileIds);
     unittest.expect(o.cancelled, unittest.isTrue);
     checkLastModifiedInfo(o.createdInfo);
     unittest.expect(o.effectiveDate,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2794(o.lastSentRecipients);
+    checkUnnamed2819(o.lastSentRecipients);
     unittest.expect(o.lastSentTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.orderId, unittest.equals('foo'));
@@ -5709,14 +5709,14 @@
   buildCounterOrderDocument--;
 }
 
-buildUnnamed2795() {
+buildUnnamed2820() {
   var o = new core.List<api.OrderDocument>();
   o.add(buildOrderDocument());
   o.add(buildOrderDocument());
   return o;
 }
 
-checkUnnamed2795(core.List<api.OrderDocument> o) {
+checkUnnamed2820(core.List<api.OrderDocument> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderDocument(o[0]);
   checkOrderDocument(o[1]);
@@ -5729,7 +5729,7 @@
   if (buildCounterOrderDocumentsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.orderDocuments = buildUnnamed2795();
+    o.orderDocuments = buildUnnamed2820();
   }
   buildCounterOrderDocumentsListResponse--;
   return o;
@@ -5740,19 +5740,19 @@
   if (buildCounterOrderDocumentsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2795(o.orderDocuments);
+    checkUnnamed2820(o.orderDocuments);
   }
   buildCounterOrderDocumentsListResponse--;
 }
 
-buildUnnamed2796() {
+buildUnnamed2821() {
   var o = new core.List<api.Order>();
   o.add(buildOrder());
   o.add(buildOrder());
   return o;
 }
 
-checkUnnamed2796(core.List<api.Order> o) {
+checkUnnamed2821(core.List<api.Order> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrder(o[0]);
   checkOrder(o[1]);
@@ -5765,7 +5765,7 @@
   if (buildCounterOrdersListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.orders = buildUnnamed2796();
+    o.orders = buildUnnamed2821();
   }
   buildCounterOrdersListResponse--;
   return o;
@@ -5776,58 +5776,58 @@
   if (buildCounterOrdersListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2796(o.orders);
+    checkUnnamed2821(o.orders);
   }
   buildCounterOrdersListResponse--;
 }
 
-buildUnnamed2797() {
+buildUnnamed2822() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed2797(core.List<api.Dimension> o) {
+checkUnnamed2822(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed2798() {
+buildUnnamed2823() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed2798(core.List<api.Dimension> o) {
+checkUnnamed2823(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed2799() {
+buildUnnamed2824() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed2799(core.List<api.Metric> o) {
+checkUnnamed2824(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed2800() {
+buildUnnamed2825() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed2800(core.List<api.Dimension> o) {
+checkUnnamed2825(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
@@ -5838,11 +5838,11 @@
   var o = new api.PathToConversionReportCompatibleFields();
   buildCounterPathToConversionReportCompatibleFields++;
   if (buildCounterPathToConversionReportCompatibleFields < 3) {
-    o.conversionDimensions = buildUnnamed2797();
-    o.customFloodlightVariables = buildUnnamed2798();
+    o.conversionDimensions = buildUnnamed2822();
+    o.customFloodlightVariables = buildUnnamed2823();
     o.kind = "foo";
-    o.metrics = buildUnnamed2799();
-    o.perInteractionDimensions = buildUnnamed2800();
+    o.metrics = buildUnnamed2824();
+    o.perInteractionDimensions = buildUnnamed2825();
   }
   buildCounterPathToConversionReportCompatibleFields--;
   return o;
@@ -5852,23 +5852,23 @@
     api.PathToConversionReportCompatibleFields o) {
   buildCounterPathToConversionReportCompatibleFields++;
   if (buildCounterPathToConversionReportCompatibleFields < 3) {
-    checkUnnamed2797(o.conversionDimensions);
-    checkUnnamed2798(o.customFloodlightVariables);
+    checkUnnamed2822(o.conversionDimensions);
+    checkUnnamed2823(o.customFloodlightVariables);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2799(o.metrics);
-    checkUnnamed2800(o.perInteractionDimensions);
+    checkUnnamed2824(o.metrics);
+    checkUnnamed2825(o.perInteractionDimensions);
   }
   buildCounterPathToConversionReportCompatibleFields--;
 }
 
-buildUnnamed2801() {
+buildUnnamed2826() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2801(core.List<core.String> o) {
+checkUnnamed2826(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5914,7 +5914,7 @@
     o.sslRequired = true;
     o.status = "foo";
     o.subaccountId = "foo";
-    o.tagFormats = buildUnnamed2801();
+    o.tagFormats = buildUnnamed2826();
     o.tagSetting = buildTagSetting();
     o.videoActiveViewOptOut = true;
     o.videoSettings = buildVideoSettings();
@@ -5962,7 +5962,7 @@
     unittest.expect(o.sslRequired, unittest.isTrue);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.subaccountId, unittest.equals('foo'));
-    checkUnnamed2801(o.tagFormats);
+    checkUnnamed2826(o.tagFormats);
     checkTagSetting(o.tagSetting);
     unittest.expect(o.videoActiveViewOptOut, unittest.isTrue);
     checkVideoSettings(o.videoSettings);
@@ -5996,14 +5996,14 @@
   buildCounterPlacementAssignment--;
 }
 
-buildUnnamed2802() {
+buildUnnamed2827() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2802(core.List<core.String> o) {
+checkUnnamed2827(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -6020,7 +6020,7 @@
     o.archived = true;
     o.campaignId = "foo";
     o.campaignIdDimensionValue = buildDimensionValue();
-    o.childPlacementIds = buildUnnamed2802();
+    o.childPlacementIds = buildUnnamed2827();
     o.comment = "foo";
     o.contentCategoryId = "foo";
     o.createInfo = buildLastModifiedInfo();
@@ -6054,7 +6054,7 @@
     unittest.expect(o.archived, unittest.isTrue);
     unittest.expect(o.campaignId, unittest.equals('foo'));
     checkDimensionValue(o.campaignIdDimensionValue);
-    checkUnnamed2802(o.childPlacementIds);
+    checkUnnamed2827(o.childPlacementIds);
     unittest.expect(o.comment, unittest.equals('foo'));
     unittest.expect(o.contentCategoryId, unittest.equals('foo'));
     checkLastModifiedInfo(o.createInfo);
@@ -6078,14 +6078,14 @@
   buildCounterPlacementGroup--;
 }
 
-buildUnnamed2803() {
+buildUnnamed2828() {
   var o = new core.List<api.PlacementGroup>();
   o.add(buildPlacementGroup());
   o.add(buildPlacementGroup());
   return o;
 }
 
-checkUnnamed2803(core.List<api.PlacementGroup> o) {
+checkUnnamed2828(core.List<api.PlacementGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlacementGroup(o[0]);
   checkPlacementGroup(o[1]);
@@ -6098,7 +6098,7 @@
   if (buildCounterPlacementGroupsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.placementGroups = buildUnnamed2803();
+    o.placementGroups = buildUnnamed2828();
   }
   buildCounterPlacementGroupsListResponse--;
   return o;
@@ -6109,19 +6109,19 @@
   if (buildCounterPlacementGroupsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2803(o.placementGroups);
+    checkUnnamed2828(o.placementGroups);
   }
   buildCounterPlacementGroupsListResponse--;
 }
 
-buildUnnamed2804() {
+buildUnnamed2829() {
   var o = new core.List<api.PlacementStrategy>();
   o.add(buildPlacementStrategy());
   o.add(buildPlacementStrategy());
   return o;
 }
 
-checkUnnamed2804(core.List<api.PlacementStrategy> o) {
+checkUnnamed2829(core.List<api.PlacementStrategy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlacementStrategy(o[0]);
   checkPlacementStrategy(o[1]);
@@ -6134,7 +6134,7 @@
   if (buildCounterPlacementStrategiesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.placementStrategies = buildUnnamed2804();
+    o.placementStrategies = buildUnnamed2829();
   }
   buildCounterPlacementStrategiesListResponse--;
   return o;
@@ -6145,7 +6145,7 @@
   if (buildCounterPlacementStrategiesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2804(o.placementStrategies);
+    checkUnnamed2829(o.placementStrategies);
   }
   buildCounterPlacementStrategiesListResponse--;
 }
@@ -6175,14 +6175,14 @@
   buildCounterPlacementStrategy--;
 }
 
-buildUnnamed2805() {
+buildUnnamed2830() {
   var o = new core.List<api.TagData>();
   o.add(buildTagData());
   o.add(buildTagData());
   return o;
 }
 
-checkUnnamed2805(core.List<api.TagData> o) {
+checkUnnamed2830(core.List<api.TagData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTagData(o[0]);
   checkTagData(o[1]);
@@ -6194,7 +6194,7 @@
   buildCounterPlacementTag++;
   if (buildCounterPlacementTag < 3) {
     o.placementId = "foo";
-    o.tagDatas = buildUnnamed2805();
+    o.tagDatas = buildUnnamed2830();
   }
   buildCounterPlacementTag--;
   return o;
@@ -6204,19 +6204,19 @@
   buildCounterPlacementTag++;
   if (buildCounterPlacementTag < 3) {
     unittest.expect(o.placementId, unittest.equals('foo'));
-    checkUnnamed2805(o.tagDatas);
+    checkUnnamed2830(o.tagDatas);
   }
   buildCounterPlacementTag--;
 }
 
-buildUnnamed2806() {
+buildUnnamed2831() {
   var o = new core.List<api.PlacementTag>();
   o.add(buildPlacementTag());
   o.add(buildPlacementTag());
   return o;
 }
 
-checkUnnamed2806(core.List<api.PlacementTag> o) {
+checkUnnamed2831(core.List<api.PlacementTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlacementTag(o[0]);
   checkPlacementTag(o[1]);
@@ -6228,7 +6228,7 @@
   buildCounterPlacementsGenerateTagsResponse++;
   if (buildCounterPlacementsGenerateTagsResponse < 3) {
     o.kind = "foo";
-    o.placementTags = buildUnnamed2806();
+    o.placementTags = buildUnnamed2831();
   }
   buildCounterPlacementsGenerateTagsResponse--;
   return o;
@@ -6238,19 +6238,19 @@
   buildCounterPlacementsGenerateTagsResponse++;
   if (buildCounterPlacementsGenerateTagsResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2806(o.placementTags);
+    checkUnnamed2831(o.placementTags);
   }
   buildCounterPlacementsGenerateTagsResponse--;
 }
 
-buildUnnamed2807() {
+buildUnnamed2832() {
   var o = new core.List<api.Placement>();
   o.add(buildPlacement());
   o.add(buildPlacement());
   return o;
 }
 
-checkUnnamed2807(core.List<api.Placement> o) {
+checkUnnamed2832(core.List<api.Placement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlacement(o[0]);
   checkPlacement(o[1]);
@@ -6263,7 +6263,7 @@
   if (buildCounterPlacementsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.placements = buildUnnamed2807();
+    o.placements = buildUnnamed2832();
   }
   buildCounterPlacementsListResponse--;
   return o;
@@ -6274,7 +6274,7 @@
   if (buildCounterPlacementsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2807(o.placements);
+    checkUnnamed2832(o.placements);
   }
   buildCounterPlacementsListResponse--;
 }
@@ -6302,14 +6302,14 @@
   buildCounterPlatformType--;
 }
 
-buildUnnamed2808() {
+buildUnnamed2833() {
   var o = new core.List<api.PlatformType>();
   o.add(buildPlatformType());
   o.add(buildPlatformType());
   return o;
 }
 
-checkUnnamed2808(core.List<api.PlatformType> o) {
+checkUnnamed2833(core.List<api.PlatformType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlatformType(o[0]);
   checkPlatformType(o[1]);
@@ -6321,7 +6321,7 @@
   buildCounterPlatformTypesListResponse++;
   if (buildCounterPlatformTypesListResponse < 3) {
     o.kind = "foo";
-    o.platformTypes = buildUnnamed2808();
+    o.platformTypes = buildUnnamed2833();
   }
   buildCounterPlatformTypesListResponse--;
   return o;
@@ -6331,7 +6331,7 @@
   buildCounterPlatformTypesListResponse++;
   if (buildCounterPlatformTypesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2808(o.platformTypes);
+    checkUnnamed2833(o.platformTypes);
   }
   buildCounterPlatformTypesListResponse--;
 }
@@ -6398,14 +6398,14 @@
   buildCounterPostalCode--;
 }
 
-buildUnnamed2809() {
+buildUnnamed2834() {
   var o = new core.List<api.PostalCode>();
   o.add(buildPostalCode());
   o.add(buildPostalCode());
   return o;
 }
 
-checkUnnamed2809(core.List<api.PostalCode> o) {
+checkUnnamed2834(core.List<api.PostalCode> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostalCode(o[0]);
   checkPostalCode(o[1]);
@@ -6417,7 +6417,7 @@
   buildCounterPostalCodesListResponse++;
   if (buildCounterPostalCodesListResponse < 3) {
     o.kind = "foo";
-    o.postalCodes = buildUnnamed2809();
+    o.postalCodes = buildUnnamed2834();
   }
   buildCounterPostalCodesListResponse--;
   return o;
@@ -6427,19 +6427,19 @@
   buildCounterPostalCodesListResponse++;
   if (buildCounterPostalCodesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2809(o.postalCodes);
+    checkUnnamed2834(o.postalCodes);
   }
   buildCounterPostalCodesListResponse--;
 }
 
-buildUnnamed2810() {
+buildUnnamed2835() {
   var o = new core.List<api.Flight>();
   o.add(buildFlight());
   o.add(buildFlight());
   return o;
 }
 
-checkUnnamed2810(core.List<api.Flight> o) {
+checkUnnamed2835(core.List<api.Flight> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFlight(o[0]);
   checkFlight(o[1]);
@@ -6452,7 +6452,7 @@
   if (buildCounterPricing < 3) {
     o.capCostType = "foo";
     o.endDate = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.flights = buildUnnamed2810();
+    o.flights = buildUnnamed2835();
     o.groupType = "foo";
     o.pricingType = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
@@ -6467,7 +6467,7 @@
     unittest.expect(o.capCostType, unittest.equals('foo'));
     unittest.expect(
         o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed2810(o.flights);
+    checkUnnamed2835(o.flights);
     unittest.expect(o.groupType, unittest.equals('foo'));
     unittest.expect(o.pricingType, unittest.equals('foo'));
     unittest.expect(o.startDate,
@@ -6476,14 +6476,14 @@
   buildCounterPricing--;
 }
 
-buildUnnamed2811() {
+buildUnnamed2836() {
   var o = new core.List<api.PricingSchedulePricingPeriod>();
   o.add(buildPricingSchedulePricingPeriod());
   o.add(buildPricingSchedulePricingPeriod());
   return o;
 }
 
-checkUnnamed2811(core.List<api.PricingSchedulePricingPeriod> o) {
+checkUnnamed2836(core.List<api.PricingSchedulePricingPeriod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPricingSchedulePricingPeriod(o[0]);
   checkPricingSchedulePricingPeriod(o[1]);
@@ -6499,7 +6499,7 @@
     o.endDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.flighted = true;
     o.floodlightActivityId = "foo";
-    o.pricingPeriods = buildUnnamed2811();
+    o.pricingPeriods = buildUnnamed2836();
     o.pricingType = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.testingStartDate = core.DateTime.parse("2002-02-27T14:01:02Z");
@@ -6517,7 +6517,7 @@
         o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.flighted, unittest.isTrue);
     unittest.expect(o.floodlightActivityId, unittest.equals('foo'));
-    checkUnnamed2811(o.pricingPeriods);
+    checkUnnamed2836(o.pricingPeriods);
     unittest.expect(o.pricingType, unittest.equals('foo'));
     unittest.expect(o.startDate,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
@@ -6619,14 +6619,14 @@
   buildCounterProject--;
 }
 
-buildUnnamed2812() {
+buildUnnamed2837() {
   var o = new core.List<api.Project>();
   o.add(buildProject());
   o.add(buildProject());
   return o;
 }
 
-checkUnnamed2812(core.List<api.Project> o) {
+checkUnnamed2837(core.List<api.Project> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProject(o[0]);
   checkProject(o[1]);
@@ -6639,7 +6639,7 @@
   if (buildCounterProjectsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.projects = buildUnnamed2812();
+    o.projects = buildUnnamed2837();
   }
   buildCounterProjectsListResponse--;
   return o;
@@ -6650,71 +6650,71 @@
   if (buildCounterProjectsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2812(o.projects);
+    checkUnnamed2837(o.projects);
   }
   buildCounterProjectsListResponse--;
 }
 
-buildUnnamed2813() {
+buildUnnamed2838() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed2813(core.List<api.Dimension> o) {
+checkUnnamed2838(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed2814() {
+buildUnnamed2839() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed2814(core.List<api.Dimension> o) {
+checkUnnamed2839(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed2815() {
+buildUnnamed2840() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed2815(core.List<api.Metric> o) {
+checkUnnamed2840(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed2816() {
+buildUnnamed2841() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed2816(core.List<api.Metric> o) {
+checkUnnamed2841(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed2817() {
+buildUnnamed2842() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed2817(core.List<api.Metric> o) {
+checkUnnamed2842(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -6725,12 +6725,12 @@
   var o = new api.ReachReportCompatibleFields();
   buildCounterReachReportCompatibleFields++;
   if (buildCounterReachReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed2813();
-    o.dimensions = buildUnnamed2814();
+    o.dimensionFilters = buildUnnamed2838();
+    o.dimensions = buildUnnamed2839();
     o.kind = "foo";
-    o.metrics = buildUnnamed2815();
-    o.pivotedActivityMetrics = buildUnnamed2816();
-    o.reachByFrequencyMetrics = buildUnnamed2817();
+    o.metrics = buildUnnamed2840();
+    o.pivotedActivityMetrics = buildUnnamed2841();
+    o.reachByFrequencyMetrics = buildUnnamed2842();
   }
   buildCounterReachReportCompatibleFields--;
   return o;
@@ -6739,12 +6739,12 @@
 checkReachReportCompatibleFields(api.ReachReportCompatibleFields o) {
   buildCounterReachReportCompatibleFields++;
   if (buildCounterReachReportCompatibleFields < 3) {
-    checkUnnamed2813(o.dimensionFilters);
-    checkUnnamed2814(o.dimensions);
+    checkUnnamed2838(o.dimensionFilters);
+    checkUnnamed2839(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2815(o.metrics);
-    checkUnnamed2816(o.pivotedActivityMetrics);
-    checkUnnamed2817(o.reachByFrequencyMetrics);
+    checkUnnamed2840(o.metrics);
+    checkUnnamed2841(o.pivotedActivityMetrics);
+    checkUnnamed2842(o.reachByFrequencyMetrics);
   }
   buildCounterReachReportCompatibleFields--;
 }
@@ -6801,14 +6801,14 @@
   buildCounterRegion--;
 }
 
-buildUnnamed2818() {
+buildUnnamed2843() {
   var o = new core.List<api.Region>();
   o.add(buildRegion());
   o.add(buildRegion());
   return o;
 }
 
-checkUnnamed2818(core.List<api.Region> o) {
+checkUnnamed2843(core.List<api.Region> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegion(o[0]);
   checkRegion(o[1]);
@@ -6820,7 +6820,7 @@
   buildCounterRegionsListResponse++;
   if (buildCounterRegionsListResponse < 3) {
     o.kind = "foo";
-    o.regions = buildUnnamed2818();
+    o.regions = buildUnnamed2843();
   }
   buildCounterRegionsListResponse--;
   return o;
@@ -6830,7 +6830,7 @@
   buildCounterRegionsListResponse++;
   if (buildCounterRegionsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2818(o.regions);
+    checkUnnamed2843(o.regions);
   }
   buildCounterRegionsListResponse--;
 }
@@ -6878,27 +6878,27 @@
   buildCounterRemarketingList--;
 }
 
-buildUnnamed2819() {
+buildUnnamed2844() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2819(core.List<core.String> o) {
+checkUnnamed2844(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2820() {
+buildUnnamed2845() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2820(core.List<core.String> o) {
+checkUnnamed2845(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -6911,8 +6911,8 @@
   if (buildCounterRemarketingListShare < 3) {
     o.kind = "foo";
     o.remarketingListId = "foo";
-    o.sharedAccountIds = buildUnnamed2819();
-    o.sharedAdvertiserIds = buildUnnamed2820();
+    o.sharedAccountIds = buildUnnamed2844();
+    o.sharedAdvertiserIds = buildUnnamed2845();
   }
   buildCounterRemarketingListShare--;
   return o;
@@ -6923,20 +6923,20 @@
   if (buildCounterRemarketingListShare < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.remarketingListId, unittest.equals('foo'));
-    checkUnnamed2819(o.sharedAccountIds);
-    checkUnnamed2820(o.sharedAdvertiserIds);
+    checkUnnamed2844(o.sharedAccountIds);
+    checkUnnamed2845(o.sharedAdvertiserIds);
   }
   buildCounterRemarketingListShare--;
 }
 
-buildUnnamed2821() {
+buildUnnamed2846() {
   var o = new core.List<api.RemarketingList>();
   o.add(buildRemarketingList());
   o.add(buildRemarketingList());
   return o;
 }
 
-checkUnnamed2821(core.List<api.RemarketingList> o) {
+checkUnnamed2846(core.List<api.RemarketingList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRemarketingList(o[0]);
   checkRemarketingList(o[1]);
@@ -6949,7 +6949,7 @@
   if (buildCounterRemarketingListsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.remarketingLists = buildUnnamed2821();
+    o.remarketingLists = buildUnnamed2846();
   }
   buildCounterRemarketingListsListResponse--;
   return o;
@@ -6960,45 +6960,45 @@
   if (buildCounterRemarketingListsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2821(o.remarketingLists);
+    checkUnnamed2846(o.remarketingLists);
   }
   buildCounterRemarketingListsListResponse--;
 }
 
-buildUnnamed2822() {
+buildUnnamed2847() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed2822(core.List<api.DimensionValue> o) {
+checkUnnamed2847(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed2823() {
+buildUnnamed2848() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed2823(core.List<api.SortedDimension> o) {
+checkUnnamed2848(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed2824() {
+buildUnnamed2849() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2824(core.List<core.String> o) {
+checkUnnamed2849(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -7012,9 +7012,9 @@
     o.activities = buildActivities();
     o.customRichMediaEvents = buildCustomRichMediaEvents();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed2822();
-    o.dimensions = buildUnnamed2823();
-    o.metricNames = buildUnnamed2824();
+    o.dimensionFilters = buildUnnamed2847();
+    o.dimensions = buildUnnamed2848();
+    o.metricNames = buildUnnamed2849();
   }
   buildCounterReportCriteria--;
   return o;
@@ -7026,60 +7026,60 @@
     checkActivities(o.activities);
     checkCustomRichMediaEvents(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed2822(o.dimensionFilters);
-    checkUnnamed2823(o.dimensions);
-    checkUnnamed2824(o.metricNames);
+    checkUnnamed2847(o.dimensionFilters);
+    checkUnnamed2848(o.dimensions);
+    checkUnnamed2849(o.metricNames);
   }
   buildCounterReportCriteria--;
 }
 
-buildUnnamed2825() {
+buildUnnamed2850() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed2825(core.List<api.SortedDimension> o) {
+checkUnnamed2850(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed2826() {
+buildUnnamed2851() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed2826(core.List<api.DimensionValue> o) {
+checkUnnamed2851(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed2827() {
+buildUnnamed2852() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2827(core.List<core.String> o) {
+checkUnnamed2852(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2828() {
+buildUnnamed2853() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2828(core.List<core.String> o) {
+checkUnnamed2853(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -7090,12 +7090,12 @@
   var o = new api.ReportCrossDimensionReachCriteria();
   buildCounterReportCrossDimensionReachCriteria++;
   if (buildCounterReportCrossDimensionReachCriteria < 3) {
-    o.breakdown = buildUnnamed2825();
+    o.breakdown = buildUnnamed2850();
     o.dateRange = buildDateRange();
     o.dimension = "foo";
-    o.dimensionFilters = buildUnnamed2826();
-    o.metricNames = buildUnnamed2827();
-    o.overlapMetricNames = buildUnnamed2828();
+    o.dimensionFilters = buildUnnamed2851();
+    o.metricNames = buildUnnamed2852();
+    o.overlapMetricNames = buildUnnamed2853();
     o.pivoted = true;
   }
   buildCounterReportCrossDimensionReachCriteria--;
@@ -7106,25 +7106,25 @@
     api.ReportCrossDimensionReachCriteria o) {
   buildCounterReportCrossDimensionReachCriteria++;
   if (buildCounterReportCrossDimensionReachCriteria < 3) {
-    checkUnnamed2825(o.breakdown);
+    checkUnnamed2850(o.breakdown);
     checkDateRange(o.dateRange);
     unittest.expect(o.dimension, unittest.equals('foo'));
-    checkUnnamed2826(o.dimensionFilters);
-    checkUnnamed2827(o.metricNames);
-    checkUnnamed2828(o.overlapMetricNames);
+    checkUnnamed2851(o.dimensionFilters);
+    checkUnnamed2852(o.metricNames);
+    checkUnnamed2853(o.overlapMetricNames);
     unittest.expect(o.pivoted, unittest.isTrue);
   }
   buildCounterReportCrossDimensionReachCriteria--;
 }
 
-buildUnnamed2829() {
+buildUnnamed2854() {
   var o = new core.List<api.Recipient>();
   o.add(buildRecipient());
   o.add(buildRecipient());
   return o;
 }
 
-checkUnnamed2829(core.List<api.Recipient> o) {
+checkUnnamed2854(core.List<api.Recipient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRecipient(o[0]);
   checkRecipient(o[1]);
@@ -7138,7 +7138,7 @@
     o.emailOwner = true;
     o.emailOwnerDeliveryType = "foo";
     o.message = "foo";
-    o.recipients = buildUnnamed2829();
+    o.recipients = buildUnnamed2854();
   }
   buildCounterReportDelivery--;
   return o;
@@ -7150,58 +7150,58 @@
     unittest.expect(o.emailOwner, unittest.isTrue);
     unittest.expect(o.emailOwnerDeliveryType, unittest.equals('foo'));
     unittest.expect(o.message, unittest.equals('foo'));
-    checkUnnamed2829(o.recipients);
+    checkUnnamed2854(o.recipients);
   }
   buildCounterReportDelivery--;
 }
 
-buildUnnamed2830() {
+buildUnnamed2855() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed2830(core.List<api.DimensionValue> o) {
+checkUnnamed2855(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed2831() {
+buildUnnamed2856() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed2831(core.List<api.DimensionValue> o) {
+checkUnnamed2856(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed2832() {
+buildUnnamed2857() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed2832(core.List<api.SortedDimension> o) {
+checkUnnamed2857(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed2833() {
+buildUnnamed2858() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2833(core.List<core.String> o) {
+checkUnnamed2858(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -7236,12 +7236,12 @@
   var o = new api.ReportFloodlightCriteria();
   buildCounterReportFloodlightCriteria++;
   if (buildCounterReportFloodlightCriteria < 3) {
-    o.customRichMediaEvents = buildUnnamed2830();
+    o.customRichMediaEvents = buildUnnamed2855();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed2831();
-    o.dimensions = buildUnnamed2832();
+    o.dimensionFilters = buildUnnamed2856();
+    o.dimensions = buildUnnamed2857();
     o.floodlightConfigId = buildDimensionValue();
-    o.metricNames = buildUnnamed2833();
+    o.metricNames = buildUnnamed2858();
     o.reportProperties = buildReportFloodlightCriteriaReportProperties();
   }
   buildCounterReportFloodlightCriteria--;
@@ -7251,90 +7251,90 @@
 checkReportFloodlightCriteria(api.ReportFloodlightCriteria o) {
   buildCounterReportFloodlightCriteria++;
   if (buildCounterReportFloodlightCriteria < 3) {
-    checkUnnamed2830(o.customRichMediaEvents);
+    checkUnnamed2855(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed2831(o.dimensionFilters);
-    checkUnnamed2832(o.dimensions);
+    checkUnnamed2856(o.dimensionFilters);
+    checkUnnamed2857(o.dimensions);
     checkDimensionValue(o.floodlightConfigId);
-    checkUnnamed2833(o.metricNames);
+    checkUnnamed2858(o.metricNames);
     checkReportFloodlightCriteriaReportProperties(o.reportProperties);
   }
   buildCounterReportFloodlightCriteria--;
 }
 
-buildUnnamed2834() {
+buildUnnamed2859() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed2834(core.List<api.DimensionValue> o) {
+checkUnnamed2859(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed2835() {
+buildUnnamed2860() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed2835(core.List<api.SortedDimension> o) {
+checkUnnamed2860(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed2836() {
+buildUnnamed2861() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed2836(core.List<api.SortedDimension> o) {
+checkUnnamed2861(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed2837() {
+buildUnnamed2862() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed2837(core.List<api.DimensionValue> o) {
+checkUnnamed2862(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed2838() {
+buildUnnamed2863() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2838(core.List<core.String> o) {
+checkUnnamed2863(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2839() {
+buildUnnamed2864() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed2839(core.List<api.SortedDimension> o) {
+checkUnnamed2864(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
@@ -7381,14 +7381,14 @@
   var o = new api.ReportPathToConversionCriteria();
   buildCounterReportPathToConversionCriteria++;
   if (buildCounterReportPathToConversionCriteria < 3) {
-    o.activityFilters = buildUnnamed2834();
-    o.conversionDimensions = buildUnnamed2835();
-    o.customFloodlightVariables = buildUnnamed2836();
-    o.customRichMediaEvents = buildUnnamed2837();
+    o.activityFilters = buildUnnamed2859();
+    o.conversionDimensions = buildUnnamed2860();
+    o.customFloodlightVariables = buildUnnamed2861();
+    o.customRichMediaEvents = buildUnnamed2862();
     o.dateRange = buildDateRange();
     o.floodlightConfigId = buildDimensionValue();
-    o.metricNames = buildUnnamed2838();
-    o.perInteractionDimensions = buildUnnamed2839();
+    o.metricNames = buildUnnamed2863();
+    o.perInteractionDimensions = buildUnnamed2864();
     o.reportProperties = buildReportPathToConversionCriteriaReportProperties();
   }
   buildCounterReportPathToConversionCriteria--;
@@ -7398,66 +7398,66 @@
 checkReportPathToConversionCriteria(api.ReportPathToConversionCriteria o) {
   buildCounterReportPathToConversionCriteria++;
   if (buildCounterReportPathToConversionCriteria < 3) {
-    checkUnnamed2834(o.activityFilters);
-    checkUnnamed2835(o.conversionDimensions);
-    checkUnnamed2836(o.customFloodlightVariables);
-    checkUnnamed2837(o.customRichMediaEvents);
+    checkUnnamed2859(o.activityFilters);
+    checkUnnamed2860(o.conversionDimensions);
+    checkUnnamed2861(o.customFloodlightVariables);
+    checkUnnamed2862(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
     checkDimensionValue(o.floodlightConfigId);
-    checkUnnamed2838(o.metricNames);
-    checkUnnamed2839(o.perInteractionDimensions);
+    checkUnnamed2863(o.metricNames);
+    checkUnnamed2864(o.perInteractionDimensions);
     checkReportPathToConversionCriteriaReportProperties(o.reportProperties);
   }
   buildCounterReportPathToConversionCriteria--;
 }
 
-buildUnnamed2840() {
+buildUnnamed2865() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed2840(core.List<api.DimensionValue> o) {
+checkUnnamed2865(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed2841() {
+buildUnnamed2866() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed2841(core.List<api.SortedDimension> o) {
+checkUnnamed2866(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed2842() {
+buildUnnamed2867() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2842(core.List<core.String> o) {
+checkUnnamed2867(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2843() {
+buildUnnamed2868() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2843(core.List<core.String> o) {
+checkUnnamed2868(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -7471,11 +7471,11 @@
     o.activities = buildActivities();
     o.customRichMediaEvents = buildCustomRichMediaEvents();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed2840();
-    o.dimensions = buildUnnamed2841();
+    o.dimensionFilters = buildUnnamed2865();
+    o.dimensions = buildUnnamed2866();
     o.enableAllDimensionCombinations = true;
-    o.metricNames = buildUnnamed2842();
-    o.reachByFrequencyMetricNames = buildUnnamed2843();
+    o.metricNames = buildUnnamed2867();
+    o.reachByFrequencyMetricNames = buildUnnamed2868();
   }
   buildCounterReportReachCriteria--;
   return o;
@@ -7487,23 +7487,23 @@
     checkActivities(o.activities);
     checkCustomRichMediaEvents(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed2840(o.dimensionFilters);
-    checkUnnamed2841(o.dimensions);
+    checkUnnamed2865(o.dimensionFilters);
+    checkUnnamed2866(o.dimensions);
     unittest.expect(o.enableAllDimensionCombinations, unittest.isTrue);
-    checkUnnamed2842(o.metricNames);
-    checkUnnamed2843(o.reachByFrequencyMetricNames);
+    checkUnnamed2867(o.metricNames);
+    checkUnnamed2868(o.reachByFrequencyMetricNames);
   }
   buildCounterReportReachCriteria--;
 }
 
-buildUnnamed2844() {
+buildUnnamed2869() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2844(core.List<core.String> o) {
+checkUnnamed2869(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -7518,7 +7518,7 @@
     o.every = 42;
     o.expirationDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.repeats = "foo";
-    o.repeatsOnWeekDays = buildUnnamed2844();
+    o.repeatsOnWeekDays = buildUnnamed2869();
     o.runsOnDayOfMonth = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
   }
@@ -7534,7 +7534,7 @@
     unittest.expect(o.expirationDate,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.repeats, unittest.equals('foo'));
-    checkUnnamed2844(o.repeatsOnWeekDays);
+    checkUnnamed2869(o.repeatsOnWeekDays);
     unittest.expect(o.runsOnDayOfMonth, unittest.equals('foo'));
     unittest.expect(o.startDate,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
@@ -7595,53 +7595,53 @@
   buildCounterReport--;
 }
 
-buildUnnamed2845() {
+buildUnnamed2870() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed2845(core.List<api.Dimension> o) {
+checkUnnamed2870(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed2846() {
+buildUnnamed2871() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed2846(core.List<api.Dimension> o) {
+checkUnnamed2871(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed2847() {
+buildUnnamed2872() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed2847(core.List<api.Metric> o) {
+checkUnnamed2872(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed2848() {
+buildUnnamed2873() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed2848(core.List<api.Metric> o) {
+checkUnnamed2873(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -7652,11 +7652,11 @@
   var o = new api.ReportCompatibleFields();
   buildCounterReportCompatibleFields++;
   if (buildCounterReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed2845();
-    o.dimensions = buildUnnamed2846();
+    o.dimensionFilters = buildUnnamed2870();
+    o.dimensions = buildUnnamed2871();
     o.kind = "foo";
-    o.metrics = buildUnnamed2847();
-    o.pivotedActivityMetrics = buildUnnamed2848();
+    o.metrics = buildUnnamed2872();
+    o.pivotedActivityMetrics = buildUnnamed2873();
   }
   buildCounterReportCompatibleFields--;
   return o;
@@ -7665,23 +7665,23 @@
 checkReportCompatibleFields(api.ReportCompatibleFields o) {
   buildCounterReportCompatibleFields++;
   if (buildCounterReportCompatibleFields < 3) {
-    checkUnnamed2845(o.dimensionFilters);
-    checkUnnamed2846(o.dimensions);
+    checkUnnamed2870(o.dimensionFilters);
+    checkUnnamed2871(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2847(o.metrics);
-    checkUnnamed2848(o.pivotedActivityMetrics);
+    checkUnnamed2872(o.metrics);
+    checkUnnamed2873(o.pivotedActivityMetrics);
   }
   buildCounterReportCompatibleFields--;
 }
 
-buildUnnamed2849() {
+buildUnnamed2874() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed2849(core.List<api.Report> o) {
+checkUnnamed2874(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -7693,7 +7693,7 @@
   buildCounterReportList++;
   if (buildCounterReportList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed2849();
+    o.items = buildUnnamed2874();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -7705,7 +7705,7 @@
   buildCounterReportList++;
   if (buildCounterReportList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed2849(o.items);
+    checkUnnamed2874(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -7781,14 +7781,14 @@
   buildCounterRule--;
 }
 
-buildUnnamed2850() {
+buildUnnamed2875() {
   var o = new core.List<api.SiteContact>();
   o.add(buildSiteContact());
   o.add(buildSiteContact());
   return o;
 }
 
-checkUnnamed2850(core.List<api.SiteContact> o) {
+checkUnnamed2875(core.List<api.SiteContact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSiteContact(o[0]);
   checkSiteContact(o[1]);
@@ -7808,7 +7808,7 @@
     o.keyName = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.siteContacts = buildUnnamed2850();
+    o.siteContacts = buildUnnamed2875();
     o.siteSettings = buildSiteSettings();
     o.subaccountId = "foo";
   }
@@ -7828,7 +7828,7 @@
     unittest.expect(o.keyName, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2850(o.siteContacts);
+    checkUnnamed2875(o.siteContacts);
     checkSiteSettings(o.siteSettings);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
   }
@@ -7901,14 +7901,14 @@
   buildCounterSiteSettings--;
 }
 
-buildUnnamed2851() {
+buildUnnamed2876() {
   var o = new core.List<api.Site>();
   o.add(buildSite());
   o.add(buildSite());
   return o;
 }
 
-checkUnnamed2851(core.List<api.Site> o) {
+checkUnnamed2876(core.List<api.Site> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSite(o[0]);
   checkSite(o[1]);
@@ -7921,7 +7921,7 @@
   if (buildCounterSitesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.sites = buildUnnamed2851();
+    o.sites = buildUnnamed2876();
   }
   buildCounterSitesListResponse--;
   return o;
@@ -7932,7 +7932,7 @@
   if (buildCounterSitesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2851(o.sites);
+    checkUnnamed2876(o.sites);
   }
   buildCounterSitesListResponse--;
 }
@@ -7964,14 +7964,14 @@
   buildCounterSize--;
 }
 
-buildUnnamed2852() {
+buildUnnamed2877() {
   var o = new core.List<api.Size>();
   o.add(buildSize());
   o.add(buildSize());
   return o;
 }
 
-checkUnnamed2852(core.List<api.Size> o) {
+checkUnnamed2877(core.List<api.Size> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSize(o[0]);
   checkSize(o[1]);
@@ -7983,7 +7983,7 @@
   buildCounterSizesListResponse++;
   if (buildCounterSizesListResponse < 3) {
     o.kind = "foo";
-    o.sizes = buildUnnamed2852();
+    o.sizes = buildUnnamed2877();
   }
   buildCounterSizesListResponse--;
   return o;
@@ -7993,7 +7993,7 @@
   buildCounterSizesListResponse++;
   if (buildCounterSizesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2852(o.sizes);
+    checkUnnamed2877(o.sizes);
   }
   buildCounterSizesListResponse--;
 }
@@ -8046,14 +8046,14 @@
   buildCounterSortedDimension--;
 }
 
-buildUnnamed2853() {
+buildUnnamed2878() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2853(core.List<core.String> o) {
+checkUnnamed2878(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -8065,7 +8065,7 @@
   buildCounterSubaccount++;
   if (buildCounterSubaccount < 3) {
     o.accountId = "foo";
-    o.availablePermissionIds = buildUnnamed2853();
+    o.availablePermissionIds = buildUnnamed2878();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -8078,7 +8078,7 @@
   buildCounterSubaccount++;
   if (buildCounterSubaccount < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed2853(o.availablePermissionIds);
+    checkUnnamed2878(o.availablePermissionIds);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -8086,14 +8086,14 @@
   buildCounterSubaccount--;
 }
 
-buildUnnamed2854() {
+buildUnnamed2879() {
   var o = new core.List<api.Subaccount>();
   o.add(buildSubaccount());
   o.add(buildSubaccount());
   return o;
 }
 
-checkUnnamed2854(core.List<api.Subaccount> o) {
+checkUnnamed2879(core.List<api.Subaccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubaccount(o[0]);
   checkSubaccount(o[1]);
@@ -8106,7 +8106,7 @@
   if (buildCounterSubaccountsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.subaccounts = buildUnnamed2854();
+    o.subaccounts = buildUnnamed2879();
   }
   buildCounterSubaccountsListResponse--;
   return o;
@@ -8117,7 +8117,7 @@
   if (buildCounterSubaccountsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2854(o.subaccounts);
+    checkUnnamed2879(o.subaccounts);
   }
   buildCounterSubaccountsListResponse--;
 }
@@ -8257,14 +8257,14 @@
   buildCounterTargetableRemarketingList--;
 }
 
-buildUnnamed2855() {
+buildUnnamed2880() {
   var o = new core.List<api.TargetableRemarketingList>();
   o.add(buildTargetableRemarketingList());
   o.add(buildTargetableRemarketingList());
   return o;
 }
 
-checkUnnamed2855(core.List<api.TargetableRemarketingList> o) {
+checkUnnamed2880(core.List<api.TargetableRemarketingList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetableRemarketingList(o[0]);
   checkTargetableRemarketingList(o[1]);
@@ -8277,7 +8277,7 @@
   if (buildCounterTargetableRemarketingListsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.targetableRemarketingLists = buildUnnamed2855();
+    o.targetableRemarketingLists = buildUnnamed2880();
   }
   buildCounterTargetableRemarketingListsListResponse--;
   return o;
@@ -8289,7 +8289,7 @@
   if (buildCounterTargetableRemarketingListsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2855(o.targetableRemarketingLists);
+    checkUnnamed2880(o.targetableRemarketingLists);
   }
   buildCounterTargetableRemarketingListsListResponse--;
 }
@@ -8337,14 +8337,14 @@
   buildCounterTargetingTemplate--;
 }
 
-buildUnnamed2856() {
+buildUnnamed2881() {
   var o = new core.List<api.TargetingTemplate>();
   o.add(buildTargetingTemplate());
   o.add(buildTargetingTemplate());
   return o;
 }
 
-checkUnnamed2856(core.List<api.TargetingTemplate> o) {
+checkUnnamed2881(core.List<api.TargetingTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetingTemplate(o[0]);
   checkTargetingTemplate(o[1]);
@@ -8357,7 +8357,7 @@
   if (buildCounterTargetingTemplatesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.targetingTemplates = buildUnnamed2856();
+    o.targetingTemplates = buildUnnamed2881();
   }
   buildCounterTargetingTemplatesListResponse--;
   return o;
@@ -8368,84 +8368,84 @@
   if (buildCounterTargetingTemplatesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2856(o.targetingTemplates);
+    checkUnnamed2881(o.targetingTemplates);
   }
   buildCounterTargetingTemplatesListResponse--;
 }
 
-buildUnnamed2857() {
+buildUnnamed2882() {
   var o = new core.List<api.Browser>();
   o.add(buildBrowser());
   o.add(buildBrowser());
   return o;
 }
 
-checkUnnamed2857(core.List<api.Browser> o) {
+checkUnnamed2882(core.List<api.Browser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBrowser(o[0]);
   checkBrowser(o[1]);
 }
 
-buildUnnamed2858() {
+buildUnnamed2883() {
   var o = new core.List<api.ConnectionType>();
   o.add(buildConnectionType());
   o.add(buildConnectionType());
   return o;
 }
 
-checkUnnamed2858(core.List<api.ConnectionType> o) {
+checkUnnamed2883(core.List<api.ConnectionType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConnectionType(o[0]);
   checkConnectionType(o[1]);
 }
 
-buildUnnamed2859() {
+buildUnnamed2884() {
   var o = new core.List<api.MobileCarrier>();
   o.add(buildMobileCarrier());
   o.add(buildMobileCarrier());
   return o;
 }
 
-checkUnnamed2859(core.List<api.MobileCarrier> o) {
+checkUnnamed2884(core.List<api.MobileCarrier> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileCarrier(o[0]);
   checkMobileCarrier(o[1]);
 }
 
-buildUnnamed2860() {
+buildUnnamed2885() {
   var o = new core.List<api.OperatingSystemVersion>();
   o.add(buildOperatingSystemVersion());
   o.add(buildOperatingSystemVersion());
   return o;
 }
 
-checkUnnamed2860(core.List<api.OperatingSystemVersion> o) {
+checkUnnamed2885(core.List<api.OperatingSystemVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperatingSystemVersion(o[0]);
   checkOperatingSystemVersion(o[1]);
 }
 
-buildUnnamed2861() {
+buildUnnamed2886() {
   var o = new core.List<api.OperatingSystem>();
   o.add(buildOperatingSystem());
   o.add(buildOperatingSystem());
   return o;
 }
 
-checkUnnamed2861(core.List<api.OperatingSystem> o) {
+checkUnnamed2886(core.List<api.OperatingSystem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperatingSystem(o[0]);
   checkOperatingSystem(o[1]);
 }
 
-buildUnnamed2862() {
+buildUnnamed2887() {
   var o = new core.List<api.PlatformType>();
   o.add(buildPlatformType());
   o.add(buildPlatformType());
   return o;
 }
 
-checkUnnamed2862(core.List<api.PlatformType> o) {
+checkUnnamed2887(core.List<api.PlatformType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlatformType(o[0]);
   checkPlatformType(o[1]);
@@ -8456,12 +8456,12 @@
   var o = new api.TechnologyTargeting();
   buildCounterTechnologyTargeting++;
   if (buildCounterTechnologyTargeting < 3) {
-    o.browsers = buildUnnamed2857();
-    o.connectionTypes = buildUnnamed2858();
-    o.mobileCarriers = buildUnnamed2859();
-    o.operatingSystemVersions = buildUnnamed2860();
-    o.operatingSystems = buildUnnamed2861();
-    o.platformTypes = buildUnnamed2862();
+    o.browsers = buildUnnamed2882();
+    o.connectionTypes = buildUnnamed2883();
+    o.mobileCarriers = buildUnnamed2884();
+    o.operatingSystemVersions = buildUnnamed2885();
+    o.operatingSystems = buildUnnamed2886();
+    o.platformTypes = buildUnnamed2887();
   }
   buildCounterTechnologyTargeting--;
   return o;
@@ -8470,12 +8470,12 @@
 checkTechnologyTargeting(api.TechnologyTargeting o) {
   buildCounterTechnologyTargeting++;
   if (buildCounterTechnologyTargeting < 3) {
-    checkUnnamed2857(o.browsers);
-    checkUnnamed2858(o.connectionTypes);
-    checkUnnamed2859(o.mobileCarriers);
-    checkUnnamed2860(o.operatingSystemVersions);
-    checkUnnamed2861(o.operatingSystems);
-    checkUnnamed2862(o.platformTypes);
+    checkUnnamed2882(o.browsers);
+    checkUnnamed2883(o.connectionTypes);
+    checkUnnamed2884(o.mobileCarriers);
+    checkUnnamed2885(o.operatingSystemVersions);
+    checkUnnamed2886(o.operatingSystems);
+    checkUnnamed2887(o.platformTypes);
   }
   buildCounterTechnologyTargeting--;
 }
@@ -8522,14 +8522,14 @@
   buildCounterThirdPartyTrackingUrl--;
 }
 
-buildUnnamed2863() {
+buildUnnamed2888() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2863(core.List<core.int> o) {
+checkUnnamed2888(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));
@@ -8540,7 +8540,7 @@
   var o = new api.TranscodeSetting();
   buildCounterTranscodeSetting++;
   if (buildCounterTranscodeSetting < 3) {
-    o.enabledVideoFormats = buildUnnamed2863();
+    o.enabledVideoFormats = buildUnnamed2888();
     o.kind = "foo";
   }
   buildCounterTranscodeSetting--;
@@ -8550,7 +8550,7 @@
 checkTranscodeSetting(api.TranscodeSetting o) {
   buildCounterTranscodeSetting++;
   if (buildCounterTranscodeSetting < 3) {
-    checkUnnamed2863(o.enabledVideoFormats);
+    checkUnnamed2888(o.enabledVideoFormats);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTranscodeSetting--;
@@ -8633,14 +8633,14 @@
   buildCounterUserProfile--;
 }
 
-buildUnnamed2864() {
+buildUnnamed2889() {
   var o = new core.List<api.UserProfile>();
   o.add(buildUserProfile());
   o.add(buildUserProfile());
   return o;
 }
 
-checkUnnamed2864(core.List<api.UserProfile> o) {
+checkUnnamed2889(core.List<api.UserProfile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserProfile(o[0]);
   checkUserProfile(o[1]);
@@ -8652,7 +8652,7 @@
   buildCounterUserProfileList++;
   if (buildCounterUserProfileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed2864();
+    o.items = buildUnnamed2889();
     o.kind = "foo";
   }
   buildCounterUserProfileList--;
@@ -8663,20 +8663,20 @@
   buildCounterUserProfileList++;
   if (buildCounterUserProfileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed2864(o.items);
+    checkUnnamed2889(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterUserProfileList--;
 }
 
-buildUnnamed2865() {
+buildUnnamed2890() {
   var o = new core.List<api.UserRolePermission>();
   o.add(buildUserRolePermission());
   o.add(buildUserRolePermission());
   return o;
 }
 
-checkUnnamed2865(core.List<api.UserRolePermission> o) {
+checkUnnamed2890(core.List<api.UserRolePermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserRolePermission(o[0]);
   checkUserRolePermission(o[1]);
@@ -8693,7 +8693,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.parentUserRoleId = "foo";
-    o.permissions = buildUnnamed2865();
+    o.permissions = buildUnnamed2890();
     o.subaccountId = "foo";
   }
   buildCounterUserRole--;
@@ -8709,7 +8709,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parentUserRoleId, unittest.equals('foo'));
-    checkUnnamed2865(o.permissions);
+    checkUnnamed2890(o.permissions);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
   }
   buildCounterUserRole--;
@@ -8765,14 +8765,14 @@
   buildCounterUserRolePermissionGroup--;
 }
 
-buildUnnamed2866() {
+buildUnnamed2891() {
   var o = new core.List<api.UserRolePermissionGroup>();
   o.add(buildUserRolePermissionGroup());
   o.add(buildUserRolePermissionGroup());
   return o;
 }
 
-checkUnnamed2866(core.List<api.UserRolePermissionGroup> o) {
+checkUnnamed2891(core.List<api.UserRolePermissionGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserRolePermissionGroup(o[0]);
   checkUserRolePermissionGroup(o[1]);
@@ -8784,7 +8784,7 @@
   buildCounterUserRolePermissionGroupsListResponse++;
   if (buildCounterUserRolePermissionGroupsListResponse < 3) {
     o.kind = "foo";
-    o.userRolePermissionGroups = buildUnnamed2866();
+    o.userRolePermissionGroups = buildUnnamed2891();
   }
   buildCounterUserRolePermissionGroupsListResponse--;
   return o;
@@ -8795,19 +8795,19 @@
   buildCounterUserRolePermissionGroupsListResponse++;
   if (buildCounterUserRolePermissionGroupsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2866(o.userRolePermissionGroups);
+    checkUnnamed2891(o.userRolePermissionGroups);
   }
   buildCounterUserRolePermissionGroupsListResponse--;
 }
 
-buildUnnamed2867() {
+buildUnnamed2892() {
   var o = new core.List<api.UserRolePermission>();
   o.add(buildUserRolePermission());
   o.add(buildUserRolePermission());
   return o;
 }
 
-checkUnnamed2867(core.List<api.UserRolePermission> o) {
+checkUnnamed2892(core.List<api.UserRolePermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserRolePermission(o[0]);
   checkUserRolePermission(o[1]);
@@ -8819,7 +8819,7 @@
   buildCounterUserRolePermissionsListResponse++;
   if (buildCounterUserRolePermissionsListResponse < 3) {
     o.kind = "foo";
-    o.userRolePermissions = buildUnnamed2867();
+    o.userRolePermissions = buildUnnamed2892();
   }
   buildCounterUserRolePermissionsListResponse--;
   return o;
@@ -8829,19 +8829,19 @@
   buildCounterUserRolePermissionsListResponse++;
   if (buildCounterUserRolePermissionsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2867(o.userRolePermissions);
+    checkUnnamed2892(o.userRolePermissions);
   }
   buildCounterUserRolePermissionsListResponse--;
 }
 
-buildUnnamed2868() {
+buildUnnamed2893() {
   var o = new core.List<api.UserRole>();
   o.add(buildUserRole());
   o.add(buildUserRole());
   return o;
 }
 
-checkUnnamed2868(core.List<api.UserRole> o) {
+checkUnnamed2893(core.List<api.UserRole> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserRole(o[0]);
   checkUserRole(o[1]);
@@ -8854,7 +8854,7 @@
   if (buildCounterUserRolesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.userRoles = buildUnnamed2868();
+    o.userRoles = buildUnnamed2893();
   }
   buildCounterUserRolesListResponse--;
   return o;
@@ -8865,7 +8865,7 @@
   if (buildCounterUserRolesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2868(o.userRoles);
+    checkUnnamed2893(o.userRoles);
   }
   buildCounterUserRolesListResponse--;
 }
@@ -8897,14 +8897,14 @@
   buildCounterVideoFormat--;
 }
 
-buildUnnamed2869() {
+buildUnnamed2894() {
   var o = new core.List<api.VideoFormat>();
   o.add(buildVideoFormat());
   o.add(buildVideoFormat());
   return o;
 }
 
-checkUnnamed2869(core.List<api.VideoFormat> o) {
+checkUnnamed2894(core.List<api.VideoFormat> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFormat(o[0]);
   checkVideoFormat(o[1]);
@@ -8916,7 +8916,7 @@
   buildCounterVideoFormatsListResponse++;
   if (buildCounterVideoFormatsListResponse < 3) {
     o.kind = "foo";
-    o.videoFormats = buildUnnamed2869();
+    o.videoFormats = buildUnnamed2894();
   }
   buildCounterVideoFormatsListResponse--;
   return o;
@@ -8926,7 +8926,7 @@
   buildCounterVideoFormatsListResponse++;
   if (buildCounterVideoFormatsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2869(o.videoFormats);
+    checkUnnamed2894(o.videoFormats);
   }
   buildCounterVideoFormatsListResponse--;
 }
@@ -8979,331 +8979,6 @@
   buildCounterVideoSettings--;
 }
 
-buildUnnamed2870() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2870(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2871() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2871(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2872() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2872(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2873() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2873(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2874() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2874(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2875() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2875(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2876() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2876(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2877() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2877(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2878() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2878(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2879() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2879(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2880() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2880(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2881() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2881(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2882() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2882(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2883() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2883(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2884() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2884(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2885() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2885(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2886() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2886(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2887() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2887(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2888() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2888(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2889() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2889(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2890() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2890(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2891() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2891(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2892() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2892(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2893() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2893(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2894() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2894(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed2895() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -10149,6 +9824,331 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed2960() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2960(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2961() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2961(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2962() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2962(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2963() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2963(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2964() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2964(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2965() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2965(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2966() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2966(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2967() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2967(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2968() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2968(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2969() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2969(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2970() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2970(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2971() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2971(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2972() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2972(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2973() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2973(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2974() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2974(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2975() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2975(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2976() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2976(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2977() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2977(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2978() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2978(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2979() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2979(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2980() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2980(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2981() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2981(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2982() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2982(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2983() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2983(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2984() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2984(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 main() {
   unittest.group("obj-schema-Account", () {
     unittest.test("to-json--from-json", () {
@@ -12404,7 +12404,7 @@
           new api.DfareportingApi(mock).accountUserProfiles;
       var arg_profileId = "foo";
       var arg_active = true;
-      var arg_ids = buildUnnamed2870();
+      var arg_ids = buildUnnamed2895();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -12707,7 +12707,7 @@
       api.AccountsResourceApi res = new api.DfareportingApi(mock).accounts;
       var arg_profileId = "foo";
       var arg_active = true;
-      var arg_ids = buildUnnamed2871();
+      var arg_ids = buildUnnamed2896();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -13067,26 +13067,26 @@
       var arg_active = true;
       var arg_advertiserId = "foo";
       var arg_archived = true;
-      var arg_audienceSegmentIds = buildUnnamed2872();
-      var arg_campaignIds = buildUnnamed2873();
+      var arg_audienceSegmentIds = buildUnnamed2897();
+      var arg_campaignIds = buildUnnamed2898();
       var arg_compatibility = "foo";
-      var arg_creativeIds = buildUnnamed2874();
-      var arg_creativeOptimizationConfigurationIds = buildUnnamed2875();
+      var arg_creativeIds = buildUnnamed2899();
+      var arg_creativeOptimizationConfigurationIds = buildUnnamed2900();
       var arg_dynamicClickTracker = true;
-      var arg_ids = buildUnnamed2876();
-      var arg_landingPageIds = buildUnnamed2877();
+      var arg_ids = buildUnnamed2901();
+      var arg_landingPageIds = buildUnnamed2902();
       var arg_maxResults = 42;
       var arg_overriddenEventTagId = "foo";
       var arg_pageToken = "foo";
-      var arg_placementIds = buildUnnamed2878();
-      var arg_remarketingListIds = buildUnnamed2879();
+      var arg_placementIds = buildUnnamed2903();
+      var arg_remarketingListIds = buildUnnamed2904();
       var arg_searchString = "foo";
-      var arg_sizeIds = buildUnnamed2880();
+      var arg_sizeIds = buildUnnamed2905();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_sslCompliant = true;
       var arg_sslRequired = true;
-      var arg_type = buildUnnamed2881();
+      var arg_type = buildUnnamed2906();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -13553,7 +13553,7 @@
       api.AdvertiserGroupsResourceApi res =
           new api.DfareportingApi(mock).advertiserGroups;
       var arg_profileId = "foo";
-      var arg_ids = buildUnnamed2882();
+      var arg_ids = buildUnnamed2907();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -13913,9 +13913,9 @@
       api.AdvertiserLandingPagesResourceApi res =
           new api.DfareportingApi(mock).advertiserLandingPages;
       var arg_profileId = "foo";
-      var arg_advertiserIds = buildUnnamed2883();
+      var arg_advertiserIds = buildUnnamed2908();
       var arg_archived = true;
-      var arg_ids = buildUnnamed2884();
+      var arg_ids = buildUnnamed2909();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -14286,9 +14286,9 @@
       api.AdvertisersResourceApi res =
           new api.DfareportingApi(mock).advertisers;
       var arg_profileId = "foo";
-      var arg_advertiserGroupIds = buildUnnamed2885();
-      var arg_floodlightConfigurationIds = buildUnnamed2886();
-      var arg_ids = buildUnnamed2887();
+      var arg_advertiserGroupIds = buildUnnamed2910();
+      var arg_floodlightConfigurationIds = buildUnnamed2911();
+      var arg_ids = buildUnnamed2912();
       var arg_includeAdvertisersWithoutGroupsOnly = true;
       var arg_maxResults = 42;
       var arg_onlyParent = true;
@@ -14899,12 +14899,12 @@
       var mock = new HttpServerMock();
       api.CampaignsResourceApi res = new api.DfareportingApi(mock).campaigns;
       var arg_profileId = "foo";
-      var arg_advertiserGroupIds = buildUnnamed2888();
-      var arg_advertiserIds = buildUnnamed2889();
+      var arg_advertiserGroupIds = buildUnnamed2913();
+      var arg_advertiserIds = buildUnnamed2914();
       var arg_archived = true;
       var arg_atLeastOneOptimizationActivity = true;
-      var arg_excludedIds = buildUnnamed2890();
-      var arg_ids = buildUnnamed2891();
+      var arg_excludedIds = buildUnnamed2915();
+      var arg_ids = buildUnnamed2916();
       var arg_maxResults = 42;
       var arg_overriddenEventTagId = "foo";
       var arg_pageToken = "foo";
@@ -15217,15 +15217,15 @@
       api.ChangeLogsResourceApi res = new api.DfareportingApi(mock).changeLogs;
       var arg_profileId = "foo";
       var arg_action = "foo";
-      var arg_ids = buildUnnamed2892();
+      var arg_ids = buildUnnamed2917();
       var arg_maxChangeTime = "foo";
       var arg_maxResults = 42;
       var arg_minChangeTime = "foo";
-      var arg_objectIds = buildUnnamed2893();
+      var arg_objectIds = buildUnnamed2918();
       var arg_objectType = "foo";
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
-      var arg_userProfileIds = buildUnnamed2894();
+      var arg_userProfileIds = buildUnnamed2919();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -15318,10 +15318,10 @@
       var mock = new HttpServerMock();
       api.CitiesResourceApi res = new api.DfareportingApi(mock).cities;
       var arg_profileId = "foo";
-      var arg_countryDartIds = buildUnnamed2895();
-      var arg_dartIds = buildUnnamed2896();
+      var arg_countryDartIds = buildUnnamed2920();
+      var arg_dartIds = buildUnnamed2921();
       var arg_namePrefix = "foo";
-      var arg_regionDartIds = buildUnnamed2897();
+      var arg_regionDartIds = buildUnnamed2922();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -15729,7 +15729,7 @@
       api.ContentCategoriesResourceApi res =
           new api.DfareportingApi(mock).contentCategories;
       var arg_profileId = "foo";
-      var arg_ids = buildUnnamed2898();
+      var arg_ids = buildUnnamed2923();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -16534,7 +16534,7 @@
           new api.DfareportingApi(mock).creativeFieldValues;
       var arg_profileId = "foo";
       var arg_creativeFieldId = "foo";
-      var arg_ids = buildUnnamed2899();
+      var arg_ids = buildUnnamed2924();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -16990,8 +16990,8 @@
       api.CreativeFieldsResourceApi res =
           new api.DfareportingApi(mock).creativeFields;
       var arg_profileId = "foo";
-      var arg_advertiserIds = buildUnnamed2900();
-      var arg_ids = buildUnnamed2901();
+      var arg_advertiserIds = buildUnnamed2925();
+      var arg_ids = buildUnnamed2926();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -17354,9 +17354,9 @@
       api.CreativeGroupsResourceApi res =
           new api.DfareportingApi(mock).creativeGroups;
       var arg_profileId = "foo";
-      var arg_advertiserIds = buildUnnamed2902();
+      var arg_advertiserIds = buildUnnamed2927();
       var arg_groupNumber = 42;
-      var arg_ids = buildUnnamed2903();
+      var arg_ids = buildUnnamed2928();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -17723,18 +17723,18 @@
       var arg_advertiserId = "foo";
       var arg_archived = true;
       var arg_campaignId = "foo";
-      var arg_companionCreativeIds = buildUnnamed2904();
-      var arg_creativeFieldIds = buildUnnamed2905();
-      var arg_ids = buildUnnamed2906();
+      var arg_companionCreativeIds = buildUnnamed2929();
+      var arg_creativeFieldIds = buildUnnamed2930();
+      var arg_ids = buildUnnamed2931();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
-      var arg_renderingIds = buildUnnamed2907();
+      var arg_renderingIds = buildUnnamed2932();
       var arg_searchString = "foo";
-      var arg_sizeIds = buildUnnamed2908();
+      var arg_sizeIds = buildUnnamed2933();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_studioCreativeId = "foo";
-      var arg_types = buildUnnamed2909();
+      var arg_types = buildUnnamed2934();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -18125,8 +18125,8 @@
       api.DirectorySiteContactsResourceApi res =
           new api.DfareportingApi(mock).directorySiteContacts;
       var arg_profileId = "foo";
-      var arg_directorySiteIds = buildUnnamed2910();
-      var arg_ids = buildUnnamed2911();
+      var arg_directorySiteIds = buildUnnamed2935();
+      var arg_ids = buildUnnamed2936();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -18360,7 +18360,7 @@
       var arg_active = true;
       var arg_countryId = "foo";
       var arg_dfpNetworkCode = "foo";
-      var arg_ids = buildUnnamed2912();
+      var arg_ids = buildUnnamed2937();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_parentId = "foo";
@@ -18613,7 +18613,7 @@
           new api.DfareportingApi(mock).dynamicTargetingKeys;
       var arg_profileId = "foo";
       var arg_advertiserId = "foo";
-      var arg_names = buildUnnamed2913();
+      var arg_names = buildUnnamed2938();
       var arg_objectId = "foo";
       var arg_objectType = "foo";
       var arg_$fields = "foo";
@@ -18894,8 +18894,8 @@
       var arg_campaignId = "foo";
       var arg_definitionsOnly = true;
       var arg_enabled = true;
-      var arg_eventTagTypes = buildUnnamed2914();
-      var arg_ids = buildUnnamed2915();
+      var arg_eventTagTypes = buildUnnamed2939();
+      var arg_ids = buildUnnamed2940();
       var arg_searchString = "foo";
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
@@ -19550,12 +19550,12 @@
           new api.DfareportingApi(mock).floodlightActivities;
       var arg_profileId = "foo";
       var arg_advertiserId = "foo";
-      var arg_floodlightActivityGroupIds = buildUnnamed2916();
+      var arg_floodlightActivityGroupIds = buildUnnamed2941();
       var arg_floodlightActivityGroupName = "foo";
       var arg_floodlightActivityGroupTagString = "foo";
       var arg_floodlightActivityGroupType = "foo";
       var arg_floodlightConfigurationId = "foo";
-      var arg_ids = buildUnnamed2917();
+      var arg_ids = buildUnnamed2942();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -19940,7 +19940,7 @@
       var arg_profileId = "foo";
       var arg_advertiserId = "foo";
       var arg_floodlightConfigurationId = "foo";
-      var arg_ids = buildUnnamed2918();
+      var arg_ids = buildUnnamed2943();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -20243,7 +20243,7 @@
       api.FloodlightConfigurationsResourceApi res =
           new api.DfareportingApi(mock).floodlightConfigurations;
       var arg_profileId = "foo";
-      var arg_ids = buildUnnamed2919();
+      var arg_ids = buildUnnamed2944();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -20524,12 +20524,12 @@
           new api.DfareportingApi(mock).inventoryItems;
       var arg_profileId = "foo";
       var arg_projectId = "foo";
-      var arg_ids = buildUnnamed2920();
+      var arg_ids = buildUnnamed2945();
       var arg_inPlan = true;
       var arg_maxResults = 42;
-      var arg_orderId = buildUnnamed2921();
+      var arg_orderId = buildUnnamed2946();
       var arg_pageToken = "foo";
-      var arg_siteId = buildUnnamed2922();
+      var arg_siteId = buildUnnamed2947();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_type = "foo";
@@ -21233,12 +21233,12 @@
       var arg_profileId = "foo";
       var arg_projectId = "foo";
       var arg_approved = true;
-      var arg_ids = buildUnnamed2923();
+      var arg_ids = buildUnnamed2948();
       var arg_maxResults = 42;
-      var arg_orderId = buildUnnamed2924();
+      var arg_orderId = buildUnnamed2949();
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
-      var arg_siteId = buildUnnamed2925();
+      var arg_siteId = buildUnnamed2950();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_$fields = "foo";
@@ -21417,11 +21417,11 @@
       api.OrdersResourceApi res = new api.DfareportingApi(mock).orders;
       var arg_profileId = "foo";
       var arg_projectId = "foo";
-      var arg_ids = buildUnnamed2926();
+      var arg_ids = buildUnnamed2951();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
-      var arg_siteId = buildUnnamed2927();
+      var arg_siteId = buildUnnamed2952();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_$fields = "foo";
@@ -21652,12 +21652,12 @@
       api.PlacementGroupsResourceApi res =
           new api.DfareportingApi(mock).placementGroups;
       var arg_profileId = "foo";
-      var arg_advertiserIds = buildUnnamed2928();
+      var arg_advertiserIds = buildUnnamed2953();
       var arg_archived = true;
-      var arg_campaignIds = buildUnnamed2929();
-      var arg_contentCategoryIds = buildUnnamed2930();
-      var arg_directorySiteIds = buildUnnamed2931();
-      var arg_ids = buildUnnamed2932();
+      var arg_campaignIds = buildUnnamed2954();
+      var arg_contentCategoryIds = buildUnnamed2955();
+      var arg_directorySiteIds = buildUnnamed2956();
+      var arg_ids = buildUnnamed2957();
       var arg_maxEndDate = "foo";
       var arg_maxResults = 42;
       var arg_maxStartDate = "foo";
@@ -21665,10 +21665,10 @@
       var arg_minStartDate = "foo";
       var arg_pageToken = "foo";
       var arg_placementGroupType = "foo";
-      var arg_placementStrategyIds = buildUnnamed2933();
-      var arg_pricingTypes = buildUnnamed2934();
+      var arg_placementStrategyIds = buildUnnamed2958();
+      var arg_pricingTypes = buildUnnamed2959();
       var arg_searchString = "foo";
-      var arg_siteIds = buildUnnamed2935();
+      var arg_siteIds = buildUnnamed2960();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_$fields = "foo";
@@ -22128,7 +22128,7 @@
       api.PlacementStrategiesResourceApi res =
           new api.DfareportingApi(mock).placementStrategies;
       var arg_profileId = "foo";
-      var arg_ids = buildUnnamed2936();
+      var arg_ids = buildUnnamed2961();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -22354,8 +22354,8 @@
       api.PlacementsResourceApi res = new api.DfareportingApi(mock).placements;
       var arg_profileId = "foo";
       var arg_campaignId = "foo";
-      var arg_placementIds = buildUnnamed2937();
-      var arg_tagFormats = buildUnnamed2938();
+      var arg_placementIds = buildUnnamed2962();
+      var arg_tagFormats = buildUnnamed2963();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -22561,14 +22561,14 @@
       var mock = new HttpServerMock();
       api.PlacementsResourceApi res = new api.DfareportingApi(mock).placements;
       var arg_profileId = "foo";
-      var arg_advertiserIds = buildUnnamed2939();
+      var arg_advertiserIds = buildUnnamed2964();
       var arg_archived = true;
-      var arg_campaignIds = buildUnnamed2940();
-      var arg_compatibilities = buildUnnamed2941();
-      var arg_contentCategoryIds = buildUnnamed2942();
-      var arg_directorySiteIds = buildUnnamed2943();
-      var arg_groupIds = buildUnnamed2944();
-      var arg_ids = buildUnnamed2945();
+      var arg_campaignIds = buildUnnamed2965();
+      var arg_compatibilities = buildUnnamed2966();
+      var arg_contentCategoryIds = buildUnnamed2967();
+      var arg_directorySiteIds = buildUnnamed2968();
+      var arg_groupIds = buildUnnamed2969();
+      var arg_ids = buildUnnamed2970();
       var arg_maxEndDate = "foo";
       var arg_maxResults = 42;
       var arg_maxStartDate = "foo";
@@ -22576,11 +22576,11 @@
       var arg_minStartDate = "foo";
       var arg_pageToken = "foo";
       var arg_paymentSource = "foo";
-      var arg_placementStrategyIds = buildUnnamed2946();
-      var arg_pricingTypes = buildUnnamed2947();
+      var arg_placementStrategyIds = buildUnnamed2971();
+      var arg_pricingTypes = buildUnnamed2972();
       var arg_searchString = "foo";
-      var arg_siteIds = buildUnnamed2948();
-      var arg_sizeIds = buildUnnamed2949();
+      var arg_siteIds = buildUnnamed2973();
+      var arg_sizeIds = buildUnnamed2974();
       var arg_sortField = "foo";
       var arg_sortOrder = "foo";
       var arg_$fields = "foo";
@@ -23173,8 +23173,8 @@
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.DfareportingApi(mock).projects;
       var arg_profileId = "foo";
-      var arg_advertiserIds = buildUnnamed2950();
-      var arg_ids = buildUnnamed2951();
+      var arg_advertiserIds = buildUnnamed2975();
+      var arg_ids = buildUnnamed2976();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -24778,9 +24778,9 @@
       var arg_acceptsPublisherPaidPlacements = true;
       var arg_adWordsSite = true;
       var arg_approved = true;
-      var arg_campaignIds = buildUnnamed2952();
-      var arg_directorySiteIds = buildUnnamed2953();
-      var arg_ids = buildUnnamed2954();
+      var arg_campaignIds = buildUnnamed2977();
+      var arg_directorySiteIds = buildUnnamed2978();
+      var arg_ids = buildUnnamed2979();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -25167,7 +25167,7 @@
       var arg_profileId = "foo";
       var arg_height = 42;
       var arg_iabStandard = true;
-      var arg_ids = buildUnnamed2955();
+      var arg_ids = buildUnnamed2980();
       var arg_width = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -25380,7 +25380,7 @@
       api.SubaccountsResourceApi res =
           new api.DfareportingApi(mock).subaccounts;
       var arg_profileId = "foo";
-      var arg_ids = buildUnnamed2956();
+      var arg_ids = buildUnnamed2981();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -25900,7 +25900,7 @@
           new api.DfareportingApi(mock).targetingTemplates;
       var arg_profileId = "foo";
       var arg_advertiserId = "foo";
-      var arg_ids = buildUnnamed2957();
+      var arg_ids = buildUnnamed2982();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
@@ -26440,7 +26440,7 @@
       api.UserRolePermissionsResourceApi res =
           new api.DfareportingApi(mock).userRolePermissions;
       var arg_profileId = "foo";
-      var arg_ids = buildUnnamed2958();
+      var arg_ids = buildUnnamed2983();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -26702,7 +26702,7 @@
       api.UserRolesResourceApi res = new api.DfareportingApi(mock).userRoles;
       var arg_profileId = "foo";
       var arg_accountUserRoleOnly = true;
-      var arg_ids = buildUnnamed2959();
+      var arg_ids = buildUnnamed2984();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_searchString = "foo";
diff --git a/generated/googleapis/test/digitalassetlinks/v1_test.dart b/generated/googleapis/test/digitalassetlinks/v1_test.dart
new file mode 100644
index 0000000..579cc92
--- /dev/null
+++ b/generated/googleapis/test/digitalassetlinks/v1_test.dart
@@ -0,0 +1,460 @@
+library googleapis.digitalassetlinks.v1.test;
+
+import "dart:core" as core;
+import "dart:async" as async;
+import "dart:convert" as convert;
+
+import 'package:http/http.dart' as http;
+import 'package:test/test.dart' as unittest;
+
+import 'package:googleapis/digitalassetlinks/v1.dart' as api;
+
+class HttpServerMock extends http.BaseClient {
+  core.Function _callback;
+  core.bool _expectJson;
+
+  void register(core.Function callback, core.bool expectJson) {
+    _callback = callback;
+    _expectJson = expectJson;
+  }
+
+  async.Future<http.StreamedResponse> send(http.BaseRequest request) {
+    if (_expectJson) {
+      return request
+          .finalize()
+          .transform(convert.UTF8.decoder)
+          .join('')
+          .then((core.String jsonString) {
+        if (jsonString.isEmpty) {
+          return _callback(request, null);
+        } else {
+          return _callback(request, convert.JSON.decode(jsonString));
+        }
+      });
+    } else {
+      var stream = request.finalize();
+      if (stream == null) {
+        return _callback(request, []);
+      } else {
+        return stream.toBytes().then((data) {
+          return _callback(request, data);
+        });
+      }
+    }
+  }
+}
+
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
+  var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
+  return new http.StreamedResponse(stream, status, headers: headers);
+}
+
+core.int buildCounterAndroidAppAsset = 0;
+buildAndroidAppAsset() {
+  var o = new api.AndroidAppAsset();
+  buildCounterAndroidAppAsset++;
+  if (buildCounterAndroidAppAsset < 3) {
+    o.certificate = buildCertificateInfo();
+    o.packageName = "foo";
+  }
+  buildCounterAndroidAppAsset--;
+  return o;
+}
+
+checkAndroidAppAsset(api.AndroidAppAsset o) {
+  buildCounterAndroidAppAsset++;
+  if (buildCounterAndroidAppAsset < 3) {
+    checkCertificateInfo(o.certificate);
+    unittest.expect(o.packageName, unittest.equals('foo'));
+  }
+  buildCounterAndroidAppAsset--;
+}
+
+core.int buildCounterAsset = 0;
+buildAsset() {
+  var o = new api.Asset();
+  buildCounterAsset++;
+  if (buildCounterAsset < 3) {
+    o.androidApp = buildAndroidAppAsset();
+    o.web = buildWebAsset();
+  }
+  buildCounterAsset--;
+  return o;
+}
+
+checkAsset(api.Asset o) {
+  buildCounterAsset++;
+  if (buildCounterAsset < 3) {
+    checkAndroidAppAsset(o.androidApp);
+    checkWebAsset(o.web);
+  }
+  buildCounterAsset--;
+}
+
+core.int buildCounterCertificateInfo = 0;
+buildCertificateInfo() {
+  var o = new api.CertificateInfo();
+  buildCounterCertificateInfo++;
+  if (buildCounterCertificateInfo < 3) {
+    o.sha256Fingerprint = "foo";
+  }
+  buildCounterCertificateInfo--;
+  return o;
+}
+
+checkCertificateInfo(api.CertificateInfo o) {
+  buildCounterCertificateInfo++;
+  if (buildCounterCertificateInfo < 3) {
+    unittest.expect(o.sha256Fingerprint, unittest.equals('foo'));
+  }
+  buildCounterCertificateInfo--;
+}
+
+buildUnnamed1286() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1286(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterCheckResponse = 0;
+buildCheckResponse() {
+  var o = new api.CheckResponse();
+  buildCounterCheckResponse++;
+  if (buildCounterCheckResponse < 3) {
+    o.debugString = "foo";
+    o.errorCode = buildUnnamed1286();
+    o.linked = true;
+    o.maxAge = "foo";
+  }
+  buildCounterCheckResponse--;
+  return o;
+}
+
+checkCheckResponse(api.CheckResponse o) {
+  buildCounterCheckResponse++;
+  if (buildCounterCheckResponse < 3) {
+    unittest.expect(o.debugString, unittest.equals('foo'));
+    checkUnnamed1286(o.errorCode);
+    unittest.expect(o.linked, unittest.isTrue);
+    unittest.expect(o.maxAge, unittest.equals('foo'));
+  }
+  buildCounterCheckResponse--;
+}
+
+buildUnnamed1287() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1287(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1288() {
+  var o = new core.List<api.Statement>();
+  o.add(buildStatement());
+  o.add(buildStatement());
+  return o;
+}
+
+checkUnnamed1288(core.List<api.Statement> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkStatement(o[0]);
+  checkStatement(o[1]);
+}
+
+core.int buildCounterListResponse = 0;
+buildListResponse() {
+  var o = new api.ListResponse();
+  buildCounterListResponse++;
+  if (buildCounterListResponse < 3) {
+    o.debugString = "foo";
+    o.errorCode = buildUnnamed1287();
+    o.maxAge = "foo";
+    o.statements = buildUnnamed1288();
+  }
+  buildCounterListResponse--;
+  return o;
+}
+
+checkListResponse(api.ListResponse o) {
+  buildCounterListResponse++;
+  if (buildCounterListResponse < 3) {
+    unittest.expect(o.debugString, unittest.equals('foo'));
+    checkUnnamed1287(o.errorCode);
+    unittest.expect(o.maxAge, unittest.equals('foo'));
+    checkUnnamed1288(o.statements);
+  }
+  buildCounterListResponse--;
+}
+
+core.int buildCounterStatement = 0;
+buildStatement() {
+  var o = new api.Statement();
+  buildCounterStatement++;
+  if (buildCounterStatement < 3) {
+    o.relation = "foo";
+    o.source = buildAsset();
+    o.target = buildAsset();
+  }
+  buildCounterStatement--;
+  return o;
+}
+
+checkStatement(api.Statement o) {
+  buildCounterStatement++;
+  if (buildCounterStatement < 3) {
+    unittest.expect(o.relation, unittest.equals('foo'));
+    checkAsset(o.source);
+    checkAsset(o.target);
+  }
+  buildCounterStatement--;
+}
+
+core.int buildCounterWebAsset = 0;
+buildWebAsset() {
+  var o = new api.WebAsset();
+  buildCounterWebAsset++;
+  if (buildCounterWebAsset < 3) {
+    o.site = "foo";
+  }
+  buildCounterWebAsset--;
+  return o;
+}
+
+checkWebAsset(api.WebAsset o) {
+  buildCounterWebAsset++;
+  if (buildCounterWebAsset < 3) {
+    unittest.expect(o.site, unittest.equals('foo'));
+  }
+  buildCounterWebAsset--;
+}
+
+main() {
+  unittest.group("obj-schema-AndroidAppAsset", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildAndroidAppAsset();
+      var od = new api.AndroidAppAsset.fromJson(o.toJson());
+      checkAndroidAppAsset(od);
+    });
+  });
+
+  unittest.group("obj-schema-Asset", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildAsset();
+      var od = new api.Asset.fromJson(o.toJson());
+      checkAsset(od);
+    });
+  });
+
+  unittest.group("obj-schema-CertificateInfo", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCertificateInfo();
+      var od = new api.CertificateInfo.fromJson(o.toJson());
+      checkCertificateInfo(od);
+    });
+  });
+
+  unittest.group("obj-schema-CheckResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCheckResponse();
+      var od = new api.CheckResponse.fromJson(o.toJson());
+      checkCheckResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-ListResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListResponse();
+      var od = new api.ListResponse.fromJson(o.toJson());
+      checkListResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-Statement", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildStatement();
+      var od = new api.Statement.fromJson(o.toJson());
+      checkStatement(od);
+    });
+  });
+
+  unittest.group("obj-schema-WebAsset", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildWebAsset();
+      var od = new api.WebAsset.fromJson(o.toJson());
+      checkWebAsset(od);
+    });
+  });
+
+  unittest.group("resource-AssetlinksResourceApi", () {
+    unittest.test("method--check", () {
+      var mock = new HttpServerMock();
+      api.AssetlinksResourceApi res =
+          new api.DigitalassetlinksApi(mock).assetlinks;
+      var arg_target_androidApp_packageName = "foo";
+      var arg_source_androidApp_certificate_sha256Fingerprint = "foo";
+      var arg_relation = "foo";
+      var arg_target_web_site = "foo";
+      var arg_target_androidApp_certificate_sha256Fingerprint = "foo";
+      var arg_source_web_site = "foo";
+      var arg_source_androidApp_packageName = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 19),
+            unittest.equals("v1/assetlinks:check"));
+        pathOffset += 19;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["target.androidApp.packageName"].first,
+            unittest.equals(arg_target_androidApp_packageName));
+        unittest.expect(
+            queryMap["source.androidApp.certificate.sha256Fingerprint"].first,
+            unittest
+                .equals(arg_source_androidApp_certificate_sha256Fingerprint));
+        unittest.expect(
+            queryMap["relation"].first, unittest.equals(arg_relation));
+        unittest.expect(queryMap["target.web.site"].first,
+            unittest.equals(arg_target_web_site));
+        unittest.expect(
+            queryMap["target.androidApp.certificate.sha256Fingerprint"].first,
+            unittest
+                .equals(arg_target_androidApp_certificate_sha256Fingerprint));
+        unittest.expect(queryMap["source.web.site"].first,
+            unittest.equals(arg_source_web_site));
+        unittest.expect(queryMap["source.androidApp.packageName"].first,
+            unittest.equals(arg_source_androidApp_packageName));
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildCheckResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .check(
+              target_androidApp_packageName: arg_target_androidApp_packageName,
+              source_androidApp_certificate_sha256Fingerprint:
+                  arg_source_androidApp_certificate_sha256Fingerprint,
+              relation: arg_relation,
+              target_web_site: arg_target_web_site,
+              target_androidApp_certificate_sha256Fingerprint:
+                  arg_target_androidApp_certificate_sha256Fingerprint,
+              source_web_site: arg_source_web_site,
+              source_androidApp_packageName: arg_source_androidApp_packageName,
+              $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.CheckResponse response) {
+        checkCheckResponse(response);
+      })));
+    });
+  });
+
+  unittest.group("resource-StatementsResourceApi", () {
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.StatementsResourceApi res =
+          new api.DigitalassetlinksApi(mock).statements;
+      var arg_source_androidApp_certificate_sha256Fingerprint = "foo";
+      var arg_relation = "foo";
+      var arg_source_web_site = "foo";
+      var arg_source_androidApp_packageName = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 18),
+            unittest.equals("v1/statements:list"));
+        pathOffset += 18;
+
+        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]));
+          }
+        }
+        unittest.expect(
+            queryMap["source.androidApp.certificate.sha256Fingerprint"].first,
+            unittest
+                .equals(arg_source_androidApp_certificate_sha256Fingerprint));
+        unittest.expect(
+            queryMap["relation"].first, unittest.equals(arg_relation));
+        unittest.expect(queryMap["source.web.site"].first,
+            unittest.equals(arg_source_web_site));
+        unittest.expect(queryMap["source.androidApp.packageName"].first,
+            unittest.equals(arg_source_androidApp_packageName));
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(
+              source_androidApp_certificate_sha256Fingerprint:
+                  arg_source_androidApp_certificate_sha256Fingerprint,
+              relation: arg_relation,
+              source_web_site: arg_source_web_site,
+              source_androidApp_packageName: arg_source_androidApp_packageName,
+              $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.ListResponse response) {
+        checkListResponse(response);
+      })));
+    });
+  });
+}
diff --git a/generated/googleapis/test/discovery/v1_test.dart b/generated/googleapis/test/discovery/v1_test.dart
index d648a80..337530f 100644
--- a/generated/googleapis/test/discovery/v1_test.dart
+++ b/generated/googleapis/test/discovery/v1_test.dart
@@ -71,14 +71,14 @@
   buildCounterDirectoryListItemsIcons--;
 }
 
-buildUnnamed317() {
+buildUnnamed311() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed317(core.List<core.String> o) {
+checkUnnamed311(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -96,7 +96,7 @@
     o.icons = buildDirectoryListItemsIcons();
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed317();
+    o.labels = buildUnnamed311();
     o.name = "foo";
     o.preferred = true;
     o.title = "foo";
@@ -116,7 +116,7 @@
     checkDirectoryListItemsIcons(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed317(o.labels);
+    checkUnnamed311(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.preferred, unittest.isTrue);
     unittest.expect(o.title, unittest.equals('foo'));
@@ -125,14 +125,14 @@
   buildCounterDirectoryListItems--;
 }
 
-buildUnnamed318() {
+buildUnnamed312() {
   var o = new core.List<api.DirectoryListItems>();
   o.add(buildDirectoryListItems());
   o.add(buildDirectoryListItems());
   return o;
 }
 
-checkUnnamed318(core.List<api.DirectoryListItems> o) {
+checkUnnamed312(core.List<api.DirectoryListItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectoryListItems(o[0]);
   checkDirectoryListItems(o[1]);
@@ -144,7 +144,7 @@
   buildCounterDirectoryList++;
   if (buildCounterDirectoryList < 3) {
     o.discoveryVersion = "foo";
-    o.items = buildUnnamed318();
+    o.items = buildUnnamed312();
     o.kind = "foo";
   }
   buildCounterDirectoryList--;
@@ -155,20 +155,20 @@
   buildCounterDirectoryList++;
   if (buildCounterDirectoryList < 3) {
     unittest.expect(o.discoveryVersion, unittest.equals('foo'));
-    checkUnnamed318(o.items);
+    checkUnnamed312(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDirectoryList--;
 }
 
-buildUnnamed319() {
+buildUnnamed313() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed319(core.List<core.String> o) {
+checkUnnamed313(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -179,7 +179,7 @@
   var o = new api.JsonSchemaAnnotations();
   buildCounterJsonSchemaAnnotations++;
   if (buildCounterJsonSchemaAnnotations < 3) {
-    o.required = buildUnnamed319();
+    o.required = buildUnnamed313();
   }
   buildCounterJsonSchemaAnnotations--;
   return o;
@@ -188,45 +188,45 @@
 checkJsonSchemaAnnotations(api.JsonSchemaAnnotations o) {
   buildCounterJsonSchemaAnnotations++;
   if (buildCounterJsonSchemaAnnotations < 3) {
-    checkUnnamed319(o.required);
+    checkUnnamed313(o.required);
   }
   buildCounterJsonSchemaAnnotations--;
 }
 
-buildUnnamed320() {
+buildUnnamed314() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed320(core.List<core.String> o) {
+checkUnnamed314(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed321() {
+buildUnnamed315() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed321(core.List<core.String> o) {
+checkUnnamed315(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed322() {
+buildUnnamed316() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed322(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed316(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -253,14 +253,14 @@
   buildCounterJsonSchemaVariantMap--;
 }
 
-buildUnnamed323() {
+buildUnnamed317() {
   var o = new core.List<api.JsonSchemaVariantMap>();
   o.add(buildJsonSchemaVariantMap());
   o.add(buildJsonSchemaVariantMap());
   return o;
 }
 
-checkUnnamed323(core.List<api.JsonSchemaVariantMap> o) {
+checkUnnamed317(core.List<api.JsonSchemaVariantMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchemaVariantMap(o[0]);
   checkJsonSchemaVariantMap(o[1]);
@@ -272,7 +272,7 @@
   buildCounterJsonSchemaVariant++;
   if (buildCounterJsonSchemaVariant < 3) {
     o.discriminant = "foo";
-    o.map = buildUnnamed323();
+    o.map = buildUnnamed317();
   }
   buildCounterJsonSchemaVariant--;
   return o;
@@ -282,7 +282,7 @@
   buildCounterJsonSchemaVariant++;
   if (buildCounterJsonSchemaVariant < 3) {
     unittest.expect(o.discriminant, unittest.equals('foo'));
-    checkUnnamed323(o.map);
+    checkUnnamed317(o.map);
   }
   buildCounterJsonSchemaVariant--;
 }
@@ -297,8 +297,8 @@
     o.annotations = buildJsonSchemaAnnotations();
     o.default_ = "foo";
     o.description = "foo";
-    o.enum_ = buildUnnamed320();
-    o.enumDescriptions = buildUnnamed321();
+    o.enum_ = buildUnnamed314();
+    o.enumDescriptions = buildUnnamed315();
     o.format = "foo";
     o.id = "foo";
     o.items = buildJsonSchema();
@@ -306,7 +306,7 @@
     o.maximum = "foo";
     o.minimum = "foo";
     o.pattern = "foo";
-    o.properties = buildUnnamed322();
+    o.properties = buildUnnamed316();
     o.readOnly = true;
     o.repeated = true;
     o.required = true;
@@ -325,8 +325,8 @@
     checkJsonSchemaAnnotations(o.annotations);
     unittest.expect(o.default_, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed320(o.enum_);
-    checkUnnamed321(o.enumDescriptions);
+    checkUnnamed314(o.enum_);
+    checkUnnamed315(o.enumDescriptions);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkJsonSchema(o.items);
@@ -334,7 +334,7 @@
     unittest.expect(o.maximum, unittest.equals('foo'));
     unittest.expect(o.minimum, unittest.equals('foo'));
     unittest.expect(o.pattern, unittest.equals('foo'));
-    checkUnnamed322(o.properties);
+    checkUnnamed316(o.properties);
     unittest.expect(o.readOnly, unittest.isTrue);
     unittest.expect(o.repeated, unittest.isTrue);
     unittest.expect(o.required, unittest.isTrue);
@@ -364,14 +364,14 @@
   buildCounterRestDescriptionAuthOauth2ScopesValue--;
 }
 
-buildUnnamed324() {
+buildUnnamed318() {
   var o = new core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue>();
   o["x"] = buildRestDescriptionAuthOauth2ScopesValue();
   o["y"] = buildRestDescriptionAuthOauth2ScopesValue();
   return o;
 }
 
-checkUnnamed324(
+checkUnnamed318(
     core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestDescriptionAuthOauth2ScopesValue(o["x"]);
@@ -383,7 +383,7 @@
   var o = new api.RestDescriptionAuthOauth2();
   buildCounterRestDescriptionAuthOauth2++;
   if (buildCounterRestDescriptionAuthOauth2 < 3) {
-    o.scopes = buildUnnamed324();
+    o.scopes = buildUnnamed318();
   }
   buildCounterRestDescriptionAuthOauth2--;
   return o;
@@ -392,7 +392,7 @@
 checkRestDescriptionAuthOauth2(api.RestDescriptionAuthOauth2 o) {
   buildCounterRestDescriptionAuthOauth2++;
   if (buildCounterRestDescriptionAuthOauth2 < 3) {
-    checkUnnamed324(o.scopes);
+    checkUnnamed318(o.scopes);
   }
   buildCounterRestDescriptionAuthOauth2--;
 }
@@ -416,14 +416,14 @@
   buildCounterRestDescriptionAuth--;
 }
 
-buildUnnamed325() {
+buildUnnamed319() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed325(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'));
@@ -450,66 +450,66 @@
   buildCounterRestDescriptionIcons--;
 }
 
-buildUnnamed326() {
+buildUnnamed320() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed326(core.List<core.String> o) {
+checkUnnamed320(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed327() {
+buildUnnamed321() {
   var o = new core.Map<core.String, api.RestMethod>();
   o["x"] = buildRestMethod();
   o["y"] = buildRestMethod();
   return o;
 }
 
-checkUnnamed327(core.Map<core.String, api.RestMethod> o) {
+checkUnnamed321(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestMethod(o["x"]);
   checkRestMethod(o["y"]);
 }
 
-buildUnnamed328() {
+buildUnnamed322() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed328(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed322(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
 }
 
-buildUnnamed329() {
+buildUnnamed323() {
   var o = new core.Map<core.String, api.RestResource>();
   o["x"] = buildRestResource();
   o["y"] = buildRestResource();
   return o;
 }
 
-checkUnnamed329(core.Map<core.String, api.RestResource> o) {
+checkUnnamed323(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestResource(o["x"]);
   checkRestResource(o["y"]);
 }
 
-buildUnnamed330() {
+buildUnnamed324() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed330(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed324(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -530,22 +530,22 @@
     o.documentationLink = "foo";
     o.etag = "foo";
     o.exponentialBackoffDefault = true;
-    o.features = buildUnnamed325();
+    o.features = buildUnnamed319();
     o.icons = buildRestDescriptionIcons();
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed326();
-    o.methods = buildUnnamed327();
+    o.labels = buildUnnamed320();
+    o.methods = buildUnnamed321();
     o.name = "foo";
     o.ownerDomain = "foo";
     o.ownerName = "foo";
     o.packagePath = "foo";
-    o.parameters = buildUnnamed328();
+    o.parameters = buildUnnamed322();
     o.protocol = "foo";
-    o.resources = buildUnnamed329();
+    o.resources = buildUnnamed323();
     o.revision = "foo";
     o.rootUrl = "foo";
-    o.schemas = buildUnnamed330();
+    o.schemas = buildUnnamed324();
     o.servicePath = "foo";
     o.title = "foo";
     o.version = "foo";
@@ -568,22 +568,22 @@
     unittest.expect(o.documentationLink, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.exponentialBackoffDefault, unittest.isTrue);
-    checkUnnamed325(o.features);
+    checkUnnamed319(o.features);
     checkRestDescriptionIcons(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed326(o.labels);
-    checkUnnamed327(o.methods);
+    checkUnnamed320(o.labels);
+    checkUnnamed321(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'));
-    checkUnnamed328(o.parameters);
+    checkUnnamed322(o.parameters);
     unittest.expect(o.protocol, unittest.equals('foo'));
-    checkUnnamed329(o.resources);
+    checkUnnamed323(o.resources);
     unittest.expect(o.revision, unittest.equals('foo'));
     unittest.expect(o.rootUrl, unittest.equals('foo'));
-    checkUnnamed330(o.schemas);
+    checkUnnamed324(o.schemas);
     unittest.expect(o.servicePath, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
@@ -592,14 +592,14 @@
   buildCounterRestDescription--;
 }
 
-buildUnnamed331() {
+buildUnnamed325() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed331(core.List<core.String> o) {
+checkUnnamed325(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -675,7 +675,7 @@
   var o = new api.RestMethodMediaUpload();
   buildCounterRestMethodMediaUpload++;
   if (buildCounterRestMethodMediaUpload < 3) {
-    o.accept = buildUnnamed331();
+    o.accept = buildUnnamed325();
     o.maxSize = "foo";
     o.protocols = buildRestMethodMediaUploadProtocols();
   }
@@ -686,34 +686,34 @@
 checkRestMethodMediaUpload(api.RestMethodMediaUpload o) {
   buildCounterRestMethodMediaUpload++;
   if (buildCounterRestMethodMediaUpload < 3) {
-    checkUnnamed331(o.accept);
+    checkUnnamed325(o.accept);
     unittest.expect(o.maxSize, unittest.equals('foo'));
     checkRestMethodMediaUploadProtocols(o.protocols);
   }
   buildCounterRestMethodMediaUpload--;
 }
 
-buildUnnamed332() {
+buildUnnamed326() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed332(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'));
 }
 
-buildUnnamed333() {
+buildUnnamed327() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed333(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed327(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -759,14 +759,14 @@
   buildCounterRestMethodResponse--;
 }
 
-buildUnnamed334() {
+buildUnnamed328() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed334(core.List<core.String> o) {
+checkUnnamed328(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -782,12 +782,12 @@
     o.httpMethod = "foo";
     o.id = "foo";
     o.mediaUpload = buildRestMethodMediaUpload();
-    o.parameterOrder = buildUnnamed332();
-    o.parameters = buildUnnamed333();
+    o.parameterOrder = buildUnnamed326();
+    o.parameters = buildUnnamed327();
     o.path = "foo";
     o.request = buildRestMethodRequest();
     o.response = buildRestMethodResponse();
-    o.scopes = buildUnnamed334();
+    o.scopes = buildUnnamed328();
     o.supportsMediaDownload = true;
     o.supportsMediaUpload = true;
     o.supportsSubscription = true;
@@ -805,12 +805,12 @@
     unittest.expect(o.httpMethod, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkRestMethodMediaUpload(o.mediaUpload);
-    checkUnnamed332(o.parameterOrder);
-    checkUnnamed333(o.parameters);
+    checkUnnamed326(o.parameterOrder);
+    checkUnnamed327(o.parameters);
     unittest.expect(o.path, unittest.equals('foo'));
     checkRestMethodRequest(o.request);
     checkRestMethodResponse(o.response);
-    checkUnnamed334(o.scopes);
+    checkUnnamed328(o.scopes);
     unittest.expect(o.supportsMediaDownload, unittest.isTrue);
     unittest.expect(o.supportsMediaUpload, unittest.isTrue);
     unittest.expect(o.supportsSubscription, unittest.isTrue);
@@ -819,27 +819,27 @@
   buildCounterRestMethod--;
 }
 
-buildUnnamed335() {
+buildUnnamed329() {
   var o = new core.Map<core.String, api.RestMethod>();
   o["x"] = buildRestMethod();
   o["y"] = buildRestMethod();
   return o;
 }
 
-checkUnnamed335(core.Map<core.String, api.RestMethod> o) {
+checkUnnamed329(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestMethod(o["x"]);
   checkRestMethod(o["y"]);
 }
 
-buildUnnamed336() {
+buildUnnamed330() {
   var o = new core.Map<core.String, api.RestResource>();
   o["x"] = buildRestResource();
   o["y"] = buildRestResource();
   return o;
 }
 
-checkUnnamed336(core.Map<core.String, api.RestResource> o) {
+checkUnnamed330(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestResource(o["x"]);
   checkRestResource(o["y"]);
@@ -850,8 +850,8 @@
   var o = new api.RestResource();
   buildCounterRestResource++;
   if (buildCounterRestResource < 3) {
-    o.methods = buildUnnamed335();
-    o.resources = buildUnnamed336();
+    o.methods = buildUnnamed329();
+    o.resources = buildUnnamed330();
   }
   buildCounterRestResource--;
   return o;
@@ -860,8 +860,8 @@
 checkRestResource(api.RestResource o) {
   buildCounterRestResource++;
   if (buildCounterRestResource < 3) {
-    checkUnnamed335(o.methods);
-    checkUnnamed336(o.resources);
+    checkUnnamed329(o.methods);
+    checkUnnamed330(o.resources);
   }
   buildCounterRestResource--;
 }
diff --git a/generated/googleapis/test/dns/v1_test.dart b/generated/googleapis/test/dns/v1_test.dart
index 1cf13dd..a280b4e 100644
--- a/generated/googleapis/test/dns/v1_test.dart
+++ b/generated/googleapis/test/dns/v1_test.dart
@@ -50,27 +50,27 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed836() {
+buildUnnamed841() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed836(core.List<api.ResourceRecordSet> o) {
+checkUnnamed841(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
 }
 
-buildUnnamed837() {
+buildUnnamed842() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed837(core.List<api.ResourceRecordSet> o) {
+checkUnnamed842(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
@@ -81,8 +81,8 @@
   var o = new api.Change();
   buildCounterChange++;
   if (buildCounterChange < 3) {
-    o.additions = buildUnnamed836();
-    o.deletions = buildUnnamed837();
+    o.additions = buildUnnamed841();
+    o.deletions = buildUnnamed842();
     o.id = "foo";
     o.kind = "foo";
     o.startTime = "foo";
@@ -95,8 +95,8 @@
 checkChange(api.Change o) {
   buildCounterChange++;
   if (buildCounterChange < 3) {
-    checkUnnamed836(o.additions);
-    checkUnnamed837(o.deletions);
+    checkUnnamed841(o.additions);
+    checkUnnamed842(o.deletions);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
@@ -105,14 +105,14 @@
   buildCounterChange--;
 }
 
-buildUnnamed838() {
+buildUnnamed843() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed838(core.List<api.Change> o) {
+checkUnnamed843(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -123,7 +123,7 @@
   var o = new api.ChangesListResponse();
   buildCounterChangesListResponse++;
   if (buildCounterChangesListResponse < 3) {
-    o.changes = buildUnnamed838();
+    o.changes = buildUnnamed843();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -134,21 +134,21 @@
 checkChangesListResponse(api.ChangesListResponse o) {
   buildCounterChangesListResponse++;
   if (buildCounterChangesListResponse < 3) {
-    checkUnnamed838(o.changes);
+    checkUnnamed843(o.changes);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterChangesListResponse--;
 }
 
-buildUnnamed839() {
+buildUnnamed844() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed839(core.List<core.String> o) {
+checkUnnamed844(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -166,7 +166,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.nameServerSet = "foo";
-    o.nameServers = buildUnnamed839();
+    o.nameServers = buildUnnamed844();
   }
   buildCounterManagedZone--;
   return o;
@@ -182,19 +182,19 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nameServerSet, unittest.equals('foo'));
-    checkUnnamed839(o.nameServers);
+    checkUnnamed844(o.nameServers);
   }
   buildCounterManagedZone--;
 }
 
-buildUnnamed840() {
+buildUnnamed845() {
   var o = new core.List<api.ManagedZone>();
   o.add(buildManagedZone());
   o.add(buildManagedZone());
   return o;
 }
 
-checkUnnamed840(core.List<api.ManagedZone> o) {
+checkUnnamed845(core.List<api.ManagedZone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedZone(o[0]);
   checkManagedZone(o[1]);
@@ -206,7 +206,7 @@
   buildCounterManagedZonesListResponse++;
   if (buildCounterManagedZonesListResponse < 3) {
     o.kind = "foo";
-    o.managedZones = buildUnnamed840();
+    o.managedZones = buildUnnamed845();
     o.nextPageToken = "foo";
   }
   buildCounterManagedZonesListResponse--;
@@ -217,7 +217,7 @@
   buildCounterManagedZonesListResponse++;
   if (buildCounterManagedZonesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed840(o.managedZones);
+    checkUnnamed845(o.managedZones);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterManagedZonesListResponse--;
@@ -279,14 +279,14 @@
   buildCounterQuota--;
 }
 
-buildUnnamed841() {
+buildUnnamed846() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed841(core.List<core.String> o) {
+checkUnnamed846(core.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 @@
   if (buildCounterResourceRecordSet < 3) {
     o.kind = "foo";
     o.name = "foo";
-    o.rrdatas = buildUnnamed841();
+    o.rrdatas = buildUnnamed846();
     o.ttl = 42;
     o.type = "foo";
   }
@@ -312,21 +312,21 @@
   if (buildCounterResourceRecordSet < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed841(o.rrdatas);
+    checkUnnamed846(o.rrdatas);
     unittest.expect(o.ttl, unittest.equals(42));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterResourceRecordSet--;
 }
 
-buildUnnamed842() {
+buildUnnamed847() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed842(core.List<api.ResourceRecordSet> o) {
+checkUnnamed847(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
@@ -339,7 +339,7 @@
   if (buildCounterResourceRecordSetsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.rrsets = buildUnnamed842();
+    o.rrsets = buildUnnamed847();
   }
   buildCounterResourceRecordSetsListResponse--;
   return o;
@@ -350,7 +350,7 @@
   if (buildCounterResourceRecordSetsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed842(o.rrsets);
+    checkUnnamed847(o.rrsets);
   }
   buildCounterResourceRecordSetsListResponse--;
 }
diff --git a/generated/googleapis/test/doubleclickbidmanager/v1_test.dart b/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
index 7592b0f..e8daa53 100644
--- a/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
+++ b/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1301() {
+buildUnnamed1317() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1301(core.List<core.String> o) {
+checkUnnamed1317(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -69,7 +69,7 @@
   buildCounterDownloadLineItemsRequest++;
   if (buildCounterDownloadLineItemsRequest < 3) {
     o.fileSpec = "foo";
-    o.filterIds = buildUnnamed1301();
+    o.filterIds = buildUnnamed1317();
     o.filterType = "foo";
     o.format = "foo";
   }
@@ -81,7 +81,7 @@
   buildCounterDownloadLineItemsRequest++;
   if (buildCounterDownloadLineItemsRequest < 3) {
     unittest.expect(o.fileSpec, unittest.equals('foo'));
-    checkUnnamed1301(o.filterIds);
+    checkUnnamed1317(o.filterIds);
     unittest.expect(o.filterType, unittest.equals('foo'));
     unittest.expect(o.format, unittest.equals('foo'));
   }
@@ -107,27 +107,27 @@
   buildCounterDownloadLineItemsResponse--;
 }
 
-buildUnnamed1302() {
+buildUnnamed1318() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1302(core.List<core.String> o) {
+checkUnnamed1318(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1303() {
+buildUnnamed1319() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1303(core.List<core.String> o) {
+checkUnnamed1319(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -138,8 +138,8 @@
   var o = new api.DownloadRequest();
   buildCounterDownloadRequest++;
   if (buildCounterDownloadRequest < 3) {
-    o.fileTypes = buildUnnamed1302();
-    o.filterIds = buildUnnamed1303();
+    o.fileTypes = buildUnnamed1318();
+    o.filterIds = buildUnnamed1319();
     o.filterType = "foo";
     o.version = "foo";
   }
@@ -150,8 +150,8 @@
 checkDownloadRequest(api.DownloadRequest o) {
   buildCounterDownloadRequest++;
   if (buildCounterDownloadRequest < 3) {
-    checkUnnamed1302(o.fileTypes);
-    checkUnnamed1303(o.filterIds);
+    checkUnnamed1318(o.fileTypes);
+    checkUnnamed1319(o.filterIds);
     unittest.expect(o.filterType, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
   }
@@ -204,14 +204,14 @@
   buildCounterFilterPair--;
 }
 
-buildUnnamed1304() {
+buildUnnamed1320() {
   var o = new core.List<api.Query>();
   o.add(buildQuery());
   o.add(buildQuery());
   return o;
 }
 
-checkUnnamed1304(core.List<api.Query> o) {
+checkUnnamed1320(core.List<api.Query> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuery(o[0]);
   checkQuery(o[1]);
@@ -223,7 +223,7 @@
   buildCounterListQueriesResponse++;
   if (buildCounterListQueriesResponse < 3) {
     o.kind = "foo";
-    o.queries = buildUnnamed1304();
+    o.queries = buildUnnamed1320();
   }
   buildCounterListQueriesResponse--;
   return o;
@@ -233,19 +233,19 @@
   buildCounterListQueriesResponse++;
   if (buildCounterListQueriesResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1304(o.queries);
+    checkUnnamed1320(o.queries);
   }
   buildCounterListQueriesResponse--;
 }
 
-buildUnnamed1305() {
+buildUnnamed1321() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed1305(core.List<api.Report> o) {
+checkUnnamed1321(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -257,7 +257,7 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     o.kind = "foo";
-    o.reports = buildUnnamed1305();
+    o.reports = buildUnnamed1321();
   }
   buildCounterListReportsResponse--;
   return o;
@@ -267,45 +267,45 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1305(o.reports);
+    checkUnnamed1321(o.reports);
   }
   buildCounterListReportsResponse--;
 }
 
-buildUnnamed1306() {
+buildUnnamed1322() {
   var o = new core.List<api.FilterPair>();
   o.add(buildFilterPair());
   o.add(buildFilterPair());
   return o;
 }
 
-checkUnnamed1306(core.List<api.FilterPair> o) {
+checkUnnamed1322(core.List<api.FilterPair> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilterPair(o[0]);
   checkFilterPair(o[1]);
 }
 
-buildUnnamed1307() {
+buildUnnamed1323() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1307(core.List<core.String> o) {
+checkUnnamed1323(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1308() {
+buildUnnamed1324() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1308(core.List<core.String> o) {
+checkUnnamed1324(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -316,10 +316,10 @@
   var o = new api.Parameters();
   buildCounterParameters++;
   if (buildCounterParameters < 3) {
-    o.filters = buildUnnamed1306();
-    o.groupBys = buildUnnamed1307();
+    o.filters = buildUnnamed1322();
+    o.groupBys = buildUnnamed1323();
     o.includeInviteData = true;
-    o.metrics = buildUnnamed1308();
+    o.metrics = buildUnnamed1324();
     o.type = "foo";
   }
   buildCounterParameters--;
@@ -329,10 +329,10 @@
 checkParameters(api.Parameters o) {
   buildCounterParameters++;
   if (buildCounterParameters < 3) {
-    checkUnnamed1306(o.filters);
-    checkUnnamed1307(o.groupBys);
+    checkUnnamed1322(o.filters);
+    checkUnnamed1323(o.groupBys);
     unittest.expect(o.includeInviteData, unittest.isTrue);
-    checkUnnamed1308(o.metrics);
+    checkUnnamed1324(o.metrics);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterParameters--;
@@ -371,14 +371,14 @@
   buildCounterQuery--;
 }
 
-buildUnnamed1309() {
+buildUnnamed1325() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1309(core.List<core.String> o) {
+checkUnnamed1325(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -398,7 +398,7 @@
     o.reportCount = 42;
     o.running = true;
     o.sendNotification = true;
-    o.shareEmailAddress = buildUnnamed1309();
+    o.shareEmailAddress = buildUnnamed1325();
     o.title = "foo";
   }
   buildCounterQueryMetadata--;
@@ -418,7 +418,7 @@
     unittest.expect(o.reportCount, unittest.equals(42));
     unittest.expect(o.running, unittest.isTrue);
     unittest.expect(o.sendNotification, unittest.isTrue);
-    checkUnnamed1309(o.shareEmailAddress);
+    checkUnnamed1325(o.shareEmailAddress);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterQueryMetadata--;
@@ -562,14 +562,14 @@
   buildCounterReportStatus--;
 }
 
-buildUnnamed1310() {
+buildUnnamed1326() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1310(core.List<core.String> o) {
+checkUnnamed1326(core.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,7 +583,7 @@
     o.changed = true;
     o.entityId = "foo";
     o.entityName = "foo";
-    o.errors = buildUnnamed1310();
+    o.errors = buildUnnamed1326();
     o.persisted = true;
     o.rowNumber = 42;
   }
@@ -597,7 +597,7 @@
     unittest.expect(o.changed, unittest.isTrue);
     unittest.expect(o.entityId, unittest.equals('foo'));
     unittest.expect(o.entityName, unittest.equals('foo'));
-    checkUnnamed1310(o.errors);
+    checkUnnamed1326(o.errors);
     unittest.expect(o.persisted, unittest.isTrue);
     unittest.expect(o.rowNumber, unittest.equals(42));
   }
@@ -671,27 +671,27 @@
   buildCounterUploadLineItemsResponse--;
 }
 
-buildUnnamed1311() {
+buildUnnamed1327() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1311(core.List<core.String> o) {
+checkUnnamed1327(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1312() {
+buildUnnamed1328() {
   var o = new core.List<api.RowStatus>();
   o.add(buildRowStatus());
   o.add(buildRowStatus());
   return o;
 }
 
-checkUnnamed1312(core.List<api.RowStatus> o) {
+checkUnnamed1328(core.List<api.RowStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRowStatus(o[0]);
   checkRowStatus(o[1]);
@@ -702,8 +702,8 @@
   var o = new api.UploadStatus();
   buildCounterUploadStatus++;
   if (buildCounterUploadStatus < 3) {
-    o.errors = buildUnnamed1311();
-    o.rowStatus = buildUnnamed1312();
+    o.errors = buildUnnamed1327();
+    o.rowStatus = buildUnnamed1328();
   }
   buildCounterUploadStatus--;
   return o;
@@ -712,8 +712,8 @@
 checkUploadStatus(api.UploadStatus o) {
   buildCounterUploadStatus++;
   if (buildCounterUploadStatus < 3) {
-    checkUnnamed1311(o.errors);
-    checkUnnamed1312(o.rowStatus);
+    checkUnnamed1327(o.errors);
+    checkUnnamed1328(o.rowStatus);
   }
   buildCounterUploadStatus--;
 }
diff --git a/generated/googleapis/test/doubleclicksearch/v2_test.dart b/generated/googleapis/test/doubleclicksearch/v2_test.dart
index 5268756..69eedab 100644
--- a/generated/googleapis/test/doubleclicksearch/v2_test.dart
+++ b/generated/googleapis/test/doubleclicksearch/v2_test.dart
@@ -79,27 +79,27 @@
   buildCounterAvailability--;
 }
 
-buildUnnamed1485() {
+buildUnnamed1502() {
   var o = new core.List<api.CustomDimension>();
   o.add(buildCustomDimension());
   o.add(buildCustomDimension());
   return o;
 }
 
-checkUnnamed1485(core.List<api.CustomDimension> o) {
+checkUnnamed1502(core.List<api.CustomDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDimension(o[0]);
   checkCustomDimension(o[1]);
 }
 
-buildUnnamed1486() {
+buildUnnamed1503() {
   var o = new core.List<api.CustomMetric>();
   o.add(buildCustomMetric());
   o.add(buildCustomMetric());
   return o;
 }
 
-checkUnnamed1486(core.List<api.CustomMetric> o) {
+checkUnnamed1503(core.List<api.CustomMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomMetric(o[0]);
   checkCustomMetric(o[1]);
@@ -124,8 +124,8 @@
     o.countMillis = "foo";
     o.criterionId = "foo";
     o.currencyCode = "foo";
-    o.customDimension = buildUnnamed1485();
-    o.customMetric = buildUnnamed1486();
+    o.customDimension = buildUnnamed1502();
+    o.customMetric = buildUnnamed1503();
     o.deviceType = "foo";
     o.dsConversionId = "foo";
     o.engineAccountId = "foo";
@@ -165,8 +165,8 @@
     unittest.expect(o.countMillis, unittest.equals('foo'));
     unittest.expect(o.criterionId, unittest.equals('foo'));
     unittest.expect(o.currencyCode, unittest.equals('foo'));
-    checkUnnamed1485(o.customDimension);
-    checkUnnamed1486(o.customMetric);
+    checkUnnamed1502(o.customDimension);
+    checkUnnamed1503(o.customMetric);
     unittest.expect(o.deviceType, unittest.equals('foo'));
     unittest.expect(o.dsConversionId, unittest.equals('foo'));
     unittest.expect(o.engineAccountId, unittest.equals('foo'));
@@ -188,14 +188,14 @@
   buildCounterConversion--;
 }
 
-buildUnnamed1487() {
+buildUnnamed1504() {
   var o = new core.List<api.Conversion>();
   o.add(buildConversion());
   o.add(buildConversion());
   return o;
 }
 
-checkUnnamed1487(core.List<api.Conversion> o) {
+checkUnnamed1504(core.List<api.Conversion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversion(o[0]);
   checkConversion(o[1]);
@@ -206,7 +206,7 @@
   var o = new api.ConversionList();
   buildCounterConversionList++;
   if (buildCounterConversionList < 3) {
-    o.conversion = buildUnnamed1487();
+    o.conversion = buildUnnamed1504();
     o.kind = "foo";
   }
   buildCounterConversionList--;
@@ -216,7 +216,7 @@
 checkConversionList(api.ConversionList o) {
   buildCounterConversionList++;
   if (buildCounterConversionList < 3) {
-    checkUnnamed1487(o.conversion);
+    checkUnnamed1504(o.conversion);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionList--;
@@ -285,27 +285,27 @@
   buildCounterReportFiles--;
 }
 
-buildUnnamed1488() {
+buildUnnamed1505() {
   var o = new core.List<api.ReportFiles>();
   o.add(buildReportFiles());
   o.add(buildReportFiles());
   return o;
 }
 
-checkUnnamed1488(core.List<api.ReportFiles> o) {
+checkUnnamed1505(core.List<api.ReportFiles> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportFiles(o[0]);
   checkReportFiles(o[1]);
 }
 
-buildUnnamed1489() {
+buildUnnamed1506() {
   var o = new core.List<api.ReportRow>();
   o.add(buildReportRow());
   o.add(buildReportRow());
   return o;
 }
 
-checkUnnamed1489(core.List<api.ReportRow> o) {
+checkUnnamed1506(core.List<api.ReportRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRow(o[0]);
   checkReportRow(o[1]);
@@ -316,13 +316,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.files = buildUnnamed1488();
+    o.files = buildUnnamed1505();
     o.id = "foo";
     o.isReportReady = true;
     o.kind = "foo";
     o.request = buildReportRequest();
     o.rowCount = 42;
-    o.rows = buildUnnamed1489();
+    o.rows = buildUnnamed1506();
     o.statisticsCurrencyCode = "foo";
     o.statisticsTimeZone = "foo";
   }
@@ -333,13 +333,13 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed1488(o.files);
+    checkUnnamed1505(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));
-    checkUnnamed1489(o.rows);
+    checkUnnamed1506(o.rows);
     unittest.expect(o.statisticsCurrencyCode, unittest.equals('foo'));
     unittest.expect(o.statisticsTimeZone, unittest.equals('foo'));
   }
@@ -383,20 +383,20 @@
   buildCounterReportApiColumnSpec--;
 }
 
-buildUnnamed1490() {
+buildUnnamed1507() {
   var o = new core.List<api.ReportApiColumnSpec>();
   o.add(buildReportApiColumnSpec());
   o.add(buildReportApiColumnSpec());
   return o;
 }
 
-checkUnnamed1490(core.List<api.ReportApiColumnSpec> o) {
+checkUnnamed1507(core.List<api.ReportApiColumnSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportApiColumnSpec(o[0]);
   checkReportApiColumnSpec(o[1]);
 }
 
-buildUnnamed1491() {
+buildUnnamed1508() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -411,7 +411,7 @@
   return o;
 }
 
-checkUnnamed1491(core.List<core.Object> o) {
+checkUnnamed1508(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map;
   unittest.expect(casted1, unittest.hasLength(3));
@@ -432,7 +432,7 @@
   if (buildCounterReportRequestFilters < 3) {
     o.column = buildReportApiColumnSpec();
     o.operator = "foo";
-    o.values = buildUnnamed1491();
+    o.values = buildUnnamed1508();
   }
   buildCounterReportRequestFilters--;
   return o;
@@ -443,19 +443,19 @@
   if (buildCounterReportRequestFilters < 3) {
     checkReportApiColumnSpec(o.column);
     unittest.expect(o.operator, unittest.equals('foo'));
-    checkUnnamed1491(o.values);
+    checkUnnamed1508(o.values);
   }
   buildCounterReportRequestFilters--;
 }
 
-buildUnnamed1492() {
+buildUnnamed1509() {
   var o = new core.List<api.ReportRequestFilters>();
   o.add(buildReportRequestFilters());
   o.add(buildReportRequestFilters());
   return o;
 }
 
-checkUnnamed1492(core.List<api.ReportRequestFilters> o) {
+checkUnnamed1509(core.List<api.ReportRequestFilters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequestFilters(o[0]);
   checkReportRequestFilters(o[1]);
@@ -482,14 +482,14 @@
   buildCounterReportRequestOrderBy--;
 }
 
-buildUnnamed1493() {
+buildUnnamed1510() {
   var o = new core.List<api.ReportRequestOrderBy>();
   o.add(buildReportRequestOrderBy());
   o.add(buildReportRequestOrderBy());
   return o;
 }
 
-checkUnnamed1493(core.List<api.ReportRequestOrderBy> o) {
+checkUnnamed1510(core.List<api.ReportRequestOrderBy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequestOrderBy(o[0]);
   checkReportRequestOrderBy(o[1]);
@@ -559,13 +559,13 @@
   var o = new api.ReportRequest();
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    o.columns = buildUnnamed1490();
+    o.columns = buildUnnamed1507();
     o.downloadFormat = "foo";
-    o.filters = buildUnnamed1492();
+    o.filters = buildUnnamed1509();
     o.includeDeletedEntities = true;
     o.includeRemovedEntities = true;
     o.maxRowsPerFile = 42;
-    o.orderBy = buildUnnamed1493();
+    o.orderBy = buildUnnamed1510();
     o.reportScope = buildReportRequestReportScope();
     o.reportType = "foo";
     o.rowCount = 42;
@@ -581,13 +581,13 @@
 checkReportRequest(api.ReportRequest o) {
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    checkUnnamed1490(o.columns);
+    checkUnnamed1507(o.columns);
     unittest.expect(o.downloadFormat, unittest.equals('foo'));
-    checkUnnamed1492(o.filters);
+    checkUnnamed1509(o.filters);
     unittest.expect(o.includeDeletedEntities, unittest.isTrue);
     unittest.expect(o.includeRemovedEntities, unittest.isTrue);
     unittest.expect(o.maxRowsPerFile, unittest.equals(42));
-    checkUnnamed1493(o.orderBy);
+    checkUnnamed1510(o.orderBy);
     checkReportRequestReportScope(o.reportScope);
     unittest.expect(o.reportType, unittest.equals('foo'));
     unittest.expect(o.rowCount, unittest.equals(42));
@@ -651,14 +651,14 @@
   buildCounterSavedColumn--;
 }
 
-buildUnnamed1494() {
+buildUnnamed1511() {
   var o = new core.List<api.SavedColumn>();
   o.add(buildSavedColumn());
   o.add(buildSavedColumn());
   return o;
 }
 
-checkUnnamed1494(core.List<api.SavedColumn> o) {
+checkUnnamed1511(core.List<api.SavedColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedColumn(o[0]);
   checkSavedColumn(o[1]);
@@ -669,7 +669,7 @@
   var o = new api.SavedColumnList();
   buildCounterSavedColumnList++;
   if (buildCounterSavedColumnList < 3) {
-    o.items = buildUnnamed1494();
+    o.items = buildUnnamed1511();
     o.kind = "foo";
   }
   buildCounterSavedColumnList--;
@@ -679,20 +679,20 @@
 checkSavedColumnList(api.SavedColumnList o) {
   buildCounterSavedColumnList++;
   if (buildCounterSavedColumnList < 3) {
-    checkUnnamed1494(o.items);
+    checkUnnamed1511(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSavedColumnList--;
 }
 
-buildUnnamed1495() {
+buildUnnamed1512() {
   var o = new core.List<api.Availability>();
   o.add(buildAvailability());
   o.add(buildAvailability());
   return o;
 }
 
-checkUnnamed1495(core.List<api.Availability> o) {
+checkUnnamed1512(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAvailability(o[0]);
   checkAvailability(o[1]);
@@ -703,7 +703,7 @@
   var o = new api.UpdateAvailabilityRequest();
   buildCounterUpdateAvailabilityRequest++;
   if (buildCounterUpdateAvailabilityRequest < 3) {
-    o.availabilities = buildUnnamed1495();
+    o.availabilities = buildUnnamed1512();
   }
   buildCounterUpdateAvailabilityRequest--;
   return o;
@@ -712,19 +712,19 @@
 checkUpdateAvailabilityRequest(api.UpdateAvailabilityRequest o) {
   buildCounterUpdateAvailabilityRequest++;
   if (buildCounterUpdateAvailabilityRequest < 3) {
-    checkUnnamed1495(o.availabilities);
+    checkUnnamed1512(o.availabilities);
   }
   buildCounterUpdateAvailabilityRequest--;
 }
 
-buildUnnamed1496() {
+buildUnnamed1513() {
   var o = new core.List<api.Availability>();
   o.add(buildAvailability());
   o.add(buildAvailability());
   return o;
 }
 
-checkUnnamed1496(core.List<api.Availability> o) {
+checkUnnamed1513(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAvailability(o[0]);
   checkAvailability(o[1]);
@@ -735,7 +735,7 @@
   var o = new api.UpdateAvailabilityResponse();
   buildCounterUpdateAvailabilityResponse++;
   if (buildCounterUpdateAvailabilityResponse < 3) {
-    o.availabilities = buildUnnamed1496();
+    o.availabilities = buildUnnamed1513();
   }
   buildCounterUpdateAvailabilityResponse--;
   return o;
@@ -744,7 +744,7 @@
 checkUpdateAvailabilityResponse(api.UpdateAvailabilityResponse o) {
   buildCounterUpdateAvailabilityResponse++;
   if (buildCounterUpdateAvailabilityResponse < 3) {
-    checkUnnamed1496(o.availabilities);
+    checkUnnamed1513(o.availabilities);
   }
   buildCounterUpdateAvailabilityResponse--;
 }
diff --git a/generated/googleapis/test/drive/v2_test.dart b/generated/googleapis/test/drive/v2_test.dart
index 24f4075..af220a4 100644
--- a/generated/googleapis/test/drive/v2_test.dart
+++ b/generated/googleapis/test/drive/v2_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed735() {
+buildUnnamed739() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed735(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'));
@@ -68,7 +68,7 @@
   var o = new api.AboutAdditionalRoleInfoRoleSets();
   buildCounterAboutAdditionalRoleInfoRoleSets++;
   if (buildCounterAboutAdditionalRoleInfoRoleSets < 3) {
-    o.additionalRoles = buildUnnamed735();
+    o.additionalRoles = buildUnnamed739();
     o.primaryRole = "foo";
   }
   buildCounterAboutAdditionalRoleInfoRoleSets--;
@@ -78,20 +78,20 @@
 checkAboutAdditionalRoleInfoRoleSets(api.AboutAdditionalRoleInfoRoleSets o) {
   buildCounterAboutAdditionalRoleInfoRoleSets++;
   if (buildCounterAboutAdditionalRoleInfoRoleSets < 3) {
-    checkUnnamed735(o.additionalRoles);
+    checkUnnamed739(o.additionalRoles);
     unittest.expect(o.primaryRole, unittest.equals('foo'));
   }
   buildCounterAboutAdditionalRoleInfoRoleSets--;
 }
 
-buildUnnamed736() {
+buildUnnamed740() {
   var o = new core.List<api.AboutAdditionalRoleInfoRoleSets>();
   o.add(buildAboutAdditionalRoleInfoRoleSets());
   o.add(buildAboutAdditionalRoleInfoRoleSets());
   return o;
 }
 
-checkUnnamed736(core.List<api.AboutAdditionalRoleInfoRoleSets> o) {
+checkUnnamed740(core.List<api.AboutAdditionalRoleInfoRoleSets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutAdditionalRoleInfoRoleSets(o[0]);
   checkAboutAdditionalRoleInfoRoleSets(o[1]);
@@ -102,7 +102,7 @@
   var o = new api.AboutAdditionalRoleInfo();
   buildCounterAboutAdditionalRoleInfo++;
   if (buildCounterAboutAdditionalRoleInfo < 3) {
-    o.roleSets = buildUnnamed736();
+    o.roleSets = buildUnnamed740();
     o.type = "foo";
   }
   buildCounterAboutAdditionalRoleInfo--;
@@ -112,33 +112,33 @@
 checkAboutAdditionalRoleInfo(api.AboutAdditionalRoleInfo o) {
   buildCounterAboutAdditionalRoleInfo++;
   if (buildCounterAboutAdditionalRoleInfo < 3) {
-    checkUnnamed736(o.roleSets);
+    checkUnnamed740(o.roleSets);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterAboutAdditionalRoleInfo--;
 }
 
-buildUnnamed737() {
+buildUnnamed741() {
   var o = new core.List<api.AboutAdditionalRoleInfo>();
   o.add(buildAboutAdditionalRoleInfo());
   o.add(buildAboutAdditionalRoleInfo());
   return o;
 }
 
-checkUnnamed737(core.List<api.AboutAdditionalRoleInfo> o) {
+checkUnnamed741(core.List<api.AboutAdditionalRoleInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutAdditionalRoleInfo(o[0]);
   checkAboutAdditionalRoleInfo(o[1]);
 }
 
-buildUnnamed738() {
+buildUnnamed742() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed738(core.List<core.String> o) {
+checkUnnamed742(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -150,7 +150,7 @@
   buildCounterAboutExportFormats++;
   if (buildCounterAboutExportFormats < 3) {
     o.source = "foo";
-    o.targets = buildUnnamed738();
+    o.targets = buildUnnamed742();
   }
   buildCounterAboutExportFormats--;
   return o;
@@ -160,19 +160,19 @@
   buildCounterAboutExportFormats++;
   if (buildCounterAboutExportFormats < 3) {
     unittest.expect(o.source, unittest.equals('foo'));
-    checkUnnamed738(o.targets);
+    checkUnnamed742(o.targets);
   }
   buildCounterAboutExportFormats--;
 }
 
-buildUnnamed739() {
+buildUnnamed743() {
   var o = new core.List<api.AboutExportFormats>();
   o.add(buildAboutExportFormats());
   o.add(buildAboutExportFormats());
   return o;
 }
 
-checkUnnamed739(core.List<api.AboutExportFormats> o) {
+checkUnnamed743(core.List<api.AboutExportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutExportFormats(o[0]);
   checkAboutExportFormats(o[1]);
@@ -199,40 +199,40 @@
   buildCounterAboutFeatures--;
 }
 
-buildUnnamed740() {
+buildUnnamed744() {
   var o = new core.List<api.AboutFeatures>();
   o.add(buildAboutFeatures());
   o.add(buildAboutFeatures());
   return o;
 }
 
-checkUnnamed740(core.List<api.AboutFeatures> o) {
+checkUnnamed744(core.List<api.AboutFeatures> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutFeatures(o[0]);
   checkAboutFeatures(o[1]);
 }
 
-buildUnnamed741() {
+buildUnnamed745() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed741(core.List<core.String> o) {
+checkUnnamed745(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed742() {
+buildUnnamed746() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed742(core.List<core.String> o) {
+checkUnnamed746(core.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 @@
   buildCounterAboutImportFormats++;
   if (buildCounterAboutImportFormats < 3) {
     o.source = "foo";
-    o.targets = buildUnnamed742();
+    o.targets = buildUnnamed746();
   }
   buildCounterAboutImportFormats--;
   return o;
@@ -254,19 +254,19 @@
   buildCounterAboutImportFormats++;
   if (buildCounterAboutImportFormats < 3) {
     unittest.expect(o.source, unittest.equals('foo'));
-    checkUnnamed742(o.targets);
+    checkUnnamed746(o.targets);
   }
   buildCounterAboutImportFormats--;
 }
 
-buildUnnamed743() {
+buildUnnamed747() {
   var o = new core.List<api.AboutImportFormats>();
   o.add(buildAboutImportFormats());
   o.add(buildAboutImportFormats());
   return o;
 }
 
-checkUnnamed743(core.List<api.AboutImportFormats> o) {
+checkUnnamed747(core.List<api.AboutImportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutImportFormats(o[0]);
   checkAboutImportFormats(o[1]);
@@ -293,14 +293,14 @@
   buildCounterAboutMaxUploadSizes--;
 }
 
-buildUnnamed744() {
+buildUnnamed748() {
   var o = new core.List<api.AboutMaxUploadSizes>();
   o.add(buildAboutMaxUploadSizes());
   o.add(buildAboutMaxUploadSizes());
   return o;
 }
 
-checkUnnamed744(core.List<api.AboutMaxUploadSizes> o) {
+checkUnnamed748(core.List<api.AboutMaxUploadSizes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutMaxUploadSizes(o[0]);
   checkAboutMaxUploadSizes(o[1]);
@@ -327,14 +327,14 @@
   buildCounterAboutQuotaBytesByService--;
 }
 
-buildUnnamed745() {
+buildUnnamed749() {
   var o = new core.List<api.AboutQuotaBytesByService>();
   o.add(buildAboutQuotaBytesByService());
   o.add(buildAboutQuotaBytesByService());
   return o;
 }
 
-checkUnnamed745(core.List<api.AboutQuotaBytesByService> o) {
+checkUnnamed749(core.List<api.AboutQuotaBytesByService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutQuotaBytesByService(o[0]);
   checkAboutQuotaBytesByService(o[1]);
@@ -363,14 +363,14 @@
   buildCounterAboutTeamDriveThemes--;
 }
 
-buildUnnamed746() {
+buildUnnamed750() {
   var o = new core.List<api.AboutTeamDriveThemes>();
   o.add(buildAboutTeamDriveThemes());
   o.add(buildAboutTeamDriveThemes());
   return o;
 }
 
-checkUnnamed746(core.List<api.AboutTeamDriveThemes> o) {
+checkUnnamed750(core.List<api.AboutTeamDriveThemes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutTeamDriveThemes(o[0]);
   checkAboutTeamDriveThemes(o[1]);
@@ -381,21 +381,21 @@
   var o = new api.About();
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
-    o.additionalRoleInfo = buildUnnamed737();
+    o.additionalRoleInfo = buildUnnamed741();
     o.domainSharingPolicy = "foo";
     o.etag = "foo";
-    o.exportFormats = buildUnnamed739();
-    o.features = buildUnnamed740();
-    o.folderColorPalette = buildUnnamed741();
-    o.importFormats = buildUnnamed743();
+    o.exportFormats = buildUnnamed743();
+    o.features = buildUnnamed744();
+    o.folderColorPalette = buildUnnamed745();
+    o.importFormats = buildUnnamed747();
     o.isCurrentAppInstalled = true;
     o.kind = "foo";
     o.languageCode = "foo";
     o.largestChangeId = "foo";
-    o.maxUploadSizes = buildUnnamed744();
+    o.maxUploadSizes = buildUnnamed748();
     o.name = "foo";
     o.permissionId = "foo";
-    o.quotaBytesByService = buildUnnamed745();
+    o.quotaBytesByService = buildUnnamed749();
     o.quotaBytesTotal = "foo";
     o.quotaBytesUsed = "foo";
     o.quotaBytesUsedAggregate = "foo";
@@ -404,7 +404,7 @@
     o.remainingChangeIds = "foo";
     o.rootFolderId = "foo";
     o.selfLink = "foo";
-    o.teamDriveThemes = buildUnnamed746();
+    o.teamDriveThemes = buildUnnamed750();
     o.user = buildUser();
   }
   buildCounterAbout--;
@@ -414,21 +414,21 @@
 checkAbout(api.About o) {
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
-    checkUnnamed737(o.additionalRoleInfo);
+    checkUnnamed741(o.additionalRoleInfo);
     unittest.expect(o.domainSharingPolicy, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed739(o.exportFormats);
-    checkUnnamed740(o.features);
-    checkUnnamed741(o.folderColorPalette);
-    checkUnnamed743(o.importFormats);
+    checkUnnamed743(o.exportFormats);
+    checkUnnamed744(o.features);
+    checkUnnamed745(o.folderColorPalette);
+    checkUnnamed747(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'));
-    checkUnnamed744(o.maxUploadSizes);
+    checkUnnamed748(o.maxUploadSizes);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.permissionId, unittest.equals('foo'));
-    checkUnnamed745(o.quotaBytesByService);
+    checkUnnamed749(o.quotaBytesByService);
     unittest.expect(o.quotaBytesTotal, unittest.equals('foo'));
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.quotaBytesUsedAggregate, unittest.equals('foo'));
@@ -437,7 +437,7 @@
     unittest.expect(o.remainingChangeIds, unittest.equals('foo'));
     unittest.expect(o.rootFolderId, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed746(o.teamDriveThemes);
+    checkUnnamed750(o.teamDriveThemes);
     checkUser(o.user);
   }
   buildCounterAbout--;
@@ -466,66 +466,66 @@
   buildCounterAppIcons--;
 }
 
-buildUnnamed747() {
+buildUnnamed751() {
   var o = new core.List<api.AppIcons>();
   o.add(buildAppIcons());
   o.add(buildAppIcons());
   return o;
 }
 
-checkUnnamed747(core.List<api.AppIcons> o) {
+checkUnnamed751(core.List<api.AppIcons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAppIcons(o[0]);
   checkAppIcons(o[1]);
 }
 
-buildUnnamed748() {
+buildUnnamed752() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed748(core.List<core.String> o) {
+checkUnnamed752(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed749() {
+buildUnnamed753() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed749(core.List<core.String> o) {
+checkUnnamed753(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed750() {
+buildUnnamed754() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed750(core.List<core.String> o) {
+checkUnnamed754(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed751() {
+buildUnnamed755() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed751(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'));
@@ -540,7 +540,7 @@
     o.createInFolderTemplate = "foo";
     o.createUrl = "foo";
     o.hasDriveWideScope = true;
-    o.icons = buildUnnamed747();
+    o.icons = buildUnnamed751();
     o.id = "foo";
     o.installed = true;
     o.kind = "foo";
@@ -548,12 +548,12 @@
     o.name = "foo";
     o.objectType = "foo";
     o.openUrlTemplate = "foo";
-    o.primaryFileExtensions = buildUnnamed748();
-    o.primaryMimeTypes = buildUnnamed749();
+    o.primaryFileExtensions = buildUnnamed752();
+    o.primaryMimeTypes = buildUnnamed753();
     o.productId = "foo";
     o.productUrl = "foo";
-    o.secondaryFileExtensions = buildUnnamed750();
-    o.secondaryMimeTypes = buildUnnamed751();
+    o.secondaryFileExtensions = buildUnnamed754();
+    o.secondaryMimeTypes = buildUnnamed755();
     o.shortDescription = "foo";
     o.supportsCreate = true;
     o.supportsImport = true;
@@ -572,7 +572,7 @@
     unittest.expect(o.createInFolderTemplate, unittest.equals('foo'));
     unittest.expect(o.createUrl, unittest.equals('foo'));
     unittest.expect(o.hasDriveWideScope, unittest.isTrue);
-    checkUnnamed747(o.icons);
+    checkUnnamed751(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.installed, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -580,12 +580,12 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.openUrlTemplate, unittest.equals('foo'));
-    checkUnnamed748(o.primaryFileExtensions);
-    checkUnnamed749(o.primaryMimeTypes);
+    checkUnnamed752(o.primaryFileExtensions);
+    checkUnnamed753(o.primaryMimeTypes);
     unittest.expect(o.productId, unittest.equals('foo'));
     unittest.expect(o.productUrl, unittest.equals('foo'));
-    checkUnnamed750(o.secondaryFileExtensions);
-    checkUnnamed751(o.secondaryMimeTypes);
+    checkUnnamed754(o.secondaryFileExtensions);
+    checkUnnamed755(o.secondaryMimeTypes);
     unittest.expect(o.shortDescription, unittest.equals('foo'));
     unittest.expect(o.supportsCreate, unittest.isTrue);
     unittest.expect(o.supportsImport, unittest.isTrue);
@@ -596,27 +596,27 @@
   buildCounterApp--;
 }
 
-buildUnnamed752() {
+buildUnnamed756() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed752(core.List<core.String> o) {
+checkUnnamed756(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed753() {
+buildUnnamed757() {
   var o = new core.List<api.App>();
   o.add(buildApp());
   o.add(buildApp());
   return o;
 }
 
-checkUnnamed753(core.List<api.App> o) {
+checkUnnamed757(core.List<api.App> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApp(o[0]);
   checkApp(o[1]);
@@ -627,9 +627,9 @@
   var o = new api.AppList();
   buildCounterAppList++;
   if (buildCounterAppList < 3) {
-    o.defaultAppIds = buildUnnamed752();
+    o.defaultAppIds = buildUnnamed756();
     o.etag = "foo";
-    o.items = buildUnnamed753();
+    o.items = buildUnnamed757();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -640,9 +640,9 @@
 checkAppList(api.AppList o) {
   buildCounterAppList++;
   if (buildCounterAppList < 3) {
-    checkUnnamed752(o.defaultAppIds);
+    checkUnnamed756(o.defaultAppIds);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed753(o.items);
+    checkUnnamed757(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -687,14 +687,14 @@
   buildCounterChange--;
 }
 
-buildUnnamed754() {
+buildUnnamed758() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed754(core.List<api.Change> o) {
+checkUnnamed758(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -706,7 +706,7 @@
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed754();
+    o.items = buildUnnamed758();
     o.kind = "foo";
     o.largestChangeId = "foo";
     o.newStartPageToken = "foo";
@@ -722,7 +722,7 @@
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed754(o.items);
+    checkUnnamed758(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.largestChangeId, unittest.equals('foo'));
     unittest.expect(o.newStartPageToken, unittest.equals('foo'));
@@ -733,14 +733,14 @@
   buildCounterChangeList--;
 }
 
-buildUnnamed755() {
+buildUnnamed759() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed755(core.Map<core.String, core.String> o) {
+checkUnnamed759(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'));
@@ -755,7 +755,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed755();
+    o.params = buildUnnamed759();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -773,7 +773,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed755(o.params);
+    checkUnnamed759(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -783,14 +783,14 @@
   buildCounterChannel--;
 }
 
-buildUnnamed756() {
+buildUnnamed760() {
   var o = new core.List<api.ChildReference>();
   o.add(buildChildReference());
   o.add(buildChildReference());
   return o;
 }
 
-checkUnnamed756(core.List<api.ChildReference> o) {
+checkUnnamed760(core.List<api.ChildReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChildReference(o[0]);
   checkChildReference(o[1]);
@@ -802,7 +802,7 @@
   buildCounterChildList++;
   if (buildCounterChildList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed756();
+    o.items = buildUnnamed760();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -816,7 +816,7 @@
   buildCounterChildList++;
   if (buildCounterChildList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed756(o.items);
+    checkUnnamed760(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -871,14 +871,14 @@
   buildCounterCommentContext--;
 }
 
-buildUnnamed757() {
+buildUnnamed761() {
   var o = new core.List<api.CommentReply>();
   o.add(buildCommentReply());
   o.add(buildCommentReply());
   return o;
 }
 
-checkUnnamed757(core.List<api.CommentReply> o) {
+checkUnnamed761(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentReply(o[0]);
   checkCommentReply(o[1]);
@@ -901,7 +901,7 @@
     o.htmlContent = "foo";
     o.kind = "foo";
     o.modifiedDate = core.DateTime.parse("2002-02-27T14:01:02");
-    o.replies = buildUnnamed757();
+    o.replies = buildUnnamed761();
     o.selfLink = "foo";
     o.status = "foo";
   }
@@ -926,21 +926,21 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.modifiedDate,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed757(o.replies);
+    checkUnnamed761(o.replies);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterComment--;
 }
 
-buildUnnamed758() {
+buildUnnamed762() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed758(core.List<api.Comment> o) {
+checkUnnamed762(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -951,7 +951,7 @@
   var o = new api.CommentList();
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    o.items = buildUnnamed758();
+    o.items = buildUnnamed762();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -964,7 +964,7 @@
 checkCommentList(api.CommentList o) {
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    checkUnnamed758(o.items);
+    checkUnnamed762(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1010,14 +1010,14 @@
   buildCounterCommentReply--;
 }
 
-buildUnnamed759() {
+buildUnnamed763() {
   var o = new core.List<api.CommentReply>();
   o.add(buildCommentReply());
   o.add(buildCommentReply());
   return o;
 }
 
-checkUnnamed759(core.List<api.CommentReply> o) {
+checkUnnamed763(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentReply(o[0]);
   checkCommentReply(o[1]);
@@ -1028,7 +1028,7 @@
   var o = new api.CommentReplyList();
   buildCounterCommentReplyList++;
   if (buildCounterCommentReplyList < 3) {
-    o.items = buildUnnamed759();
+    o.items = buildUnnamed763();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -1041,7 +1041,7 @@
 checkCommentReplyList(api.CommentReplyList o) {
   buildCounterCommentReplyList++;
   if (buildCounterCommentReplyList < 3) {
-    checkUnnamed759(o.items);
+    checkUnnamed763(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1101,14 +1101,14 @@
   buildCounterFileCapabilities--;
 }
 
-buildUnnamed760() {
+buildUnnamed764() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed760(core.Map<core.String, core.String> o) {
+checkUnnamed764(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'));
@@ -1244,105 +1244,105 @@
   buildCounterFileLabels--;
 }
 
-buildUnnamed761() {
+buildUnnamed765() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed761(core.Map<core.String, core.String> o) {
+checkUnnamed765(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'));
 }
 
-buildUnnamed762() {
+buildUnnamed766() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed762(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'));
 }
 
-buildUnnamed763() {
+buildUnnamed767() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed763(core.List<api.User> o) {
+checkUnnamed767(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
 }
 
-buildUnnamed764() {
+buildUnnamed768() {
   var o = new core.List<api.ParentReference>();
   o.add(buildParentReference());
   o.add(buildParentReference());
   return o;
 }
 
-checkUnnamed764(core.List<api.ParentReference> o) {
+checkUnnamed768(core.List<api.ParentReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParentReference(o[0]);
   checkParentReference(o[1]);
 }
 
-buildUnnamed765() {
+buildUnnamed769() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed765(core.List<core.String> o) {
+checkUnnamed769(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed766() {
+buildUnnamed770() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed766(core.List<api.Permission> o) {
+checkUnnamed770(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
 }
 
-buildUnnamed767() {
+buildUnnamed771() {
   var o = new core.List<api.Property>();
   o.add(buildProperty());
   o.add(buildProperty());
   return o;
 }
 
-checkUnnamed767(core.List<api.Property> o) {
+checkUnnamed771(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o[0]);
   checkProperty(o[1]);
 }
 
-buildUnnamed768() {
+buildUnnamed772() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed768(core.List<core.String> o) {
+checkUnnamed772(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1411,7 +1411,7 @@
     o.embedLink = "foo";
     o.etag = "foo";
     o.explicitlyTrashed = true;
-    o.exportLinks = buildUnnamed760();
+    o.exportLinks = buildUnnamed764();
     o.fileExtension = "foo";
     o.fileSize = "foo";
     o.folderColorRgb = "foo";
@@ -1434,22 +1434,22 @@
     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 = buildUnnamed761();
+    o.openWithLinks = buildUnnamed765();
     o.originalFilename = "foo";
     o.ownedByMe = true;
-    o.ownerNames = buildUnnamed762();
-    o.owners = buildUnnamed763();
-    o.parents = buildUnnamed764();
-    o.permissionIds = buildUnnamed765();
-    o.permissions = buildUnnamed766();
-    o.properties = buildUnnamed767();
+    o.ownerNames = buildUnnamed766();
+    o.owners = buildUnnamed767();
+    o.parents = buildUnnamed768();
+    o.permissionIds = buildUnnamed769();
+    o.permissions = buildUnnamed770();
+    o.properties = buildUnnamed771();
     o.quotaBytesUsed = "foo";
     o.selfLink = "foo";
     o.shareable = true;
     o.shared = true;
     o.sharedWithMeDate = core.DateTime.parse("2002-02-27T14:01:02");
     o.sharingUser = buildUser();
-    o.spaces = buildUnnamed768();
+    o.spaces = buildUnnamed772();
     o.teamDriveId = "foo";
     o.thumbnail = buildFileThumbnail();
     o.thumbnailLink = "foo";
@@ -1486,7 +1486,7 @@
     unittest.expect(o.embedLink, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.explicitlyTrashed, unittest.isTrue);
-    checkUnnamed760(o.exportLinks);
+    checkUnnamed764(o.exportLinks);
     unittest.expect(o.fileExtension, unittest.equals('foo'));
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.folderColorRgb, unittest.equals('foo'));
@@ -1513,15 +1513,15 @@
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.modifiedDate,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed761(o.openWithLinks);
+    checkUnnamed765(o.openWithLinks);
     unittest.expect(o.originalFilename, unittest.equals('foo'));
     unittest.expect(o.ownedByMe, unittest.isTrue);
-    checkUnnamed762(o.ownerNames);
-    checkUnnamed763(o.owners);
-    checkUnnamed764(o.parents);
-    checkUnnamed765(o.permissionIds);
-    checkUnnamed766(o.permissions);
-    checkUnnamed767(o.properties);
+    checkUnnamed766(o.ownerNames);
+    checkUnnamed767(o.owners);
+    checkUnnamed768(o.parents);
+    checkUnnamed769(o.permissionIds);
+    checkUnnamed770(o.permissions);
+    checkUnnamed771(o.properties);
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.shareable, unittest.isTrue);
@@ -1529,7 +1529,7 @@
     unittest.expect(o.sharedWithMeDate,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkUser(o.sharingUser);
-    checkUnnamed768(o.spaces);
+    checkUnnamed772(o.spaces);
     unittest.expect(o.teamDriveId, unittest.equals('foo'));
     checkFileThumbnail(o.thumbnail);
     unittest.expect(o.thumbnailLink, unittest.equals('foo'));
@@ -1548,14 +1548,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed769() {
+buildUnnamed773() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed769(core.List<api.File> o) {
+checkUnnamed773(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -1568,7 +1568,7 @@
   if (buildCounterFileList < 3) {
     o.etag = "foo";
     o.incompleteSearch = true;
-    o.items = buildUnnamed769();
+    o.items = buildUnnamed773();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -1583,7 +1583,7 @@
   if (buildCounterFileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.incompleteSearch, unittest.isTrue);
-    checkUnnamed769(o.items);
+    checkUnnamed773(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1592,14 +1592,14 @@
   buildCounterFileList--;
 }
 
-buildUnnamed770() {
+buildUnnamed774() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed770(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'));
@@ -1610,7 +1610,7 @@
   var o = new api.GeneratedIds();
   buildCounterGeneratedIds++;
   if (buildCounterGeneratedIds < 3) {
-    o.ids = buildUnnamed770();
+    o.ids = buildUnnamed774();
     o.kind = "foo";
     o.space = "foo";
   }
@@ -1621,21 +1621,21 @@
 checkGeneratedIds(api.GeneratedIds o) {
   buildCounterGeneratedIds++;
   if (buildCounterGeneratedIds < 3) {
-    checkUnnamed770(o.ids);
+    checkUnnamed774(o.ids);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.space, unittest.equals('foo'));
   }
   buildCounterGeneratedIds--;
 }
 
-buildUnnamed771() {
+buildUnnamed775() {
   var o = new core.List<api.ParentReference>();
   o.add(buildParentReference());
   o.add(buildParentReference());
   return o;
 }
 
-checkUnnamed771(core.List<api.ParentReference> o) {
+checkUnnamed775(core.List<api.ParentReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParentReference(o[0]);
   checkParentReference(o[1]);
@@ -1647,7 +1647,7 @@
   buildCounterParentList++;
   if (buildCounterParentList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed771();
+    o.items = buildUnnamed775();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1659,7 +1659,7 @@
   buildCounterParentList++;
   if (buildCounterParentList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed771(o.items);
+    checkUnnamed775(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -1693,27 +1693,27 @@
   buildCounterParentReference--;
 }
 
-buildUnnamed772() {
+buildUnnamed776() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed772(core.List<core.String> o) {
+checkUnnamed776(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed773() {
+buildUnnamed777() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed773(core.List<core.String> o) {
+checkUnnamed777(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1724,7 +1724,7 @@
   var o = new api.PermissionTeamDrivePermissionDetails();
   buildCounterPermissionTeamDrivePermissionDetails++;
   if (buildCounterPermissionTeamDrivePermissionDetails < 3) {
-    o.additionalRoles = buildUnnamed773();
+    o.additionalRoles = buildUnnamed777();
     o.inherited = true;
     o.inheritedFrom = "foo";
     o.role = "foo";
@@ -1738,7 +1738,7 @@
     api.PermissionTeamDrivePermissionDetails o) {
   buildCounterPermissionTeamDrivePermissionDetails++;
   if (buildCounterPermissionTeamDrivePermissionDetails < 3) {
-    checkUnnamed773(o.additionalRoles);
+    checkUnnamed777(o.additionalRoles);
     unittest.expect(o.inherited, unittest.isTrue);
     unittest.expect(o.inheritedFrom, unittest.equals('foo'));
     unittest.expect(o.role, unittest.equals('foo'));
@@ -1747,14 +1747,14 @@
   buildCounterPermissionTeamDrivePermissionDetails--;
 }
 
-buildUnnamed774() {
+buildUnnamed778() {
   var o = new core.List<api.PermissionTeamDrivePermissionDetails>();
   o.add(buildPermissionTeamDrivePermissionDetails());
   o.add(buildPermissionTeamDrivePermissionDetails());
   return o;
 }
 
-checkUnnamed774(core.List<api.PermissionTeamDrivePermissionDetails> o) {
+checkUnnamed778(core.List<api.PermissionTeamDrivePermissionDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermissionTeamDrivePermissionDetails(o[0]);
   checkPermissionTeamDrivePermissionDetails(o[1]);
@@ -1765,7 +1765,7 @@
   var o = new api.Permission();
   buildCounterPermission++;
   if (buildCounterPermission < 3) {
-    o.additionalRoles = buildUnnamed772();
+    o.additionalRoles = buildUnnamed776();
     o.authKey = "foo";
     o.deleted = true;
     o.domain = "foo";
@@ -1778,7 +1778,7 @@
     o.photoLink = "foo";
     o.role = "foo";
     o.selfLink = "foo";
-    o.teamDrivePermissionDetails = buildUnnamed774();
+    o.teamDrivePermissionDetails = buildUnnamed778();
     o.type = "foo";
     o.value = "foo";
     o.withLink = true;
@@ -1790,7 +1790,7 @@
 checkPermission(api.Permission o) {
   buildCounterPermission++;
   if (buildCounterPermission < 3) {
-    checkUnnamed772(o.additionalRoles);
+    checkUnnamed776(o.additionalRoles);
     unittest.expect(o.authKey, unittest.equals('foo'));
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.domain, unittest.equals('foo'));
@@ -1804,7 +1804,7 @@
     unittest.expect(o.photoLink, unittest.equals('foo'));
     unittest.expect(o.role, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed774(o.teamDrivePermissionDetails);
+    checkUnnamed778(o.teamDrivePermissionDetails);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
     unittest.expect(o.withLink, unittest.isTrue);
@@ -1833,14 +1833,14 @@
   buildCounterPermissionId--;
 }
 
-buildUnnamed775() {
+buildUnnamed779() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed775(core.List<api.Permission> o) {
+checkUnnamed779(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -1852,7 +1852,7 @@
   buildCounterPermissionList++;
   if (buildCounterPermissionList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed775();
+    o.items = buildUnnamed779();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1865,7 +1865,7 @@
   buildCounterPermissionList++;
   if (buildCounterPermissionList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed775(o.items);
+    checkUnnamed779(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1902,14 +1902,14 @@
   buildCounterProperty--;
 }
 
-buildUnnamed776() {
+buildUnnamed780() {
   var o = new core.List<api.Property>();
   o.add(buildProperty());
   o.add(buildProperty());
   return o;
 }
 
-checkUnnamed776(core.List<api.Property> o) {
+checkUnnamed780(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o[0]);
   checkProperty(o[1]);
@@ -1921,7 +1921,7 @@
   buildCounterPropertyList++;
   if (buildCounterPropertyList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed776();
+    o.items = buildUnnamed780();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1933,21 +1933,21 @@
   buildCounterPropertyList++;
   if (buildCounterPropertyList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed776(o.items);
+    checkUnnamed780(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterPropertyList--;
 }
 
-buildUnnamed777() {
+buildUnnamed781() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed777(core.Map<core.String, core.String> o) {
+checkUnnamed781(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'));
@@ -1960,7 +1960,7 @@
   if (buildCounterRevision < 3) {
     o.downloadUrl = "foo";
     o.etag = "foo";
-    o.exportLinks = buildUnnamed777();
+    o.exportLinks = buildUnnamed781();
     o.fileSize = "foo";
     o.id = "foo";
     o.kind = "foo";
@@ -1986,7 +1986,7 @@
   if (buildCounterRevision < 3) {
     unittest.expect(o.downloadUrl, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed777(o.exportLinks);
+    checkUnnamed781(o.exportLinks);
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -2007,14 +2007,14 @@
   buildCounterRevision--;
 }
 
-buildUnnamed778() {
+buildUnnamed782() {
   var o = new core.List<api.Revision>();
   o.add(buildRevision());
   o.add(buildRevision());
   return o;
 }
 
-checkUnnamed778(core.List<api.Revision> o) {
+checkUnnamed782(core.List<api.Revision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRevision(o[0]);
   checkRevision(o[1]);
@@ -2026,7 +2026,7 @@
   buildCounterRevisionList++;
   if (buildCounterRevisionList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed778();
+    o.items = buildUnnamed782();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2039,7 +2039,7 @@
   buildCounterRevisionList++;
   if (buildCounterRevisionList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed778(o.items);
+    checkUnnamed782(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2174,14 +2174,14 @@
   buildCounterTeamDrive--;
 }
 
-buildUnnamed779() {
+buildUnnamed783() {
   var o = new core.List<api.TeamDrive>();
   o.add(buildTeamDrive());
   o.add(buildTeamDrive());
   return o;
 }
 
-checkUnnamed779(core.List<api.TeamDrive> o) {
+checkUnnamed783(core.List<api.TeamDrive> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTeamDrive(o[0]);
   checkTeamDrive(o[1]);
@@ -2192,7 +2192,7 @@
   var o = new api.TeamDriveList();
   buildCounterTeamDriveList++;
   if (buildCounterTeamDriveList < 3) {
-    o.items = buildUnnamed779();
+    o.items = buildUnnamed783();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2203,7 +2203,7 @@
 checkTeamDriveList(api.TeamDriveList o) {
   buildCounterTeamDriveList++;
   if (buildCounterTeamDriveList < 3) {
-    checkUnnamed779(o.items);
+    checkUnnamed783(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/drive/v3_test.dart b/generated/googleapis/test/drive/v3_test.dart
index 6ac2d09..affeaf5 100644
--- a/generated/googleapis/test/drive/v3_test.dart
+++ b/generated/googleapis/test/drive/v3_test.dart
@@ -50,79 +50,79 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1672() {
+buildUnnamed1694() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1672(core.List<core.String> o) {
+checkUnnamed1694(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1673() {
+buildUnnamed1695() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1672();
-  o["y"] = buildUnnamed1672();
+  o["x"] = buildUnnamed1694();
+  o["y"] = buildUnnamed1694();
   return o;
 }
 
-checkUnnamed1673(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1695(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1672(o["x"]);
-  checkUnnamed1672(o["y"]);
+  checkUnnamed1694(o["x"]);
+  checkUnnamed1694(o["y"]);
 }
 
-buildUnnamed1674() {
+buildUnnamed1696() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1674(core.List<core.String> o) {
+checkUnnamed1696(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1675() {
+buildUnnamed1697() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1675(core.List<core.String> o) {
+checkUnnamed1697(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1676() {
+buildUnnamed1698() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1675();
-  o["y"] = buildUnnamed1675();
+  o["x"] = buildUnnamed1697();
+  o["y"] = buildUnnamed1697();
   return o;
 }
 
-checkUnnamed1676(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1698(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1675(o["x"]);
-  checkUnnamed1675(o["y"]);
+  checkUnnamed1697(o["x"]);
+  checkUnnamed1697(o["y"]);
 }
 
-buildUnnamed1677() {
+buildUnnamed1699() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1677(core.Map<core.String, core.String> o) {
+checkUnnamed1699(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'));
@@ -176,14 +176,14 @@
   buildCounterAboutTeamDriveThemes--;
 }
 
-buildUnnamed1678() {
+buildUnnamed1700() {
   var o = new core.List<api.AboutTeamDriveThemes>();
   o.add(buildAboutTeamDriveThemes());
   o.add(buildAboutTeamDriveThemes());
   return o;
 }
 
-checkUnnamed1678(core.List<api.AboutTeamDriveThemes> o) {
+checkUnnamed1700(core.List<api.AboutTeamDriveThemes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutTeamDriveThemes(o[0]);
   checkAboutTeamDriveThemes(o[1]);
@@ -195,14 +195,14 @@
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
     o.appInstalled = true;
-    o.exportFormats = buildUnnamed1673();
-    o.folderColorPalette = buildUnnamed1674();
-    o.importFormats = buildUnnamed1676();
+    o.exportFormats = buildUnnamed1695();
+    o.folderColorPalette = buildUnnamed1696();
+    o.importFormats = buildUnnamed1698();
     o.kind = "foo";
-    o.maxImportSizes = buildUnnamed1677();
+    o.maxImportSizes = buildUnnamed1699();
     o.maxUploadSize = "foo";
     o.storageQuota = buildAboutStorageQuota();
-    o.teamDriveThemes = buildUnnamed1678();
+    o.teamDriveThemes = buildUnnamed1700();
     o.user = buildUser();
   }
   buildCounterAbout--;
@@ -213,14 +213,14 @@
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
     unittest.expect(o.appInstalled, unittest.isTrue);
-    checkUnnamed1673(o.exportFormats);
-    checkUnnamed1674(o.folderColorPalette);
-    checkUnnamed1676(o.importFormats);
+    checkUnnamed1695(o.exportFormats);
+    checkUnnamed1696(o.folderColorPalette);
+    checkUnnamed1698(o.importFormats);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1677(o.maxImportSizes);
+    checkUnnamed1699(o.maxImportSizes);
     unittest.expect(o.maxUploadSize, unittest.equals('foo'));
     checkAboutStorageQuota(o.storageQuota);
-    checkUnnamed1678(o.teamDriveThemes);
+    checkUnnamed1700(o.teamDriveThemes);
     checkUser(o.user);
   }
   buildCounterAbout--;
@@ -260,14 +260,14 @@
   buildCounterChange--;
 }
 
-buildUnnamed1679() {
+buildUnnamed1701() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed1679(core.List<api.Change> o) {
+checkUnnamed1701(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -278,7 +278,7 @@
   var o = new api.ChangeList();
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
-    o.changes = buildUnnamed1679();
+    o.changes = buildUnnamed1701();
     o.kind = "foo";
     o.newStartPageToken = "foo";
     o.nextPageToken = "foo";
@@ -290,7 +290,7 @@
 checkChangeList(api.ChangeList o) {
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
-    checkUnnamed1679(o.changes);
+    checkUnnamed1701(o.changes);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.newStartPageToken, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -298,14 +298,14 @@
   buildCounterChangeList--;
 }
 
-buildUnnamed1680() {
+buildUnnamed1702() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1680(core.Map<core.String, core.String> o) {
+checkUnnamed1702(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,7 +320,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed1680();
+    o.params = buildUnnamed1702();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -338,7 +338,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1680(o.params);
+    checkUnnamed1702(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -369,14 +369,14 @@
   buildCounterCommentQuotedFileContent--;
 }
 
-buildUnnamed1681() {
+buildUnnamed1703() {
   var o = new core.List<api.Reply>();
   o.add(buildReply());
   o.add(buildReply());
   return o;
 }
 
-checkUnnamed1681(core.List<api.Reply> o) {
+checkUnnamed1703(core.List<api.Reply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReply(o[0]);
   checkReply(o[1]);
@@ -397,7 +397,7 @@
     o.kind = "foo";
     o.modifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.quotedFileContent = buildCommentQuotedFileContent();
-    o.replies = buildUnnamed1681();
+    o.replies = buildUnnamed1703();
     o.resolved = true;
   }
   buildCounterComment--;
@@ -419,20 +419,20 @@
     unittest.expect(o.modifiedTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkCommentQuotedFileContent(o.quotedFileContent);
-    checkUnnamed1681(o.replies);
+    checkUnnamed1703(o.replies);
     unittest.expect(o.resolved, unittest.isTrue);
   }
   buildCounterComment--;
 }
 
-buildUnnamed1682() {
+buildUnnamed1704() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed1682(core.List<api.Comment> o) {
+checkUnnamed1704(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -443,7 +443,7 @@
   var o = new api.CommentList();
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    o.comments = buildUnnamed1682();
+    o.comments = buildUnnamed1704();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -454,21 +454,21 @@
 checkCommentList(api.CommentList o) {
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    checkUnnamed1682(o.comments);
+    checkUnnamed1704(o.comments);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCommentList--;
 }
 
-buildUnnamed1683() {
+buildUnnamed1705() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1683(core.Map<core.String, core.String> o) {
+checkUnnamed1705(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'));
@@ -649,79 +649,79 @@
   buildCounterFileImageMediaMetadata--;
 }
 
-buildUnnamed1684() {
+buildUnnamed1706() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed1684(core.List<api.User> o) {
+checkUnnamed1706(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
 }
 
-buildUnnamed1685() {
+buildUnnamed1707() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1685(core.List<core.String> o) {
+checkUnnamed1707(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1686() {
+buildUnnamed1708() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1686(core.List<core.String> o) {
+checkUnnamed1708(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1687() {
+buildUnnamed1709() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed1687(core.List<api.Permission> o) {
+checkUnnamed1709(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
 }
 
-buildUnnamed1688() {
+buildUnnamed1710() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1688(core.Map<core.String, core.String> o) {
+checkUnnamed1710(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'));
 }
 
-buildUnnamed1689() {
+buildUnnamed1711() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1689(core.List<core.String> o) {
+checkUnnamed1711(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -755,7 +755,7 @@
   var o = new api.File();
   buildCounterFile++;
   if (buildCounterFile < 3) {
-    o.appProperties = buildUnnamed1683();
+    o.appProperties = buildUnnamed1705();
     o.capabilities = buildFileCapabilities();
     o.contentHints = buildFileContentHints();
     o.createdTime = core.DateTime.parse("2002-02-27T14:01:02");
@@ -781,17 +781,17 @@
     o.name = "foo";
     o.originalFilename = "foo";
     o.ownedByMe = true;
-    o.owners = buildUnnamed1684();
-    o.parents = buildUnnamed1685();
-    o.permissionIds = buildUnnamed1686();
-    o.permissions = buildUnnamed1687();
-    o.properties = buildUnnamed1688();
+    o.owners = buildUnnamed1706();
+    o.parents = buildUnnamed1707();
+    o.permissionIds = buildUnnamed1708();
+    o.permissions = buildUnnamed1709();
+    o.properties = buildUnnamed1710();
     o.quotaBytesUsed = "foo";
     o.shared = true;
     o.sharedWithMeTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.sharingUser = buildUser();
     o.size = "foo";
-    o.spaces = buildUnnamed1689();
+    o.spaces = buildUnnamed1711();
     o.starred = true;
     o.teamDriveId = "foo";
     o.thumbnailLink = "foo";
@@ -815,7 +815,7 @@
 checkFile(api.File o) {
   buildCounterFile++;
   if (buildCounterFile < 3) {
-    checkUnnamed1683(o.appProperties);
+    checkUnnamed1705(o.appProperties);
     checkFileCapabilities(o.capabilities);
     checkFileContentHints(o.contentHints);
     unittest.expect(o.createdTime,
@@ -844,18 +844,18 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.originalFilename, unittest.equals('foo'));
     unittest.expect(o.ownedByMe, unittest.isTrue);
-    checkUnnamed1684(o.owners);
-    checkUnnamed1685(o.parents);
-    checkUnnamed1686(o.permissionIds);
-    checkUnnamed1687(o.permissions);
-    checkUnnamed1688(o.properties);
+    checkUnnamed1706(o.owners);
+    checkUnnamed1707(o.parents);
+    checkUnnamed1708(o.permissionIds);
+    checkUnnamed1709(o.permissions);
+    checkUnnamed1710(o.properties);
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.shared, unittest.isTrue);
     unittest.expect(o.sharedWithMeTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkUser(o.sharingUser);
     unittest.expect(o.size, unittest.equals('foo'));
-    checkUnnamed1689(o.spaces);
+    checkUnnamed1711(o.spaces);
     unittest.expect(o.starred, unittest.isTrue);
     unittest.expect(o.teamDriveId, unittest.equals('foo'));
     unittest.expect(o.thumbnailLink, unittest.equals('foo'));
@@ -877,14 +877,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed1690() {
+buildUnnamed1712() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed1690(core.List<api.File> o) {
+checkUnnamed1712(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -895,7 +895,7 @@
   var o = new api.FileList();
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
-    o.files = buildUnnamed1690();
+    o.files = buildUnnamed1712();
     o.incompleteSearch = true;
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -907,7 +907,7 @@
 checkFileList(api.FileList o) {
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
-    checkUnnamed1690(o.files);
+    checkUnnamed1712(o.files);
     unittest.expect(o.incompleteSearch, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -915,14 +915,14 @@
   buildCounterFileList--;
 }
 
-buildUnnamed1691() {
+buildUnnamed1713() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1691(core.List<core.String> o) {
+checkUnnamed1713(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -933,7 +933,7 @@
   var o = new api.GeneratedIds();
   buildCounterGeneratedIds++;
   if (buildCounterGeneratedIds < 3) {
-    o.ids = buildUnnamed1691();
+    o.ids = buildUnnamed1713();
     o.kind = "foo";
     o.space = "foo";
   }
@@ -944,7 +944,7 @@
 checkGeneratedIds(api.GeneratedIds o) {
   buildCounterGeneratedIds++;
   if (buildCounterGeneratedIds < 3) {
-    checkUnnamed1691(o.ids);
+    checkUnnamed1713(o.ids);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.space, unittest.equals('foo'));
   }
@@ -977,14 +977,14 @@
   buildCounterPermissionTeamDrivePermissionDetails--;
 }
 
-buildUnnamed1692() {
+buildUnnamed1714() {
   var o = new core.List<api.PermissionTeamDrivePermissionDetails>();
   o.add(buildPermissionTeamDrivePermissionDetails());
   o.add(buildPermissionTeamDrivePermissionDetails());
   return o;
 }
 
-checkUnnamed1692(core.List<api.PermissionTeamDrivePermissionDetails> o) {
+checkUnnamed1714(core.List<api.PermissionTeamDrivePermissionDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermissionTeamDrivePermissionDetails(o[0]);
   checkPermissionTeamDrivePermissionDetails(o[1]);
@@ -1005,7 +1005,7 @@
     o.kind = "foo";
     o.photoLink = "foo";
     o.role = "foo";
-    o.teamDrivePermissionDetails = buildUnnamed1692();
+    o.teamDrivePermissionDetails = buildUnnamed1714();
     o.type = "foo";
   }
   buildCounterPermission--;
@@ -1026,20 +1026,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.photoLink, unittest.equals('foo'));
     unittest.expect(o.role, unittest.equals('foo'));
-    checkUnnamed1692(o.teamDrivePermissionDetails);
+    checkUnnamed1714(o.teamDrivePermissionDetails);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPermission--;
 }
 
-buildUnnamed1693() {
+buildUnnamed1715() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed1693(core.List<api.Permission> o) {
+checkUnnamed1715(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -1052,7 +1052,7 @@
   if (buildCounterPermissionList < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.permissions = buildUnnamed1693();
+    o.permissions = buildUnnamed1715();
   }
   buildCounterPermissionList--;
   return o;
@@ -1063,7 +1063,7 @@
   if (buildCounterPermissionList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1693(o.permissions);
+    checkUnnamed1715(o.permissions);
   }
   buildCounterPermissionList--;
 }
@@ -1105,14 +1105,14 @@
   buildCounterReply--;
 }
 
-buildUnnamed1694() {
+buildUnnamed1716() {
   var o = new core.List<api.Reply>();
   o.add(buildReply());
   o.add(buildReply());
   return o;
 }
 
-checkUnnamed1694(core.List<api.Reply> o) {
+checkUnnamed1716(core.List<api.Reply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReply(o[0]);
   checkReply(o[1]);
@@ -1125,7 +1125,7 @@
   if (buildCounterReplyList < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.replies = buildUnnamed1694();
+    o.replies = buildUnnamed1716();
   }
   buildCounterReplyList--;
   return o;
@@ -1136,7 +1136,7 @@
   if (buildCounterReplyList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1694(o.replies);
+    checkUnnamed1716(o.replies);
   }
   buildCounterReplyList--;
 }
@@ -1183,14 +1183,14 @@
   buildCounterRevision--;
 }
 
-buildUnnamed1695() {
+buildUnnamed1717() {
   var o = new core.List<api.Revision>();
   o.add(buildRevision());
   o.add(buildRevision());
   return o;
 }
 
-checkUnnamed1695(core.List<api.Revision> o) {
+checkUnnamed1717(core.List<api.Revision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRevision(o[0]);
   checkRevision(o[1]);
@@ -1203,7 +1203,7 @@
   if (buildCounterRevisionList < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.revisions = buildUnnamed1695();
+    o.revisions = buildUnnamed1717();
   }
   buildCounterRevisionList--;
   return o;
@@ -1214,7 +1214,7 @@
   if (buildCounterRevisionList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1695(o.revisions);
+    checkUnnamed1717(o.revisions);
   }
   buildCounterRevisionList--;
 }
@@ -1346,14 +1346,14 @@
   buildCounterTeamDrive--;
 }
 
-buildUnnamed1696() {
+buildUnnamed1718() {
   var o = new core.List<api.TeamDrive>();
   o.add(buildTeamDrive());
   o.add(buildTeamDrive());
   return o;
 }
 
-checkUnnamed1696(core.List<api.TeamDrive> o) {
+checkUnnamed1718(core.List<api.TeamDrive> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTeamDrive(o[0]);
   checkTeamDrive(o[1]);
@@ -1366,7 +1366,7 @@
   if (buildCounterTeamDriveList < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.teamDrives = buildUnnamed1696();
+    o.teamDrives = buildUnnamed1718();
   }
   buildCounterTeamDriveList--;
   return o;
@@ -1377,7 +1377,7 @@
   if (buildCounterTeamDriveList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1696(o.teamDrives);
+    checkUnnamed1718(o.teamDrives);
   }
   buildCounterTeamDriveList--;
 }
diff --git a/generated/googleapis/test/firebasedynamiclinks/v1_test.dart b/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
index e5ce150..b116e97 100644
--- a/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
+++ b/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
@@ -119,14 +119,14 @@
   buildCounterCreateShortDynamicLinkRequest--;
 }
 
-buildUnnamed2264() {
+buildUnnamed2289() {
   var o = new core.List<api.DynamicLinkWarning>();
   o.add(buildDynamicLinkWarning());
   o.add(buildDynamicLinkWarning());
   return o;
 }
 
-checkUnnamed2264(core.List<api.DynamicLinkWarning> o) {
+checkUnnamed2289(core.List<api.DynamicLinkWarning> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDynamicLinkWarning(o[0]);
   checkDynamicLinkWarning(o[1]);
@@ -139,7 +139,7 @@
   if (buildCounterCreateShortDynamicLinkResponse < 3) {
     o.previewLink = "foo";
     o.shortLink = "foo";
-    o.warning = buildUnnamed2264();
+    o.warning = buildUnnamed2289();
   }
   buildCounterCreateShortDynamicLinkResponse--;
   return o;
@@ -150,7 +150,7 @@
   if (buildCounterCreateShortDynamicLinkResponse < 3) {
     unittest.expect(o.previewLink, unittest.equals('foo'));
     unittest.expect(o.shortLink, unittest.equals('foo'));
-    checkUnnamed2264(o.warning);
+    checkUnnamed2289(o.warning);
   }
   buildCounterCreateShortDynamicLinkResponse--;
 }
@@ -259,14 +259,14 @@
   buildCounterDynamicLinkInfo--;
 }
 
-buildUnnamed2265() {
+buildUnnamed2290() {
   var o = new core.List<api.DynamicLinkEventStat>();
   o.add(buildDynamicLinkEventStat());
   o.add(buildDynamicLinkEventStat());
   return o;
 }
 
-checkUnnamed2265(core.List<api.DynamicLinkEventStat> o) {
+checkUnnamed2290(core.List<api.DynamicLinkEventStat> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDynamicLinkEventStat(o[0]);
   checkDynamicLinkEventStat(o[1]);
@@ -277,7 +277,7 @@
   var o = new api.DynamicLinkStats();
   buildCounterDynamicLinkStats++;
   if (buildCounterDynamicLinkStats < 3) {
-    o.linkEventStats = buildUnnamed2265();
+    o.linkEventStats = buildUnnamed2290();
   }
   buildCounterDynamicLinkStats--;
   return o;
@@ -286,7 +286,7 @@
 checkDynamicLinkStats(api.DynamicLinkStats o) {
   buildCounterDynamicLinkStats++;
   if (buildCounterDynamicLinkStats < 3) {
-    checkUnnamed2265(o.linkEventStats);
+    checkUnnamed2290(o.linkEventStats);
   }
   buildCounterDynamicLinkStats--;
 }
diff --git a/generated/googleapis/test/firebaseremoteconfig/v1_test.dart b/generated/googleapis/test/firebaseremoteconfig/v1_test.dart
index 17b0918..bfc5b3f 100644
--- a/generated/googleapis/test/firebaseremoteconfig/v1_test.dart
+++ b/generated/googleapis/test/firebaseremoteconfig/v1_test.dart
@@ -50,27 +50,27 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed793() {
+buildUnnamed797() {
   var o = new core.List<api.RemoteConfigCondition>();
   o.add(buildRemoteConfigCondition());
   o.add(buildRemoteConfigCondition());
   return o;
 }
 
-checkUnnamed793(core.List<api.RemoteConfigCondition> o) {
+checkUnnamed797(core.List<api.RemoteConfigCondition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRemoteConfigCondition(o[0]);
   checkRemoteConfigCondition(o[1]);
 }
 
-buildUnnamed794() {
+buildUnnamed798() {
   var o = new core.Map<core.String, api.RemoteConfigParameter>();
   o["x"] = buildRemoteConfigParameter();
   o["y"] = buildRemoteConfigParameter();
   return o;
 }
 
-checkUnnamed794(core.Map<core.String, api.RemoteConfigParameter> o) {
+checkUnnamed798(core.Map<core.String, api.RemoteConfigParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRemoteConfigParameter(o["x"]);
   checkRemoteConfigParameter(o["y"]);
@@ -81,8 +81,8 @@
   var o = new api.RemoteConfig();
   buildCounterRemoteConfig++;
   if (buildCounterRemoteConfig < 3) {
-    o.conditions = buildUnnamed793();
-    o.parameters = buildUnnamed794();
+    o.conditions = buildUnnamed797();
+    o.parameters = buildUnnamed798();
   }
   buildCounterRemoteConfig--;
   return o;
@@ -91,8 +91,8 @@
 checkRemoteConfig(api.RemoteConfig o) {
   buildCounterRemoteConfig++;
   if (buildCounterRemoteConfig < 3) {
-    checkUnnamed793(o.conditions);
-    checkUnnamed794(o.parameters);
+    checkUnnamed797(o.conditions);
+    checkUnnamed798(o.parameters);
   }
   buildCounterRemoteConfig--;
 }
@@ -122,14 +122,14 @@
   buildCounterRemoteConfigCondition--;
 }
 
-buildUnnamed795() {
+buildUnnamed799() {
   var o = new core.Map<core.String, api.RemoteConfigParameterValue>();
   o["x"] = buildRemoteConfigParameterValue();
   o["y"] = buildRemoteConfigParameterValue();
   return o;
 }
 
-checkUnnamed795(core.Map<core.String, api.RemoteConfigParameterValue> o) {
+checkUnnamed799(core.Map<core.String, api.RemoteConfigParameterValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRemoteConfigParameterValue(o["x"]);
   checkRemoteConfigParameterValue(o["y"]);
@@ -140,7 +140,7 @@
   var o = new api.RemoteConfigParameter();
   buildCounterRemoteConfigParameter++;
   if (buildCounterRemoteConfigParameter < 3) {
-    o.conditionalValues = buildUnnamed795();
+    o.conditionalValues = buildUnnamed799();
     o.defaultValue = buildRemoteConfigParameterValue();
     o.description = "foo";
   }
@@ -151,7 +151,7 @@
 checkRemoteConfigParameter(api.RemoteConfigParameter o) {
   buildCounterRemoteConfigParameter++;
   if (buildCounterRemoteConfigParameter < 3) {
-    checkUnnamed795(o.conditionalValues);
+    checkUnnamed799(o.conditionalValues);
     checkRemoteConfigParameterValue(o.defaultValue);
     unittest.expect(o.description, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/firebaserules/v1_test.dart b/generated/googleapis/test/firebaserules/v1_test.dart
index 8dc3a32..91a6d89 100644
--- a/generated/googleapis/test/firebaserules/v1_test.dart
+++ b/generated/googleapis/test/firebaserules/v1_test.dart
@@ -117,7 +117,7 @@
   buildCounterFile--;
 }
 
-buildUnnamed3598() {
+buildUnnamed3627() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -132,7 +132,7 @@
   return o;
 }
 
-checkUnnamed3598(core.List<core.Object> o) {
+checkUnnamed3627(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted2 = (o[0]) as core.Map;
   unittest.expect(casted2, unittest.hasLength(3));
@@ -151,7 +151,7 @@
   var o = new api.FunctionCall();
   buildCounterFunctionCall++;
   if (buildCounterFunctionCall < 3) {
-    o.args = buildUnnamed3598();
+    o.args = buildUnnamed3627();
     o.function = "foo";
   }
   buildCounterFunctionCall--;
@@ -161,20 +161,20 @@
 checkFunctionCall(api.FunctionCall o) {
   buildCounterFunctionCall++;
   if (buildCounterFunctionCall < 3) {
-    checkUnnamed3598(o.args);
+    checkUnnamed3627(o.args);
     unittest.expect(o.function, unittest.equals('foo'));
   }
   buildCounterFunctionCall--;
 }
 
-buildUnnamed3599() {
+buildUnnamed3628() {
   var o = new core.List<api.Arg>();
   o.add(buildArg());
   o.add(buildArg());
   return o;
 }
 
-checkUnnamed3599(core.List<api.Arg> o) {
+checkUnnamed3628(core.List<api.Arg> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkArg(o[0]);
   checkArg(o[1]);
@@ -185,7 +185,7 @@
   var o = new api.FunctionMock();
   buildCounterFunctionMock++;
   if (buildCounterFunctionMock < 3) {
-    o.args = buildUnnamed3599();
+    o.args = buildUnnamed3628();
     o.function = "foo";
     o.result = buildResult();
   }
@@ -196,7 +196,7 @@
 checkFunctionMock(api.FunctionMock o) {
   buildCounterFunctionMock++;
   if (buildCounterFunctionMock < 3) {
-    checkUnnamed3599(o.args);
+    checkUnnamed3628(o.args);
     unittest.expect(o.function, unittest.equals('foo'));
     checkResult(o.result);
   }
@@ -253,14 +253,14 @@
   buildCounterIssue--;
 }
 
-buildUnnamed3600() {
+buildUnnamed3629() {
   var o = new core.List<api.Release>();
   o.add(buildRelease());
   o.add(buildRelease());
   return o;
 }
 
-checkUnnamed3600(core.List<api.Release> o) {
+checkUnnamed3629(core.List<api.Release> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRelease(o[0]);
   checkRelease(o[1]);
@@ -272,7 +272,7 @@
   buildCounterListReleasesResponse++;
   if (buildCounterListReleasesResponse < 3) {
     o.nextPageToken = "foo";
-    o.releases = buildUnnamed3600();
+    o.releases = buildUnnamed3629();
   }
   buildCounterListReleasesResponse--;
   return o;
@@ -282,19 +282,19 @@
   buildCounterListReleasesResponse++;
   if (buildCounterListReleasesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3600(o.releases);
+    checkUnnamed3629(o.releases);
   }
   buildCounterListReleasesResponse--;
 }
 
-buildUnnamed3601() {
+buildUnnamed3630() {
   var o = new core.List<api.Ruleset>();
   o.add(buildRuleset());
   o.add(buildRuleset());
   return o;
 }
 
-checkUnnamed3601(core.List<api.Ruleset> o) {
+checkUnnamed3630(core.List<api.Ruleset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRuleset(o[0]);
   checkRuleset(o[1]);
@@ -306,7 +306,7 @@
   buildCounterListRulesetsResponse++;
   if (buildCounterListRulesetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.rulesets = buildUnnamed3601();
+    o.rulesets = buildUnnamed3630();
   }
   buildCounterListRulesetsResponse--;
   return o;
@@ -316,7 +316,7 @@
   buildCounterListRulesetsResponse++;
   if (buildCounterListRulesetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3601(o.rulesets);
+    checkUnnamed3630(o.rulesets);
   }
   buildCounterListRulesetsResponse--;
 }
@@ -398,14 +398,14 @@
   buildCounterRuleset--;
 }
 
-buildUnnamed3602() {
+buildUnnamed3631() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed3602(core.List<api.File> o) {
+checkUnnamed3631(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -416,7 +416,7 @@
   var o = new api.Source();
   buildCounterSource++;
   if (buildCounterSource < 3) {
-    o.files = buildUnnamed3602();
+    o.files = buildUnnamed3631();
   }
   buildCounterSource--;
   return o;
@@ -425,7 +425,7 @@
 checkSource(api.Source o) {
   buildCounterSource++;
   if (buildCounterSource < 3) {
-    checkUnnamed3602(o.files);
+    checkUnnamed3631(o.files);
   }
   buildCounterSource--;
 }
@@ -453,14 +453,14 @@
   buildCounterSourcePosition--;
 }
 
-buildUnnamed3603() {
+buildUnnamed3632() {
   var o = new core.List<api.FunctionMock>();
   o.add(buildFunctionMock());
   o.add(buildFunctionMock());
   return o;
 }
 
-checkUnnamed3603(core.List<api.FunctionMock> o) {
+checkUnnamed3632(core.List<api.FunctionMock> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFunctionMock(o[0]);
   checkFunctionMock(o[1]);
@@ -472,7 +472,7 @@
   buildCounterTestCase++;
   if (buildCounterTestCase < 3) {
     o.expectation = "foo";
-    o.functionMocks = buildUnnamed3603();
+    o.functionMocks = buildUnnamed3632();
     o.request = {
       'list': [1, 2, 3],
       'bool': true,
@@ -492,7 +492,7 @@
   buildCounterTestCase++;
   if (buildCounterTestCase < 3) {
     unittest.expect(o.expectation, unittest.equals('foo'));
-    checkUnnamed3603(o.functionMocks);
+    checkUnnamed3632(o.functionMocks);
     var casted5 = (o.request) as core.Map;
     unittest.expect(casted5, unittest.hasLength(3));
     unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
@@ -507,27 +507,27 @@
   buildCounterTestCase--;
 }
 
-buildUnnamed3604() {
+buildUnnamed3633() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3604(core.List<core.String> o) {
+checkUnnamed3633(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3605() {
+buildUnnamed3634() {
   var o = new core.List<api.FunctionCall>();
   o.add(buildFunctionCall());
   o.add(buildFunctionCall());
   return o;
 }
 
-checkUnnamed3605(core.List<api.FunctionCall> o) {
+checkUnnamed3634(core.List<api.FunctionCall> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFunctionCall(o[0]);
   checkFunctionCall(o[1]);
@@ -538,9 +538,9 @@
   var o = new api.TestResult();
   buildCounterTestResult++;
   if (buildCounterTestResult < 3) {
-    o.debugMessages = buildUnnamed3604();
+    o.debugMessages = buildUnnamed3633();
     o.errorPosition = buildSourcePosition();
-    o.functionCalls = buildUnnamed3605();
+    o.functionCalls = buildUnnamed3634();
     o.state = "foo";
   }
   buildCounterTestResult--;
@@ -550,9 +550,9 @@
 checkTestResult(api.TestResult o) {
   buildCounterTestResult++;
   if (buildCounterTestResult < 3) {
-    checkUnnamed3604(o.debugMessages);
+    checkUnnamed3633(o.debugMessages);
     checkSourcePosition(o.errorPosition);
-    checkUnnamed3605(o.functionCalls);
+    checkUnnamed3634(o.functionCalls);
     unittest.expect(o.state, unittest.equals('foo'));
   }
   buildCounterTestResult--;
@@ -579,27 +579,27 @@
   buildCounterTestRulesetRequest--;
 }
 
-buildUnnamed3606() {
+buildUnnamed3635() {
   var o = new core.List<api.Issue>();
   o.add(buildIssue());
   o.add(buildIssue());
   return o;
 }
 
-checkUnnamed3606(core.List<api.Issue> o) {
+checkUnnamed3635(core.List<api.Issue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIssue(o[0]);
   checkIssue(o[1]);
 }
 
-buildUnnamed3607() {
+buildUnnamed3636() {
   var o = new core.List<api.TestResult>();
   o.add(buildTestResult());
   o.add(buildTestResult());
   return o;
 }
 
-checkUnnamed3607(core.List<api.TestResult> o) {
+checkUnnamed3636(core.List<api.TestResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTestResult(o[0]);
   checkTestResult(o[1]);
@@ -610,8 +610,8 @@
   var o = new api.TestRulesetResponse();
   buildCounterTestRulesetResponse++;
   if (buildCounterTestRulesetResponse < 3) {
-    o.issues = buildUnnamed3606();
-    o.testResults = buildUnnamed3607();
+    o.issues = buildUnnamed3635();
+    o.testResults = buildUnnamed3636();
   }
   buildCounterTestRulesetResponse--;
   return o;
@@ -620,20 +620,20 @@
 checkTestRulesetResponse(api.TestRulesetResponse o) {
   buildCounterTestRulesetResponse++;
   if (buildCounterTestRulesetResponse < 3) {
-    checkUnnamed3606(o.issues);
-    checkUnnamed3607(o.testResults);
+    checkUnnamed3635(o.issues);
+    checkUnnamed3636(o.testResults);
   }
   buildCounterTestRulesetResponse--;
 }
 
-buildUnnamed3608() {
+buildUnnamed3637() {
   var o = new core.List<api.TestCase>();
   o.add(buildTestCase());
   o.add(buildTestCase());
   return o;
 }
 
-checkUnnamed3608(core.List<api.TestCase> o) {
+checkUnnamed3637(core.List<api.TestCase> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTestCase(o[0]);
   checkTestCase(o[1]);
@@ -644,7 +644,7 @@
   var o = new api.TestSuite();
   buildCounterTestSuite++;
   if (buildCounterTestSuite < 3) {
-    o.testCases = buildUnnamed3608();
+    o.testCases = buildUnnamed3637();
   }
   buildCounterTestSuite--;
   return o;
@@ -653,7 +653,7 @@
 checkTestSuite(api.TestSuite o) {
   buildCounterTestSuite++;
   if (buildCounterTestSuite < 3) {
-    checkUnnamed3608(o.testCases);
+    checkUnnamed3637(o.testCases);
   }
   buildCounterTestSuite--;
 }
@@ -1120,9 +1120,9 @@
       api.ProjectsReleasesResourceApi res =
           new api.FirebaserulesApi(mock).projects.releases;
       var arg_name = "foo";
+      var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_filter = "foo";
-      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1155,11 +1155,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1170,9 +1170,9 @@
       }), true);
       res
           .list(arg_name,
+              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
               filter: arg_filter,
-              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListReleasesResponse response) {
         checkListReleasesResponse(response);
diff --git a/generated/googleapis/test/fitness/v1_test.dart b/generated/googleapis/test/fitness/v1_test.dart
index ca53ba6..43c03ca 100644
--- a/generated/googleapis/test/fitness/v1_test.dart
+++ b/generated/googleapis/test/fitness/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed2004() {
+buildUnnamed2026() {
   var o = new core.List<api.Dataset>();
   o.add(buildDataset());
   o.add(buildDataset());
   return o;
 }
 
-checkUnnamed2004(core.List<api.Dataset> o) {
+checkUnnamed2026(core.List<api.Dataset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataset(o[0]);
   checkDataset(o[1]);
@@ -69,7 +69,7 @@
   buildCounterAggregateBucket++;
   if (buildCounterAggregateBucket < 3) {
     o.activity = 42;
-    o.dataset = buildUnnamed2004();
+    o.dataset = buildUnnamed2026();
     o.endTimeMillis = "foo";
     o.session = buildSession();
     o.startTimeMillis = "foo";
@@ -83,7 +83,7 @@
   buildCounterAggregateBucket++;
   if (buildCounterAggregateBucket < 3) {
     unittest.expect(o.activity, unittest.equals(42));
-    checkUnnamed2004(o.dataset);
+    checkUnnamed2026(o.dataset);
     unittest.expect(o.endTimeMillis, unittest.equals('foo'));
     checkSession(o.session);
     unittest.expect(o.startTimeMillis, unittest.equals('foo'));
@@ -113,27 +113,27 @@
   buildCounterAggregateBy--;
 }
 
-buildUnnamed2005() {
+buildUnnamed2027() {
   var o = new core.List<api.AggregateBy>();
   o.add(buildAggregateBy());
   o.add(buildAggregateBy());
   return o;
 }
 
-checkUnnamed2005(core.List<api.AggregateBy> o) {
+checkUnnamed2027(core.List<api.AggregateBy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAggregateBy(o[0]);
   checkAggregateBy(o[1]);
 }
 
-buildUnnamed2006() {
+buildUnnamed2028() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2006(core.List<core.String> o) {
+checkUnnamed2028(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -144,13 +144,13 @@
   var o = new api.AggregateRequest();
   buildCounterAggregateRequest++;
   if (buildCounterAggregateRequest < 3) {
-    o.aggregateBy = buildUnnamed2005();
+    o.aggregateBy = buildUnnamed2027();
     o.bucketByActivitySegment = buildBucketByActivity();
     o.bucketByActivityType = buildBucketByActivity();
     o.bucketBySession = buildBucketBySession();
     o.bucketByTime = buildBucketByTime();
     o.endTimeMillis = "foo";
-    o.filteredDataQualityStandard = buildUnnamed2006();
+    o.filteredDataQualityStandard = buildUnnamed2028();
     o.startTimeMillis = "foo";
   }
   buildCounterAggregateRequest--;
@@ -160,26 +160,26 @@
 checkAggregateRequest(api.AggregateRequest o) {
   buildCounterAggregateRequest++;
   if (buildCounterAggregateRequest < 3) {
-    checkUnnamed2005(o.aggregateBy);
+    checkUnnamed2027(o.aggregateBy);
     checkBucketByActivity(o.bucketByActivitySegment);
     checkBucketByActivity(o.bucketByActivityType);
     checkBucketBySession(o.bucketBySession);
     checkBucketByTime(o.bucketByTime);
     unittest.expect(o.endTimeMillis, unittest.equals('foo'));
-    checkUnnamed2006(o.filteredDataQualityStandard);
+    checkUnnamed2028(o.filteredDataQualityStandard);
     unittest.expect(o.startTimeMillis, unittest.equals('foo'));
   }
   buildCounterAggregateRequest--;
 }
 
-buildUnnamed2007() {
+buildUnnamed2029() {
   var o = new core.List<api.AggregateBucket>();
   o.add(buildAggregateBucket());
   o.add(buildAggregateBucket());
   return o;
 }
 
-checkUnnamed2007(core.List<api.AggregateBucket> o) {
+checkUnnamed2029(core.List<api.AggregateBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAggregateBucket(o[0]);
   checkAggregateBucket(o[1]);
@@ -190,7 +190,7 @@
   var o = new api.AggregateResponse();
   buildCounterAggregateResponse++;
   if (buildCounterAggregateResponse < 3) {
-    o.bucket = buildUnnamed2007();
+    o.bucket = buildUnnamed2029();
   }
   buildCounterAggregateResponse--;
   return o;
@@ -199,7 +199,7 @@
 checkAggregateResponse(api.AggregateResponse o) {
   buildCounterAggregateResponse++;
   if (buildCounterAggregateResponse < 3) {
-    checkUnnamed2007(o.bucket);
+    checkUnnamed2029(o.bucket);
   }
   buildCounterAggregateResponse--;
 }
@@ -313,14 +313,14 @@
   buildCounterBucketByTimePeriod--;
 }
 
-buildUnnamed2008() {
+buildUnnamed2030() {
   var o = new core.List<api.Value>();
   o.add(buildValue());
   o.add(buildValue());
   return o;
 }
 
-checkUnnamed2008(core.List<api.Value> o) {
+checkUnnamed2030(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o[0]);
   checkValue(o[1]);
@@ -338,7 +338,7 @@
     o.originDataSourceId = "foo";
     o.rawTimestampNanos = "foo";
     o.startTimeNanos = "foo";
-    o.value = buildUnnamed2008();
+    o.value = buildUnnamed2030();
   }
   buildCounterDataPoint--;
   return o;
@@ -354,19 +354,19 @@
     unittest.expect(o.originDataSourceId, unittest.equals('foo'));
     unittest.expect(o.rawTimestampNanos, unittest.equals('foo'));
     unittest.expect(o.startTimeNanos, unittest.equals('foo'));
-    checkUnnamed2008(o.value);
+    checkUnnamed2030(o.value);
   }
   buildCounterDataPoint--;
 }
 
-buildUnnamed2009() {
+buildUnnamed2031() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2009(core.List<core.String> o) {
+checkUnnamed2031(core.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 @@
   buildCounterDataSource++;
   if (buildCounterDataSource < 3) {
     o.application = buildApplication();
-    o.dataQualityStandard = buildUnnamed2009();
+    o.dataQualityStandard = buildUnnamed2031();
     o.dataStreamId = "foo";
     o.dataStreamName = "foo";
     o.dataType = buildDataType();
@@ -394,7 +394,7 @@
   buildCounterDataSource++;
   if (buildCounterDataSource < 3) {
     checkApplication(o.application);
-    checkUnnamed2009(o.dataQualityStandard);
+    checkUnnamed2031(o.dataQualityStandard);
     unittest.expect(o.dataStreamId, unittest.equals('foo'));
     unittest.expect(o.dataStreamName, unittest.equals('foo'));
     checkDataType(o.dataType);
@@ -405,14 +405,14 @@
   buildCounterDataSource--;
 }
 
-buildUnnamed2010() {
+buildUnnamed2032() {
   var o = new core.List<api.DataTypeField>();
   o.add(buildDataTypeField());
   o.add(buildDataTypeField());
   return o;
 }
 
-checkUnnamed2010(core.List<api.DataTypeField> o) {
+checkUnnamed2032(core.List<api.DataTypeField> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataTypeField(o[0]);
   checkDataTypeField(o[1]);
@@ -423,7 +423,7 @@
   var o = new api.DataType();
   buildCounterDataType++;
   if (buildCounterDataType < 3) {
-    o.field = buildUnnamed2010();
+    o.field = buildUnnamed2032();
     o.name = "foo";
   }
   buildCounterDataType--;
@@ -433,7 +433,7 @@
 checkDataType(api.DataType o) {
   buildCounterDataType++;
   if (buildCounterDataType < 3) {
-    checkUnnamed2010(o.field);
+    checkUnnamed2032(o.field);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterDataType--;
@@ -462,14 +462,14 @@
   buildCounterDataTypeField--;
 }
 
-buildUnnamed2011() {
+buildUnnamed2033() {
   var o = new core.List<api.DataPoint>();
   o.add(buildDataPoint());
   o.add(buildDataPoint());
   return o;
 }
 
-checkUnnamed2011(core.List<api.DataPoint> o) {
+checkUnnamed2033(core.List<api.DataPoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataPoint(o[0]);
   checkDataPoint(o[1]);
@@ -484,7 +484,7 @@
     o.maxEndTimeNs = "foo";
     o.minStartTimeNs = "foo";
     o.nextPageToken = "foo";
-    o.point = buildUnnamed2011();
+    o.point = buildUnnamed2033();
   }
   buildCounterDataset--;
   return o;
@@ -497,7 +497,7 @@
     unittest.expect(o.maxEndTimeNs, unittest.equals('foo'));
     unittest.expect(o.minStartTimeNs, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2011(o.point);
+    checkUnnamed2033(o.point);
   }
   buildCounterDataset--;
 }
@@ -529,27 +529,27 @@
   buildCounterDevice--;
 }
 
-buildUnnamed2012() {
+buildUnnamed2034() {
   var o = new core.List<api.DataPoint>();
   o.add(buildDataPoint());
   o.add(buildDataPoint());
   return o;
 }
 
-checkUnnamed2012(core.List<api.DataPoint> o) {
+checkUnnamed2034(core.List<api.DataPoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataPoint(o[0]);
   checkDataPoint(o[1]);
 }
 
-buildUnnamed2013() {
+buildUnnamed2035() {
   var o = new core.List<api.DataPoint>();
   o.add(buildDataPoint());
   o.add(buildDataPoint());
   return o;
 }
 
-checkUnnamed2013(core.List<api.DataPoint> o) {
+checkUnnamed2035(core.List<api.DataPoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataPoint(o[0]);
   checkDataPoint(o[1]);
@@ -561,8 +561,8 @@
   buildCounterListDataPointChangesResponse++;
   if (buildCounterListDataPointChangesResponse < 3) {
     o.dataSourceId = "foo";
-    o.deletedDataPoint = buildUnnamed2012();
-    o.insertedDataPoint = buildUnnamed2013();
+    o.deletedDataPoint = buildUnnamed2034();
+    o.insertedDataPoint = buildUnnamed2035();
     o.nextPageToken = "foo";
   }
   buildCounterListDataPointChangesResponse--;
@@ -573,21 +573,21 @@
   buildCounterListDataPointChangesResponse++;
   if (buildCounterListDataPointChangesResponse < 3) {
     unittest.expect(o.dataSourceId, unittest.equals('foo'));
-    checkUnnamed2012(o.deletedDataPoint);
-    checkUnnamed2013(o.insertedDataPoint);
+    checkUnnamed2034(o.deletedDataPoint);
+    checkUnnamed2035(o.insertedDataPoint);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDataPointChangesResponse--;
 }
 
-buildUnnamed2014() {
+buildUnnamed2036() {
   var o = new core.List<api.DataSource>();
   o.add(buildDataSource());
   o.add(buildDataSource());
   return o;
 }
 
-checkUnnamed2014(core.List<api.DataSource> o) {
+checkUnnamed2036(core.List<api.DataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataSource(o[0]);
   checkDataSource(o[1]);
@@ -598,7 +598,7 @@
   var o = new api.ListDataSourcesResponse();
   buildCounterListDataSourcesResponse++;
   if (buildCounterListDataSourcesResponse < 3) {
-    o.dataSource = buildUnnamed2014();
+    o.dataSource = buildUnnamed2036();
   }
   buildCounterListDataSourcesResponse--;
   return o;
@@ -607,32 +607,32 @@
 checkListDataSourcesResponse(api.ListDataSourcesResponse o) {
   buildCounterListDataSourcesResponse++;
   if (buildCounterListDataSourcesResponse < 3) {
-    checkUnnamed2014(o.dataSource);
+    checkUnnamed2036(o.dataSource);
   }
   buildCounterListDataSourcesResponse--;
 }
 
-buildUnnamed2015() {
+buildUnnamed2037() {
   var o = new core.List<api.Session>();
   o.add(buildSession());
   o.add(buildSession());
   return o;
 }
 
-checkUnnamed2015(core.List<api.Session> o) {
+checkUnnamed2037(core.List<api.Session> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSession(o[0]);
   checkSession(o[1]);
 }
 
-buildUnnamed2016() {
+buildUnnamed2038() {
   var o = new core.List<api.Session>();
   o.add(buildSession());
   o.add(buildSession());
   return o;
 }
 
-checkUnnamed2016(core.List<api.Session> o) {
+checkUnnamed2038(core.List<api.Session> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSession(o[0]);
   checkSession(o[1]);
@@ -643,10 +643,10 @@
   var o = new api.ListSessionsResponse();
   buildCounterListSessionsResponse++;
   if (buildCounterListSessionsResponse < 3) {
-    o.deletedSession = buildUnnamed2015();
+    o.deletedSession = buildUnnamed2037();
     o.hasMoreData = true;
     o.nextPageToken = "foo";
-    o.session = buildUnnamed2016();
+    o.session = buildUnnamed2038();
   }
   buildCounterListSessionsResponse--;
   return o;
@@ -655,10 +655,10 @@
 checkListSessionsResponse(api.ListSessionsResponse o) {
   buildCounterListSessionsResponse++;
   if (buildCounterListSessionsResponse < 3) {
-    checkUnnamed2015(o.deletedSession);
+    checkUnnamed2037(o.deletedSession);
     unittest.expect(o.hasMoreData, unittest.isTrue);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2016(o.session);
+    checkUnnamed2038(o.session);
   }
   buildCounterListSessionsResponse--;
 }
@@ -717,14 +717,14 @@
   buildCounterSession--;
 }
 
-buildUnnamed2017() {
+buildUnnamed2039() {
   var o = new core.List<api.ValueMapValEntry>();
   o.add(buildValueMapValEntry());
   o.add(buildValueMapValEntry());
   return o;
 }
 
-checkUnnamed2017(core.List<api.ValueMapValEntry> o) {
+checkUnnamed2039(core.List<api.ValueMapValEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValueMapValEntry(o[0]);
   checkValueMapValEntry(o[1]);
@@ -737,7 +737,7 @@
   if (buildCounterValue < 3) {
     o.fpVal = 42.0;
     o.intVal = 42;
-    o.mapVal = buildUnnamed2017();
+    o.mapVal = buildUnnamed2039();
     o.stringVal = "foo";
   }
   buildCounterValue--;
@@ -749,7 +749,7 @@
   if (buildCounterValue < 3) {
     unittest.expect(o.fpVal, unittest.equals(42.0));
     unittest.expect(o.intVal, unittest.equals(42));
-    checkUnnamed2017(o.mapVal);
+    checkUnnamed2039(o.mapVal);
     unittest.expect(o.stringVal, unittest.equals('foo'));
   }
   buildCounterValue--;
@@ -776,14 +776,14 @@
   buildCounterValueMapValEntry--;
 }
 
-buildUnnamed2018() {
+buildUnnamed2040() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2018(core.List<core.String> o) {
+checkUnnamed2040(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1122,7 +1122,7 @@
       api.UsersDataSourcesResourceApi res =
           new api.FitnessApi(mock).users.dataSources;
       var arg_userId = "foo";
-      var arg_dataTypeName = buildUnnamed2018();
+      var arg_dataTypeName = buildUnnamed2040();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/fusiontables/v1_test.dart b/generated/googleapis/test/fusiontables/v1_test.dart
index 8b43433..1f9cc76 100644
--- a/generated/googleapis/test/fusiontables/v1_test.dart
+++ b/generated/googleapis/test/fusiontables/v1_test.dart
@@ -131,14 +131,14 @@
   buildCounterColumn--;
 }
 
-buildUnnamed3093() {
+buildUnnamed3119() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed3093(core.List<api.Column> o) {
+checkUnnamed3119(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -149,7 +149,7 @@
   var o = new api.ColumnList();
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    o.items = buildUnnamed3093();
+    o.items = buildUnnamed3119();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -161,7 +161,7 @@
 checkColumnList(api.ColumnList o) {
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    checkUnnamed3093(o.items);
+    checkUnnamed3119(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -169,7 +169,7 @@
   buildCounterColumnList--;
 }
 
-buildUnnamed3094() {
+buildUnnamed3120() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -184,7 +184,7 @@
   return o;
 }
 
-checkUnnamed3094(core.List<core.Object> o) {
+checkUnnamed3120(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map;
   unittest.expect(casted1, unittest.hasLength(3));
@@ -203,7 +203,7 @@
   var o = new api.Geometry();
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    o.geometries = buildUnnamed3094();
+    o.geometries = buildUnnamed3120();
     o.geometry = {
       'list': [1, 2, 3],
       'bool': true,
@@ -218,7 +218,7 @@
 checkGeometry(api.Geometry o) {
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    checkUnnamed3094(o.geometries);
+    checkUnnamed3120(o.geometries);
     var casted3 = (o.geometry) as core.Map;
     unittest.expect(casted3, unittest.hasLength(3));
     unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
@@ -250,30 +250,30 @@
   buildCounterImport--;
 }
 
-buildUnnamed3095() {
+buildUnnamed3121() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed3095(core.List<core.double> o) {
+checkUnnamed3121(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));
 }
 
-buildUnnamed3096() {
+buildUnnamed3122() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed3095());
-  o.add(buildUnnamed3095());
+  o.add(buildUnnamed3121());
+  o.add(buildUnnamed3121());
   return o;
 }
 
-checkUnnamed3096(core.List<core.List<core.double>> o) {
+checkUnnamed3122(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3095(o[0]);
-  checkUnnamed3095(o[1]);
+  checkUnnamed3121(o[0]);
+  checkUnnamed3121(o[1]);
 }
 
 core.int buildCounterLine = 0;
@@ -281,7 +281,7 @@
   var o = new api.Line();
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    o.coordinates = buildUnnamed3096();
+    o.coordinates = buildUnnamed3122();
     o.type = "foo";
   }
   buildCounterLine--;
@@ -291,7 +291,7 @@
 checkLine(api.Line o) {
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    checkUnnamed3096(o.coordinates);
+    checkUnnamed3122(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterLine--;
@@ -324,14 +324,14 @@
   buildCounterLineStyle--;
 }
 
-buildUnnamed3097() {
+buildUnnamed3123() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed3097(core.List<core.double> o) {
+checkUnnamed3123(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));
@@ -342,7 +342,7 @@
   var o = new api.Point();
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    o.coordinates = buildUnnamed3097();
+    o.coordinates = buildUnnamed3123();
     o.type = "foo";
   }
   buildCounterPoint--;
@@ -352,7 +352,7 @@
 checkPoint(api.Point o) {
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    checkUnnamed3097(o.coordinates);
+    checkUnnamed3123(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPoint--;
@@ -379,43 +379,43 @@
   buildCounterPointStyle--;
 }
 
-buildUnnamed3098() {
+buildUnnamed3124() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed3098(core.List<core.double> o) {
+checkUnnamed3124(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));
 }
 
-buildUnnamed3099() {
+buildUnnamed3125() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed3098());
-  o.add(buildUnnamed3098());
+  o.add(buildUnnamed3124());
+  o.add(buildUnnamed3124());
   return o;
 }
 
-checkUnnamed3099(core.List<core.List<core.double>> o) {
+checkUnnamed3125(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3098(o[0]);
-  checkUnnamed3098(o[1]);
+  checkUnnamed3124(o[0]);
+  checkUnnamed3124(o[1]);
 }
 
-buildUnnamed3100() {
+buildUnnamed3126() {
   var o = new core.List<core.List<core.List<core.double>>>();
-  o.add(buildUnnamed3099());
-  o.add(buildUnnamed3099());
+  o.add(buildUnnamed3125());
+  o.add(buildUnnamed3125());
   return o;
 }
 
-checkUnnamed3100(core.List<core.List<core.List<core.double>>> o) {
+checkUnnamed3126(core.List<core.List<core.List<core.double>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3099(o[0]);
-  checkUnnamed3099(o[1]);
+  checkUnnamed3125(o[0]);
+  checkUnnamed3125(o[1]);
 }
 
 core.int buildCounterPolygon = 0;
@@ -423,7 +423,7 @@
   var o = new api.Polygon();
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    o.coordinates = buildUnnamed3100();
+    o.coordinates = buildUnnamed3126();
     o.type = "foo";
   }
   buildCounterPolygon--;
@@ -433,7 +433,7 @@
 checkPolygon(api.Polygon o) {
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    checkUnnamed3100(o.coordinates);
+    checkUnnamed3126(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPolygon--;
@@ -472,20 +472,20 @@
   buildCounterPolygonStyle--;
 }
 
-buildUnnamed3101() {
+buildUnnamed3127() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3101(core.List<core.String> o) {
+checkUnnamed3127(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3102() {
+buildUnnamed3128() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -500,7 +500,7 @@
   return o;
 }
 
-checkUnnamed3102(core.List<core.Object> o) {
+checkUnnamed3128(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted4 = (o[0]) as core.Map;
   unittest.expect(casted4, unittest.hasLength(3));
@@ -514,17 +514,17 @@
   unittest.expect(casted5["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3103() {
+buildUnnamed3129() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed3102());
-  o.add(buildUnnamed3102());
+  o.add(buildUnnamed3128());
+  o.add(buildUnnamed3128());
   return o;
 }
 
-checkUnnamed3103(core.List<core.List<core.Object>> o) {
+checkUnnamed3129(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3102(o[0]);
-  checkUnnamed3102(o[1]);
+  checkUnnamed3128(o[0]);
+  checkUnnamed3128(o[1]);
 }
 
 core.int buildCounterSqlresponse = 0;
@@ -532,9 +532,9 @@
   var o = new api.Sqlresponse();
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    o.columns = buildUnnamed3101();
+    o.columns = buildUnnamed3127();
     o.kind = "foo";
-    o.rows = buildUnnamed3103();
+    o.rows = buildUnnamed3129();
   }
   buildCounterSqlresponse--;
   return o;
@@ -543,21 +543,21 @@
 checkSqlresponse(api.Sqlresponse o) {
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    checkUnnamed3101(o.columns);
+    checkUnnamed3127(o.columns);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3103(o.rows);
+    checkUnnamed3129(o.rows);
   }
   buildCounterSqlresponse--;
 }
 
-buildUnnamed3104() {
+buildUnnamed3130() {
   var o = new core.List<api.Bucket>();
   o.add(buildBucket());
   o.add(buildBucket());
   return o;
 }
 
-checkUnnamed3104(core.List<api.Bucket> o) {
+checkUnnamed3130(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucket(o[0]);
   checkBucket(o[1]);
@@ -584,14 +584,14 @@
   buildCounterStyleFunctionGradientColors--;
 }
 
-buildUnnamed3105() {
+buildUnnamed3131() {
   var o = new core.List<api.StyleFunctionGradientColors>();
   o.add(buildStyleFunctionGradientColors());
   o.add(buildStyleFunctionGradientColors());
   return o;
 }
 
-checkUnnamed3105(core.List<api.StyleFunctionGradientColors> o) {
+checkUnnamed3131(core.List<api.StyleFunctionGradientColors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleFunctionGradientColors(o[0]);
   checkStyleFunctionGradientColors(o[1]);
@@ -602,7 +602,7 @@
   var o = new api.StyleFunctionGradient();
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    o.colors = buildUnnamed3105();
+    o.colors = buildUnnamed3131();
     o.max = 42.0;
     o.min = 42.0;
   }
@@ -613,7 +613,7 @@
 checkStyleFunctionGradient(api.StyleFunctionGradient o) {
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    checkUnnamed3105(o.colors);
+    checkUnnamed3131(o.colors);
     unittest.expect(o.max, unittest.equals(42.0));
     unittest.expect(o.min, unittest.equals(42.0));
   }
@@ -625,7 +625,7 @@
   var o = new api.StyleFunction();
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    o.buckets = buildUnnamed3104();
+    o.buckets = buildUnnamed3130();
     o.columnName = "foo";
     o.gradient = buildStyleFunctionGradient();
     o.kind = "foo";
@@ -637,7 +637,7 @@
 checkStyleFunction(api.StyleFunction o) {
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    checkUnnamed3104(o.buckets);
+    checkUnnamed3130(o.buckets);
     unittest.expect(o.columnName, unittest.equals('foo'));
     checkStyleFunctionGradient(o.gradient);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -676,14 +676,14 @@
   buildCounterStyleSetting--;
 }
 
-buildUnnamed3106() {
+buildUnnamed3132() {
   var o = new core.List<api.StyleSetting>();
   o.add(buildStyleSetting());
   o.add(buildStyleSetting());
   return o;
 }
 
-checkUnnamed3106(core.List<api.StyleSetting> o) {
+checkUnnamed3132(core.List<api.StyleSetting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleSetting(o[0]);
   checkStyleSetting(o[1]);
@@ -694,7 +694,7 @@
   var o = new api.StyleSettingList();
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    o.items = buildUnnamed3106();
+    o.items = buildUnnamed3132();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -706,7 +706,7 @@
 checkStyleSettingList(api.StyleSettingList o) {
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    checkUnnamed3106(o.items);
+    checkUnnamed3132(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -714,27 +714,27 @@
   buildCounterStyleSettingList--;
 }
 
-buildUnnamed3107() {
+buildUnnamed3133() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3107(core.List<core.String> o) {
+checkUnnamed3133(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3108() {
+buildUnnamed3134() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed3108(core.List<api.Column> o) {
+checkUnnamed3134(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -747,8 +747,8 @@
   if (buildCounterTable < 3) {
     o.attribution = "foo";
     o.attributionLink = "foo";
-    o.baseTableIds = buildUnnamed3107();
-    o.columns = buildUnnamed3108();
+    o.baseTableIds = buildUnnamed3133();
+    o.columns = buildUnnamed3134();
     o.description = "foo";
     o.isExportable = true;
     o.kind = "foo";
@@ -765,8 +765,8 @@
   if (buildCounterTable < 3) {
     unittest.expect(o.attribution, unittest.equals('foo'));
     unittest.expect(o.attributionLink, unittest.equals('foo'));
-    checkUnnamed3107(o.baseTableIds);
-    checkUnnamed3108(o.columns);
+    checkUnnamed3133(o.baseTableIds);
+    checkUnnamed3134(o.columns);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.isExportable, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -777,14 +777,14 @@
   buildCounterTable--;
 }
 
-buildUnnamed3109() {
+buildUnnamed3135() {
   var o = new core.List<api.Table>();
   o.add(buildTable());
   o.add(buildTable());
   return o;
 }
 
-checkUnnamed3109(core.List<api.Table> o) {
+checkUnnamed3135(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTable(o[0]);
   checkTable(o[1]);
@@ -795,7 +795,7 @@
   var o = new api.TableList();
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    o.items = buildUnnamed3109();
+    o.items = buildUnnamed3135();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -806,7 +806,7 @@
 checkTableList(api.TableList o) {
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    checkUnnamed3109(o.items);
+    checkUnnamed3135(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -840,14 +840,14 @@
   buildCounterTask--;
 }
 
-buildUnnamed3110() {
+buildUnnamed3136() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed3110(core.List<api.Task> o) {
+checkUnnamed3136(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -858,7 +858,7 @@
   var o = new api.TaskList();
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    o.items = buildUnnamed3110();
+    o.items = buildUnnamed3136();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -870,7 +870,7 @@
 checkTaskList(api.TaskList o) {
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    checkUnnamed3110(o.items);
+    checkUnnamed3136(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -878,14 +878,14 @@
   buildCounterTaskList--;
 }
 
-buildUnnamed3111() {
+buildUnnamed3137() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3111(core.List<core.String> o) {
+checkUnnamed3137(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -896,7 +896,7 @@
   var o = new api.Template();
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    o.automaticColumnNames = buildUnnamed3111();
+    o.automaticColumnNames = buildUnnamed3137();
     o.body = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -910,7 +910,7 @@
 checkTemplate(api.Template o) {
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    checkUnnamed3111(o.automaticColumnNames);
+    checkUnnamed3137(o.automaticColumnNames);
     unittest.expect(o.body, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -920,14 +920,14 @@
   buildCounterTemplate--;
 }
 
-buildUnnamed3112() {
+buildUnnamed3138() {
   var o = new core.List<api.Template>();
   o.add(buildTemplate());
   o.add(buildTemplate());
   return o;
 }
 
-checkUnnamed3112(core.List<api.Template> o) {
+checkUnnamed3138(core.List<api.Template> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTemplate(o[0]);
   checkTemplate(o[1]);
@@ -938,7 +938,7 @@
   var o = new api.TemplateList();
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    o.items = buildUnnamed3112();
+    o.items = buildUnnamed3138();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -950,7 +950,7 @@
 checkTemplateList(api.TemplateList o) {
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    checkUnnamed3112(o.items);
+    checkUnnamed3138(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/fusiontables/v2_test.dart b/generated/googleapis/test/fusiontables/v2_test.dart
index 948f474..5fdaa5a 100644
--- a/generated/googleapis/test/fusiontables/v2_test.dart
+++ b/generated/googleapis/test/fusiontables/v2_test.dart
@@ -100,14 +100,14 @@
   buildCounterColumnBaseColumn--;
 }
 
-buildUnnamed512() {
+buildUnnamed510() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed512(core.List<core.String> o) {
+checkUnnamed510(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -128,7 +128,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.type = "foo";
-    o.validValues = buildUnnamed512();
+    o.validValues = buildUnnamed510();
     o.validateData = true;
   }
   buildCounterColumn--;
@@ -148,20 +148,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    checkUnnamed512(o.validValues);
+    checkUnnamed510(o.validValues);
     unittest.expect(o.validateData, unittest.isTrue);
   }
   buildCounterColumn--;
 }
 
-buildUnnamed513() {
+buildUnnamed511() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed513(core.List<api.Column> o) {
+checkUnnamed511(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -172,7 +172,7 @@
   var o = new api.ColumnList();
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    o.items = buildUnnamed513();
+    o.items = buildUnnamed511();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -184,7 +184,7 @@
 checkColumnList(api.ColumnList o) {
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    checkUnnamed513(o.items);
+    checkUnnamed511(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -192,7 +192,7 @@
   buildCounterColumnList--;
 }
 
-buildUnnamed514() {
+buildUnnamed512() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -207,7 +207,7 @@
   return o;
 }
 
-checkUnnamed514(core.List<core.Object> o) {
+checkUnnamed512(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map;
   unittest.expect(casted1, unittest.hasLength(3));
@@ -226,7 +226,7 @@
   var o = new api.Geometry();
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    o.geometries = buildUnnamed514();
+    o.geometries = buildUnnamed512();
     o.geometry = {
       'list': [1, 2, 3],
       'bool': true,
@@ -241,7 +241,7 @@
 checkGeometry(api.Geometry o) {
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    checkUnnamed514(o.geometries);
+    checkUnnamed512(o.geometries);
     var casted3 = (o.geometry) as core.Map;
     unittest.expect(casted3, unittest.hasLength(3));
     unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
@@ -273,30 +273,30 @@
   buildCounterImport--;
 }
 
-buildUnnamed515() {
+buildUnnamed513() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed515(core.List<core.double> o) {
+checkUnnamed513(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));
 }
 
-buildUnnamed516() {
+buildUnnamed514() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed515());
-  o.add(buildUnnamed515());
+  o.add(buildUnnamed513());
+  o.add(buildUnnamed513());
   return o;
 }
 
-checkUnnamed516(core.List<core.List<core.double>> o) {
+checkUnnamed514(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed515(o[0]);
-  checkUnnamed515(o[1]);
+  checkUnnamed513(o[0]);
+  checkUnnamed513(o[1]);
 }
 
 core.int buildCounterLine = 0;
@@ -304,7 +304,7 @@
   var o = new api.Line();
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    o.coordinates = buildUnnamed516();
+    o.coordinates = buildUnnamed514();
     o.type = "foo";
   }
   buildCounterLine--;
@@ -314,7 +314,7 @@
 checkLine(api.Line o) {
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    checkUnnamed516(o.coordinates);
+    checkUnnamed514(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterLine--;
@@ -347,14 +347,14 @@
   buildCounterLineStyle--;
 }
 
-buildUnnamed517() {
+buildUnnamed515() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed517(core.List<core.double> o) {
+checkUnnamed515(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));
@@ -365,7 +365,7 @@
   var o = new api.Point();
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    o.coordinates = buildUnnamed517();
+    o.coordinates = buildUnnamed515();
     o.type = "foo";
   }
   buildCounterPoint--;
@@ -375,7 +375,7 @@
 checkPoint(api.Point o) {
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    checkUnnamed517(o.coordinates);
+    checkUnnamed515(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPoint--;
@@ -402,43 +402,43 @@
   buildCounterPointStyle--;
 }
 
-buildUnnamed518() {
+buildUnnamed516() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed518(core.List<core.double> o) {
+checkUnnamed516(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));
 }
 
-buildUnnamed519() {
+buildUnnamed517() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed518());
-  o.add(buildUnnamed518());
+  o.add(buildUnnamed516());
+  o.add(buildUnnamed516());
   return o;
 }
 
-checkUnnamed519(core.List<core.List<core.double>> o) {
+checkUnnamed517(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed518(o[0]);
-  checkUnnamed518(o[1]);
+  checkUnnamed516(o[0]);
+  checkUnnamed516(o[1]);
 }
 
-buildUnnamed520() {
+buildUnnamed518() {
   var o = new core.List<core.List<core.List<core.double>>>();
-  o.add(buildUnnamed519());
-  o.add(buildUnnamed519());
+  o.add(buildUnnamed517());
+  o.add(buildUnnamed517());
   return o;
 }
 
-checkUnnamed520(core.List<core.List<core.List<core.double>>> o) {
+checkUnnamed518(core.List<core.List<core.List<core.double>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed519(o[0]);
-  checkUnnamed519(o[1]);
+  checkUnnamed517(o[0]);
+  checkUnnamed517(o[1]);
 }
 
 core.int buildCounterPolygon = 0;
@@ -446,7 +446,7 @@
   var o = new api.Polygon();
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    o.coordinates = buildUnnamed520();
+    o.coordinates = buildUnnamed518();
     o.type = "foo";
   }
   buildCounterPolygon--;
@@ -456,7 +456,7 @@
 checkPolygon(api.Polygon o) {
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    checkUnnamed520(o.coordinates);
+    checkUnnamed518(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPolygon--;
@@ -495,20 +495,20 @@
   buildCounterPolygonStyle--;
 }
 
-buildUnnamed521() {
+buildUnnamed519() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed521(core.List<core.String> o) {
+checkUnnamed519(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed522() {
+buildUnnamed520() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -523,7 +523,7 @@
   return o;
 }
 
-checkUnnamed522(core.List<core.Object> o) {
+checkUnnamed520(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted4 = (o[0]) as core.Map;
   unittest.expect(casted4, unittest.hasLength(3));
@@ -537,17 +537,17 @@
   unittest.expect(casted5["string"], unittest.equals('foo'));
 }
 
-buildUnnamed523() {
+buildUnnamed521() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed522());
-  o.add(buildUnnamed522());
+  o.add(buildUnnamed520());
+  o.add(buildUnnamed520());
   return o;
 }
 
-checkUnnamed523(core.List<core.List<core.Object>> o) {
+checkUnnamed521(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed522(o[0]);
-  checkUnnamed522(o[1]);
+  checkUnnamed520(o[0]);
+  checkUnnamed520(o[1]);
 }
 
 core.int buildCounterSqlresponse = 0;
@@ -555,9 +555,9 @@
   var o = new api.Sqlresponse();
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    o.columns = buildUnnamed521();
+    o.columns = buildUnnamed519();
     o.kind = "foo";
-    o.rows = buildUnnamed523();
+    o.rows = buildUnnamed521();
   }
   buildCounterSqlresponse--;
   return o;
@@ -566,21 +566,21 @@
 checkSqlresponse(api.Sqlresponse o) {
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    checkUnnamed521(o.columns);
+    checkUnnamed519(o.columns);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed523(o.rows);
+    checkUnnamed521(o.rows);
   }
   buildCounterSqlresponse--;
 }
 
-buildUnnamed524() {
+buildUnnamed522() {
   var o = new core.List<api.Bucket>();
   o.add(buildBucket());
   o.add(buildBucket());
   return o;
 }
 
-checkUnnamed524(core.List<api.Bucket> o) {
+checkUnnamed522(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucket(o[0]);
   checkBucket(o[1]);
@@ -607,14 +607,14 @@
   buildCounterStyleFunctionGradientColors--;
 }
 
-buildUnnamed525() {
+buildUnnamed523() {
   var o = new core.List<api.StyleFunctionGradientColors>();
   o.add(buildStyleFunctionGradientColors());
   o.add(buildStyleFunctionGradientColors());
   return o;
 }
 
-checkUnnamed525(core.List<api.StyleFunctionGradientColors> o) {
+checkUnnamed523(core.List<api.StyleFunctionGradientColors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleFunctionGradientColors(o[0]);
   checkStyleFunctionGradientColors(o[1]);
@@ -625,7 +625,7 @@
   var o = new api.StyleFunctionGradient();
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    o.colors = buildUnnamed525();
+    o.colors = buildUnnamed523();
     o.max = 42.0;
     o.min = 42.0;
   }
@@ -636,7 +636,7 @@
 checkStyleFunctionGradient(api.StyleFunctionGradient o) {
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    checkUnnamed525(o.colors);
+    checkUnnamed523(o.colors);
     unittest.expect(o.max, unittest.equals(42.0));
     unittest.expect(o.min, unittest.equals(42.0));
   }
@@ -648,7 +648,7 @@
   var o = new api.StyleFunction();
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    o.buckets = buildUnnamed524();
+    o.buckets = buildUnnamed522();
     o.columnName = "foo";
     o.gradient = buildStyleFunctionGradient();
     o.kind = "foo";
@@ -660,7 +660,7 @@
 checkStyleFunction(api.StyleFunction o) {
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    checkUnnamed524(o.buckets);
+    checkUnnamed522(o.buckets);
     unittest.expect(o.columnName, unittest.equals('foo'));
     checkStyleFunctionGradient(o.gradient);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -699,14 +699,14 @@
   buildCounterStyleSetting--;
 }
 
-buildUnnamed526() {
+buildUnnamed524() {
   var o = new core.List<api.StyleSetting>();
   o.add(buildStyleSetting());
   o.add(buildStyleSetting());
   return o;
 }
 
-checkUnnamed526(core.List<api.StyleSetting> o) {
+checkUnnamed524(core.List<api.StyleSetting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleSetting(o[0]);
   checkStyleSetting(o[1]);
@@ -717,7 +717,7 @@
   var o = new api.StyleSettingList();
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    o.items = buildUnnamed526();
+    o.items = buildUnnamed524();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -729,7 +729,7 @@
 checkStyleSettingList(api.StyleSettingList o) {
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    checkUnnamed526(o.items);
+    checkUnnamed524(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -737,27 +737,27 @@
   buildCounterStyleSettingList--;
 }
 
-buildUnnamed527() {
+buildUnnamed525() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed527(core.List<core.String> o) {
+checkUnnamed525(core.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() {
+buildUnnamed526() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed528(core.List<api.Column> o) {
+checkUnnamed526(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -770,9 +770,9 @@
   if (buildCounterTable < 3) {
     o.attribution = "foo";
     o.attributionLink = "foo";
-    o.baseTableIds = buildUnnamed527();
+    o.baseTableIds = buildUnnamed525();
     o.columnPropertiesJsonSchema = "foo";
-    o.columns = buildUnnamed528();
+    o.columns = buildUnnamed526();
     o.description = "foo";
     o.isExportable = true;
     o.kind = "foo";
@@ -791,9 +791,9 @@
   if (buildCounterTable < 3) {
     unittest.expect(o.attribution, unittest.equals('foo'));
     unittest.expect(o.attributionLink, unittest.equals('foo'));
-    checkUnnamed527(o.baseTableIds);
+    checkUnnamed525(o.baseTableIds);
     unittest.expect(o.columnPropertiesJsonSchema, unittest.equals('foo'));
-    checkUnnamed528(o.columns);
+    checkUnnamed526(o.columns);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.isExportable, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -806,14 +806,14 @@
   buildCounterTable--;
 }
 
-buildUnnamed529() {
+buildUnnamed527() {
   var o = new core.List<api.Table>();
   o.add(buildTable());
   o.add(buildTable());
   return o;
 }
 
-checkUnnamed529(core.List<api.Table> o) {
+checkUnnamed527(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTable(o[0]);
   checkTable(o[1]);
@@ -824,7 +824,7 @@
   var o = new api.TableList();
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    o.items = buildUnnamed529();
+    o.items = buildUnnamed527();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -835,7 +835,7 @@
 checkTableList(api.TableList o) {
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    checkUnnamed529(o.items);
+    checkUnnamed527(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -869,14 +869,14 @@
   buildCounterTask--;
 }
 
-buildUnnamed530() {
+buildUnnamed528() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed530(core.List<api.Task> o) {
+checkUnnamed528(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -887,7 +887,7 @@
   var o = new api.TaskList();
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    o.items = buildUnnamed530();
+    o.items = buildUnnamed528();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -899,7 +899,7 @@
 checkTaskList(api.TaskList o) {
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    checkUnnamed530(o.items);
+    checkUnnamed528(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -907,14 +907,14 @@
   buildCounterTaskList--;
 }
 
-buildUnnamed531() {
+buildUnnamed529() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed531(core.List<core.String> o) {
+checkUnnamed529(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -925,7 +925,7 @@
   var o = new api.Template();
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    o.automaticColumnNames = buildUnnamed531();
+    o.automaticColumnNames = buildUnnamed529();
     o.body = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -939,7 +939,7 @@
 checkTemplate(api.Template o) {
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    checkUnnamed531(o.automaticColumnNames);
+    checkUnnamed529(o.automaticColumnNames);
     unittest.expect(o.body, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -949,14 +949,14 @@
   buildCounterTemplate--;
 }
 
-buildUnnamed532() {
+buildUnnamed530() {
   var o = new core.List<api.Template>();
   o.add(buildTemplate());
   o.add(buildTemplate());
   return o;
 }
 
-checkUnnamed532(core.List<api.Template> o) {
+checkUnnamed530(core.List<api.Template> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTemplate(o[0]);
   checkTemplate(o[1]);
@@ -967,7 +967,7 @@
   var o = new api.TemplateList();
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    o.items = buildUnnamed532();
+    o.items = buildUnnamed530();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -979,7 +979,7 @@
 checkTemplateList(api.TemplateList o) {
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    checkUnnamed532(o.items);
+    checkUnnamed530(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 5ce011e..1a83187 100644
--- a/generated/googleapis/test/games/v1_test.dart
+++ b/generated/googleapis/test/games/v1_test.dart
@@ -93,14 +93,14 @@
   buildCounterAchievementDefinition--;
 }
 
-buildUnnamed81() {
+buildUnnamed75() {
   var o = new core.List<api.AchievementDefinition>();
   o.add(buildAchievementDefinition());
   o.add(buildAchievementDefinition());
   return o;
 }
 
-checkUnnamed81(core.List<api.AchievementDefinition> o) {
+checkUnnamed75(core.List<api.AchievementDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementDefinition(o[0]);
   checkAchievementDefinition(o[1]);
@@ -111,7 +111,7 @@
   var o = new api.AchievementDefinitionsListResponse();
   buildCounterAchievementDefinitionsListResponse++;
   if (buildCounterAchievementDefinitionsListResponse < 3) {
-    o.items = buildUnnamed81();
+    o.items = buildUnnamed75();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -123,7 +123,7 @@
     api.AchievementDefinitionsListResponse o) {
   buildCounterAchievementDefinitionsListResponse++;
   if (buildCounterAchievementDefinitionsListResponse < 3) {
-    checkUnnamed81(o.items);
+    checkUnnamed75(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -219,14 +219,14 @@
   buildCounterAchievementUnlockResponse--;
 }
 
-buildUnnamed82() {
+buildUnnamed76() {
   var o = new core.List<api.AchievementUpdateRequest>();
   o.add(buildAchievementUpdateRequest());
   o.add(buildAchievementUpdateRequest());
   return o;
 }
 
-checkUnnamed82(core.List<api.AchievementUpdateRequest> o) {
+checkUnnamed76(core.List<api.AchievementUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementUpdateRequest(o[0]);
   checkAchievementUpdateRequest(o[1]);
@@ -238,7 +238,7 @@
   buildCounterAchievementUpdateMultipleRequest++;
   if (buildCounterAchievementUpdateMultipleRequest < 3) {
     o.kind = "foo";
-    o.updates = buildUnnamed82();
+    o.updates = buildUnnamed76();
   }
   buildCounterAchievementUpdateMultipleRequest--;
   return o;
@@ -248,19 +248,19 @@
   buildCounterAchievementUpdateMultipleRequest++;
   if (buildCounterAchievementUpdateMultipleRequest < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed82(o.updates);
+    checkUnnamed76(o.updates);
   }
   buildCounterAchievementUpdateMultipleRequest--;
 }
 
-buildUnnamed83() {
+buildUnnamed77() {
   var o = new core.List<api.AchievementUpdateResponse>();
   o.add(buildAchievementUpdateResponse());
   o.add(buildAchievementUpdateResponse());
   return o;
 }
 
-checkUnnamed83(core.List<api.AchievementUpdateResponse> o) {
+checkUnnamed77(core.List<api.AchievementUpdateResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementUpdateResponse(o[0]);
   checkAchievementUpdateResponse(o[1]);
@@ -272,7 +272,7 @@
   buildCounterAchievementUpdateMultipleResponse++;
   if (buildCounterAchievementUpdateMultipleResponse < 3) {
     o.kind = "foo";
-    o.updatedAchievements = buildUnnamed83();
+    o.updatedAchievements = buildUnnamed77();
   }
   buildCounterAchievementUpdateMultipleResponse--;
   return o;
@@ -283,7 +283,7 @@
   buildCounterAchievementUpdateMultipleResponse++;
   if (buildCounterAchievementUpdateMultipleResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed83(o.updatedAchievements);
+    checkUnnamed77(o.updatedAchievements);
   }
   buildCounterAchievementUpdateMultipleResponse--;
 }
@@ -394,40 +394,40 @@
   buildCounterAnonymousPlayer--;
 }
 
-buildUnnamed84() {
+buildUnnamed78() {
   var o = new core.List<api.ImageAsset>();
   o.add(buildImageAsset());
   o.add(buildImageAsset());
   return o;
 }
 
-checkUnnamed84(core.List<api.ImageAsset> o) {
+checkUnnamed78(core.List<api.ImageAsset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImageAsset(o[0]);
   checkImageAsset(o[1]);
 }
 
-buildUnnamed85() {
+buildUnnamed79() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed85(core.List<core.String> o) {
+checkUnnamed79(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed86() {
+buildUnnamed80() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed86(core.List<api.Instance> o) {
+checkUnnamed80(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -439,13 +439,13 @@
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
     o.achievementCount = 42;
-    o.assets = buildUnnamed84();
+    o.assets = buildUnnamed78();
     o.author = "foo";
     o.category = buildApplicationCategory();
     o.description = "foo";
-    o.enabledFeatures = buildUnnamed85();
+    o.enabledFeatures = buildUnnamed79();
     o.id = "foo";
-    o.instances = buildUnnamed86();
+    o.instances = buildUnnamed80();
     o.kind = "foo";
     o.lastUpdatedTimestamp = "foo";
     o.leaderboardCount = 42;
@@ -460,13 +460,13 @@
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
     unittest.expect(o.achievementCount, unittest.equals(42));
-    checkUnnamed84(o.assets);
+    checkUnnamed78(o.assets);
     unittest.expect(o.author, unittest.equals('foo'));
     checkApplicationCategory(o.category);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed85(o.enabledFeatures);
+    checkUnnamed79(o.enabledFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed86(o.instances);
+    checkUnnamed80(o.instances);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastUpdatedTimestamp, unittest.equals('foo'));
     unittest.expect(o.leaderboardCount, unittest.equals(42));
@@ -545,14 +545,14 @@
   buildCounterCategory--;
 }
 
-buildUnnamed87() {
+buildUnnamed81() {
   var o = new core.List<api.Category>();
   o.add(buildCategory());
   o.add(buildCategory());
   return o;
 }
 
-checkUnnamed87(core.List<api.Category> o) {
+checkUnnamed81(core.List<api.Category> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCategory(o[0]);
   checkCategory(o[1]);
@@ -563,7 +563,7 @@
   var o = new api.CategoryListResponse();
   buildCounterCategoryListResponse++;
   if (buildCounterCategoryListResponse < 3) {
-    o.items = buildUnnamed87();
+    o.items = buildUnnamed81();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -574,7 +574,7 @@
 checkCategoryListResponse(api.CategoryListResponse o) {
   buildCounterCategoryListResponse++;
   if (buildCounterCategoryListResponse < 3) {
-    checkUnnamed87(o.items);
+    checkUnnamed81(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -625,14 +625,14 @@
   buildCounterEventChild--;
 }
 
-buildUnnamed88() {
+buildUnnamed82() {
   var o = new core.List<api.EventChild>();
   o.add(buildEventChild());
   o.add(buildEventChild());
   return o;
 }
 
-checkUnnamed88(core.List<api.EventChild> o) {
+checkUnnamed82(core.List<api.EventChild> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventChild(o[0]);
   checkEventChild(o[1]);
@@ -643,7 +643,7 @@
   var o = new api.EventDefinition();
   buildCounterEventDefinition++;
   if (buildCounterEventDefinition < 3) {
-    o.childEvents = buildUnnamed88();
+    o.childEvents = buildUnnamed82();
     o.description = "foo";
     o.displayName = "foo";
     o.id = "foo";
@@ -659,7 +659,7 @@
 checkEventDefinition(api.EventDefinition o) {
   buildCounterEventDefinition++;
   if (buildCounterEventDefinition < 3) {
-    checkUnnamed88(o.childEvents);
+    checkUnnamed82(o.childEvents);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -671,14 +671,14 @@
   buildCounterEventDefinition--;
 }
 
-buildUnnamed89() {
+buildUnnamed83() {
   var o = new core.List<api.EventDefinition>();
   o.add(buildEventDefinition());
   o.add(buildEventDefinition());
   return o;
 }
 
-checkUnnamed89(core.List<api.EventDefinition> o) {
+checkUnnamed83(core.List<api.EventDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventDefinition(o[0]);
   checkEventDefinition(o[1]);
@@ -689,7 +689,7 @@
   var o = new api.EventDefinitionListResponse();
   buildCounterEventDefinitionListResponse++;
   if (buildCounterEventDefinitionListResponse < 3) {
-    o.items = buildUnnamed89();
+    o.items = buildUnnamed83();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -700,7 +700,7 @@
 checkEventDefinitionListResponse(api.EventDefinitionListResponse o) {
   buildCounterEventDefinitionListResponse++;
   if (buildCounterEventDefinitionListResponse < 3) {
-    checkUnnamed89(o.items);
+    checkUnnamed83(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -730,14 +730,14 @@
   buildCounterEventPeriodRange--;
 }
 
-buildUnnamed90() {
+buildUnnamed84() {
   var o = new core.List<api.EventUpdateRequest>();
   o.add(buildEventUpdateRequest());
   o.add(buildEventUpdateRequest());
   return o;
 }
 
-checkUnnamed90(core.List<api.EventUpdateRequest> o) {
+checkUnnamed84(core.List<api.EventUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventUpdateRequest(o[0]);
   checkEventUpdateRequest(o[1]);
@@ -750,7 +750,7 @@
   if (buildCounterEventPeriodUpdate < 3) {
     o.kind = "foo";
     o.timePeriod = buildEventPeriodRange();
-    o.updates = buildUnnamed90();
+    o.updates = buildUnnamed84();
   }
   buildCounterEventPeriodUpdate--;
   return o;
@@ -761,7 +761,7 @@
   if (buildCounterEventPeriodUpdate < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     checkEventPeriodRange(o.timePeriod);
-    checkUnnamed90(o.updates);
+    checkUnnamed84(o.updates);
   }
   buildCounterEventPeriodUpdate--;
 }
@@ -789,14 +789,14 @@
   buildCounterEventRecordFailure--;
 }
 
-buildUnnamed91() {
+buildUnnamed85() {
   var o = new core.List<api.EventPeriodUpdate>();
   o.add(buildEventPeriodUpdate());
   o.add(buildEventPeriodUpdate());
   return o;
 }
 
-checkUnnamed91(core.List<api.EventPeriodUpdate> o) {
+checkUnnamed85(core.List<api.EventPeriodUpdate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventPeriodUpdate(o[0]);
   checkEventPeriodUpdate(o[1]);
@@ -810,7 +810,7 @@
     o.currentTimeMillis = "foo";
     o.kind = "foo";
     o.requestId = "foo";
-    o.timePeriods = buildUnnamed91();
+    o.timePeriods = buildUnnamed85();
   }
   buildCounterEventRecordRequest--;
   return o;
@@ -822,7 +822,7 @@
     unittest.expect(o.currentTimeMillis, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed91(o.timePeriods);
+    checkUnnamed85(o.timePeriods);
   }
   buildCounterEventRecordRequest--;
 }
@@ -850,40 +850,40 @@
   buildCounterEventUpdateRequest--;
 }
 
-buildUnnamed92() {
+buildUnnamed86() {
   var o = new core.List<api.EventBatchRecordFailure>();
   o.add(buildEventBatchRecordFailure());
   o.add(buildEventBatchRecordFailure());
   return o;
 }
 
-checkUnnamed92(core.List<api.EventBatchRecordFailure> o) {
+checkUnnamed86(core.List<api.EventBatchRecordFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventBatchRecordFailure(o[0]);
   checkEventBatchRecordFailure(o[1]);
 }
 
-buildUnnamed93() {
+buildUnnamed87() {
   var o = new core.List<api.EventRecordFailure>();
   o.add(buildEventRecordFailure());
   o.add(buildEventRecordFailure());
   return o;
 }
 
-checkUnnamed93(core.List<api.EventRecordFailure> o) {
+checkUnnamed87(core.List<api.EventRecordFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventRecordFailure(o[0]);
   checkEventRecordFailure(o[1]);
 }
 
-buildUnnamed94() {
+buildUnnamed88() {
   var o = new core.List<api.PlayerEvent>();
   o.add(buildPlayerEvent());
   o.add(buildPlayerEvent());
   return o;
 }
 
-checkUnnamed94(core.List<api.PlayerEvent> o) {
+checkUnnamed88(core.List<api.PlayerEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerEvent(o[0]);
   checkPlayerEvent(o[1]);
@@ -894,10 +894,10 @@
   var o = new api.EventUpdateResponse();
   buildCounterEventUpdateResponse++;
   if (buildCounterEventUpdateResponse < 3) {
-    o.batchFailures = buildUnnamed92();
-    o.eventFailures = buildUnnamed93();
+    o.batchFailures = buildUnnamed86();
+    o.eventFailures = buildUnnamed87();
     o.kind = "foo";
-    o.playerEvents = buildUnnamed94();
+    o.playerEvents = buildUnnamed88();
   }
   buildCounterEventUpdateResponse--;
   return o;
@@ -906,10 +906,10 @@
 checkEventUpdateResponse(api.EventUpdateResponse o) {
   buildCounterEventUpdateResponse++;
   if (buildCounterEventUpdateResponse < 3) {
-    checkUnnamed92(o.batchFailures);
-    checkUnnamed93(o.eventFailures);
+    checkUnnamed86(o.batchFailures);
+    checkUnnamed87(o.eventFailures);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed94(o.playerEvents);
+    checkUnnamed88(o.playerEvents);
   }
   buildCounterEventUpdateResponse--;
 }
@@ -1163,14 +1163,14 @@
   buildCounterLeaderboardEntry--;
 }
 
-buildUnnamed95() {
+buildUnnamed89() {
   var o = new core.List<api.Leaderboard>();
   o.add(buildLeaderboard());
   o.add(buildLeaderboard());
   return o;
 }
 
-checkUnnamed95(core.List<api.Leaderboard> o) {
+checkUnnamed89(core.List<api.Leaderboard> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLeaderboard(o[0]);
   checkLeaderboard(o[1]);
@@ -1181,7 +1181,7 @@
   var o = new api.LeaderboardListResponse();
   buildCounterLeaderboardListResponse++;
   if (buildCounterLeaderboardListResponse < 3) {
-    o.items = buildUnnamed95();
+    o.items = buildUnnamed89();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1192,7 +1192,7 @@
 checkLeaderboardListResponse(api.LeaderboardListResponse o) {
   buildCounterLeaderboardListResponse++;
   if (buildCounterLeaderboardListResponse < 3) {
-    checkUnnamed95(o.items);
+    checkUnnamed89(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1226,14 +1226,14 @@
   buildCounterLeaderboardScoreRank--;
 }
 
-buildUnnamed96() {
+buildUnnamed90() {
   var o = new core.List<api.LeaderboardEntry>();
   o.add(buildLeaderboardEntry());
   o.add(buildLeaderboardEntry());
   return o;
 }
 
-checkUnnamed96(core.List<api.LeaderboardEntry> o) {
+checkUnnamed90(core.List<api.LeaderboardEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLeaderboardEntry(o[0]);
   checkLeaderboardEntry(o[1]);
@@ -1244,7 +1244,7 @@
   var o = new api.LeaderboardScores();
   buildCounterLeaderboardScores++;
   if (buildCounterLeaderboardScores < 3) {
-    o.items = buildUnnamed96();
+    o.items = buildUnnamed90();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.numScores = "foo";
@@ -1258,7 +1258,7 @@
 checkLeaderboardScores(api.LeaderboardScores o) {
   buildCounterLeaderboardScores++;
   if (buildCounterLeaderboardScores < 3) {
-    checkUnnamed96(o.items);
+    checkUnnamed90(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.numScores, unittest.equals('foo'));
@@ -1268,14 +1268,14 @@
   buildCounterLeaderboardScores--;
 }
 
-buildUnnamed97() {
+buildUnnamed91() {
   var o = new core.List<api.PlayerLevel>();
   o.add(buildPlayerLevel());
   o.add(buildPlayerLevel());
   return o;
 }
 
-checkUnnamed97(core.List<api.PlayerLevel> o) {
+checkUnnamed91(core.List<api.PlayerLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerLevel(o[0]);
   checkPlayerLevel(o[1]);
@@ -1288,7 +1288,7 @@
   if (buildCounterMetagameConfig < 3) {
     o.currentVersion = 42;
     o.kind = "foo";
-    o.playerLevels = buildUnnamed97();
+    o.playerLevels = buildUnnamed91();
   }
   buildCounterMetagameConfig--;
   return o;
@@ -1299,7 +1299,7 @@
   if (buildCounterMetagameConfig < 3) {
     unittest.expect(o.currentVersion, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed97(o.playerLevels);
+    checkUnnamed91(o.playerLevels);
   }
   buildCounterMetagameConfig--;
 }
@@ -1536,14 +1536,14 @@
   buildCounterPlayerAchievement--;
 }
 
-buildUnnamed98() {
+buildUnnamed92() {
   var o = new core.List<api.PlayerAchievement>();
   o.add(buildPlayerAchievement());
   o.add(buildPlayerAchievement());
   return o;
 }
 
-checkUnnamed98(core.List<api.PlayerAchievement> o) {
+checkUnnamed92(core.List<api.PlayerAchievement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerAchievement(o[0]);
   checkPlayerAchievement(o[1]);
@@ -1554,7 +1554,7 @@
   var o = new api.PlayerAchievementListResponse();
   buildCounterPlayerAchievementListResponse++;
   if (buildCounterPlayerAchievementListResponse < 3) {
-    o.items = buildUnnamed98();
+    o.items = buildUnnamed92();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1565,7 +1565,7 @@
 checkPlayerAchievementListResponse(api.PlayerAchievementListResponse o) {
   buildCounterPlayerAchievementListResponse++;
   if (buildCounterPlayerAchievementListResponse < 3) {
-    checkUnnamed98(o.items);
+    checkUnnamed92(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1599,14 +1599,14 @@
   buildCounterPlayerEvent--;
 }
 
-buildUnnamed99() {
+buildUnnamed93() {
   var o = new core.List<api.PlayerEvent>();
   o.add(buildPlayerEvent());
   o.add(buildPlayerEvent());
   return o;
 }
 
-checkUnnamed99(core.List<api.PlayerEvent> o) {
+checkUnnamed93(core.List<api.PlayerEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerEvent(o[0]);
   checkPlayerEvent(o[1]);
@@ -1617,7 +1617,7 @@
   var o = new api.PlayerEventListResponse();
   buildCounterPlayerEventListResponse++;
   if (buildCounterPlayerEventListResponse < 3) {
-    o.items = buildUnnamed99();
+    o.items = buildUnnamed93();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1628,7 +1628,7 @@
 checkPlayerEventListResponse(api.PlayerEventListResponse o) {
   buildCounterPlayerEventListResponse++;
   if (buildCounterPlayerEventListResponse < 3) {
-    checkUnnamed99(o.items);
+    checkUnnamed93(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1697,14 +1697,14 @@
   buildCounterPlayerLeaderboardScore--;
 }
 
-buildUnnamed100() {
+buildUnnamed94() {
   var o = new core.List<api.PlayerLeaderboardScore>();
   o.add(buildPlayerLeaderboardScore());
   o.add(buildPlayerLeaderboardScore());
   return o;
 }
 
-checkUnnamed100(core.List<api.PlayerLeaderboardScore> o) {
+checkUnnamed94(core.List<api.PlayerLeaderboardScore> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerLeaderboardScore(o[0]);
   checkPlayerLeaderboardScore(o[1]);
@@ -1715,7 +1715,7 @@
   var o = new api.PlayerLeaderboardScoreListResponse();
   buildCounterPlayerLeaderboardScoreListResponse++;
   if (buildCounterPlayerLeaderboardScoreListResponse < 3) {
-    o.items = buildUnnamed100();
+    o.items = buildUnnamed94();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.player = buildPlayer();
@@ -1728,7 +1728,7 @@
     api.PlayerLeaderboardScoreListResponse o) {
   buildCounterPlayerLeaderboardScoreListResponse++;
   if (buildCounterPlayerLeaderboardScoreListResponse < 3) {
-    checkUnnamed100(o.items);
+    checkUnnamed94(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPlayer(o.player);
@@ -1761,14 +1761,14 @@
   buildCounterPlayerLevel--;
 }
 
-buildUnnamed101() {
+buildUnnamed95() {
   var o = new core.List<api.Player>();
   o.add(buildPlayer());
   o.add(buildPlayer());
   return o;
 }
 
-checkUnnamed101(core.List<api.Player> o) {
+checkUnnamed95(core.List<api.Player> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayer(o[0]);
   checkPlayer(o[1]);
@@ -1779,7 +1779,7 @@
   var o = new api.PlayerListResponse();
   buildCounterPlayerListResponse++;
   if (buildCounterPlayerListResponse < 3) {
-    o.items = buildUnnamed101();
+    o.items = buildUnnamed95();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1790,7 +1790,7 @@
 checkPlayerListResponse(api.PlayerListResponse o) {
   buildCounterPlayerListResponse++;
   if (buildCounterPlayerListResponse < 3) {
-    checkUnnamed101(o.items);
+    checkUnnamed95(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1824,14 +1824,14 @@
   buildCounterPlayerScore--;
 }
 
-buildUnnamed102() {
+buildUnnamed96() {
   var o = new core.List<api.PlayerScoreResponse>();
   o.add(buildPlayerScoreResponse());
   o.add(buildPlayerScoreResponse());
   return o;
 }
 
-checkUnnamed102(core.List<api.PlayerScoreResponse> o) {
+checkUnnamed96(core.List<api.PlayerScoreResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerScoreResponse(o[0]);
   checkPlayerScoreResponse(o[1]);
@@ -1843,7 +1843,7 @@
   buildCounterPlayerScoreListResponse++;
   if (buildCounterPlayerScoreListResponse < 3) {
     o.kind = "foo";
-    o.submittedScores = buildUnnamed102();
+    o.submittedScores = buildUnnamed96();
   }
   buildCounterPlayerScoreListResponse--;
   return o;
@@ -1853,32 +1853,32 @@
   buildCounterPlayerScoreListResponse++;
   if (buildCounterPlayerScoreListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed102(o.submittedScores);
+    checkUnnamed96(o.submittedScores);
   }
   buildCounterPlayerScoreListResponse--;
 }
 
-buildUnnamed103() {
+buildUnnamed97() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed103(core.List<core.String> o) {
+checkUnnamed97(core.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() {
+buildUnnamed98() {
   var o = new core.List<api.PlayerScore>();
   o.add(buildPlayerScore());
   o.add(buildPlayerScore());
   return o;
 }
 
-checkUnnamed104(core.List<api.PlayerScore> o) {
+checkUnnamed98(core.List<api.PlayerScore> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerScore(o[0]);
   checkPlayerScore(o[1]);
@@ -1889,12 +1889,12 @@
   var o = new api.PlayerScoreResponse();
   buildCounterPlayerScoreResponse++;
   if (buildCounterPlayerScoreResponse < 3) {
-    o.beatenScoreTimeSpans = buildUnnamed103();
+    o.beatenScoreTimeSpans = buildUnnamed97();
     o.formattedScore = "foo";
     o.kind = "foo";
     o.leaderboardId = "foo";
     o.scoreTag = "foo";
-    o.unbeatenScores = buildUnnamed104();
+    o.unbeatenScores = buildUnnamed98();
   }
   buildCounterPlayerScoreResponse--;
   return o;
@@ -1903,24 +1903,24 @@
 checkPlayerScoreResponse(api.PlayerScoreResponse o) {
   buildCounterPlayerScoreResponse++;
   if (buildCounterPlayerScoreResponse < 3) {
-    checkUnnamed103(o.beatenScoreTimeSpans);
+    checkUnnamed97(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'));
-    checkUnnamed104(o.unbeatenScores);
+    checkUnnamed98(o.unbeatenScores);
   }
   buildCounterPlayerScoreResponse--;
 }
 
-buildUnnamed105() {
+buildUnnamed99() {
   var o = new core.List<api.ScoreSubmission>();
   o.add(buildScoreSubmission());
   o.add(buildScoreSubmission());
   return o;
 }
 
-checkUnnamed105(core.List<api.ScoreSubmission> o) {
+checkUnnamed99(core.List<api.ScoreSubmission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkScoreSubmission(o[0]);
   checkScoreSubmission(o[1]);
@@ -1932,7 +1932,7 @@
   buildCounterPlayerScoreSubmissionList++;
   if (buildCounterPlayerScoreSubmissionList < 3) {
     o.kind = "foo";
-    o.scores = buildUnnamed105();
+    o.scores = buildUnnamed99();
   }
   buildCounterPlayerScoreSubmissionList--;
   return o;
@@ -1942,7 +1942,7 @@
   buildCounterPlayerScoreSubmissionList++;
   if (buildCounterPlayerScoreSubmissionList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed105(o.scores);
+    checkUnnamed99(o.scores);
   }
   buildCounterPlayerScoreSubmissionList--;
 }
@@ -2035,14 +2035,14 @@
   buildCounterPushTokenId--;
 }
 
-buildUnnamed106() {
+buildUnnamed100() {
   var o = new core.List<api.QuestMilestone>();
   o.add(buildQuestMilestone());
   o.add(buildQuestMilestone());
   return o;
 }
 
-checkUnnamed106(core.List<api.QuestMilestone> o) {
+checkUnnamed100(core.List<api.QuestMilestone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuestMilestone(o[0]);
   checkQuestMilestone(o[1]);
@@ -2064,7 +2064,7 @@
     o.isDefaultIconUrl = true;
     o.kind = "foo";
     o.lastUpdatedTimestampMillis = "foo";
-    o.milestones = buildUnnamed106();
+    o.milestones = buildUnnamed100();
     o.name = "foo";
     o.notifyTimestampMillis = "foo";
     o.startTimestampMillis = "foo";
@@ -2088,7 +2088,7 @@
     unittest.expect(o.isDefaultIconUrl, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastUpdatedTimestampMillis, unittest.equals('foo'));
-    checkUnnamed106(o.milestones);
+    checkUnnamed100(o.milestones);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notifyTimestampMillis, unittest.equals('foo'));
     unittest.expect(o.startTimestampMillis, unittest.equals('foo'));
@@ -2147,14 +2147,14 @@
   buildCounterQuestCriterion--;
 }
 
-buildUnnamed107() {
+buildUnnamed101() {
   var o = new core.List<api.Quest>();
   o.add(buildQuest());
   o.add(buildQuest());
   return o;
 }
 
-checkUnnamed107(core.List<api.Quest> o) {
+checkUnnamed101(core.List<api.Quest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuest(o[0]);
   checkQuest(o[1]);
@@ -2165,7 +2165,7 @@
   var o = new api.QuestListResponse();
   buildCounterQuestListResponse++;
   if (buildCounterQuestListResponse < 3) {
-    o.items = buildUnnamed107();
+    o.items = buildUnnamed101();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2176,21 +2176,21 @@
 checkQuestListResponse(api.QuestListResponse o) {
   buildCounterQuestListResponse++;
   if (buildCounterQuestListResponse < 3) {
-    checkUnnamed107(o.items);
+    checkUnnamed101(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterQuestListResponse--;
 }
 
-buildUnnamed108() {
+buildUnnamed102() {
   var o = new core.List<api.QuestCriterion>();
   o.add(buildQuestCriterion());
   o.add(buildQuestCriterion());
   return o;
 }
 
-checkUnnamed108(core.List<api.QuestCriterion> o) {
+checkUnnamed102(core.List<api.QuestCriterion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuestCriterion(o[0]);
   checkQuestCriterion(o[1]);
@@ -2202,7 +2202,7 @@
   buildCounterQuestMilestone++;
   if (buildCounterQuestMilestone < 3) {
     o.completionRewardData = "foo";
-    o.criteria = buildUnnamed108();
+    o.criteria = buildUnnamed102();
     o.id = "foo";
     o.kind = "foo";
     o.state = "foo";
@@ -2215,7 +2215,7 @@
   buildCounterQuestMilestone++;
   if (buildCounterQuestMilestone < 3) {
     unittest.expect(o.completionRewardData, unittest.equals('foo'));
-    checkUnnamed108(o.criteria);
+    checkUnnamed102(o.criteria);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -2246,14 +2246,14 @@
   buildCounterRevisionCheckResponse--;
 }
 
-buildUnnamed109() {
+buildUnnamed103() {
   var o = new core.List<api.RoomParticipant>();
   o.add(buildRoomParticipant());
   o.add(buildRoomParticipant());
   return o;
 }
 
-checkUnnamed109(core.List<api.RoomParticipant> o) {
+checkUnnamed103(core.List<api.RoomParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomParticipant(o[0]);
   checkRoomParticipant(o[1]);
@@ -2272,7 +2272,7 @@
     o.inviterId = "foo";
     o.kind = "foo";
     o.lastUpdateDetails = buildRoomModification();
-    o.participants = buildUnnamed109();
+    o.participants = buildUnnamed103();
     o.roomId = "foo";
     o.roomStatusVersion = 42;
     o.status = "foo";
@@ -2293,7 +2293,7 @@
     unittest.expect(o.inviterId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkRoomModification(o.lastUpdateDetails);
-    checkUnnamed109(o.participants);
+    checkUnnamed103(o.participants);
     unittest.expect(o.roomId, unittest.equals('foo'));
     unittest.expect(o.roomStatusVersion, unittest.equals(42));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -2369,27 +2369,27 @@
   buildCounterRoomClientAddress--;
 }
 
-buildUnnamed110() {
+buildUnnamed104() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed110(core.List<core.String> o) {
+checkUnnamed104(core.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() {
+buildUnnamed105() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed111(core.List<core.String> o) {
+checkUnnamed105(core.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,9 +2401,9 @@
   buildCounterRoomCreateRequest++;
   if (buildCounterRoomCreateRequest < 3) {
     o.autoMatchingCriteria = buildRoomAutoMatchingCriteria();
-    o.capabilities = buildUnnamed110();
+    o.capabilities = buildUnnamed104();
     o.clientAddress = buildRoomClientAddress();
-    o.invitedPlayerIds = buildUnnamed111();
+    o.invitedPlayerIds = buildUnnamed105();
     o.kind = "foo";
     o.networkDiagnostics = buildNetworkDiagnostics();
     o.requestId = "foo";
@@ -2417,9 +2417,9 @@
   buildCounterRoomCreateRequest++;
   if (buildCounterRoomCreateRequest < 3) {
     checkRoomAutoMatchingCriteria(o.autoMatchingCriteria);
-    checkUnnamed110(o.capabilities);
+    checkUnnamed104(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
-    checkUnnamed111(o.invitedPlayerIds);
+    checkUnnamed105(o.invitedPlayerIds);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNetworkDiagnostics(o.networkDiagnostics);
     unittest.expect(o.requestId, unittest.equals('foo'));
@@ -2428,14 +2428,14 @@
   buildCounterRoomCreateRequest--;
 }
 
-buildUnnamed112() {
+buildUnnamed106() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed112(core.List<core.String> o) {
+checkUnnamed106(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2446,7 +2446,7 @@
   var o = new api.RoomJoinRequest();
   buildCounterRoomJoinRequest++;
   if (buildCounterRoomJoinRequest < 3) {
-    o.capabilities = buildUnnamed112();
+    o.capabilities = buildUnnamed106();
     o.clientAddress = buildRoomClientAddress();
     o.kind = "foo";
     o.networkDiagnostics = buildNetworkDiagnostics();
@@ -2458,7 +2458,7 @@
 checkRoomJoinRequest(api.RoomJoinRequest o) {
   buildCounterRoomJoinRequest++;
   if (buildCounterRoomJoinRequest < 3) {
-    checkUnnamed112(o.capabilities);
+    checkUnnamed106(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNetworkDiagnostics(o.networkDiagnostics);
@@ -2466,14 +2466,14 @@
   buildCounterRoomJoinRequest--;
 }
 
-buildUnnamed113() {
+buildUnnamed107() {
   var o = new core.List<api.PeerSessionDiagnostics>();
   o.add(buildPeerSessionDiagnostics());
   o.add(buildPeerSessionDiagnostics());
   return o;
 }
 
-checkUnnamed113(core.List<api.PeerSessionDiagnostics> o) {
+checkUnnamed107(core.List<api.PeerSessionDiagnostics> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPeerSessionDiagnostics(o[0]);
   checkPeerSessionDiagnostics(o[1]);
@@ -2490,7 +2490,7 @@
     o.kind = "foo";
     o.networkOperatorCode = "foo";
     o.networkOperatorName = "foo";
-    o.peerSession = buildUnnamed113();
+    o.peerSession = buildUnnamed107();
     o.socketsUsed = true;
   }
   buildCounterRoomLeaveDiagnostics--;
@@ -2506,7 +2506,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.networkOperatorCode, unittest.equals('foo'));
     unittest.expect(o.networkOperatorName, unittest.equals('foo'));
-    checkUnnamed113(o.peerSession);
+    checkUnnamed107(o.peerSession);
     unittest.expect(o.socketsUsed, unittest.isTrue);
   }
   buildCounterRoomLeaveDiagnostics--;
@@ -2535,14 +2535,14 @@
   buildCounterRoomLeaveRequest--;
 }
 
-buildUnnamed114() {
+buildUnnamed108() {
   var o = new core.List<api.Room>();
   o.add(buildRoom());
   o.add(buildRoom());
   return o;
 }
 
-checkUnnamed114(core.List<api.Room> o) {
+checkUnnamed108(core.List<api.Room> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoom(o[0]);
   checkRoom(o[1]);
@@ -2553,7 +2553,7 @@
   var o = new api.RoomList();
   buildCounterRoomList++;
   if (buildCounterRoomList < 3) {
-    o.items = buildUnnamed114();
+    o.items = buildUnnamed108();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2564,7 +2564,7 @@
 checkRoomList(api.RoomList o) {
   buildCounterRoomList++;
   if (buildCounterRoomList < 3) {
-    checkUnnamed114(o.items);
+    checkUnnamed108(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -2625,14 +2625,14 @@
   buildCounterRoomP2PStatus--;
 }
 
-buildUnnamed115() {
+buildUnnamed109() {
   var o = new core.List<api.RoomP2PStatus>();
   o.add(buildRoomP2PStatus());
   o.add(buildRoomP2PStatus());
   return o;
 }
 
-checkUnnamed115(core.List<api.RoomP2PStatus> o) {
+checkUnnamed109(core.List<api.RoomP2PStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomP2PStatus(o[0]);
   checkRoomP2PStatus(o[1]);
@@ -2644,7 +2644,7 @@
   buildCounterRoomP2PStatuses++;
   if (buildCounterRoomP2PStatuses < 3) {
     o.kind = "foo";
-    o.updates = buildUnnamed115();
+    o.updates = buildUnnamed109();
   }
   buildCounterRoomP2PStatuses--;
   return o;
@@ -2654,19 +2654,19 @@
   buildCounterRoomP2PStatuses++;
   if (buildCounterRoomP2PStatuses < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed115(o.updates);
+    checkUnnamed109(o.updates);
   }
   buildCounterRoomP2PStatuses--;
 }
 
-buildUnnamed116() {
+buildUnnamed110() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed116(core.List<core.String> o) {
+checkUnnamed110(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2679,7 +2679,7 @@
   if (buildCounterRoomParticipant < 3) {
     o.autoMatched = true;
     o.autoMatchedPlayer = buildAnonymousPlayer();
-    o.capabilities = buildUnnamed116();
+    o.capabilities = buildUnnamed110();
     o.clientAddress = buildRoomClientAddress();
     o.connected = true;
     o.id = "foo";
@@ -2697,7 +2697,7 @@
   if (buildCounterRoomParticipant < 3) {
     unittest.expect(o.autoMatched, unittest.isTrue);
     checkAnonymousPlayer(o.autoMatchedPlayer);
-    checkUnnamed116(o.capabilities);
+    checkUnnamed110(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
     unittest.expect(o.connected, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
@@ -2709,14 +2709,14 @@
   buildCounterRoomParticipant--;
 }
 
-buildUnnamed117() {
+buildUnnamed111() {
   var o = new core.List<api.RoomParticipant>();
   o.add(buildRoomParticipant());
   o.add(buildRoomParticipant());
   return o;
 }
 
-checkUnnamed117(core.List<api.RoomParticipant> o) {
+checkUnnamed111(core.List<api.RoomParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomParticipant(o[0]);
   checkRoomParticipant(o[1]);
@@ -2729,7 +2729,7 @@
   if (buildCounterRoomStatus < 3) {
     o.autoMatchingStatus = buildRoomAutoMatchStatus();
     o.kind = "foo";
-    o.participants = buildUnnamed117();
+    o.participants = buildUnnamed111();
     o.roomId = "foo";
     o.status = "foo";
     o.statusVersion = 42;
@@ -2743,7 +2743,7 @@
   if (buildCounterRoomStatus < 3) {
     checkRoomAutoMatchStatus(o.autoMatchingStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed117(o.participants);
+    checkUnnamed111(o.participants);
     unittest.expect(o.roomId, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusVersion, unittest.equals(42));
@@ -2844,14 +2844,14 @@
   buildCounterSnapshotImage--;
 }
 
-buildUnnamed118() {
+buildUnnamed112() {
   var o = new core.List<api.Snapshot>();
   o.add(buildSnapshot());
   o.add(buildSnapshot());
   return o;
 }
 
-checkUnnamed118(core.List<api.Snapshot> o) {
+checkUnnamed112(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSnapshot(o[0]);
   checkSnapshot(o[1]);
@@ -2862,7 +2862,7 @@
   var o = new api.SnapshotListResponse();
   buildCounterSnapshotListResponse++;
   if (buildCounterSnapshotListResponse < 3) {
-    o.items = buildUnnamed118();
+    o.items = buildUnnamed112();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2873,7 +2873,7 @@
 checkSnapshotListResponse(api.SnapshotListResponse o) {
   buildCounterSnapshotListResponse++;
   if (buildCounterSnapshotListResponse < 3) {
-    checkUnnamed118(o.items);
+    checkUnnamed112(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -2905,27 +2905,27 @@
   buildCounterTurnBasedAutoMatchingCriteria--;
 }
 
-buildUnnamed119() {
+buildUnnamed113() {
   var o = new core.List<api.TurnBasedMatchParticipant>();
   o.add(buildTurnBasedMatchParticipant());
   o.add(buildTurnBasedMatchParticipant());
   return o;
 }
 
-checkUnnamed119(core.List<api.TurnBasedMatchParticipant> o) {
+checkUnnamed113(core.List<api.TurnBasedMatchParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatchParticipant(o[0]);
   checkTurnBasedMatchParticipant(o[1]);
 }
 
-buildUnnamed120() {
+buildUnnamed114() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed120(core.List<api.ParticipantResult> o) {
+checkUnnamed114(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -2947,11 +2947,11 @@
     o.matchId = "foo";
     o.matchNumber = 42;
     o.matchVersion = 42;
-    o.participants = buildUnnamed119();
+    o.participants = buildUnnamed113();
     o.pendingParticipantId = "foo";
     o.previousMatchData = buildTurnBasedMatchData();
     o.rematchId = "foo";
-    o.results = buildUnnamed120();
+    o.results = buildUnnamed114();
     o.status = "foo";
     o.userMatchStatus = "foo";
     o.variant = 42;
@@ -2975,11 +2975,11 @@
     unittest.expect(o.matchId, unittest.equals('foo'));
     unittest.expect(o.matchNumber, unittest.equals(42));
     unittest.expect(o.matchVersion, unittest.equals(42));
-    checkUnnamed119(o.participants);
+    checkUnnamed113(o.participants);
     unittest.expect(o.pendingParticipantId, unittest.equals('foo'));
     checkTurnBasedMatchData(o.previousMatchData);
     unittest.expect(o.rematchId, unittest.equals('foo'));
-    checkUnnamed120(o.results);
+    checkUnnamed114(o.results);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.userMatchStatus, unittest.equals('foo'));
     unittest.expect(o.variant, unittest.equals(42));
@@ -2988,14 +2988,14 @@
   buildCounterTurnBasedMatch--;
 }
 
-buildUnnamed121() {
+buildUnnamed115() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed121(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'));
@@ -3007,7 +3007,7 @@
   buildCounterTurnBasedMatchCreateRequest++;
   if (buildCounterTurnBasedMatchCreateRequest < 3) {
     o.autoMatchingCriteria = buildTurnBasedAutoMatchingCriteria();
-    o.invitedPlayerIds = buildUnnamed121();
+    o.invitedPlayerIds = buildUnnamed115();
     o.kind = "foo";
     o.requestId = "foo";
     o.variant = 42;
@@ -3020,7 +3020,7 @@
   buildCounterTurnBasedMatchCreateRequest++;
   if (buildCounterTurnBasedMatchCreateRequest < 3) {
     checkTurnBasedAutoMatchingCriteria(o.autoMatchingCriteria);
-    checkUnnamed121(o.invitedPlayerIds);
+    checkUnnamed115(o.invitedPlayerIds);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
     unittest.expect(o.variant, unittest.equals(42));
@@ -3072,14 +3072,14 @@
   buildCounterTurnBasedMatchDataRequest--;
 }
 
-buildUnnamed122() {
+buildUnnamed116() {
   var o = new core.List<api.TurnBasedMatch>();
   o.add(buildTurnBasedMatch());
   o.add(buildTurnBasedMatch());
   return o;
 }
 
-checkUnnamed122(core.List<api.TurnBasedMatch> o) {
+checkUnnamed116(core.List<api.TurnBasedMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatch(o[0]);
   checkTurnBasedMatch(o[1]);
@@ -3090,7 +3090,7 @@
   var o = new api.TurnBasedMatchList();
   buildCounterTurnBasedMatchList++;
   if (buildCounterTurnBasedMatchList < 3) {
-    o.items = buildUnnamed122();
+    o.items = buildUnnamed116();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3101,7 +3101,7 @@
 checkTurnBasedMatchList(api.TurnBasedMatchList o) {
   buildCounterTurnBasedMatchList++;
   if (buildCounterTurnBasedMatchList < 3) {
-    checkUnnamed122(o.items);
+    checkUnnamed116(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -3183,14 +3183,14 @@
   buildCounterTurnBasedMatchRematch--;
 }
 
-buildUnnamed123() {
+buildUnnamed117() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed123(core.List<api.ParticipantResult> o) {
+checkUnnamed117(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -3204,7 +3204,7 @@
     o.data = buildTurnBasedMatchDataRequest();
     o.kind = "foo";
     o.matchVersion = 42;
-    o.results = buildUnnamed123();
+    o.results = buildUnnamed117();
   }
   buildCounterTurnBasedMatchResults--;
   return o;
@@ -3216,19 +3216,19 @@
     checkTurnBasedMatchDataRequest(o.data);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.matchVersion, unittest.equals(42));
-    checkUnnamed123(o.results);
+    checkUnnamed117(o.results);
   }
   buildCounterTurnBasedMatchResults--;
 }
 
-buildUnnamed124() {
+buildUnnamed118() {
   var o = new core.List<api.TurnBasedMatch>();
   o.add(buildTurnBasedMatch());
   o.add(buildTurnBasedMatch());
   return o;
 }
 
-checkUnnamed124(core.List<api.TurnBasedMatch> o) {
+checkUnnamed118(core.List<api.TurnBasedMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatch(o[0]);
   checkTurnBasedMatch(o[1]);
@@ -3239,7 +3239,7 @@
   var o = new api.TurnBasedMatchSync();
   buildCounterTurnBasedMatchSync++;
   if (buildCounterTurnBasedMatchSync < 3) {
-    o.items = buildUnnamed124();
+    o.items = buildUnnamed118();
     o.kind = "foo";
     o.moreAvailable = true;
     o.nextPageToken = "foo";
@@ -3251,7 +3251,7 @@
 checkTurnBasedMatchSync(api.TurnBasedMatchSync o) {
   buildCounterTurnBasedMatchSync++;
   if (buildCounterTurnBasedMatchSync < 3) {
-    checkUnnamed124(o.items);
+    checkUnnamed118(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.moreAvailable, unittest.isTrue);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -3259,14 +3259,14 @@
   buildCounterTurnBasedMatchSync--;
 }
 
-buildUnnamed125() {
+buildUnnamed119() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed125(core.List<api.ParticipantResult> o) {
+checkUnnamed119(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -3281,7 +3281,7 @@
     o.kind = "foo";
     o.matchVersion = 42;
     o.pendingParticipantId = "foo";
-    o.results = buildUnnamed125();
+    o.results = buildUnnamed119();
   }
   buildCounterTurnBasedMatchTurn--;
   return o;
@@ -3294,7 +3294,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.matchVersion, unittest.equals(42));
     unittest.expect(o.pendingParticipantId, unittest.equals('foo'));
-    checkUnnamed125(o.results);
+    checkUnnamed119(o.results);
   }
   buildCounterTurnBasedMatchTurn--;
 }
diff --git a/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart b/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
index 656cc35..12dd5cd 100644
--- a/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
+++ b/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
@@ -112,14 +112,14 @@
   buildCounterAchievementConfigurationDetail--;
 }
 
-buildUnnamed788() {
+buildUnnamed792() {
   var o = new core.List<api.AchievementConfiguration>();
   o.add(buildAchievementConfiguration());
   o.add(buildAchievementConfiguration());
   return o;
 }
 
-checkUnnamed788(core.List<api.AchievementConfiguration> o) {
+checkUnnamed792(core.List<api.AchievementConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementConfiguration(o[0]);
   checkAchievementConfiguration(o[1]);
@@ -130,7 +130,7 @@
   var o = new api.AchievementConfigurationListResponse();
   buildCounterAchievementConfigurationListResponse++;
   if (buildCounterAchievementConfigurationListResponse < 3) {
-    o.items = buildUnnamed788();
+    o.items = buildUnnamed792();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -142,7 +142,7 @@
     api.AchievementConfigurationListResponse o) {
   buildCounterAchievementConfigurationListResponse++;
   if (buildCounterAchievementConfigurationListResponse < 3) {
-    checkUnnamed788(o.items);
+    checkUnnamed792(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -288,14 +288,14 @@
   buildCounterLeaderboardConfigurationDetail--;
 }
 
-buildUnnamed789() {
+buildUnnamed793() {
   var o = new core.List<api.LeaderboardConfiguration>();
   o.add(buildLeaderboardConfiguration());
   o.add(buildLeaderboardConfiguration());
   return o;
 }
 
-checkUnnamed789(core.List<api.LeaderboardConfiguration> o) {
+checkUnnamed793(core.List<api.LeaderboardConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLeaderboardConfiguration(o[0]);
   checkLeaderboardConfiguration(o[1]);
@@ -306,7 +306,7 @@
   var o = new api.LeaderboardConfigurationListResponse();
   buildCounterLeaderboardConfigurationListResponse++;
   if (buildCounterLeaderboardConfigurationListResponse < 3) {
-    o.items = buildUnnamed789();
+    o.items = buildUnnamed793();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -318,7 +318,7 @@
     api.LeaderboardConfigurationListResponse o) {
   buildCounterLeaderboardConfigurationListResponse++;
   if (buildCounterLeaderboardConfigurationListResponse < 3) {
-    checkUnnamed789(o.items);
+    checkUnnamed793(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -348,14 +348,14 @@
   buildCounterLocalizedString--;
 }
 
-buildUnnamed790() {
+buildUnnamed794() {
   var o = new core.List<api.LocalizedString>();
   o.add(buildLocalizedString());
   o.add(buildLocalizedString());
   return o;
 }
 
-checkUnnamed790(core.List<api.LocalizedString> o) {
+checkUnnamed794(core.List<api.LocalizedString> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocalizedString(o[0]);
   checkLocalizedString(o[1]);
@@ -367,7 +367,7 @@
   buildCounterLocalizedStringBundle++;
   if (buildCounterLocalizedStringBundle < 3) {
     o.kind = "foo";
-    o.translations = buildUnnamed790();
+    o.translations = buildUnnamed794();
   }
   buildCounterLocalizedStringBundle--;
   return o;
@@ -377,7 +377,7 @@
   buildCounterLocalizedStringBundle++;
   if (buildCounterLocalizedStringBundle < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed790(o.translations);
+    checkUnnamed794(o.translations);
   }
   buildCounterLocalizedStringBundle--;
 }
diff --git a/generated/googleapis/test/gamesmanagement/v1management_test.dart b/generated/googleapis/test/gamesmanagement/v1management_test.dart
index 1401441..a87ac3e 100644
--- a/generated/googleapis/test/gamesmanagement/v1management_test.dart
+++ b/generated/googleapis/test/gamesmanagement/v1management_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed780() {
+buildUnnamed784() {
   var o = new core.List<api.AchievementResetResponse>();
   o.add(buildAchievementResetResponse());
   o.add(buildAchievementResetResponse());
   return o;
 }
 
-checkUnnamed780(core.List<api.AchievementResetResponse> o) {
+checkUnnamed784(core.List<api.AchievementResetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementResetResponse(o[0]);
   checkAchievementResetResponse(o[1]);
@@ -69,7 +69,7 @@
   buildCounterAchievementResetAllResponse++;
   if (buildCounterAchievementResetAllResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed780();
+    o.results = buildUnnamed784();
   }
   buildCounterAchievementResetAllResponse--;
   return o;
@@ -79,19 +79,19 @@
   buildCounterAchievementResetAllResponse++;
   if (buildCounterAchievementResetAllResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed780(o.results);
+    checkUnnamed784(o.results);
   }
   buildCounterAchievementResetAllResponse--;
 }
 
-buildUnnamed781() {
+buildUnnamed785() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed781(core.List<core.String> o) {
+checkUnnamed785(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -102,7 +102,7 @@
   var o = new api.AchievementResetMultipleForAllRequest();
   buildCounterAchievementResetMultipleForAllRequest++;
   if (buildCounterAchievementResetMultipleForAllRequest < 3) {
-    o.achievementIds = buildUnnamed781();
+    o.achievementIds = buildUnnamed785();
     o.kind = "foo";
   }
   buildCounterAchievementResetMultipleForAllRequest--;
@@ -113,7 +113,7 @@
     api.AchievementResetMultipleForAllRequest o) {
   buildCounterAchievementResetMultipleForAllRequest++;
   if (buildCounterAchievementResetMultipleForAllRequest < 3) {
-    checkUnnamed781(o.achievementIds);
+    checkUnnamed785(o.achievementIds);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAchievementResetMultipleForAllRequest--;
@@ -144,14 +144,14 @@
   buildCounterAchievementResetResponse--;
 }
 
-buildUnnamed782() {
+buildUnnamed786() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed782(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'));
@@ -162,7 +162,7 @@
   var o = new api.EventsResetMultipleForAllRequest();
   buildCounterEventsResetMultipleForAllRequest++;
   if (buildCounterEventsResetMultipleForAllRequest < 3) {
-    o.eventIds = buildUnnamed782();
+    o.eventIds = buildUnnamed786();
     o.kind = "foo";
   }
   buildCounterEventsResetMultipleForAllRequest--;
@@ -172,7 +172,7 @@
 checkEventsResetMultipleForAllRequest(api.EventsResetMultipleForAllRequest o) {
   buildCounterEventsResetMultipleForAllRequest++;
   if (buildCounterEventsResetMultipleForAllRequest < 3) {
-    checkUnnamed782(o.eventIds);
+    checkUnnamed786(o.eventIds);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterEventsResetMultipleForAllRequest--;
@@ -271,14 +271,14 @@
   buildCounterHiddenPlayer--;
 }
 
-buildUnnamed783() {
+buildUnnamed787() {
   var o = new core.List<api.HiddenPlayer>();
   o.add(buildHiddenPlayer());
   o.add(buildHiddenPlayer());
   return o;
 }
 
-checkUnnamed783(core.List<api.HiddenPlayer> o) {
+checkUnnamed787(core.List<api.HiddenPlayer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHiddenPlayer(o[0]);
   checkHiddenPlayer(o[1]);
@@ -289,7 +289,7 @@
   var o = new api.HiddenPlayerList();
   buildCounterHiddenPlayerList++;
   if (buildCounterHiddenPlayerList < 3) {
-    o.items = buildUnnamed783();
+    o.items = buildUnnamed787();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -300,7 +300,7 @@
 checkHiddenPlayerList(api.HiddenPlayerList o) {
   buildCounterHiddenPlayerList++;
   if (buildCounterHiddenPlayerList < 3) {
-    checkUnnamed783(o.items);
+    checkUnnamed787(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -369,14 +369,14 @@
   buildCounterPlayer--;
 }
 
-buildUnnamed784() {
+buildUnnamed788() {
   var o = new core.List<api.PlayerScoreResetResponse>();
   o.add(buildPlayerScoreResetResponse());
   o.add(buildPlayerScoreResetResponse());
   return o;
 }
 
-checkUnnamed784(core.List<api.PlayerScoreResetResponse> o) {
+checkUnnamed788(core.List<api.PlayerScoreResetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerScoreResetResponse(o[0]);
   checkPlayerScoreResetResponse(o[1]);
@@ -388,7 +388,7 @@
   buildCounterPlayerScoreResetAllResponse++;
   if (buildCounterPlayerScoreResetAllResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed784();
+    o.results = buildUnnamed788();
   }
   buildCounterPlayerScoreResetAllResponse--;
   return o;
@@ -398,19 +398,19 @@
   buildCounterPlayerScoreResetAllResponse++;
   if (buildCounterPlayerScoreResetAllResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed784(o.results);
+    checkUnnamed788(o.results);
   }
   buildCounterPlayerScoreResetAllResponse--;
 }
 
-buildUnnamed785() {
+buildUnnamed789() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed785(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'));
@@ -423,7 +423,7 @@
   if (buildCounterPlayerScoreResetResponse < 3) {
     o.definitionId = "foo";
     o.kind = "foo";
-    o.resetScoreTimeSpans = buildUnnamed785();
+    o.resetScoreTimeSpans = buildUnnamed789();
   }
   buildCounterPlayerScoreResetResponse--;
   return o;
@@ -434,7 +434,7 @@
   if (buildCounterPlayerScoreResetResponse < 3) {
     unittest.expect(o.definitionId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed785(o.resetScoreTimeSpans);
+    checkUnnamed789(o.resetScoreTimeSpans);
   }
   buildCounterPlayerScoreResetResponse--;
 }
@@ -460,14 +460,14 @@
   buildCounterProfileSettings--;
 }
 
-buildUnnamed786() {
+buildUnnamed790() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed786(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'));
@@ -479,7 +479,7 @@
   buildCounterQuestsResetMultipleForAllRequest++;
   if (buildCounterQuestsResetMultipleForAllRequest < 3) {
     o.kind = "foo";
-    o.questIds = buildUnnamed786();
+    o.questIds = buildUnnamed790();
   }
   buildCounterQuestsResetMultipleForAllRequest--;
   return o;
@@ -489,19 +489,19 @@
   buildCounterQuestsResetMultipleForAllRequest++;
   if (buildCounterQuestsResetMultipleForAllRequest < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed786(o.questIds);
+    checkUnnamed790(o.questIds);
   }
   buildCounterQuestsResetMultipleForAllRequest--;
 }
 
-buildUnnamed787() {
+buildUnnamed791() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed787(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'));
@@ -513,7 +513,7 @@
   buildCounterScoresResetMultipleForAllRequest++;
   if (buildCounterScoresResetMultipleForAllRequest < 3) {
     o.kind = "foo";
-    o.leaderboardIds = buildUnnamed787();
+    o.leaderboardIds = buildUnnamed791();
   }
   buildCounterScoresResetMultipleForAllRequest--;
   return o;
@@ -523,7 +523,7 @@
   buildCounterScoresResetMultipleForAllRequest++;
   if (buildCounterScoresResetMultipleForAllRequest < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed787(o.leaderboardIds);
+    checkUnnamed791(o.leaderboardIds);
   }
   buildCounterScoresResetMultipleForAllRequest--;
 }
diff --git a/generated/googleapis/test/genomics/v1_test.dart b/generated/googleapis/test/genomics/v1_test.dart
index f8de9fd..dfcd057 100644
--- a/generated/googleapis/test/genomics/v1_test.dart
+++ b/generated/googleapis/test/genomics/v1_test.dart
@@ -50,7 +50,7 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed2981() {
+buildUnnamed3007() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -65,7 +65,7 @@
   return o;
 }
 
-checkUnnamed2981(core.List<core.Object> o) {
+checkUnnamed3007(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map;
   unittest.expect(casted1, unittest.hasLength(3));
@@ -79,17 +79,17 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2982() {
+buildUnnamed3008() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed2981();
-  o["y"] = buildUnnamed2981();
+  o["x"] = buildUnnamed3007();
+  o["y"] = buildUnnamed3007();
   return o;
 }
 
-checkUnnamed2982(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed3008(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2981(o["x"]);
-  checkUnnamed2981(o["y"]);
+  checkUnnamed3007(o["x"]);
+  checkUnnamed3007(o["y"]);
 }
 
 core.int buildCounterAnnotation = 0;
@@ -100,7 +100,7 @@
     o.annotationSetId = "foo";
     o.end = "foo";
     o.id = "foo";
-    o.info = buildUnnamed2982();
+    o.info = buildUnnamed3008();
     o.name = "foo";
     o.referenceId = "foo";
     o.referenceName = "foo";
@@ -120,7 +120,7 @@
     unittest.expect(o.annotationSetId, unittest.equals('foo'));
     unittest.expect(o.end, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2982(o.info);
+    checkUnnamed3008(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.referenceId, unittest.equals('foo'));
     unittest.expect(o.referenceName, unittest.equals('foo'));
@@ -133,7 +133,7 @@
   buildCounterAnnotation--;
 }
 
-buildUnnamed2983() {
+buildUnnamed3009() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -148,7 +148,7 @@
   return o;
 }
 
-checkUnnamed2983(core.List<core.Object> o) {
+checkUnnamed3009(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o[0]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -162,17 +162,17 @@
   unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2984() {
+buildUnnamed3010() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed2983();
-  o["y"] = buildUnnamed2983();
+  o["x"] = buildUnnamed3009();
+  o["y"] = buildUnnamed3009();
   return o;
 }
 
-checkUnnamed2984(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed3010(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2983(o["x"]);
-  checkUnnamed2983(o["y"]);
+  checkUnnamed3009(o["x"]);
+  checkUnnamed3009(o["y"]);
 }
 
 core.int buildCounterAnnotationSet = 0;
@@ -182,7 +182,7 @@
   if (buildCounterAnnotationSet < 3) {
     o.datasetId = "foo";
     o.id = "foo";
-    o.info = buildUnnamed2984();
+    o.info = buildUnnamed3010();
     o.name = "foo";
     o.referenceSetId = "foo";
     o.sourceUri = "foo";
@@ -197,7 +197,7 @@
   if (buildCounterAnnotationSet < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2984(o.info);
+    checkUnnamed3010(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
     unittest.expect(o.sourceUri, unittest.equals('foo'));
@@ -206,14 +206,14 @@
   buildCounterAnnotationSet--;
 }
 
-buildUnnamed2985() {
+buildUnnamed3011() {
   var o = new core.List<api.Annotation>();
   o.add(buildAnnotation());
   o.add(buildAnnotation());
   return o;
 }
 
-checkUnnamed2985(core.List<api.Annotation> o) {
+checkUnnamed3011(core.List<api.Annotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotation(o[0]);
   checkAnnotation(o[1]);
@@ -224,7 +224,7 @@
   var o = new api.BatchCreateAnnotationsRequest();
   buildCounterBatchCreateAnnotationsRequest++;
   if (buildCounterBatchCreateAnnotationsRequest < 3) {
-    o.annotations = buildUnnamed2985();
+    o.annotations = buildUnnamed3011();
     o.requestId = "foo";
   }
   buildCounterBatchCreateAnnotationsRequest--;
@@ -234,20 +234,20 @@
 checkBatchCreateAnnotationsRequest(api.BatchCreateAnnotationsRequest o) {
   buildCounterBatchCreateAnnotationsRequest++;
   if (buildCounterBatchCreateAnnotationsRequest < 3) {
-    checkUnnamed2985(o.annotations);
+    checkUnnamed3011(o.annotations);
     unittest.expect(o.requestId, unittest.equals('foo'));
   }
   buildCounterBatchCreateAnnotationsRequest--;
 }
 
-buildUnnamed2986() {
+buildUnnamed3012() {
   var o = new core.List<api.Entry>();
   o.add(buildEntry());
   o.add(buildEntry());
   return o;
 }
 
-checkUnnamed2986(core.List<api.Entry> o) {
+checkUnnamed3012(core.List<api.Entry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntry(o[0]);
   checkEntry(o[1]);
@@ -258,7 +258,7 @@
   var o = new api.BatchCreateAnnotationsResponse();
   buildCounterBatchCreateAnnotationsResponse++;
   if (buildCounterBatchCreateAnnotationsResponse < 3) {
-    o.entries = buildUnnamed2986();
+    o.entries = buildUnnamed3012();
   }
   buildCounterBatchCreateAnnotationsResponse--;
   return o;
@@ -267,19 +267,19 @@
 checkBatchCreateAnnotationsResponse(api.BatchCreateAnnotationsResponse o) {
   buildCounterBatchCreateAnnotationsResponse++;
   if (buildCounterBatchCreateAnnotationsResponse < 3) {
-    checkUnnamed2986(o.entries);
+    checkUnnamed3012(o.entries);
   }
   buildCounterBatchCreateAnnotationsResponse--;
 }
 
-buildUnnamed2987() {
+buildUnnamed3013() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2987(core.List<core.String> o) {
+checkUnnamed3013(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -290,7 +290,7 @@
   var o = new api.Binding();
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    o.members = buildUnnamed2987();
+    o.members = buildUnnamed3013();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -300,13 +300,13 @@
 checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkUnnamed2987(o.members);
+    checkUnnamed3013(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
 }
 
-buildUnnamed2988() {
+buildUnnamed3014() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -321,7 +321,7 @@
   return o;
 }
 
-checkUnnamed2988(core.List<core.Object> o) {
+checkUnnamed3014(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o[0]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -335,27 +335,27 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2989() {
+buildUnnamed3015() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed2988();
-  o["y"] = buildUnnamed2988();
+  o["x"] = buildUnnamed3014();
+  o["y"] = buildUnnamed3014();
   return o;
 }
 
-checkUnnamed2989(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed3015(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2988(o["x"]);
-  checkUnnamed2988(o["y"]);
+  checkUnnamed3014(o["x"]);
+  checkUnnamed3014(o["y"]);
 }
 
-buildUnnamed2990() {
+buildUnnamed3016() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2990(core.List<core.String> o) {
+checkUnnamed3016(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -368,10 +368,10 @@
   if (buildCounterCallSet < 3) {
     o.created = "foo";
     o.id = "foo";
-    o.info = buildUnnamed2989();
+    o.info = buildUnnamed3015();
     o.name = "foo";
     o.sampleId = "foo";
-    o.variantSetIds = buildUnnamed2990();
+    o.variantSetIds = buildUnnamed3016();
   }
   buildCounterCallSet--;
   return o;
@@ -382,10 +382,10 @@
   if (buildCounterCallSet < 3) {
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2989(o.info);
+    checkUnnamed3015(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.sampleId, unittest.equals('foo'));
-    checkUnnamed2990(o.variantSetIds);
+    checkUnnamed3016(o.variantSetIds);
   }
   buildCounterCallSet--;
 }
@@ -428,27 +428,27 @@
   buildCounterCigarUnit--;
 }
 
-buildUnnamed2991() {
+buildUnnamed3017() {
   var o = new core.List<api.ExternalId>();
   o.add(buildExternalId());
   o.add(buildExternalId());
   return o;
 }
 
-checkUnnamed2991(core.List<api.ExternalId> o) {
+checkUnnamed3017(core.List<api.ExternalId> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExternalId(o[0]);
   checkExternalId(o[1]);
 }
 
-buildUnnamed2992() {
+buildUnnamed3018() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2992(core.List<core.String> o) {
+checkUnnamed3018(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -460,8 +460,8 @@
   buildCounterClinicalCondition++;
   if (buildCounterClinicalCondition < 3) {
     o.conceptId = "foo";
-    o.externalIds = buildUnnamed2991();
-    o.names = buildUnnamed2992();
+    o.externalIds = buildUnnamed3017();
+    o.names = buildUnnamed3018();
     o.omimId = "foo";
   }
   buildCounterClinicalCondition--;
@@ -472,8 +472,8 @@
   buildCounterClinicalCondition++;
   if (buildCounterClinicalCondition < 3) {
     unittest.expect(o.conceptId, unittest.equals('foo'));
-    checkUnnamed2991(o.externalIds);
-    checkUnnamed2992(o.names);
+    checkUnnamed3017(o.externalIds);
+    checkUnnamed3018(o.names);
     unittest.expect(o.omimId, unittest.equals('foo'));
   }
   buildCounterClinicalCondition--;
@@ -500,14 +500,14 @@
   buildCounterCodingSequence--;
 }
 
-buildUnnamed2993() {
+buildUnnamed3019() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2993(core.List<core.String> o) {
+checkUnnamed3019(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -518,7 +518,7 @@
   var o = new api.ComputeEngine();
   buildCounterComputeEngine++;
   if (buildCounterComputeEngine < 3) {
-    o.diskNames = buildUnnamed2993();
+    o.diskNames = buildUnnamed3019();
     o.instanceName = "foo";
     o.machineType = "foo";
     o.zone = "foo";
@@ -530,7 +530,7 @@
 checkComputeEngine(api.ComputeEngine o) {
   buildCounterComputeEngine++;
   if (buildCounterComputeEngine < 3) {
-    checkUnnamed2993(o.diskNames);
+    checkUnnamed3019(o.diskNames);
     unittest.expect(o.instanceName, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
@@ -668,14 +668,14 @@
   buildCounterExperiment--;
 }
 
-buildUnnamed2994() {
+buildUnnamed3020() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2994(core.List<core.String> o) {
+checkUnnamed3020(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -688,7 +688,7 @@
   if (buildCounterExportReadGroupSetRequest < 3) {
     o.exportUri = "foo";
     o.projectId = "foo";
-    o.referenceNames = buildUnnamed2994();
+    o.referenceNames = buildUnnamed3020();
   }
   buildCounterExportReadGroupSetRequest--;
   return o;
@@ -699,19 +699,19 @@
   if (buildCounterExportReadGroupSetRequest < 3) {
     unittest.expect(o.exportUri, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed2994(o.referenceNames);
+    checkUnnamed3020(o.referenceNames);
   }
   buildCounterExportReadGroupSetRequest--;
 }
 
-buildUnnamed2995() {
+buildUnnamed3021() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2995(core.List<core.String> o) {
+checkUnnamed3021(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -724,7 +724,7 @@
   if (buildCounterExportVariantSetRequest < 3) {
     o.bigqueryDataset = "foo";
     o.bigqueryTable = "foo";
-    o.callSetIds = buildUnnamed2995();
+    o.callSetIds = buildUnnamed3021();
     o.format = "foo";
     o.projectId = "foo";
   }
@@ -737,7 +737,7 @@
   if (buildCounterExportVariantSetRequest < 3) {
     unittest.expect(o.bigqueryDataset, unittest.equals('foo'));
     unittest.expect(o.bigqueryTable, unittest.equals('foo'));
-    checkUnnamed2995(o.callSetIds);
+    checkUnnamed3021(o.callSetIds);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
   }
@@ -780,14 +780,14 @@
   buildCounterGetIamPolicyRequest--;
 }
 
-buildUnnamed2996() {
+buildUnnamed3022() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2996(core.List<core.String> o) {
+checkUnnamed3022(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -801,7 +801,7 @@
     o.datasetId = "foo";
     o.partitionStrategy = "foo";
     o.referenceSetId = "foo";
-    o.sourceUris = buildUnnamed2996();
+    o.sourceUris = buildUnnamed3022();
   }
   buildCounterImportReadGroupSetsRequest--;
   return o;
@@ -813,19 +813,19 @@
     unittest.expect(o.datasetId, unittest.equals('foo'));
     unittest.expect(o.partitionStrategy, unittest.equals('foo'));
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
-    checkUnnamed2996(o.sourceUris);
+    checkUnnamed3022(o.sourceUris);
   }
   buildCounterImportReadGroupSetsRequest--;
 }
 
-buildUnnamed2997() {
+buildUnnamed3023() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2997(core.List<core.String> o) {
+checkUnnamed3023(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -836,7 +836,7 @@
   var o = new api.ImportReadGroupSetsResponse();
   buildCounterImportReadGroupSetsResponse++;
   if (buildCounterImportReadGroupSetsResponse < 3) {
-    o.readGroupSetIds = buildUnnamed2997();
+    o.readGroupSetIds = buildUnnamed3023();
   }
   buildCounterImportReadGroupSetsResponse--;
   return o;
@@ -845,32 +845,32 @@
 checkImportReadGroupSetsResponse(api.ImportReadGroupSetsResponse o) {
   buildCounterImportReadGroupSetsResponse++;
   if (buildCounterImportReadGroupSetsResponse < 3) {
-    checkUnnamed2997(o.readGroupSetIds);
+    checkUnnamed3023(o.readGroupSetIds);
   }
   buildCounterImportReadGroupSetsResponse--;
 }
 
-buildUnnamed2998() {
+buildUnnamed3024() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2998(core.Map<core.String, core.String> o) {
+checkUnnamed3024(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'));
 }
 
-buildUnnamed2999() {
+buildUnnamed3025() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2999(core.List<core.String> o) {
+checkUnnamed3025(core.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,9 +882,9 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     o.format = "foo";
-    o.infoMergeConfig = buildUnnamed2998();
+    o.infoMergeConfig = buildUnnamed3024();
     o.normalizeReferenceNames = true;
-    o.sourceUris = buildUnnamed2999();
+    o.sourceUris = buildUnnamed3025();
     o.variantSetId = "foo";
   }
   buildCounterImportVariantsRequest--;
@@ -895,22 +895,22 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     unittest.expect(o.format, unittest.equals('foo'));
-    checkUnnamed2998(o.infoMergeConfig);
+    checkUnnamed3024(o.infoMergeConfig);
     unittest.expect(o.normalizeReferenceNames, unittest.isTrue);
-    checkUnnamed2999(o.sourceUris);
+    checkUnnamed3025(o.sourceUris);
     unittest.expect(o.variantSetId, unittest.equals('foo'));
   }
   buildCounterImportVariantsRequest--;
 }
 
-buildUnnamed3000() {
+buildUnnamed3026() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3000(core.List<core.String> o) {
+checkUnnamed3026(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -921,7 +921,7 @@
   var o = new api.ImportVariantsResponse();
   buildCounterImportVariantsResponse++;
   if (buildCounterImportVariantsResponse < 3) {
-    o.callSetIds = buildUnnamed3000();
+    o.callSetIds = buildUnnamed3026();
   }
   buildCounterImportVariantsResponse--;
   return o;
@@ -930,19 +930,19 @@
 checkImportVariantsResponse(api.ImportVariantsResponse o) {
   buildCounterImportVariantsResponse++;
   if (buildCounterImportVariantsResponse < 3) {
-    checkUnnamed3000(o.callSetIds);
+    checkUnnamed3026(o.callSetIds);
   }
   buildCounterImportVariantsResponse--;
 }
 
-buildUnnamed3001() {
+buildUnnamed3027() {
   var o = new core.List<api.CigarUnit>();
   o.add(buildCigarUnit());
   o.add(buildCigarUnit());
   return o;
 }
 
-checkUnnamed3001(core.List<api.CigarUnit> o) {
+checkUnnamed3027(core.List<api.CigarUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCigarUnit(o[0]);
   checkCigarUnit(o[1]);
@@ -953,7 +953,7 @@
   var o = new api.LinearAlignment();
   buildCounterLinearAlignment++;
   if (buildCounterLinearAlignment < 3) {
-    o.cigar = buildUnnamed3001();
+    o.cigar = buildUnnamed3027();
     o.mappingQuality = 42;
     o.position = buildPosition();
   }
@@ -964,7 +964,7 @@
 checkLinearAlignment(api.LinearAlignment o) {
   buildCounterLinearAlignment++;
   if (buildCounterLinearAlignment < 3) {
-    checkUnnamed3001(o.cigar);
+    checkUnnamed3027(o.cigar);
     unittest.expect(o.mappingQuality, unittest.equals(42));
     checkPosition(o.position);
   }
@@ -994,14 +994,14 @@
   buildCounterListBasesResponse--;
 }
 
-buildUnnamed3002() {
+buildUnnamed3028() {
   var o = new core.List<api.CoverageBucket>();
   o.add(buildCoverageBucket());
   o.add(buildCoverageBucket());
   return o;
 }
 
-checkUnnamed3002(core.List<api.CoverageBucket> o) {
+checkUnnamed3028(core.List<api.CoverageBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCoverageBucket(o[0]);
   checkCoverageBucket(o[1]);
@@ -1013,7 +1013,7 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     o.bucketWidth = "foo";
-    o.coverageBuckets = buildUnnamed3002();
+    o.coverageBuckets = buildUnnamed3028();
     o.nextPageToken = "foo";
   }
   buildCounterListCoverageBucketsResponse--;
@@ -1024,20 +1024,20 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     unittest.expect(o.bucketWidth, unittest.equals('foo'));
-    checkUnnamed3002(o.coverageBuckets);
+    checkUnnamed3028(o.coverageBuckets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListCoverageBucketsResponse--;
 }
 
-buildUnnamed3003() {
+buildUnnamed3029() {
   var o = new core.List<api.Dataset>();
   o.add(buildDataset());
   o.add(buildDataset());
   return o;
 }
 
-checkUnnamed3003(core.List<api.Dataset> o) {
+checkUnnamed3029(core.List<api.Dataset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataset(o[0]);
   checkDataset(o[1]);
@@ -1048,7 +1048,7 @@
   var o = new api.ListDatasetsResponse();
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    o.datasets = buildUnnamed3003();
+    o.datasets = buildUnnamed3029();
     o.nextPageToken = "foo";
   }
   buildCounterListDatasetsResponse--;
@@ -1058,20 +1058,20 @@
 checkListDatasetsResponse(api.ListDatasetsResponse o) {
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    checkUnnamed3003(o.datasets);
+    checkUnnamed3029(o.datasets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDatasetsResponse--;
 }
 
-buildUnnamed3004() {
+buildUnnamed3030() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed3004(core.List<api.Operation> o) {
+checkUnnamed3030(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -1083,7 +1083,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed3004();
+    o.operations = buildUnnamed3030();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -1093,32 +1093,32 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3004(o.operations);
+    checkUnnamed3030(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed3005() {
+buildUnnamed3031() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3005(core.Map<core.String, core.String> o) {
+checkUnnamed3031(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'));
 }
 
-buildUnnamed3006() {
+buildUnnamed3032() {
   var o = new core.List<api.Variant>();
   o.add(buildVariant());
   o.add(buildVariant());
   return o;
 }
 
-checkUnnamed3006(core.List<api.Variant> o) {
+checkUnnamed3032(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariant(o[0]);
   checkVariant(o[1]);
@@ -1129,9 +1129,9 @@
   var o = new api.MergeVariantsRequest();
   buildCounterMergeVariantsRequest++;
   if (buildCounterMergeVariantsRequest < 3) {
-    o.infoMergeConfig = buildUnnamed3005();
+    o.infoMergeConfig = buildUnnamed3031();
     o.variantSetId = "foo";
-    o.variants = buildUnnamed3006();
+    o.variants = buildUnnamed3032();
   }
   buildCounterMergeVariantsRequest--;
   return o;
@@ -1140,14 +1140,14 @@
 checkMergeVariantsRequest(api.MergeVariantsRequest o) {
   buildCounterMergeVariantsRequest++;
   if (buildCounterMergeVariantsRequest < 3) {
-    checkUnnamed3005(o.infoMergeConfig);
+    checkUnnamed3031(o.infoMergeConfig);
     unittest.expect(o.variantSetId, unittest.equals('foo'));
-    checkUnnamed3006(o.variants);
+    checkUnnamed3032(o.variants);
   }
   buildCounterMergeVariantsRequest--;
 }
 
-buildUnnamed3007() {
+buildUnnamed3033() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1162,7 +1162,7 @@
   return o;
 }
 
-checkUnnamed3007(core.Map<core.String, core.Object> o) {
+checkUnnamed3033(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o["x"]) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -1176,7 +1176,7 @@
   unittest.expect(casted8["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3008() {
+buildUnnamed3034() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1191,7 +1191,7 @@
   return o;
 }
 
-checkUnnamed3008(core.Map<core.String, core.Object> o) {
+checkUnnamed3034(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted9 = (o["x"]) as core.Map;
   unittest.expect(casted9, unittest.hasLength(3));
@@ -1212,9 +1212,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed3007();
+    o.metadata = buildUnnamed3033();
     o.name = "foo";
-    o.response = buildUnnamed3008();
+    o.response = buildUnnamed3034();
   }
   buildCounterOperation--;
   return o;
@@ -1225,9 +1225,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed3007(o.metadata);
+    checkUnnamed3033(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3008(o.response);
+    checkUnnamed3034(o.response);
   }
   buildCounterOperation--;
 }
@@ -1255,33 +1255,33 @@
   buildCounterOperationEvent--;
 }
 
-buildUnnamed3009() {
+buildUnnamed3035() {
   var o = new core.List<api.OperationEvent>();
   o.add(buildOperationEvent());
   o.add(buildOperationEvent());
   return o;
 }
 
-checkUnnamed3009(core.List<api.OperationEvent> o) {
+checkUnnamed3035(core.List<api.OperationEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationEvent(o[0]);
   checkOperationEvent(o[1]);
 }
 
-buildUnnamed3010() {
+buildUnnamed3036() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3010(core.Map<core.String, core.String> o) {
+checkUnnamed3036(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'));
 }
 
-buildUnnamed3011() {
+buildUnnamed3037() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1296,7 +1296,7 @@
   return o;
 }
 
-checkUnnamed3011(core.Map<core.String, core.Object> o) {
+checkUnnamed3037(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted11 = (o["x"]) as core.Map;
   unittest.expect(casted11, unittest.hasLength(3));
@@ -1310,7 +1310,7 @@
   unittest.expect(casted12["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3012() {
+buildUnnamed3038() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1325,7 +1325,7 @@
   return o;
 }
 
-checkUnnamed3012(core.Map<core.String, core.Object> o) {
+checkUnnamed3038(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted13 = (o["x"]) as core.Map;
   unittest.expect(casted13, unittest.hasLength(3));
@@ -1347,11 +1347,11 @@
     o.clientId = "foo";
     o.createTime = "foo";
     o.endTime = "foo";
-    o.events = buildUnnamed3009();
-    o.labels = buildUnnamed3010();
+    o.events = buildUnnamed3035();
+    o.labels = buildUnnamed3036();
     o.projectId = "foo";
-    o.request = buildUnnamed3011();
-    o.runtimeMetadata = buildUnnamed3012();
+    o.request = buildUnnamed3037();
+    o.runtimeMetadata = buildUnnamed3038();
     o.startTime = "foo";
   }
   buildCounterOperationMetadata--;
@@ -1364,24 +1364,24 @@
     unittest.expect(o.clientId, unittest.equals('foo'));
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkUnnamed3009(o.events);
-    checkUnnamed3010(o.labels);
+    checkUnnamed3035(o.events);
+    checkUnnamed3036(o.labels);
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed3011(o.request);
-    checkUnnamed3012(o.runtimeMetadata);
+    checkUnnamed3037(o.request);
+    checkUnnamed3038(o.runtimeMetadata);
     unittest.expect(o.startTime, unittest.equals('foo'));
   }
   buildCounterOperationMetadata--;
 }
 
-buildUnnamed3013() {
+buildUnnamed3039() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed3013(core.List<api.Binding> o) {
+checkUnnamed3039(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -1392,7 +1392,7 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.bindings = buildUnnamed3013();
+    o.bindings = buildUnnamed3039();
     o.etag = "foo";
     o.version = 42;
   }
@@ -1403,7 +1403,7 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed3013(o.bindings);
+    checkUnnamed3039(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
@@ -1483,20 +1483,20 @@
   buildCounterRange--;
 }
 
-buildUnnamed3014() {
+buildUnnamed3040() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed3014(core.List<core.int> o) {
+checkUnnamed3040(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));
 }
 
-buildUnnamed3015() {
+buildUnnamed3041() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -1511,7 +1511,7 @@
   return o;
 }
 
-checkUnnamed3015(core.List<core.Object> o) {
+checkUnnamed3041(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted15 = (o[0]) as core.Map;
   unittest.expect(casted15, unittest.hasLength(3));
@@ -1525,17 +1525,17 @@
   unittest.expect(casted16["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3016() {
+buildUnnamed3042() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed3015();
-  o["y"] = buildUnnamed3015();
+  o["x"] = buildUnnamed3041();
+  o["y"] = buildUnnamed3041();
   return o;
 }
 
-checkUnnamed3016(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed3042(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3015(o["x"]);
-  checkUnnamed3015(o["y"]);
+  checkUnnamed3041(o["x"]);
+  checkUnnamed3041(o["y"]);
 }
 
 core.int buildCounterRead = 0;
@@ -1543,7 +1543,7 @@
   var o = new api.Read();
   buildCounterRead++;
   if (buildCounterRead < 3) {
-    o.alignedQuality = buildUnnamed3014();
+    o.alignedQuality = buildUnnamed3040();
     o.alignedSequence = "foo";
     o.alignment = buildLinearAlignment();
     o.duplicateFragment = true;
@@ -1551,7 +1551,7 @@
     o.fragmentLength = 42;
     o.fragmentName = "foo";
     o.id = "foo";
-    o.info = buildUnnamed3016();
+    o.info = buildUnnamed3042();
     o.nextMatePosition = buildPosition();
     o.numberReads = 42;
     o.properPlacement = true;
@@ -1568,7 +1568,7 @@
 checkRead(api.Read o) {
   buildCounterRead++;
   if (buildCounterRead < 3) {
-    checkUnnamed3014(o.alignedQuality);
+    checkUnnamed3040(o.alignedQuality);
     unittest.expect(o.alignedSequence, unittest.equals('foo'));
     checkLinearAlignment(o.alignment);
     unittest.expect(o.duplicateFragment, unittest.isTrue);
@@ -1576,7 +1576,7 @@
     unittest.expect(o.fragmentLength, unittest.equals(42));
     unittest.expect(o.fragmentName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed3016(o.info);
+    checkUnnamed3042(o.info);
     checkPosition(o.nextMatePosition);
     unittest.expect(o.numberReads, unittest.equals(42));
     unittest.expect(o.properPlacement, unittest.isTrue);
@@ -1589,7 +1589,7 @@
   buildCounterRead--;
 }
 
-buildUnnamed3017() {
+buildUnnamed3043() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -1604,7 +1604,7 @@
   return o;
 }
 
-checkUnnamed3017(core.List<core.Object> o) {
+checkUnnamed3043(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted17 = (o[0]) as core.Map;
   unittest.expect(casted17, unittest.hasLength(3));
@@ -1618,27 +1618,27 @@
   unittest.expect(casted18["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3018() {
+buildUnnamed3044() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed3017();
-  o["y"] = buildUnnamed3017();
+  o["x"] = buildUnnamed3043();
+  o["y"] = buildUnnamed3043();
   return o;
 }
 
-checkUnnamed3018(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed3044(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3017(o["x"]);
-  checkUnnamed3017(o["y"]);
+  checkUnnamed3043(o["x"]);
+  checkUnnamed3043(o["y"]);
 }
 
-buildUnnamed3019() {
+buildUnnamed3045() {
   var o = new core.List<api.Program>();
   o.add(buildProgram());
   o.add(buildProgram());
   return o;
 }
 
-checkUnnamed3019(core.List<api.Program> o) {
+checkUnnamed3045(core.List<api.Program> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProgram(o[0]);
   checkProgram(o[1]);
@@ -1653,10 +1653,10 @@
     o.description = "foo";
     o.experiment = buildExperiment();
     o.id = "foo";
-    o.info = buildUnnamed3018();
+    o.info = buildUnnamed3044();
     o.name = "foo";
     o.predictedInsertSize = 42;
-    o.programs = buildUnnamed3019();
+    o.programs = buildUnnamed3045();
     o.referenceSetId = "foo";
     o.sampleId = "foo";
   }
@@ -1671,17 +1671,17 @@
     unittest.expect(o.description, unittest.equals('foo'));
     checkExperiment(o.experiment);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed3018(o.info);
+    checkUnnamed3044(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.predictedInsertSize, unittest.equals(42));
-    checkUnnamed3019(o.programs);
+    checkUnnamed3045(o.programs);
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
     unittest.expect(o.sampleId, unittest.equals('foo'));
   }
   buildCounterReadGroup--;
 }
 
-buildUnnamed3020() {
+buildUnnamed3046() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -1696,7 +1696,7 @@
   return o;
 }
 
-checkUnnamed3020(core.List<core.Object> o) {
+checkUnnamed3046(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted19 = (o[0]) as core.Map;
   unittest.expect(casted19, unittest.hasLength(3));
@@ -1710,27 +1710,27 @@
   unittest.expect(casted20["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3021() {
+buildUnnamed3047() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed3020();
-  o["y"] = buildUnnamed3020();
+  o["x"] = buildUnnamed3046();
+  o["y"] = buildUnnamed3046();
   return o;
 }
 
-checkUnnamed3021(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed3047(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3020(o["x"]);
-  checkUnnamed3020(o["y"]);
+  checkUnnamed3046(o["x"]);
+  checkUnnamed3046(o["y"]);
 }
 
-buildUnnamed3022() {
+buildUnnamed3048() {
   var o = new core.List<api.ReadGroup>();
   o.add(buildReadGroup());
   o.add(buildReadGroup());
   return o;
 }
 
-checkUnnamed3022(core.List<api.ReadGroup> o) {
+checkUnnamed3048(core.List<api.ReadGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadGroup(o[0]);
   checkReadGroup(o[1]);
@@ -1744,9 +1744,9 @@
     o.datasetId = "foo";
     o.filename = "foo";
     o.id = "foo";
-    o.info = buildUnnamed3021();
+    o.info = buildUnnamed3047();
     o.name = "foo";
-    o.readGroups = buildUnnamed3022();
+    o.readGroups = buildUnnamed3048();
     o.referenceSetId = "foo";
   }
   buildCounterReadGroupSet--;
@@ -1759,22 +1759,22 @@
     unittest.expect(o.datasetId, unittest.equals('foo'));
     unittest.expect(o.filename, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed3021(o.info);
+    checkUnnamed3047(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3022(o.readGroups);
+    checkUnnamed3048(o.readGroups);
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
   }
   buildCounterReadGroupSet--;
 }
 
-buildUnnamed3023() {
+buildUnnamed3049() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3023(core.List<core.String> o) {
+checkUnnamed3049(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1790,7 +1790,7 @@
     o.md5checksum = "foo";
     o.name = "foo";
     o.ncbiTaxonId = 42;
-    o.sourceAccessions = buildUnnamed3023();
+    o.sourceAccessions = buildUnnamed3049();
     o.sourceUri = "foo";
   }
   buildCounterReference--;
@@ -1805,7 +1805,7 @@
     unittest.expect(o.md5checksum, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ncbiTaxonId, unittest.equals(42));
-    checkUnnamed3023(o.sourceAccessions);
+    checkUnnamed3049(o.sourceAccessions);
     unittest.expect(o.sourceUri, unittest.equals('foo'));
   }
   buildCounterReference--;
@@ -1832,27 +1832,27 @@
   buildCounterReferenceBound--;
 }
 
-buildUnnamed3024() {
+buildUnnamed3050() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3024(core.List<core.String> o) {
+checkUnnamed3050(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3025() {
+buildUnnamed3051() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3025(core.List<core.String> o) {
+checkUnnamed3051(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1868,8 +1868,8 @@
     o.id = "foo";
     o.md5checksum = "foo";
     o.ncbiTaxonId = 42;
-    o.referenceIds = buildUnnamed3024();
-    o.sourceAccessions = buildUnnamed3025();
+    o.referenceIds = buildUnnamed3050();
+    o.sourceAccessions = buildUnnamed3051();
     o.sourceUri = "foo";
   }
   buildCounterReferenceSet--;
@@ -1884,8 +1884,8 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.md5checksum, unittest.equals('foo'));
     unittest.expect(o.ncbiTaxonId, unittest.equals(42));
-    checkUnnamed3024(o.referenceIds);
-    checkUnnamed3025(o.sourceAccessions);
+    checkUnnamed3050(o.referenceIds);
+    checkUnnamed3051(o.sourceAccessions);
     unittest.expect(o.sourceUri, unittest.equals('foo'));
   }
   buildCounterReferenceSet--;
@@ -1910,27 +1910,27 @@
   buildCounterRuntimeMetadata--;
 }
 
-buildUnnamed3026() {
+buildUnnamed3052() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3026(core.List<core.String> o) {
+checkUnnamed3052(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3027() {
+buildUnnamed3053() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3027(core.List<core.String> o) {
+checkUnnamed3053(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1941,12 +1941,12 @@
   var o = new api.SearchAnnotationSetsRequest();
   buildCounterSearchAnnotationSetsRequest++;
   if (buildCounterSearchAnnotationSetsRequest < 3) {
-    o.datasetIds = buildUnnamed3026();
+    o.datasetIds = buildUnnamed3052();
     o.name = "foo";
     o.pageSize = 42;
     o.pageToken = "foo";
     o.referenceSetId = "foo";
-    o.types = buildUnnamed3027();
+    o.types = buildUnnamed3053();
   }
   buildCounterSearchAnnotationSetsRequest--;
   return o;
@@ -1955,24 +1955,24 @@
 checkSearchAnnotationSetsRequest(api.SearchAnnotationSetsRequest o) {
   buildCounterSearchAnnotationSetsRequest++;
   if (buildCounterSearchAnnotationSetsRequest < 3) {
-    checkUnnamed3026(o.datasetIds);
+    checkUnnamed3052(o.datasetIds);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
-    checkUnnamed3027(o.types);
+    checkUnnamed3053(o.types);
   }
   buildCounterSearchAnnotationSetsRequest--;
 }
 
-buildUnnamed3028() {
+buildUnnamed3054() {
   var o = new core.List<api.AnnotationSet>();
   o.add(buildAnnotationSet());
   o.add(buildAnnotationSet());
   return o;
 }
 
-checkUnnamed3028(core.List<api.AnnotationSet> o) {
+checkUnnamed3054(core.List<api.AnnotationSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotationSet(o[0]);
   checkAnnotationSet(o[1]);
@@ -1983,7 +1983,7 @@
   var o = new api.SearchAnnotationSetsResponse();
   buildCounterSearchAnnotationSetsResponse++;
   if (buildCounterSearchAnnotationSetsResponse < 3) {
-    o.annotationSets = buildUnnamed3028();
+    o.annotationSets = buildUnnamed3054();
     o.nextPageToken = "foo";
   }
   buildCounterSearchAnnotationSetsResponse--;
@@ -1993,20 +1993,20 @@
 checkSearchAnnotationSetsResponse(api.SearchAnnotationSetsResponse o) {
   buildCounterSearchAnnotationSetsResponse++;
   if (buildCounterSearchAnnotationSetsResponse < 3) {
-    checkUnnamed3028(o.annotationSets);
+    checkUnnamed3054(o.annotationSets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchAnnotationSetsResponse--;
 }
 
-buildUnnamed3029() {
+buildUnnamed3055() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3029(core.List<core.String> o) {
+checkUnnamed3055(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2017,7 +2017,7 @@
   var o = new api.SearchAnnotationsRequest();
   buildCounterSearchAnnotationsRequest++;
   if (buildCounterSearchAnnotationsRequest < 3) {
-    o.annotationSetIds = buildUnnamed3029();
+    o.annotationSetIds = buildUnnamed3055();
     o.end = "foo";
     o.pageSize = 42;
     o.pageToken = "foo";
@@ -2032,7 +2032,7 @@
 checkSearchAnnotationsRequest(api.SearchAnnotationsRequest o) {
   buildCounterSearchAnnotationsRequest++;
   if (buildCounterSearchAnnotationsRequest < 3) {
-    checkUnnamed3029(o.annotationSetIds);
+    checkUnnamed3055(o.annotationSetIds);
     unittest.expect(o.end, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
@@ -2043,14 +2043,14 @@
   buildCounterSearchAnnotationsRequest--;
 }
 
-buildUnnamed3030() {
+buildUnnamed3056() {
   var o = new core.List<api.Annotation>();
   o.add(buildAnnotation());
   o.add(buildAnnotation());
   return o;
 }
 
-checkUnnamed3030(core.List<api.Annotation> o) {
+checkUnnamed3056(core.List<api.Annotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotation(o[0]);
   checkAnnotation(o[1]);
@@ -2061,7 +2061,7 @@
   var o = new api.SearchAnnotationsResponse();
   buildCounterSearchAnnotationsResponse++;
   if (buildCounterSearchAnnotationsResponse < 3) {
-    o.annotations = buildUnnamed3030();
+    o.annotations = buildUnnamed3056();
     o.nextPageToken = "foo";
   }
   buildCounterSearchAnnotationsResponse--;
@@ -2071,20 +2071,20 @@
 checkSearchAnnotationsResponse(api.SearchAnnotationsResponse o) {
   buildCounterSearchAnnotationsResponse++;
   if (buildCounterSearchAnnotationsResponse < 3) {
-    checkUnnamed3030(o.annotations);
+    checkUnnamed3056(o.annotations);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchAnnotationsResponse--;
 }
 
-buildUnnamed3031() {
+buildUnnamed3057() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3031(core.List<core.String> o) {
+checkUnnamed3057(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2098,7 +2098,7 @@
     o.name = "foo";
     o.pageSize = 42;
     o.pageToken = "foo";
-    o.variantSetIds = buildUnnamed3031();
+    o.variantSetIds = buildUnnamed3057();
   }
   buildCounterSearchCallSetsRequest--;
   return o;
@@ -2110,19 +2110,19 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed3031(o.variantSetIds);
+    checkUnnamed3057(o.variantSetIds);
   }
   buildCounterSearchCallSetsRequest--;
 }
 
-buildUnnamed3032() {
+buildUnnamed3058() {
   var o = new core.List<api.CallSet>();
   o.add(buildCallSet());
   o.add(buildCallSet());
   return o;
 }
 
-checkUnnamed3032(core.List<api.CallSet> o) {
+checkUnnamed3058(core.List<api.CallSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCallSet(o[0]);
   checkCallSet(o[1]);
@@ -2133,7 +2133,7 @@
   var o = new api.SearchCallSetsResponse();
   buildCounterSearchCallSetsResponse++;
   if (buildCounterSearchCallSetsResponse < 3) {
-    o.callSets = buildUnnamed3032();
+    o.callSets = buildUnnamed3058();
     o.nextPageToken = "foo";
   }
   buildCounterSearchCallSetsResponse--;
@@ -2143,20 +2143,20 @@
 checkSearchCallSetsResponse(api.SearchCallSetsResponse o) {
   buildCounterSearchCallSetsResponse++;
   if (buildCounterSearchCallSetsResponse < 3) {
-    checkUnnamed3032(o.callSets);
+    checkUnnamed3058(o.callSets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchCallSetsResponse--;
 }
 
-buildUnnamed3033() {
+buildUnnamed3059() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3033(core.List<core.String> o) {
+checkUnnamed3059(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2167,7 +2167,7 @@
   var o = new api.SearchReadGroupSetsRequest();
   buildCounterSearchReadGroupSetsRequest++;
   if (buildCounterSearchReadGroupSetsRequest < 3) {
-    o.datasetIds = buildUnnamed3033();
+    o.datasetIds = buildUnnamed3059();
     o.name = "foo";
     o.pageSize = 42;
     o.pageToken = "foo";
@@ -2179,7 +2179,7 @@
 checkSearchReadGroupSetsRequest(api.SearchReadGroupSetsRequest o) {
   buildCounterSearchReadGroupSetsRequest++;
   if (buildCounterSearchReadGroupSetsRequest < 3) {
-    checkUnnamed3033(o.datasetIds);
+    checkUnnamed3059(o.datasetIds);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
@@ -2187,14 +2187,14 @@
   buildCounterSearchReadGroupSetsRequest--;
 }
 
-buildUnnamed3034() {
+buildUnnamed3060() {
   var o = new core.List<api.ReadGroupSet>();
   o.add(buildReadGroupSet());
   o.add(buildReadGroupSet());
   return o;
 }
 
-checkUnnamed3034(core.List<api.ReadGroupSet> o) {
+checkUnnamed3060(core.List<api.ReadGroupSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadGroupSet(o[0]);
   checkReadGroupSet(o[1]);
@@ -2206,7 +2206,7 @@
   buildCounterSearchReadGroupSetsResponse++;
   if (buildCounterSearchReadGroupSetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.readGroupSets = buildUnnamed3034();
+    o.readGroupSets = buildUnnamed3060();
   }
   buildCounterSearchReadGroupSetsResponse--;
   return o;
@@ -2216,32 +2216,32 @@
   buildCounterSearchReadGroupSetsResponse++;
   if (buildCounterSearchReadGroupSetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3034(o.readGroupSets);
+    checkUnnamed3060(o.readGroupSets);
   }
   buildCounterSearchReadGroupSetsResponse--;
 }
 
-buildUnnamed3035() {
+buildUnnamed3061() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3035(core.List<core.String> o) {
+checkUnnamed3061(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3036() {
+buildUnnamed3062() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3036(core.List<core.String> o) {
+checkUnnamed3062(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2255,8 +2255,8 @@
     o.end = "foo";
     o.pageSize = 42;
     o.pageToken = "foo";
-    o.readGroupIds = buildUnnamed3035();
-    o.readGroupSetIds = buildUnnamed3036();
+    o.readGroupIds = buildUnnamed3061();
+    o.readGroupSetIds = buildUnnamed3062();
     o.referenceName = "foo";
     o.start = "foo";
   }
@@ -2270,22 +2270,22 @@
     unittest.expect(o.end, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed3035(o.readGroupIds);
-    checkUnnamed3036(o.readGroupSetIds);
+    checkUnnamed3061(o.readGroupIds);
+    checkUnnamed3062(o.readGroupSetIds);
     unittest.expect(o.referenceName, unittest.equals('foo'));
     unittest.expect(o.start, unittest.equals('foo'));
   }
   buildCounterSearchReadsRequest--;
 }
 
-buildUnnamed3037() {
+buildUnnamed3063() {
   var o = new core.List<api.Read>();
   o.add(buildRead());
   o.add(buildRead());
   return o;
 }
 
-checkUnnamed3037(core.List<api.Read> o) {
+checkUnnamed3063(core.List<api.Read> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRead(o[0]);
   checkRead(o[1]);
@@ -2296,7 +2296,7 @@
   var o = new api.SearchReadsResponse();
   buildCounterSearchReadsResponse++;
   if (buildCounterSearchReadsResponse < 3) {
-    o.alignments = buildUnnamed3037();
+    o.alignments = buildUnnamed3063();
     o.nextPageToken = "foo";
   }
   buildCounterSearchReadsResponse--;
@@ -2306,33 +2306,33 @@
 checkSearchReadsResponse(api.SearchReadsResponse o) {
   buildCounterSearchReadsResponse++;
   if (buildCounterSearchReadsResponse < 3) {
-    checkUnnamed3037(o.alignments);
+    checkUnnamed3063(o.alignments);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchReadsResponse--;
 }
 
-buildUnnamed3038() {
+buildUnnamed3064() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3038(core.List<core.String> o) {
+checkUnnamed3064(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3039() {
+buildUnnamed3065() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3039(core.List<core.String> o) {
+checkUnnamed3065(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2343,9 +2343,9 @@
   var o = new api.SearchReferenceSetsRequest();
   buildCounterSearchReferenceSetsRequest++;
   if (buildCounterSearchReferenceSetsRequest < 3) {
-    o.accessions = buildUnnamed3038();
+    o.accessions = buildUnnamed3064();
     o.assemblyId = "foo";
-    o.md5checksums = buildUnnamed3039();
+    o.md5checksums = buildUnnamed3065();
     o.pageSize = 42;
     o.pageToken = "foo";
   }
@@ -2356,23 +2356,23 @@
 checkSearchReferenceSetsRequest(api.SearchReferenceSetsRequest o) {
   buildCounterSearchReferenceSetsRequest++;
   if (buildCounterSearchReferenceSetsRequest < 3) {
-    checkUnnamed3038(o.accessions);
+    checkUnnamed3064(o.accessions);
     unittest.expect(o.assemblyId, unittest.equals('foo'));
-    checkUnnamed3039(o.md5checksums);
+    checkUnnamed3065(o.md5checksums);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
   }
   buildCounterSearchReferenceSetsRequest--;
 }
 
-buildUnnamed3040() {
+buildUnnamed3066() {
   var o = new core.List<api.ReferenceSet>();
   o.add(buildReferenceSet());
   o.add(buildReferenceSet());
   return o;
 }
 
-checkUnnamed3040(core.List<api.ReferenceSet> o) {
+checkUnnamed3066(core.List<api.ReferenceSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReferenceSet(o[0]);
   checkReferenceSet(o[1]);
@@ -2384,7 +2384,7 @@
   buildCounterSearchReferenceSetsResponse++;
   if (buildCounterSearchReferenceSetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.referenceSets = buildUnnamed3040();
+    o.referenceSets = buildUnnamed3066();
   }
   buildCounterSearchReferenceSetsResponse--;
   return o;
@@ -2394,32 +2394,32 @@
   buildCounterSearchReferenceSetsResponse++;
   if (buildCounterSearchReferenceSetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3040(o.referenceSets);
+    checkUnnamed3066(o.referenceSets);
   }
   buildCounterSearchReferenceSetsResponse--;
 }
 
-buildUnnamed3041() {
+buildUnnamed3067() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3041(core.List<core.String> o) {
+checkUnnamed3067(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3042() {
+buildUnnamed3068() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3042(core.List<core.String> o) {
+checkUnnamed3068(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2430,8 +2430,8 @@
   var o = new api.SearchReferencesRequest();
   buildCounterSearchReferencesRequest++;
   if (buildCounterSearchReferencesRequest < 3) {
-    o.accessions = buildUnnamed3041();
-    o.md5checksums = buildUnnamed3042();
+    o.accessions = buildUnnamed3067();
+    o.md5checksums = buildUnnamed3068();
     o.pageSize = 42;
     o.pageToken = "foo";
     o.referenceSetId = "foo";
@@ -2443,8 +2443,8 @@
 checkSearchReferencesRequest(api.SearchReferencesRequest o) {
   buildCounterSearchReferencesRequest++;
   if (buildCounterSearchReferencesRequest < 3) {
-    checkUnnamed3041(o.accessions);
-    checkUnnamed3042(o.md5checksums);
+    checkUnnamed3067(o.accessions);
+    checkUnnamed3068(o.md5checksums);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
@@ -2452,14 +2452,14 @@
   buildCounterSearchReferencesRequest--;
 }
 
-buildUnnamed3043() {
+buildUnnamed3069() {
   var o = new core.List<api.Reference>();
   o.add(buildReference());
   o.add(buildReference());
   return o;
 }
 
-checkUnnamed3043(core.List<api.Reference> o) {
+checkUnnamed3069(core.List<api.Reference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReference(o[0]);
   checkReference(o[1]);
@@ -2471,7 +2471,7 @@
   buildCounterSearchReferencesResponse++;
   if (buildCounterSearchReferencesResponse < 3) {
     o.nextPageToken = "foo";
-    o.references = buildUnnamed3043();
+    o.references = buildUnnamed3069();
   }
   buildCounterSearchReferencesResponse--;
   return o;
@@ -2481,19 +2481,19 @@
   buildCounterSearchReferencesResponse++;
   if (buildCounterSearchReferencesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3043(o.references);
+    checkUnnamed3069(o.references);
   }
   buildCounterSearchReferencesResponse--;
 }
 
-buildUnnamed3044() {
+buildUnnamed3070() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3044(core.List<core.String> o) {
+checkUnnamed3070(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2504,7 +2504,7 @@
   var o = new api.SearchVariantSetsRequest();
   buildCounterSearchVariantSetsRequest++;
   if (buildCounterSearchVariantSetsRequest < 3) {
-    o.datasetIds = buildUnnamed3044();
+    o.datasetIds = buildUnnamed3070();
     o.pageSize = 42;
     o.pageToken = "foo";
   }
@@ -2515,21 +2515,21 @@
 checkSearchVariantSetsRequest(api.SearchVariantSetsRequest o) {
   buildCounterSearchVariantSetsRequest++;
   if (buildCounterSearchVariantSetsRequest < 3) {
-    checkUnnamed3044(o.datasetIds);
+    checkUnnamed3070(o.datasetIds);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
   }
   buildCounterSearchVariantSetsRequest--;
 }
 
-buildUnnamed3045() {
+buildUnnamed3071() {
   var o = new core.List<api.VariantSet>();
   o.add(buildVariantSet());
   o.add(buildVariantSet());
   return o;
 }
 
-checkUnnamed3045(core.List<api.VariantSet> o) {
+checkUnnamed3071(core.List<api.VariantSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariantSet(o[0]);
   checkVariantSet(o[1]);
@@ -2541,7 +2541,7 @@
   buildCounterSearchVariantSetsResponse++;
   if (buildCounterSearchVariantSetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.variantSets = buildUnnamed3045();
+    o.variantSets = buildUnnamed3071();
   }
   buildCounterSearchVariantSetsResponse--;
   return o;
@@ -2551,32 +2551,32 @@
   buildCounterSearchVariantSetsResponse++;
   if (buildCounterSearchVariantSetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3045(o.variantSets);
+    checkUnnamed3071(o.variantSets);
   }
   buildCounterSearchVariantSetsResponse--;
 }
 
-buildUnnamed3046() {
+buildUnnamed3072() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3046(core.List<core.String> o) {
+checkUnnamed3072(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3047() {
+buildUnnamed3073() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3047(core.List<core.String> o) {
+checkUnnamed3073(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2587,7 +2587,7 @@
   var o = new api.SearchVariantsRequest();
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    o.callSetIds = buildUnnamed3046();
+    o.callSetIds = buildUnnamed3072();
     o.end = "foo";
     o.maxCalls = 42;
     o.pageSize = 42;
@@ -2595,7 +2595,7 @@
     o.referenceName = "foo";
     o.start = "foo";
     o.variantName = "foo";
-    o.variantSetIds = buildUnnamed3047();
+    o.variantSetIds = buildUnnamed3073();
   }
   buildCounterSearchVariantsRequest--;
   return o;
@@ -2604,7 +2604,7 @@
 checkSearchVariantsRequest(api.SearchVariantsRequest o) {
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    checkUnnamed3046(o.callSetIds);
+    checkUnnamed3072(o.callSetIds);
     unittest.expect(o.end, unittest.equals('foo'));
     unittest.expect(o.maxCalls, unittest.equals(42));
     unittest.expect(o.pageSize, unittest.equals(42));
@@ -2612,19 +2612,19 @@
     unittest.expect(o.referenceName, unittest.equals('foo'));
     unittest.expect(o.start, unittest.equals('foo'));
     unittest.expect(o.variantName, unittest.equals('foo'));
-    checkUnnamed3047(o.variantSetIds);
+    checkUnnamed3073(o.variantSetIds);
   }
   buildCounterSearchVariantsRequest--;
 }
 
-buildUnnamed3048() {
+buildUnnamed3074() {
   var o = new core.List<api.Variant>();
   o.add(buildVariant());
   o.add(buildVariant());
   return o;
 }
 
-checkUnnamed3048(core.List<api.Variant> o) {
+checkUnnamed3074(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariant(o[0]);
   checkVariant(o[1]);
@@ -2636,7 +2636,7 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     o.nextPageToken = "foo";
-    o.variants = buildUnnamed3048();
+    o.variants = buildUnnamed3074();
   }
   buildCounterSearchVariantsResponse--;
   return o;
@@ -2646,7 +2646,7 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3048(o.variants);
+    checkUnnamed3074(o.variants);
   }
   buildCounterSearchVariantsResponse--;
 }
@@ -2670,7 +2670,7 @@
   buildCounterSetIamPolicyRequest--;
 }
 
-buildUnnamed3049() {
+buildUnnamed3075() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -2685,7 +2685,7 @@
   return o;
 }
 
-checkUnnamed3049(core.Map<core.String, core.Object> o) {
+checkUnnamed3075(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted21 = (o["x"]) as core.Map;
   unittest.expect(casted21, unittest.hasLength(3));
@@ -2699,17 +2699,17 @@
   unittest.expect(casted22["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3050() {
+buildUnnamed3076() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed3049());
-  o.add(buildUnnamed3049());
+  o.add(buildUnnamed3075());
+  o.add(buildUnnamed3075());
   return o;
 }
 
-checkUnnamed3050(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed3076(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3049(o[0]);
-  checkUnnamed3049(o[1]);
+  checkUnnamed3075(o[0]);
+  checkUnnamed3075(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -2718,7 +2718,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed3050();
+    o.details = buildUnnamed3076();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -2729,20 +2729,20 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed3050(o.details);
+    checkUnnamed3076(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-buildUnnamed3051() {
+buildUnnamed3077() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3051(core.List<core.String> o) {
+checkUnnamed3077(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2753,7 +2753,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed3051();
+    o.permissions = buildUnnamed3077();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -2762,19 +2762,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed3051(o.permissions);
+    checkUnnamed3077(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed3052() {
+buildUnnamed3078() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3052(core.List<core.String> o) {
+checkUnnamed3078(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2785,7 +2785,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed3052();
+    o.permissions = buildUnnamed3078();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -2794,19 +2794,19 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed3052(o.permissions);
+    checkUnnamed3078(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
 
-buildUnnamed3053() {
+buildUnnamed3079() {
   var o = new core.List<api.Exon>();
   o.add(buildExon());
   o.add(buildExon());
   return o;
 }
 
-checkUnnamed3053(core.List<api.Exon> o) {
+checkUnnamed3079(core.List<api.Exon> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExon(o[0]);
   checkExon(o[1]);
@@ -2818,7 +2818,7 @@
   buildCounterTranscript++;
   if (buildCounterTranscript < 3) {
     o.codingSequence = buildCodingSequence();
-    o.exons = buildUnnamed3053();
+    o.exons = buildUnnamed3079();
     o.geneId = "foo";
   }
   buildCounterTranscript--;
@@ -2829,7 +2829,7 @@
   buildCounterTranscript++;
   if (buildCounterTranscript < 3) {
     checkCodingSequence(o.codingSequence);
-    checkUnnamed3053(o.exons);
+    checkUnnamed3079(o.exons);
     unittest.expect(o.geneId, unittest.equals('foo'));
   }
   buildCounterTranscript--;
@@ -2850,46 +2850,46 @@
   buildCounterUndeleteDatasetRequest--;
 }
 
-buildUnnamed3054() {
+buildUnnamed3080() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3054(core.List<core.String> o) {
+checkUnnamed3080(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3055() {
+buildUnnamed3081() {
   var o = new core.List<api.VariantCall>();
   o.add(buildVariantCall());
   o.add(buildVariantCall());
   return o;
 }
 
-checkUnnamed3055(core.List<api.VariantCall> o) {
+checkUnnamed3081(core.List<api.VariantCall> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariantCall(o[0]);
   checkVariantCall(o[1]);
 }
 
-buildUnnamed3056() {
+buildUnnamed3082() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3056(core.List<core.String> o) {
+checkUnnamed3082(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3057() {
+buildUnnamed3083() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -2904,7 +2904,7 @@
   return o;
 }
 
-checkUnnamed3057(core.List<core.Object> o) {
+checkUnnamed3083(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted23 = (o[0]) as core.Map;
   unittest.expect(casted23, unittest.hasLength(3));
@@ -2918,27 +2918,27 @@
   unittest.expect(casted24["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3058() {
+buildUnnamed3084() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed3057();
-  o["y"] = buildUnnamed3057();
+  o["x"] = buildUnnamed3083();
+  o["y"] = buildUnnamed3083();
   return o;
 }
 
-checkUnnamed3058(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed3084(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3057(o["x"]);
-  checkUnnamed3057(o["y"]);
+  checkUnnamed3083(o["x"]);
+  checkUnnamed3083(o["y"]);
 }
 
-buildUnnamed3059() {
+buildUnnamed3085() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3059(core.List<core.String> o) {
+checkUnnamed3085(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2949,14 +2949,14 @@
   var o = new api.Variant();
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    o.alternateBases = buildUnnamed3054();
-    o.calls = buildUnnamed3055();
+    o.alternateBases = buildUnnamed3080();
+    o.calls = buildUnnamed3081();
     o.created = "foo";
     o.end = "foo";
-    o.filter = buildUnnamed3056();
+    o.filter = buildUnnamed3082();
     o.id = "foo";
-    o.info = buildUnnamed3058();
-    o.names = buildUnnamed3059();
+    o.info = buildUnnamed3084();
+    o.names = buildUnnamed3085();
     o.quality = 42.0;
     o.referenceBases = "foo";
     o.referenceName = "foo";
@@ -2970,14 +2970,14 @@
 checkVariant(api.Variant o) {
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    checkUnnamed3054(o.alternateBases);
-    checkUnnamed3055(o.calls);
+    checkUnnamed3080(o.alternateBases);
+    checkUnnamed3081(o.calls);
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.end, unittest.equals('foo'));
-    checkUnnamed3056(o.filter);
+    checkUnnamed3082(o.filter);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed3058(o.info);
-    checkUnnamed3059(o.names);
+    checkUnnamed3084(o.info);
+    checkUnnamed3085(o.names);
     unittest.expect(o.quality, unittest.equals(42.0));
     unittest.expect(o.referenceBases, unittest.equals('foo'));
     unittest.expect(o.referenceName, unittest.equals('foo'));
@@ -2987,27 +2987,27 @@
   buildCounterVariant--;
 }
 
-buildUnnamed3060() {
+buildUnnamed3086() {
   var o = new core.List<api.ClinicalCondition>();
   o.add(buildClinicalCondition());
   o.add(buildClinicalCondition());
   return o;
 }
 
-checkUnnamed3060(core.List<api.ClinicalCondition> o) {
+checkUnnamed3086(core.List<api.ClinicalCondition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkClinicalCondition(o[0]);
   checkClinicalCondition(o[1]);
 }
 
-buildUnnamed3061() {
+buildUnnamed3087() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3061(core.List<core.String> o) {
+checkUnnamed3087(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3020,10 +3020,10 @@
   if (buildCounterVariantAnnotation < 3) {
     o.alternateBases = "foo";
     o.clinicalSignificance = "foo";
-    o.conditions = buildUnnamed3060();
+    o.conditions = buildUnnamed3086();
     o.effect = "foo";
     o.geneId = "foo";
-    o.transcriptIds = buildUnnamed3061();
+    o.transcriptIds = buildUnnamed3087();
     o.type = "foo";
   }
   buildCounterVariantAnnotation--;
@@ -3035,42 +3035,42 @@
   if (buildCounterVariantAnnotation < 3) {
     unittest.expect(o.alternateBases, unittest.equals('foo'));
     unittest.expect(o.clinicalSignificance, unittest.equals('foo'));
-    checkUnnamed3060(o.conditions);
+    checkUnnamed3086(o.conditions);
     unittest.expect(o.effect, unittest.equals('foo'));
     unittest.expect(o.geneId, unittest.equals('foo'));
-    checkUnnamed3061(o.transcriptIds);
+    checkUnnamed3087(o.transcriptIds);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterVariantAnnotation--;
 }
 
-buildUnnamed3062() {
+buildUnnamed3088() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed3062(core.List<core.int> o) {
+checkUnnamed3088(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));
 }
 
-buildUnnamed3063() {
+buildUnnamed3089() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed3063(core.List<core.double> o) {
+checkUnnamed3089(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));
 }
 
-buildUnnamed3064() {
+buildUnnamed3090() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -3085,7 +3085,7 @@
   return o;
 }
 
-checkUnnamed3064(core.List<core.Object> o) {
+checkUnnamed3090(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted25 = (o[0]) as core.Map;
   unittest.expect(casted25, unittest.hasLength(3));
@@ -3099,17 +3099,17 @@
   unittest.expect(casted26["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3065() {
+buildUnnamed3091() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed3064();
-  o["y"] = buildUnnamed3064();
+  o["x"] = buildUnnamed3090();
+  o["y"] = buildUnnamed3090();
   return o;
 }
 
-checkUnnamed3065(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed3091(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3064(o["x"]);
-  checkUnnamed3064(o["y"]);
+  checkUnnamed3090(o["x"]);
+  checkUnnamed3090(o["y"]);
 }
 
 core.int buildCounterVariantCall = 0;
@@ -3119,9 +3119,9 @@
   if (buildCounterVariantCall < 3) {
     o.callSetId = "foo";
     o.callSetName = "foo";
-    o.genotype = buildUnnamed3062();
-    o.genotypeLikelihood = buildUnnamed3063();
-    o.info = buildUnnamed3065();
+    o.genotype = buildUnnamed3088();
+    o.genotypeLikelihood = buildUnnamed3089();
+    o.info = buildUnnamed3091();
     o.phaseset = "foo";
   }
   buildCounterVariantCall--;
@@ -3133,35 +3133,35 @@
   if (buildCounterVariantCall < 3) {
     unittest.expect(o.callSetId, unittest.equals('foo'));
     unittest.expect(o.callSetName, unittest.equals('foo'));
-    checkUnnamed3062(o.genotype);
-    checkUnnamed3063(o.genotypeLikelihood);
-    checkUnnamed3065(o.info);
+    checkUnnamed3088(o.genotype);
+    checkUnnamed3089(o.genotypeLikelihood);
+    checkUnnamed3091(o.info);
     unittest.expect(o.phaseset, unittest.equals('foo'));
   }
   buildCounterVariantCall--;
 }
 
-buildUnnamed3066() {
+buildUnnamed3092() {
   var o = new core.List<api.VariantSetMetadata>();
   o.add(buildVariantSetMetadata());
   o.add(buildVariantSetMetadata());
   return o;
 }
 
-checkUnnamed3066(core.List<api.VariantSetMetadata> o) {
+checkUnnamed3092(core.List<api.VariantSetMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariantSetMetadata(o[0]);
   checkVariantSetMetadata(o[1]);
 }
 
-buildUnnamed3067() {
+buildUnnamed3093() {
   var o = new core.List<api.ReferenceBound>();
   o.add(buildReferenceBound());
   o.add(buildReferenceBound());
   return o;
 }
 
-checkUnnamed3067(core.List<api.ReferenceBound> o) {
+checkUnnamed3093(core.List<api.ReferenceBound> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReferenceBound(o[0]);
   checkReferenceBound(o[1]);
@@ -3175,9 +3175,9 @@
     o.datasetId = "foo";
     o.description = "foo";
     o.id = "foo";
-    o.metadata = buildUnnamed3066();
+    o.metadata = buildUnnamed3092();
     o.name = "foo";
-    o.referenceBounds = buildUnnamed3067();
+    o.referenceBounds = buildUnnamed3093();
     o.referenceSetId = "foo";
   }
   buildCounterVariantSet--;
@@ -3190,15 +3190,15 @@
     unittest.expect(o.datasetId, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed3066(o.metadata);
+    checkUnnamed3092(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3067(o.referenceBounds);
+    checkUnnamed3093(o.referenceBounds);
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
   }
   buildCounterVariantSet--;
 }
 
-buildUnnamed3068() {
+buildUnnamed3094() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -3213,7 +3213,7 @@
   return o;
 }
 
-checkUnnamed3068(core.List<core.Object> o) {
+checkUnnamed3094(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted27 = (o[0]) as core.Map;
   unittest.expect(casted27, unittest.hasLength(3));
@@ -3227,17 +3227,17 @@
   unittest.expect(casted28["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3069() {
+buildUnnamed3095() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed3068();
-  o["y"] = buildUnnamed3068();
+  o["x"] = buildUnnamed3094();
+  o["y"] = buildUnnamed3094();
   return o;
 }
 
-checkUnnamed3069(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed3095(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3068(o["x"]);
-  checkUnnamed3068(o["y"]);
+  checkUnnamed3094(o["x"]);
+  checkUnnamed3094(o["y"]);
 }
 
 core.int buildCounterVariantSetMetadata = 0;
@@ -3247,7 +3247,7 @@
   if (buildCounterVariantSetMetadata < 3) {
     o.description = "foo";
     o.id = "foo";
-    o.info = buildUnnamed3069();
+    o.info = buildUnnamed3095();
     o.key = "foo";
     o.number = "foo";
     o.type = "foo";
@@ -3262,7 +3262,7 @@
   if (buildCounterVariantSetMetadata < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed3069(o.info);
+    checkUnnamed3095(o.info);
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -4962,9 +4962,9 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
+      var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_projectId = "foo";
-      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -4996,12 +4996,12 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
         unittest.expect(
             queryMap["projectId"].first, unittest.equals(arg_projectId));
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -5012,9 +5012,9 @@
       }), true);
       res
           .list(
+              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
               projectId: arg_projectId,
-              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListDatasetsResponse response) {
         checkListDatasetsResponse(response);
@@ -5368,9 +5368,9 @@
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.GenomicsApi(mock).operations;
       var arg_name = "foo";
-      var arg_pageSize = 42;
       var arg_filter = "foo";
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -5403,11 +5403,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -5418,9 +5418,9 @@
       }), true);
       res
           .list(arg_name,
-              pageSize: arg_pageSize,
               filter: arg_filter,
               pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
@@ -5777,12 +5777,12 @@
       api.ReadgroupsetsCoveragebucketsResourceApi res =
           new api.GenomicsApi(mock).readgroupsets.coveragebuckets;
       var arg_readGroupSetId = "foo";
+      var arg_start = "foo";
+      var arg_targetBucketWidth = "foo";
       var arg_referenceName = "foo";
       var arg_end = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_start = "foo";
-      var arg_targetBucketWidth = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -5823,6 +5823,9 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["start"].first, unittest.equals(arg_start));
+        unittest.expect(queryMap["targetBucketWidth"].first,
+            unittest.equals(arg_targetBucketWidth));
         unittest.expect(queryMap["referenceName"].first,
             unittest.equals(arg_referenceName));
         unittest.expect(queryMap["end"].first, unittest.equals(arg_end));
@@ -5830,9 +5833,6 @@
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["start"].first, unittest.equals(arg_start));
-        unittest.expect(queryMap["targetBucketWidth"].first,
-            unittest.equals(arg_targetBucketWidth));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -5843,12 +5843,12 @@
       }), true);
       res
           .list(arg_readGroupSetId,
+              start: arg_start,
+              targetBucketWidth: arg_targetBucketWidth,
               referenceName: arg_referenceName,
               end: arg_end,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
-              start: arg_start,
-              targetBucketWidth: arg_targetBucketWidth,
               $fields: arg_$fields)
           .then(unittest
               .expectAsync1(((api.ListCoverageBucketsResponse response) {
@@ -6026,10 +6026,10 @@
       api.ReferencesBasesResourceApi res =
           new api.GenomicsApi(mock).references.bases;
       var arg_referenceId = "foo";
-      var arg_pageSize = 42;
       var arg_start = "foo";
       var arg_end = "foo";
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -6070,12 +6070,12 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["start"].first, unittest.equals(arg_start));
         unittest.expect(queryMap["end"].first, unittest.equals(arg_end));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -6086,10 +6086,10 @@
       }), true);
       res
           .list(arg_referenceId,
-              pageSize: arg_pageSize,
               start: arg_start,
               end: arg_end,
               pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListBasesResponse response) {
         checkListBasesResponse(response);
diff --git a/generated/googleapis/test/gmail/v1_test.dart b/generated/googleapis/test/gmail/v1_test.dart
index 8ce1f78..ef6c891 100644
--- a/generated/googleapis/test/gmail/v1_test.dart
+++ b/generated/googleapis/test/gmail/v1_test.dart
@@ -73,14 +73,14 @@
   buildCounterAutoForwarding--;
 }
 
-buildUnnamed157() {
+buildUnnamed151() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed157(core.List<core.String> o) {
+checkUnnamed151(core.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,7 +91,7 @@
   var o = new api.BatchDeleteMessagesRequest();
   buildCounterBatchDeleteMessagesRequest++;
   if (buildCounterBatchDeleteMessagesRequest < 3) {
-    o.ids = buildUnnamed157();
+    o.ids = buildUnnamed151();
   }
   buildCounterBatchDeleteMessagesRequest--;
   return o;
@@ -100,45 +100,45 @@
 checkBatchDeleteMessagesRequest(api.BatchDeleteMessagesRequest o) {
   buildCounterBatchDeleteMessagesRequest++;
   if (buildCounterBatchDeleteMessagesRequest < 3) {
-    checkUnnamed157(o.ids);
+    checkUnnamed151(o.ids);
   }
   buildCounterBatchDeleteMessagesRequest--;
 }
 
-buildUnnamed158() {
+buildUnnamed152() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed158(core.List<core.String> o) {
+checkUnnamed152(core.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() {
+buildUnnamed153() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed159(core.List<core.String> o) {
+checkUnnamed153(core.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() {
+buildUnnamed154() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed160(core.List<core.String> o) {
+checkUnnamed154(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -149,9 +149,9 @@
   var o = new api.BatchModifyMessagesRequest();
   buildCounterBatchModifyMessagesRequest++;
   if (buildCounterBatchModifyMessagesRequest < 3) {
-    o.addLabelIds = buildUnnamed158();
-    o.ids = buildUnnamed159();
-    o.removeLabelIds = buildUnnamed160();
+    o.addLabelIds = buildUnnamed152();
+    o.ids = buildUnnamed153();
+    o.removeLabelIds = buildUnnamed154();
   }
   buildCounterBatchModifyMessagesRequest--;
   return o;
@@ -160,9 +160,9 @@
 checkBatchModifyMessagesRequest(api.BatchModifyMessagesRequest o) {
   buildCounterBatchModifyMessagesRequest++;
   if (buildCounterBatchModifyMessagesRequest < 3) {
-    checkUnnamed158(o.addLabelIds);
-    checkUnnamed159(o.ids);
-    checkUnnamed160(o.removeLabelIds);
+    checkUnnamed152(o.addLabelIds);
+    checkUnnamed153(o.ids);
+    checkUnnamed154(o.removeLabelIds);
   }
   buildCounterBatchModifyMessagesRequest--;
 }
@@ -211,27 +211,27 @@
   buildCounterFilter--;
 }
 
-buildUnnamed161() {
+buildUnnamed155() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed161(core.List<core.String> o) {
+checkUnnamed155(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed162() {
+buildUnnamed156() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed162(core.List<core.String> o) {
+checkUnnamed156(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -242,9 +242,9 @@
   var o = new api.FilterAction();
   buildCounterFilterAction++;
   if (buildCounterFilterAction < 3) {
-    o.addLabelIds = buildUnnamed161();
+    o.addLabelIds = buildUnnamed155();
     o.forward = "foo";
-    o.removeLabelIds = buildUnnamed162();
+    o.removeLabelIds = buildUnnamed156();
   }
   buildCounterFilterAction--;
   return o;
@@ -253,9 +253,9 @@
 checkFilterAction(api.FilterAction o) {
   buildCounterFilterAction++;
   if (buildCounterFilterAction < 3) {
-    checkUnnamed161(o.addLabelIds);
+    checkUnnamed155(o.addLabelIds);
     unittest.expect(o.forward, unittest.equals('foo'));
-    checkUnnamed162(o.removeLabelIds);
+    checkUnnamed156(o.removeLabelIds);
   }
   buildCounterFilterAction--;
 }
@@ -316,66 +316,66 @@
   buildCounterForwardingAddress--;
 }
 
-buildUnnamed163() {
+buildUnnamed157() {
   var o = new core.List<api.HistoryLabelAdded>();
   o.add(buildHistoryLabelAdded());
   o.add(buildHistoryLabelAdded());
   return o;
 }
 
-checkUnnamed163(core.List<api.HistoryLabelAdded> o) {
+checkUnnamed157(core.List<api.HistoryLabelAdded> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHistoryLabelAdded(o[0]);
   checkHistoryLabelAdded(o[1]);
 }
 
-buildUnnamed164() {
+buildUnnamed158() {
   var o = new core.List<api.HistoryLabelRemoved>();
   o.add(buildHistoryLabelRemoved());
   o.add(buildHistoryLabelRemoved());
   return o;
 }
 
-checkUnnamed164(core.List<api.HistoryLabelRemoved> o) {
+checkUnnamed158(core.List<api.HistoryLabelRemoved> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHistoryLabelRemoved(o[0]);
   checkHistoryLabelRemoved(o[1]);
 }
 
-buildUnnamed165() {
+buildUnnamed159() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed165(core.List<api.Message> o) {
+checkUnnamed159(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
 }
 
-buildUnnamed166() {
+buildUnnamed160() {
   var o = new core.List<api.HistoryMessageAdded>();
   o.add(buildHistoryMessageAdded());
   o.add(buildHistoryMessageAdded());
   return o;
 }
 
-checkUnnamed166(core.List<api.HistoryMessageAdded> o) {
+checkUnnamed160(core.List<api.HistoryMessageAdded> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHistoryMessageAdded(o[0]);
   checkHistoryMessageAdded(o[1]);
 }
 
-buildUnnamed167() {
+buildUnnamed161() {
   var o = new core.List<api.HistoryMessageDeleted>();
   o.add(buildHistoryMessageDeleted());
   o.add(buildHistoryMessageDeleted());
   return o;
 }
 
-checkUnnamed167(core.List<api.HistoryMessageDeleted> o) {
+checkUnnamed161(core.List<api.HistoryMessageDeleted> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHistoryMessageDeleted(o[0]);
   checkHistoryMessageDeleted(o[1]);
@@ -387,11 +387,11 @@
   buildCounterHistory++;
   if (buildCounterHistory < 3) {
     o.id = "foo";
-    o.labelsAdded = buildUnnamed163();
-    o.labelsRemoved = buildUnnamed164();
-    o.messages = buildUnnamed165();
-    o.messagesAdded = buildUnnamed166();
-    o.messagesDeleted = buildUnnamed167();
+    o.labelsAdded = buildUnnamed157();
+    o.labelsRemoved = buildUnnamed158();
+    o.messages = buildUnnamed159();
+    o.messagesAdded = buildUnnamed160();
+    o.messagesDeleted = buildUnnamed161();
   }
   buildCounterHistory--;
   return o;
@@ -401,23 +401,23 @@
   buildCounterHistory++;
   if (buildCounterHistory < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed163(o.labelsAdded);
-    checkUnnamed164(o.labelsRemoved);
-    checkUnnamed165(o.messages);
-    checkUnnamed166(o.messagesAdded);
-    checkUnnamed167(o.messagesDeleted);
+    checkUnnamed157(o.labelsAdded);
+    checkUnnamed158(o.labelsRemoved);
+    checkUnnamed159(o.messages);
+    checkUnnamed160(o.messagesAdded);
+    checkUnnamed161(o.messagesDeleted);
   }
   buildCounterHistory--;
 }
 
-buildUnnamed168() {
+buildUnnamed162() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed168(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'));
@@ -428,7 +428,7 @@
   var o = new api.HistoryLabelAdded();
   buildCounterHistoryLabelAdded++;
   if (buildCounterHistoryLabelAdded < 3) {
-    o.labelIds = buildUnnamed168();
+    o.labelIds = buildUnnamed162();
     o.message = buildMessage();
   }
   buildCounterHistoryLabelAdded--;
@@ -438,20 +438,20 @@
 checkHistoryLabelAdded(api.HistoryLabelAdded o) {
   buildCounterHistoryLabelAdded++;
   if (buildCounterHistoryLabelAdded < 3) {
-    checkUnnamed168(o.labelIds);
+    checkUnnamed162(o.labelIds);
     checkMessage(o.message);
   }
   buildCounterHistoryLabelAdded--;
 }
 
-buildUnnamed169() {
+buildUnnamed163() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed169(core.List<core.String> o) {
+checkUnnamed163(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -462,7 +462,7 @@
   var o = new api.HistoryLabelRemoved();
   buildCounterHistoryLabelRemoved++;
   if (buildCounterHistoryLabelRemoved < 3) {
-    o.labelIds = buildUnnamed169();
+    o.labelIds = buildUnnamed163();
     o.message = buildMessage();
   }
   buildCounterHistoryLabelRemoved--;
@@ -472,7 +472,7 @@
 checkHistoryLabelRemoved(api.HistoryLabelRemoved o) {
   buildCounterHistoryLabelRemoved++;
   if (buildCounterHistoryLabelRemoved < 3) {
-    checkUnnamed169(o.labelIds);
+    checkUnnamed163(o.labelIds);
     checkMessage(o.message);
   }
   buildCounterHistoryLabelRemoved--;
@@ -576,14 +576,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed170() {
+buildUnnamed164() {
   var o = new core.List<api.Draft>();
   o.add(buildDraft());
   o.add(buildDraft());
   return o;
 }
 
-checkUnnamed170(core.List<api.Draft> o) {
+checkUnnamed164(core.List<api.Draft> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDraft(o[0]);
   checkDraft(o[1]);
@@ -594,7 +594,7 @@
   var o = new api.ListDraftsResponse();
   buildCounterListDraftsResponse++;
   if (buildCounterListDraftsResponse < 3) {
-    o.drafts = buildUnnamed170();
+    o.drafts = buildUnnamed164();
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
   }
@@ -605,21 +605,21 @@
 checkListDraftsResponse(api.ListDraftsResponse o) {
   buildCounterListDraftsResponse++;
   if (buildCounterListDraftsResponse < 3) {
-    checkUnnamed170(o.drafts);
+    checkUnnamed164(o.drafts);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
   }
   buildCounterListDraftsResponse--;
 }
 
-buildUnnamed171() {
+buildUnnamed165() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed171(core.List<api.Filter> o) {
+checkUnnamed165(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -630,7 +630,7 @@
   var o = new api.ListFiltersResponse();
   buildCounterListFiltersResponse++;
   if (buildCounterListFiltersResponse < 3) {
-    o.filter = buildUnnamed171();
+    o.filter = buildUnnamed165();
   }
   buildCounterListFiltersResponse--;
   return o;
@@ -639,19 +639,19 @@
 checkListFiltersResponse(api.ListFiltersResponse o) {
   buildCounterListFiltersResponse++;
   if (buildCounterListFiltersResponse < 3) {
-    checkUnnamed171(o.filter);
+    checkUnnamed165(o.filter);
   }
   buildCounterListFiltersResponse--;
 }
 
-buildUnnamed172() {
+buildUnnamed166() {
   var o = new core.List<api.ForwardingAddress>();
   o.add(buildForwardingAddress());
   o.add(buildForwardingAddress());
   return o;
 }
 
-checkUnnamed172(core.List<api.ForwardingAddress> o) {
+checkUnnamed166(core.List<api.ForwardingAddress> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingAddress(o[0]);
   checkForwardingAddress(o[1]);
@@ -662,7 +662,7 @@
   var o = new api.ListForwardingAddressesResponse();
   buildCounterListForwardingAddressesResponse++;
   if (buildCounterListForwardingAddressesResponse < 3) {
-    o.forwardingAddresses = buildUnnamed172();
+    o.forwardingAddresses = buildUnnamed166();
   }
   buildCounterListForwardingAddressesResponse--;
   return o;
@@ -671,19 +671,19 @@
 checkListForwardingAddressesResponse(api.ListForwardingAddressesResponse o) {
   buildCounterListForwardingAddressesResponse++;
   if (buildCounterListForwardingAddressesResponse < 3) {
-    checkUnnamed172(o.forwardingAddresses);
+    checkUnnamed166(o.forwardingAddresses);
   }
   buildCounterListForwardingAddressesResponse--;
 }
 
-buildUnnamed173() {
+buildUnnamed167() {
   var o = new core.List<api.History>();
   o.add(buildHistory());
   o.add(buildHistory());
   return o;
 }
 
-checkUnnamed173(core.List<api.History> o) {
+checkUnnamed167(core.List<api.History> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHistory(o[0]);
   checkHistory(o[1]);
@@ -694,7 +694,7 @@
   var o = new api.ListHistoryResponse();
   buildCounterListHistoryResponse++;
   if (buildCounterListHistoryResponse < 3) {
-    o.history = buildUnnamed173();
+    o.history = buildUnnamed167();
     o.historyId = "foo";
     o.nextPageToken = "foo";
   }
@@ -705,21 +705,21 @@
 checkListHistoryResponse(api.ListHistoryResponse o) {
   buildCounterListHistoryResponse++;
   if (buildCounterListHistoryResponse < 3) {
-    checkUnnamed173(o.history);
+    checkUnnamed167(o.history);
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListHistoryResponse--;
 }
 
-buildUnnamed174() {
+buildUnnamed168() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed174(core.List<api.Label> o) {
+checkUnnamed168(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
@@ -730,7 +730,7 @@
   var o = new api.ListLabelsResponse();
   buildCounterListLabelsResponse++;
   if (buildCounterListLabelsResponse < 3) {
-    o.labels = buildUnnamed174();
+    o.labels = buildUnnamed168();
   }
   buildCounterListLabelsResponse--;
   return o;
@@ -739,19 +739,19 @@
 checkListLabelsResponse(api.ListLabelsResponse o) {
   buildCounterListLabelsResponse++;
   if (buildCounterListLabelsResponse < 3) {
-    checkUnnamed174(o.labels);
+    checkUnnamed168(o.labels);
   }
   buildCounterListLabelsResponse--;
 }
 
-buildUnnamed175() {
+buildUnnamed169() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed175(core.List<api.Message> o) {
+checkUnnamed169(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
@@ -762,7 +762,7 @@
   var o = new api.ListMessagesResponse();
   buildCounterListMessagesResponse++;
   if (buildCounterListMessagesResponse < 3) {
-    o.messages = buildUnnamed175();
+    o.messages = buildUnnamed169();
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
   }
@@ -773,21 +773,21 @@
 checkListMessagesResponse(api.ListMessagesResponse o) {
   buildCounterListMessagesResponse++;
   if (buildCounterListMessagesResponse < 3) {
-    checkUnnamed175(o.messages);
+    checkUnnamed169(o.messages);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
   }
   buildCounterListMessagesResponse--;
 }
 
-buildUnnamed176() {
+buildUnnamed170() {
   var o = new core.List<api.SendAs>();
   o.add(buildSendAs());
   o.add(buildSendAs());
   return o;
 }
 
-checkUnnamed176(core.List<api.SendAs> o) {
+checkUnnamed170(core.List<api.SendAs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSendAs(o[0]);
   checkSendAs(o[1]);
@@ -798,7 +798,7 @@
   var o = new api.ListSendAsResponse();
   buildCounterListSendAsResponse++;
   if (buildCounterListSendAsResponse < 3) {
-    o.sendAs = buildUnnamed176();
+    o.sendAs = buildUnnamed170();
   }
   buildCounterListSendAsResponse--;
   return o;
@@ -807,19 +807,19 @@
 checkListSendAsResponse(api.ListSendAsResponse o) {
   buildCounterListSendAsResponse++;
   if (buildCounterListSendAsResponse < 3) {
-    checkUnnamed176(o.sendAs);
+    checkUnnamed170(o.sendAs);
   }
   buildCounterListSendAsResponse--;
 }
 
-buildUnnamed177() {
+buildUnnamed171() {
   var o = new core.List<api.SmimeInfo>();
   o.add(buildSmimeInfo());
   o.add(buildSmimeInfo());
   return o;
 }
 
-checkUnnamed177(core.List<api.SmimeInfo> o) {
+checkUnnamed171(core.List<api.SmimeInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSmimeInfo(o[0]);
   checkSmimeInfo(o[1]);
@@ -830,7 +830,7 @@
   var o = new api.ListSmimeInfoResponse();
   buildCounterListSmimeInfoResponse++;
   if (buildCounterListSmimeInfoResponse < 3) {
-    o.smimeInfo = buildUnnamed177();
+    o.smimeInfo = buildUnnamed171();
   }
   buildCounterListSmimeInfoResponse--;
   return o;
@@ -839,19 +839,19 @@
 checkListSmimeInfoResponse(api.ListSmimeInfoResponse o) {
   buildCounterListSmimeInfoResponse++;
   if (buildCounterListSmimeInfoResponse < 3) {
-    checkUnnamed177(o.smimeInfo);
+    checkUnnamed171(o.smimeInfo);
   }
   buildCounterListSmimeInfoResponse--;
 }
 
-buildUnnamed178() {
+buildUnnamed172() {
   var o = new core.List<api.Thread>();
   o.add(buildThread());
   o.add(buildThread());
   return o;
 }
 
-checkUnnamed178(core.List<api.Thread> o) {
+checkUnnamed172(core.List<api.Thread> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThread(o[0]);
   checkThread(o[1]);
@@ -864,7 +864,7 @@
   if (buildCounterListThreadsResponse < 3) {
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
-    o.threads = buildUnnamed178();
+    o.threads = buildUnnamed172();
   }
   buildCounterListThreadsResponse--;
   return o;
@@ -875,19 +875,19 @@
   if (buildCounterListThreadsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
-    checkUnnamed178(o.threads);
+    checkUnnamed172(o.threads);
   }
   buildCounterListThreadsResponse--;
 }
 
-buildUnnamed179() {
+buildUnnamed173() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed179(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'));
@@ -901,7 +901,7 @@
     o.historyId = "foo";
     o.id = "foo";
     o.internalDate = "foo";
-    o.labelIds = buildUnnamed179();
+    o.labelIds = buildUnnamed173();
     o.payload = buildMessagePart();
     o.raw = "foo";
     o.sizeEstimate = 42;
@@ -918,7 +918,7 @@
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.internalDate, unittest.equals('foo'));
-    checkUnnamed179(o.labelIds);
+    checkUnnamed173(o.labelIds);
     checkMessagePart(o.payload);
     unittest.expect(o.raw, unittest.equals('foo'));
     unittest.expect(o.sizeEstimate, unittest.equals(42));
@@ -928,27 +928,27 @@
   buildCounterMessage--;
 }
 
-buildUnnamed180() {
+buildUnnamed174() {
   var o = new core.List<api.MessagePartHeader>();
   o.add(buildMessagePartHeader());
   o.add(buildMessagePartHeader());
   return o;
 }
 
-checkUnnamed180(core.List<api.MessagePartHeader> o) {
+checkUnnamed174(core.List<api.MessagePartHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessagePartHeader(o[0]);
   checkMessagePartHeader(o[1]);
 }
 
-buildUnnamed181() {
+buildUnnamed175() {
   var o = new core.List<api.MessagePart>();
   o.add(buildMessagePart());
   o.add(buildMessagePart());
   return o;
 }
 
-checkUnnamed181(core.List<api.MessagePart> o) {
+checkUnnamed175(core.List<api.MessagePart> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessagePart(o[0]);
   checkMessagePart(o[1]);
@@ -961,10 +961,10 @@
   if (buildCounterMessagePart < 3) {
     o.body = buildMessagePartBody();
     o.filename = "foo";
-    o.headers = buildUnnamed180();
+    o.headers = buildUnnamed174();
     o.mimeType = "foo";
     o.partId = "foo";
-    o.parts = buildUnnamed181();
+    o.parts = buildUnnamed175();
   }
   buildCounterMessagePart--;
   return o;
@@ -975,10 +975,10 @@
   if (buildCounterMessagePart < 3) {
     checkMessagePartBody(o.body);
     unittest.expect(o.filename, unittest.equals('foo'));
-    checkUnnamed180(o.headers);
+    checkUnnamed174(o.headers);
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.partId, unittest.equals('foo'));
-    checkUnnamed181(o.parts);
+    checkUnnamed175(o.parts);
   }
   buildCounterMessagePart--;
 }
@@ -1027,27 +1027,27 @@
   buildCounterMessagePartHeader--;
 }
 
-buildUnnamed182() {
+buildUnnamed176() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed182(core.List<core.String> o) {
+checkUnnamed176(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed183() {
+buildUnnamed177() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed183(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'));
@@ -1058,8 +1058,8 @@
   var o = new api.ModifyMessageRequest();
   buildCounterModifyMessageRequest++;
   if (buildCounterModifyMessageRequest < 3) {
-    o.addLabelIds = buildUnnamed182();
-    o.removeLabelIds = buildUnnamed183();
+    o.addLabelIds = buildUnnamed176();
+    o.removeLabelIds = buildUnnamed177();
   }
   buildCounterModifyMessageRequest--;
   return o;
@@ -1068,33 +1068,33 @@
 checkModifyMessageRequest(api.ModifyMessageRequest o) {
   buildCounterModifyMessageRequest++;
   if (buildCounterModifyMessageRequest < 3) {
-    checkUnnamed182(o.addLabelIds);
-    checkUnnamed183(o.removeLabelIds);
+    checkUnnamed176(o.addLabelIds);
+    checkUnnamed177(o.removeLabelIds);
   }
   buildCounterModifyMessageRequest--;
 }
 
-buildUnnamed184() {
+buildUnnamed178() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed184(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'));
 }
 
-buildUnnamed185() {
+buildUnnamed179() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed185(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'));
@@ -1105,8 +1105,8 @@
   var o = new api.ModifyThreadRequest();
   buildCounterModifyThreadRequest++;
   if (buildCounterModifyThreadRequest < 3) {
-    o.addLabelIds = buildUnnamed184();
-    o.removeLabelIds = buildUnnamed185();
+    o.addLabelIds = buildUnnamed178();
+    o.removeLabelIds = buildUnnamed179();
   }
   buildCounterModifyThreadRequest--;
   return o;
@@ -1115,8 +1115,8 @@
 checkModifyThreadRequest(api.ModifyThreadRequest o) {
   buildCounterModifyThreadRequest++;
   if (buildCounterModifyThreadRequest < 3) {
-    checkUnnamed184(o.addLabelIds);
-    checkUnnamed185(o.removeLabelIds);
+    checkUnnamed178(o.addLabelIds);
+    checkUnnamed179(o.removeLabelIds);
   }
   buildCounterModifyThreadRequest--;
 }
@@ -1260,14 +1260,14 @@
   buildCounterSmtpMsa--;
 }
 
-buildUnnamed186() {
+buildUnnamed180() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed186(core.List<api.Message> o) {
+checkUnnamed180(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
@@ -1280,7 +1280,7 @@
   if (buildCounterThread < 3) {
     o.historyId = "foo";
     o.id = "foo";
-    o.messages = buildUnnamed186();
+    o.messages = buildUnnamed180();
     o.snippet = "foo";
   }
   buildCounterThread--;
@@ -1292,7 +1292,7 @@
   if (buildCounterThread < 3) {
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed186(o.messages);
+    checkUnnamed180(o.messages);
     unittest.expect(o.snippet, unittest.equals('foo'));
   }
   buildCounterThread--;
@@ -1331,14 +1331,14 @@
   buildCounterVacationSettings--;
 }
 
-buildUnnamed187() {
+buildUnnamed181() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed187(core.List<core.String> o) {
+checkUnnamed181(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1350,7 +1350,7 @@
   buildCounterWatchRequest++;
   if (buildCounterWatchRequest < 3) {
     o.labelFilterAction = "foo";
-    o.labelIds = buildUnnamed187();
+    o.labelIds = buildUnnamed181();
     o.topicName = "foo";
   }
   buildCounterWatchRequest--;
@@ -1361,7 +1361,7 @@
   buildCounterWatchRequest++;
   if (buildCounterWatchRequest < 3) {
     unittest.expect(o.labelFilterAction, unittest.equals('foo'));
-    checkUnnamed187(o.labelIds);
+    checkUnnamed181(o.labelIds);
     unittest.expect(o.topicName, unittest.equals('foo'));
   }
   buildCounterWatchRequest--;
@@ -1388,66 +1388,66 @@
   buildCounterWatchResponse--;
 }
 
-buildUnnamed188() {
+buildUnnamed182() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed188(core.List<core.String> o) {
+checkUnnamed182(core.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() {
+buildUnnamed183() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed189(core.List<core.String> o) {
+checkUnnamed183(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed190() {
+buildUnnamed184() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed190(core.List<core.String> o) {
+checkUnnamed184(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed191() {
+buildUnnamed185() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed191(core.List<core.String> o) {
+checkUnnamed185(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed192() {
+buildUnnamed186() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed192(core.List<core.String> o) {
+checkUnnamed186(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2240,7 +2240,7 @@
       var mock = new HttpServerMock();
       api.UsersHistoryResourceApi res = new api.GmailApi(mock).users.history;
       var arg_userId = "foo";
-      var arg_historyTypes = buildUnnamed188();
+      var arg_historyTypes = buildUnnamed182();
       var arg_labelId = "foo";
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
@@ -2754,7 +2754,7 @@
       var arg_userId = "foo";
       var arg_id = "foo";
       var arg_format = "foo";
-      var arg_metadataHeaders = buildUnnamed189();
+      var arg_metadataHeaders = buildUnnamed183();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2943,7 +2943,7 @@
       api.UsersMessagesResourceApi res = new api.GmailApi(mock).users.messages;
       var arg_userId = "foo";
       var arg_includeSpamTrash = true;
-      var arg_labelIds = buildUnnamed190();
+      var arg_labelIds = buildUnnamed184();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_q = "foo";
@@ -4704,7 +4704,7 @@
       var arg_userId = "foo";
       var arg_id = "foo";
       var arg_format = "foo";
-      var arg_metadataHeaders = buildUnnamed191();
+      var arg_metadataHeaders = buildUnnamed185();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -4759,7 +4759,7 @@
       api.UsersThreadsResourceApi res = new api.GmailApi(mock).users.threads;
       var arg_userId = "foo";
       var arg_includeSpamTrash = true;
-      var arg_labelIds = buildUnnamed192();
+      var arg_labelIds = buildUnnamed186();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_q = "foo";
diff --git a/generated/googleapis/test/iam/v1_test.dart b/generated/googleapis/test/iam/v1_test.dart
index 4d25c45..a9ebac8 100644
--- a/generated/googleapis/test/iam/v1_test.dart
+++ b/generated/googleapis/test/iam/v1_test.dart
@@ -69,14 +69,14 @@
   buildCounterAuditData--;
 }
 
-buildUnnamed1275() {
+buildUnnamed1291() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1275(core.List<core.String> o) {
+checkUnnamed1291(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -87,7 +87,7 @@
   var o = new api.Binding();
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    o.members = buildUnnamed1275();
+    o.members = buildUnnamed1291();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -97,7 +97,7 @@
 checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkUnnamed1275(o.members);
+    checkUnnamed1291(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
@@ -109,7 +109,6 @@
   buildCounterBindingDelta++;
   if (buildCounterBindingDelta < 3) {
     o.action = "foo";
-    o.condition = buildExpr();
     o.member = "foo";
     o.role = "foo";
   }
@@ -121,7 +120,6 @@
   buildCounterBindingDelta++;
   if (buildCounterBindingDelta < 3) {
     unittest.expect(o.action, unittest.equals('foo'));
-    checkExpr(o.condition);
     unittest.expect(o.member, unittest.equals('foo'));
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -206,39 +204,14 @@
   buildCounterEmpty--;
 }
 
-core.int buildCounterExpr = 0;
-buildExpr() {
-  var o = new api.Expr();
-  buildCounterExpr++;
-  if (buildCounterExpr < 3) {
-    o.description = "foo";
-    o.expression = "foo";
-    o.location = "foo";
-    o.title = "foo";
-  }
-  buildCounterExpr--;
-  return o;
-}
-
-checkExpr(api.Expr o) {
-  buildCounterExpr++;
-  if (buildCounterExpr < 3) {
-    unittest.expect(o.description, unittest.equals('foo'));
-    unittest.expect(o.expression, unittest.equals('foo'));
-    unittest.expect(o.location, unittest.equals('foo'));
-    unittest.expect(o.title, unittest.equals('foo'));
-  }
-  buildCounterExpr--;
-}
-
-buildUnnamed1276() {
+buildUnnamed1292() {
   var o = new core.List<api.Role>();
   o.add(buildRole());
   o.add(buildRole());
   return o;
 }
 
-checkUnnamed1276(core.List<api.Role> o) {
+checkUnnamed1292(core.List<api.Role> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRole(o[0]);
   checkRole(o[1]);
@@ -250,7 +223,7 @@
   buildCounterListRolesResponse++;
   if (buildCounterListRolesResponse < 3) {
     o.nextPageToken = "foo";
-    o.roles = buildUnnamed1276();
+    o.roles = buildUnnamed1292();
   }
   buildCounterListRolesResponse--;
   return o;
@@ -260,19 +233,19 @@
   buildCounterListRolesResponse++;
   if (buildCounterListRolesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1276(o.roles);
+    checkUnnamed1292(o.roles);
   }
   buildCounterListRolesResponse--;
 }
 
-buildUnnamed1277() {
+buildUnnamed1293() {
   var o = new core.List<api.ServiceAccountKey>();
   o.add(buildServiceAccountKey());
   o.add(buildServiceAccountKey());
   return o;
 }
 
-checkUnnamed1277(core.List<api.ServiceAccountKey> o) {
+checkUnnamed1293(core.List<api.ServiceAccountKey> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccountKey(o[0]);
   checkServiceAccountKey(o[1]);
@@ -283,7 +256,7 @@
   var o = new api.ListServiceAccountKeysResponse();
   buildCounterListServiceAccountKeysResponse++;
   if (buildCounterListServiceAccountKeysResponse < 3) {
-    o.keys = buildUnnamed1277();
+    o.keys = buildUnnamed1293();
   }
   buildCounterListServiceAccountKeysResponse--;
   return o;
@@ -292,19 +265,19 @@
 checkListServiceAccountKeysResponse(api.ListServiceAccountKeysResponse o) {
   buildCounterListServiceAccountKeysResponse++;
   if (buildCounterListServiceAccountKeysResponse < 3) {
-    checkUnnamed1277(o.keys);
+    checkUnnamed1293(o.keys);
   }
   buildCounterListServiceAccountKeysResponse--;
 }
 
-buildUnnamed1278() {
+buildUnnamed1294() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed1278(core.List<api.ServiceAccount> o) {
+checkUnnamed1294(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -315,7 +288,7 @@
   var o = new api.ListServiceAccountsResponse();
   buildCounterListServiceAccountsResponse++;
   if (buildCounterListServiceAccountsResponse < 3) {
-    o.accounts = buildUnnamed1278();
+    o.accounts = buildUnnamed1294();
     o.nextPageToken = "foo";
   }
   buildCounterListServiceAccountsResponse--;
@@ -325,7 +298,7 @@
 checkListServiceAccountsResponse(api.ListServiceAccountsResponse o) {
   buildCounterListServiceAccountsResponse++;
   if (buildCounterListServiceAccountsResponse < 3) {
-    checkUnnamed1278(o.accounts);
+    checkUnnamed1294(o.accounts);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListServiceAccountsResponse--;
@@ -360,14 +333,14 @@
   buildCounterPermission--;
 }
 
-buildUnnamed1279() {
+buildUnnamed1295() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed1279(core.List<api.Binding> o) {
+checkUnnamed1295(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -378,7 +351,7 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.bindings = buildUnnamed1279();
+    o.bindings = buildUnnamed1295();
     o.etag = "foo";
     o.version = 42;
   }
@@ -389,21 +362,21 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed1279(o.bindings);
+    checkUnnamed1295(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterPolicy--;
 }
 
-buildUnnamed1280() {
+buildUnnamed1296() {
   var o = new core.List<api.BindingDelta>();
   o.add(buildBindingDelta());
   o.add(buildBindingDelta());
   return o;
 }
 
-checkUnnamed1280(core.List<api.BindingDelta> o) {
+checkUnnamed1296(core.List<api.BindingDelta> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBindingDelta(o[0]);
   checkBindingDelta(o[1]);
@@ -414,7 +387,7 @@
   var o = new api.PolicyDelta();
   buildCounterPolicyDelta++;
   if (buildCounterPolicyDelta < 3) {
-    o.bindingDeltas = buildUnnamed1280();
+    o.bindingDeltas = buildUnnamed1296();
   }
   buildCounterPolicyDelta--;
   return o;
@@ -423,7 +396,7 @@
 checkPolicyDelta(api.PolicyDelta o) {
   buildCounterPolicyDelta++;
   if (buildCounterPolicyDelta < 3) {
-    checkUnnamed1280(o.bindingDeltas);
+    checkUnnamed1296(o.bindingDeltas);
   }
   buildCounterPolicyDelta--;
 }
@@ -453,14 +426,14 @@
   buildCounterQueryGrantableRolesRequest--;
 }
 
-buildUnnamed1281() {
+buildUnnamed1297() {
   var o = new core.List<api.Role>();
   o.add(buildRole());
   o.add(buildRole());
   return o;
 }
 
-checkUnnamed1281(core.List<api.Role> o) {
+checkUnnamed1297(core.List<api.Role> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRole(o[0]);
   checkRole(o[1]);
@@ -472,7 +445,7 @@
   buildCounterQueryGrantableRolesResponse++;
   if (buildCounterQueryGrantableRolesResponse < 3) {
     o.nextPageToken = "foo";
-    o.roles = buildUnnamed1281();
+    o.roles = buildUnnamed1297();
   }
   buildCounterQueryGrantableRolesResponse--;
   return o;
@@ -482,7 +455,7 @@
   buildCounterQueryGrantableRolesResponse++;
   if (buildCounterQueryGrantableRolesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1281(o.roles);
+    checkUnnamed1297(o.roles);
   }
   buildCounterQueryGrantableRolesResponse--;
 }
@@ -510,14 +483,14 @@
   buildCounterQueryTestablePermissionsRequest--;
 }
 
-buildUnnamed1282() {
+buildUnnamed1298() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed1282(core.List<api.Permission> o) {
+checkUnnamed1298(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -529,7 +502,7 @@
   buildCounterQueryTestablePermissionsResponse++;
   if (buildCounterQueryTestablePermissionsResponse < 3) {
     o.nextPageToken = "foo";
-    o.permissions = buildUnnamed1282();
+    o.permissions = buildUnnamed1298();
   }
   buildCounterQueryTestablePermissionsResponse--;
   return o;
@@ -539,19 +512,19 @@
   buildCounterQueryTestablePermissionsResponse++;
   if (buildCounterQueryTestablePermissionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1282(o.permissions);
+    checkUnnamed1298(o.permissions);
   }
   buildCounterQueryTestablePermissionsResponse--;
 }
 
-buildUnnamed1283() {
+buildUnnamed1299() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1283(core.List<core.String> o) {
+checkUnnamed1299(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -565,7 +538,7 @@
     o.deleted = true;
     o.description = "foo";
     o.etag = "foo";
-    o.includedPermissions = buildUnnamed1283();
+    o.includedPermissions = buildUnnamed1299();
     o.name = "foo";
     o.stage = "foo";
     o.title = "foo";
@@ -580,7 +553,7 @@
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1283(o.includedPermissions);
+    checkUnnamed1299(o.includedPermissions);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.stage, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
@@ -749,14 +722,14 @@
   buildCounterSignJwtResponse--;
 }
 
-buildUnnamed1284() {
+buildUnnamed1300() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1284(core.List<core.String> o) {
+checkUnnamed1300(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -767,7 +740,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed1284();
+    o.permissions = buildUnnamed1300();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -776,19 +749,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed1284(o.permissions);
+    checkUnnamed1300(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed1285() {
+buildUnnamed1301() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1285(core.List<core.String> o) {
+checkUnnamed1301(core.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,7 +772,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed1285();
+    o.permissions = buildUnnamed1301();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -808,7 +781,7 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed1285(o.permissions);
+    checkUnnamed1301(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
@@ -832,14 +805,14 @@
   buildCounterUndeleteRoleRequest--;
 }
 
-buildUnnamed1286() {
+buildUnnamed1302() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1286(core.List<core.String> o) {
+checkUnnamed1302(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -902,14 +875,6 @@
     });
   });
 
-  unittest.group("obj-schema-Expr", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildExpr();
-      var od = new api.Expr.fromJson(o.toJson());
-      checkExpr(od);
-    });
-  });
-
   unittest.group("obj-schema-ListRolesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListRolesResponse();
@@ -1246,10 +1211,10 @@
       api.OrganizationsRolesResourceApi res =
           new api.IamApi(mock).organizations.roles;
       var arg_parent = "foo";
-      var arg_showDeleted = true;
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_view = "foo";
+      var arg_showDeleted = true;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1283,12 +1248,12 @@
           }
         }
         unittest.expect(
-            queryMap["showDeleted"].first, unittest.equals("$arg_showDeleted"));
-        unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
         unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
+        unittest.expect(
+            queryMap["showDeleted"].first, unittest.equals("$arg_showDeleted"));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1299,10 +1264,10 @@
       }), true);
       res
           .list(arg_parent,
-              showDeleted: arg_showDeleted,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
               view: arg_view,
+              showDeleted: arg_showDeleted,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListRolesResponse response) {
         checkListRolesResponse(response);
@@ -1645,10 +1610,10 @@
       var mock = new HttpServerMock();
       api.ProjectsRolesResourceApi res = new api.IamApi(mock).projects.roles;
       var arg_parent = "foo";
+      var arg_showDeleted = true;
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_view = "foo";
-      var arg_showDeleted = true;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1682,12 +1647,12 @@
           }
         }
         unittest.expect(
+            queryMap["showDeleted"].first, unittest.equals("$arg_showDeleted"));
+        unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
         unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
-        unittest.expect(
-            queryMap["showDeleted"].first, unittest.equals("$arg_showDeleted"));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1698,10 +1663,10 @@
       }), true);
       res
           .list(arg_parent,
+              showDeleted: arg_showDeleted,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
               view: arg_view,
-              showDeleted: arg_showDeleted,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListRolesResponse response) {
         checkListRolesResponse(response);
@@ -2549,7 +2514,7 @@
       api.ProjectsServiceAccountsKeysResourceApi res =
           new api.IamApi(mock).projects.serviceAccounts.keys;
       var arg_name = "foo";
-      var arg_keyTypes = buildUnnamed1286();
+      var arg_keyTypes = buildUnnamed1302();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/identitytoolkit/v3_test.dart b/generated/googleapis/test/identitytoolkit/v3_test.dart
index 52cfcbd..bcb084a 100644
--- a/generated/googleapis/test/identitytoolkit/v3_test.dart
+++ b/generated/googleapis/test/identitytoolkit/v3_test.dart
@@ -50,27 +50,27 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed2605() {
+buildUnnamed2630() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2605(core.List<core.String> o) {
+checkUnnamed2630(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2606() {
+buildUnnamed2631() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2606(core.List<core.String> o) {
+checkUnnamed2631(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -81,7 +81,7 @@
   var o = new api.CreateAuthUriResponse();
   buildCounterCreateAuthUriResponse++;
   if (buildCounterCreateAuthUriResponse < 3) {
-    o.allProviders = buildUnnamed2605();
+    o.allProviders = buildUnnamed2630();
     o.authUri = "foo";
     o.captchaRequired = true;
     o.forExistingProvider = true;
@@ -89,7 +89,7 @@
     o.providerId = "foo";
     o.registered = true;
     o.sessionId = "foo";
-    o.signinMethods = buildUnnamed2606();
+    o.signinMethods = buildUnnamed2631();
   }
   buildCounterCreateAuthUriResponse--;
   return o;
@@ -98,7 +98,7 @@
 checkCreateAuthUriResponse(api.CreateAuthUriResponse o) {
   buildCounterCreateAuthUriResponse++;
   if (buildCounterCreateAuthUriResponse < 3) {
-    checkUnnamed2605(o.allProviders);
+    checkUnnamed2630(o.allProviders);
     unittest.expect(o.authUri, unittest.equals('foo'));
     unittest.expect(o.captchaRequired, unittest.isTrue);
     unittest.expect(o.forExistingProvider, unittest.isTrue);
@@ -106,7 +106,7 @@
     unittest.expect(o.providerId, unittest.equals('foo'));
     unittest.expect(o.registered, unittest.isTrue);
     unittest.expect(o.sessionId, unittest.equals('foo'));
-    checkUnnamed2606(o.signinMethods);
+    checkUnnamed2631(o.signinMethods);
   }
   buildCounterCreateAuthUriResponse--;
 }
@@ -130,14 +130,14 @@
   buildCounterDeleteAccountResponse--;
 }
 
-buildUnnamed2607() {
+buildUnnamed2632() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed2607(core.List<api.UserInfo> o) {
+checkUnnamed2632(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -150,7 +150,7 @@
   if (buildCounterDownloadAccountResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.users = buildUnnamed2607();
+    o.users = buildUnnamed2632();
   }
   buildCounterDownloadAccountResponse--;
   return o;
@@ -161,7 +161,7 @@
   if (buildCounterDownloadAccountResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2607(o.users);
+    checkUnnamed2632(o.users);
   }
   buildCounterDownloadAccountResponse--;
 }
@@ -226,14 +226,14 @@
   buildCounterEmailTemplate--;
 }
 
-buildUnnamed2608() {
+buildUnnamed2633() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed2608(core.List<api.UserInfo> o) {
+checkUnnamed2633(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -245,7 +245,7 @@
   buildCounterGetAccountInfoResponse++;
   if (buildCounterGetAccountInfoResponse < 3) {
     o.kind = "foo";
-    o.users = buildUnnamed2608();
+    o.users = buildUnnamed2633();
   }
   buildCounterGetAccountInfoResponse--;
   return o;
@@ -255,7 +255,7 @@
   buildCounterGetAccountInfoResponse++;
   if (buildCounterGetAccountInfoResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2608(o.users);
+    checkUnnamed2633(o.users);
   }
   buildCounterGetAccountInfoResponse--;
 }
@@ -306,14 +306,14 @@
   buildCounterGetRecaptchaParamResponse--;
 }
 
-buildUnnamed2609() {
+buildUnnamed2634() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2609(core.Map<core.String, core.String> o) {
+checkUnnamed2634(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'));
@@ -329,7 +329,7 @@
     o.clientId = "foo";
     o.context = "foo";
     o.continueUri = "foo";
-    o.customParameter = buildUnnamed2609();
+    o.customParameter = buildUnnamed2634();
     o.hostedDomain = "foo";
     o.identifier = "foo";
     o.oauthConsumerKey = "foo";
@@ -352,7 +352,7 @@
     unittest.expect(o.clientId, unittest.equals('foo'));
     unittest.expect(o.context, unittest.equals('foo'));
     unittest.expect(o.continueUri, unittest.equals('foo'));
-    checkUnnamed2609(o.customParameter);
+    checkUnnamed2634(o.customParameter);
     unittest.expect(o.hostedDomain, unittest.equals('foo'));
     unittest.expect(o.identifier, unittest.equals('foo'));
     unittest.expect(o.oauthConsumerKey, unittest.equals('foo'));
@@ -439,40 +439,40 @@
   buildCounterIdentitytoolkitRelyingpartyEmailLinkSigninRequest--;
 }
 
-buildUnnamed2610() {
+buildUnnamed2635() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2610(core.List<core.String> o) {
+checkUnnamed2635(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2611() {
+buildUnnamed2636() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2611(core.List<core.String> o) {
+checkUnnamed2636(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2612() {
+buildUnnamed2637() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2612(core.List<core.String> o) {
+checkUnnamed2637(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -484,10 +484,10 @@
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest < 3) {
     o.delegatedProjectNumber = "foo";
-    o.email = buildUnnamed2610();
+    o.email = buildUnnamed2635();
     o.idToken = "foo";
-    o.localId = buildUnnamed2611();
-    o.phoneNumber = buildUnnamed2612();
+    o.localId = buildUnnamed2636();
+    o.phoneNumber = buildUnnamed2637();
   }
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest--;
   return o;
@@ -498,35 +498,35 @@
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest < 3) {
     unittest.expect(o.delegatedProjectNumber, unittest.equals('foo'));
-    checkUnnamed2610(o.email);
+    checkUnnamed2635(o.email);
     unittest.expect(o.idToken, unittest.equals('foo'));
-    checkUnnamed2611(o.localId);
-    checkUnnamed2612(o.phoneNumber);
+    checkUnnamed2636(o.localId);
+    checkUnnamed2637(o.phoneNumber);
   }
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest--;
 }
 
-buildUnnamed2613() {
+buildUnnamed2638() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2613(core.List<core.String> o) {
+checkUnnamed2638(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2614() {
+buildUnnamed2639() {
   var o = new core.List<api.IdpConfig>();
   o.add(buildIdpConfig());
   o.add(buildIdpConfig());
   return o;
 }
 
-checkUnnamed2614(core.List<api.IdpConfig> o) {
+checkUnnamed2639(core.List<api.IdpConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIdpConfig(o[0]);
   checkIdpConfig(o[1]);
@@ -539,11 +539,11 @@
   if (buildCounterIdentitytoolkitRelyingpartyGetProjectConfigResponse < 3) {
     o.allowPasswordUser = true;
     o.apiKey = "foo";
-    o.authorizedDomains = buildUnnamed2613();
+    o.authorizedDomains = buildUnnamed2638();
     o.changeEmailTemplate = buildEmailTemplate();
     o.dynamicLinksDomain = "foo";
     o.enableAnonymousUser = true;
-    o.idpConfig = buildUnnamed2614();
+    o.idpConfig = buildUnnamed2639();
     o.legacyResetPasswordTemplate = buildEmailTemplate();
     o.projectId = "foo";
     o.resetPasswordTemplate = buildEmailTemplate();
@@ -560,11 +560,11 @@
   if (buildCounterIdentitytoolkitRelyingpartyGetProjectConfigResponse < 3) {
     unittest.expect(o.allowPasswordUser, unittest.isTrue);
     unittest.expect(o.apiKey, unittest.equals('foo'));
-    checkUnnamed2613(o.authorizedDomains);
+    checkUnnamed2638(o.authorizedDomains);
     checkEmailTemplate(o.changeEmailTemplate);
     unittest.expect(o.dynamicLinksDomain, unittest.equals('foo'));
     unittest.expect(o.enableAnonymousUser, unittest.isTrue);
-    checkUnnamed2614(o.idpConfig);
+    checkUnnamed2639(o.idpConfig);
     checkEmailTemplate(o.legacyResetPasswordTemplate);
     unittest.expect(o.projectId, unittest.equals('foo'));
     checkEmailTemplate(o.resetPasswordTemplate);
@@ -661,40 +661,40 @@
   buildCounterIdentitytoolkitRelyingpartySendVerificationCodeResponse--;
 }
 
-buildUnnamed2615() {
+buildUnnamed2640() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2615(core.List<core.String> o) {
+checkUnnamed2640(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2616() {
+buildUnnamed2641() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2616(core.List<core.String> o) {
+checkUnnamed2641(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2617() {
+buildUnnamed2642() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2617(core.List<core.String> o) {
+checkUnnamed2642(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -710,8 +710,8 @@
     o.createdAt = "foo";
     o.customAttributes = "foo";
     o.delegatedProjectNumber = "foo";
-    o.deleteAttribute = buildUnnamed2615();
-    o.deleteProvider = buildUnnamed2616();
+    o.deleteAttribute = buildUnnamed2640();
+    o.deleteProvider = buildUnnamed2641();
     o.disableUser = true;
     o.displayName = "foo";
     o.email = "foo";
@@ -724,7 +724,7 @@
     o.password = "foo";
     o.phoneNumber = "foo";
     o.photoUrl = "foo";
-    o.provider = buildUnnamed2617();
+    o.provider = buildUnnamed2642();
     o.returnSecureToken = true;
     o.upgradeToFederatedLogin = true;
     o.validSince = "foo";
@@ -742,8 +742,8 @@
     unittest.expect(o.createdAt, unittest.equals('foo'));
     unittest.expect(o.customAttributes, unittest.equals('foo'));
     unittest.expect(o.delegatedProjectNumber, unittest.equals('foo'));
-    checkUnnamed2615(o.deleteAttribute);
-    checkUnnamed2616(o.deleteProvider);
+    checkUnnamed2640(o.deleteAttribute);
+    checkUnnamed2641(o.deleteProvider);
     unittest.expect(o.disableUser, unittest.isTrue);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.email, unittest.equals('foo'));
@@ -756,7 +756,7 @@
     unittest.expect(o.password, unittest.equals('foo'));
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed2617(o.provider);
+    checkUnnamed2642(o.provider);
     unittest.expect(o.returnSecureToken, unittest.isTrue);
     unittest.expect(o.upgradeToFederatedLogin, unittest.isTrue);
     unittest.expect(o.validSince, unittest.equals('foo'));
@@ -764,27 +764,27 @@
   buildCounterIdentitytoolkitRelyingpartySetAccountInfoRequest--;
 }
 
-buildUnnamed2618() {
+buildUnnamed2643() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2618(core.List<core.String> o) {
+checkUnnamed2643(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2619() {
+buildUnnamed2644() {
   var o = new core.List<api.IdpConfig>();
   o.add(buildIdpConfig());
   o.add(buildIdpConfig());
   return o;
 }
 
-checkUnnamed2619(core.List<api.IdpConfig> o) {
+checkUnnamed2644(core.List<api.IdpConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIdpConfig(o[0]);
   checkIdpConfig(o[1]);
@@ -797,11 +797,11 @@
   if (buildCounterIdentitytoolkitRelyingpartySetProjectConfigRequest < 3) {
     o.allowPasswordUser = true;
     o.apiKey = "foo";
-    o.authorizedDomains = buildUnnamed2618();
+    o.authorizedDomains = buildUnnamed2643();
     o.changeEmailTemplate = buildEmailTemplate();
     o.delegatedProjectNumber = "foo";
     o.enableAnonymousUser = true;
-    o.idpConfig = buildUnnamed2619();
+    o.idpConfig = buildUnnamed2644();
     o.legacyResetPasswordTemplate = buildEmailTemplate();
     o.resetPasswordTemplate = buildEmailTemplate();
     o.useEmailSending = true;
@@ -817,11 +817,11 @@
   if (buildCounterIdentitytoolkitRelyingpartySetProjectConfigRequest < 3) {
     unittest.expect(o.allowPasswordUser, unittest.isTrue);
     unittest.expect(o.apiKey, unittest.equals('foo'));
-    checkUnnamed2618(o.authorizedDomains);
+    checkUnnamed2643(o.authorizedDomains);
     checkEmailTemplate(o.changeEmailTemplate);
     unittest.expect(o.delegatedProjectNumber, unittest.equals('foo'));
     unittest.expect(o.enableAnonymousUser, unittest.isTrue);
-    checkUnnamed2619(o.idpConfig);
+    checkUnnamed2644(o.idpConfig);
     checkEmailTemplate(o.legacyResetPasswordTemplate);
     checkEmailTemplate(o.resetPasswordTemplate);
     unittest.expect(o.useEmailSending, unittest.isTrue);
@@ -934,14 +934,14 @@
   buildCounterIdentitytoolkitRelyingpartySignupNewUserRequest--;
 }
 
-buildUnnamed2620() {
+buildUnnamed2645() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed2620(core.List<api.UserInfo> o) {
+checkUnnamed2645(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -965,7 +965,7 @@
     o.sanityCheck = true;
     o.signerKey = "foo";
     o.targetProjectId = "foo";
-    o.users = buildUnnamed2620();
+    o.users = buildUnnamed2645();
   }
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest--;
   return o;
@@ -988,7 +988,7 @@
     unittest.expect(o.sanityCheck, unittest.isTrue);
     unittest.expect(o.signerKey, unittest.equals('foo'));
     unittest.expect(o.targetProjectId, unittest.equals('foo'));
-    checkUnnamed2620(o.users);
+    checkUnnamed2645(o.users);
   }
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest--;
 }
@@ -1165,14 +1165,14 @@
   buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse--;
 }
 
-buildUnnamed2621() {
+buildUnnamed2646() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2621(core.List<core.String> o) {
+checkUnnamed2646(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1188,7 +1188,7 @@
     o.experimentPercent = 42;
     o.provider = "foo";
     o.secret = "foo";
-    o.whitelistedAudiences = buildUnnamed2621();
+    o.whitelistedAudiences = buildUnnamed2646();
   }
   buildCounterIdpConfig--;
   return o;
@@ -1202,7 +1202,7 @@
     unittest.expect(o.experimentPercent, unittest.equals(42));
     unittest.expect(o.provider, unittest.equals('foo'));
     unittest.expect(o.secret, unittest.equals('foo'));
-    checkUnnamed2621(o.whitelistedAudiences);
+    checkUnnamed2646(o.whitelistedAudiences);
   }
   buildCounterIdpConfig--;
 }
@@ -1305,14 +1305,14 @@
   buildCounterSetAccountInfoResponseProviderUserInfo--;
 }
 
-buildUnnamed2622() {
+buildUnnamed2647() {
   var o = new core.List<api.SetAccountInfoResponseProviderUserInfo>();
   o.add(buildSetAccountInfoResponseProviderUserInfo());
   o.add(buildSetAccountInfoResponseProviderUserInfo());
   return o;
 }
 
-checkUnnamed2622(core.List<api.SetAccountInfoResponseProviderUserInfo> o) {
+checkUnnamed2647(core.List<api.SetAccountInfoResponseProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSetAccountInfoResponseProviderUserInfo(o[0]);
   checkSetAccountInfoResponseProviderUserInfo(o[1]);
@@ -1333,7 +1333,7 @@
     o.newEmail = "foo";
     o.passwordHash = "foo";
     o.photoUrl = "foo";
-    o.providerUserInfo = buildUnnamed2622();
+    o.providerUserInfo = buildUnnamed2647();
     o.refreshToken = "foo";
   }
   buildCounterSetAccountInfoResponse--;
@@ -1353,7 +1353,7 @@
     unittest.expect(o.newEmail, unittest.equals('foo'));
     unittest.expect(o.passwordHash, unittest.equals('foo'));
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed2622(o.providerUserInfo);
+    checkUnnamed2647(o.providerUserInfo);
     unittest.expect(o.refreshToken, unittest.equals('foo'));
   }
   buildCounterSetAccountInfoResponse--;
@@ -1411,14 +1411,14 @@
   buildCounterUploadAccountResponseError--;
 }
 
-buildUnnamed2623() {
+buildUnnamed2648() {
   var o = new core.List<api.UploadAccountResponseError>();
   o.add(buildUploadAccountResponseError());
   o.add(buildUploadAccountResponseError());
   return o;
 }
 
-checkUnnamed2623(core.List<api.UploadAccountResponseError> o) {
+checkUnnamed2648(core.List<api.UploadAccountResponseError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUploadAccountResponseError(o[0]);
   checkUploadAccountResponseError(o[1]);
@@ -1429,7 +1429,7 @@
   var o = new api.UploadAccountResponse();
   buildCounterUploadAccountResponse++;
   if (buildCounterUploadAccountResponse < 3) {
-    o.error = buildUnnamed2623();
+    o.error = buildUnnamed2648();
     o.kind = "foo";
   }
   buildCounterUploadAccountResponse--;
@@ -1439,7 +1439,7 @@
 checkUploadAccountResponse(api.UploadAccountResponse o) {
   buildCounterUploadAccountResponse++;
   if (buildCounterUploadAccountResponse < 3) {
-    checkUnnamed2623(o.error);
+    checkUnnamed2648(o.error);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterUploadAccountResponse--;
@@ -1478,14 +1478,14 @@
   buildCounterUserInfoProviderUserInfo--;
 }
 
-buildUnnamed2624() {
+buildUnnamed2649() {
   var o = new core.List<api.UserInfoProviderUserInfo>();
   o.add(buildUserInfoProviderUserInfo());
   o.add(buildUserInfoProviderUserInfo());
   return o;
 }
 
-checkUnnamed2624(core.List<api.UserInfoProviderUserInfo> o) {
+checkUnnamed2649(core.List<api.UserInfoProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfoProviderUserInfo(o[0]);
   checkUserInfoProviderUserInfo(o[1]);
@@ -1509,7 +1509,7 @@
     o.passwordUpdatedAt = 42.0;
     o.phoneNumber = "foo";
     o.photoUrl = "foo";
-    o.providerUserInfo = buildUnnamed2624();
+    o.providerUserInfo = buildUnnamed2649();
     o.rawPassword = "foo";
     o.salt = "foo";
     o.screenName = "foo";
@@ -1536,7 +1536,7 @@
     unittest.expect(o.passwordUpdatedAt, unittest.equals(42.0));
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed2624(o.providerUserInfo);
+    checkUnnamed2649(o.providerUserInfo);
     unittest.expect(o.rawPassword, unittest.equals('foo'));
     unittest.expect(o.salt, unittest.equals('foo'));
     unittest.expect(o.screenName, unittest.equals('foo'));
@@ -1546,14 +1546,14 @@
   buildCounterUserInfo--;
 }
 
-buildUnnamed2625() {
+buildUnnamed2650() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2625(core.List<core.String> o) {
+checkUnnamed2650(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1602,7 +1602,7 @@
     o.refreshToken = "foo";
     o.screenName = "foo";
     o.timeZone = "foo";
-    o.verifiedProvider = buildUnnamed2625();
+    o.verifiedProvider = buildUnnamed2650();
   }
   buildCounterVerifyAssertionResponse--;
   return o;
@@ -1649,7 +1649,7 @@
     unittest.expect(o.refreshToken, unittest.equals('foo'));
     unittest.expect(o.screenName, unittest.equals('foo'));
     unittest.expect(o.timeZone, unittest.equals('foo'));
-    checkUnnamed2625(o.verifiedProvider);
+    checkUnnamed2650(o.verifiedProvider);
   }
   buildCounterVerifyAssertionResponse--;
 }
diff --git a/generated/googleapis/test/kgsearch/v1_test.dart b/generated/googleapis/test/kgsearch/v1_test.dart
index d74b676..a8b7803 100644
--- a/generated/googleapis/test/kgsearch/v1_test.dart
+++ b/generated/googleapis/test/kgsearch/v1_test.dart
@@ -50,7 +50,7 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1043() {
+buildUnnamed1052() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -65,7 +65,7 @@
   return o;
 }
 
-checkUnnamed1043(core.List<core.Object> o) {
+checkUnnamed1052(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map;
   unittest.expect(casted1, unittest.hasLength(3));
@@ -94,7 +94,7 @@
       'bool': true,
       'string': 'foo'
     };
-    o.itemListElement = buildUnnamed1043();
+    o.itemListElement = buildUnnamed1052();
   }
   buildCounterSearchResponse--;
   return o;
@@ -113,45 +113,45 @@
     unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
     unittest.expect(casted4["bool"], unittest.equals(true));
     unittest.expect(casted4["string"], unittest.equals('foo'));
-    checkUnnamed1043(o.itemListElement);
+    checkUnnamed1052(o.itemListElement);
   }
   buildCounterSearchResponse--;
 }
 
-buildUnnamed1044() {
+buildUnnamed1053() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1044(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'));
 }
 
-buildUnnamed1045() {
+buildUnnamed1054() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1045(core.List<core.String> o) {
+checkUnnamed1054(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1046() {
+buildUnnamed1055() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1046(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'));
@@ -170,13 +170,13 @@
     unittest.test("method--search", () {
       var mock = new HttpServerMock();
       api.EntitiesResourceApi res = new api.KgsearchApi(mock).entities;
+      var arg_languages = buildUnnamed1053();
+      var arg_ids = buildUnnamed1054();
+      var arg_limit = 42;
       var arg_prefix = true;
       var arg_query = "foo";
-      var arg_types = buildUnnamed1044();
+      var arg_types = buildUnnamed1055();
       var arg_indent = true;
-      var arg_languages = buildUnnamed1045();
-      var arg_ids = buildUnnamed1046();
-      var arg_limit = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -208,16 +208,16 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["languages"], unittest.equals(arg_languages));
+        unittest.expect(queryMap["ids"], unittest.equals(arg_ids));
+        unittest.expect(core.int.parse(queryMap["limit"].first),
+            unittest.equals(arg_limit));
         unittest.expect(
             queryMap["prefix"].first, unittest.equals("$arg_prefix"));
         unittest.expect(queryMap["query"].first, unittest.equals(arg_query));
         unittest.expect(queryMap["types"], unittest.equals(arg_types));
         unittest.expect(
             queryMap["indent"].first, unittest.equals("$arg_indent"));
-        unittest.expect(queryMap["languages"], unittest.equals(arg_languages));
-        unittest.expect(queryMap["ids"], unittest.equals(arg_ids));
-        unittest.expect(core.int.parse(queryMap["limit"].first),
-            unittest.equals(arg_limit));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -228,13 +228,13 @@
       }), true);
       res
           .search(
+              languages: arg_languages,
+              ids: arg_ids,
+              limit: arg_limit,
               prefix: arg_prefix,
               query: arg_query,
               types: arg_types,
               indent: arg_indent,
-              languages: arg_languages,
-              ids: arg_ids,
-              limit: arg_limit,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.SearchResponse response) {
         checkSearchResponse(response);
diff --git a/generated/googleapis/test/language/v1_test.dart b/generated/googleapis/test/language/v1_test.dart
index 008bd80..3761cd0 100644
--- a/generated/googleapis/test/language/v1_test.dart
+++ b/generated/googleapis/test/language/v1_test.dart
@@ -71,14 +71,14 @@
   buildCounterAnalyzeEntitiesRequest--;
 }
 
-buildUnnamed917() {
+buildUnnamed926() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed917(core.List<api.Entity> o) {
+checkUnnamed926(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
@@ -89,7 +89,7 @@
   var o = new api.AnalyzeEntitiesResponse();
   buildCounterAnalyzeEntitiesResponse++;
   if (buildCounterAnalyzeEntitiesResponse < 3) {
-    o.entities = buildUnnamed917();
+    o.entities = buildUnnamed926();
     o.language = "foo";
   }
   buildCounterAnalyzeEntitiesResponse--;
@@ -99,7 +99,7 @@
 checkAnalyzeEntitiesResponse(api.AnalyzeEntitiesResponse o) {
   buildCounterAnalyzeEntitiesResponse++;
   if (buildCounterAnalyzeEntitiesResponse < 3) {
-    checkUnnamed917(o.entities);
+    checkUnnamed926(o.entities);
     unittest.expect(o.language, unittest.equals('foo'));
   }
   buildCounterAnalyzeEntitiesResponse--;
@@ -126,14 +126,14 @@
   buildCounterAnalyzeEntitySentimentRequest--;
 }
 
-buildUnnamed918() {
+buildUnnamed927() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed918(core.List<api.Entity> o) {
+checkUnnamed927(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
@@ -144,7 +144,7 @@
   var o = new api.AnalyzeEntitySentimentResponse();
   buildCounterAnalyzeEntitySentimentResponse++;
   if (buildCounterAnalyzeEntitySentimentResponse < 3) {
-    o.entities = buildUnnamed918();
+    o.entities = buildUnnamed927();
     o.language = "foo";
   }
   buildCounterAnalyzeEntitySentimentResponse--;
@@ -154,7 +154,7 @@
 checkAnalyzeEntitySentimentResponse(api.AnalyzeEntitySentimentResponse o) {
   buildCounterAnalyzeEntitySentimentResponse++;
   if (buildCounterAnalyzeEntitySentimentResponse < 3) {
-    checkUnnamed918(o.entities);
+    checkUnnamed927(o.entities);
     unittest.expect(o.language, unittest.equals('foo'));
   }
   buildCounterAnalyzeEntitySentimentResponse--;
@@ -181,14 +181,14 @@
   buildCounterAnalyzeSentimentRequest--;
 }
 
-buildUnnamed919() {
+buildUnnamed928() {
   var o = new core.List<api.Sentence>();
   o.add(buildSentence());
   o.add(buildSentence());
   return o;
 }
 
-checkUnnamed919(core.List<api.Sentence> o) {
+checkUnnamed928(core.List<api.Sentence> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSentence(o[0]);
   checkSentence(o[1]);
@@ -201,7 +201,7 @@
   if (buildCounterAnalyzeSentimentResponse < 3) {
     o.documentSentiment = buildSentiment();
     o.language = "foo";
-    o.sentences = buildUnnamed919();
+    o.sentences = buildUnnamed928();
   }
   buildCounterAnalyzeSentimentResponse--;
   return o;
@@ -212,7 +212,7 @@
   if (buildCounterAnalyzeSentimentResponse < 3) {
     checkSentiment(o.documentSentiment);
     unittest.expect(o.language, unittest.equals('foo'));
-    checkUnnamed919(o.sentences);
+    checkUnnamed928(o.sentences);
   }
   buildCounterAnalyzeSentimentResponse--;
 }
@@ -238,27 +238,27 @@
   buildCounterAnalyzeSyntaxRequest--;
 }
 
-buildUnnamed920() {
+buildUnnamed929() {
   var o = new core.List<api.Sentence>();
   o.add(buildSentence());
   o.add(buildSentence());
   return o;
 }
 
-checkUnnamed920(core.List<api.Sentence> o) {
+checkUnnamed929(core.List<api.Sentence> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSentence(o[0]);
   checkSentence(o[1]);
 }
 
-buildUnnamed921() {
+buildUnnamed930() {
   var o = new core.List<api.Token>();
   o.add(buildToken());
   o.add(buildToken());
   return o;
 }
 
-checkUnnamed921(core.List<api.Token> o) {
+checkUnnamed930(core.List<api.Token> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkToken(o[0]);
   checkToken(o[1]);
@@ -270,8 +270,8 @@
   buildCounterAnalyzeSyntaxResponse++;
   if (buildCounterAnalyzeSyntaxResponse < 3) {
     o.language = "foo";
-    o.sentences = buildUnnamed920();
-    o.tokens = buildUnnamed921();
+    o.sentences = buildUnnamed929();
+    o.tokens = buildUnnamed930();
   }
   buildCounterAnalyzeSyntaxResponse--;
   return o;
@@ -281,8 +281,8 @@
   buildCounterAnalyzeSyntaxResponse++;
   if (buildCounterAnalyzeSyntaxResponse < 3) {
     unittest.expect(o.language, unittest.equals('foo'));
-    checkUnnamed920(o.sentences);
-    checkUnnamed921(o.tokens);
+    checkUnnamed929(o.sentences);
+    checkUnnamed930(o.tokens);
   }
   buildCounterAnalyzeSyntaxResponse--;
 }
@@ -310,53 +310,53 @@
   buildCounterAnnotateTextRequest--;
 }
 
-buildUnnamed922() {
+buildUnnamed931() {
   var o = new core.List<api.ClassificationCategory>();
   o.add(buildClassificationCategory());
   o.add(buildClassificationCategory());
   return o;
 }
 
-checkUnnamed922(core.List<api.ClassificationCategory> o) {
+checkUnnamed931(core.List<api.ClassificationCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkClassificationCategory(o[0]);
   checkClassificationCategory(o[1]);
 }
 
-buildUnnamed923() {
+buildUnnamed932() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed923(core.List<api.Entity> o) {
+checkUnnamed932(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
 }
 
-buildUnnamed924() {
+buildUnnamed933() {
   var o = new core.List<api.Sentence>();
   o.add(buildSentence());
   o.add(buildSentence());
   return o;
 }
 
-checkUnnamed924(core.List<api.Sentence> o) {
+checkUnnamed933(core.List<api.Sentence> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSentence(o[0]);
   checkSentence(o[1]);
 }
 
-buildUnnamed925() {
+buildUnnamed934() {
   var o = new core.List<api.Token>();
   o.add(buildToken());
   o.add(buildToken());
   return o;
 }
 
-checkUnnamed925(core.List<api.Token> o) {
+checkUnnamed934(core.List<api.Token> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkToken(o[0]);
   checkToken(o[1]);
@@ -367,12 +367,12 @@
   var o = new api.AnnotateTextResponse();
   buildCounterAnnotateTextResponse++;
   if (buildCounterAnnotateTextResponse < 3) {
-    o.categories = buildUnnamed922();
+    o.categories = buildUnnamed931();
     o.documentSentiment = buildSentiment();
-    o.entities = buildUnnamed923();
+    o.entities = buildUnnamed932();
     o.language = "foo";
-    o.sentences = buildUnnamed924();
-    o.tokens = buildUnnamed925();
+    o.sentences = buildUnnamed933();
+    o.tokens = buildUnnamed934();
   }
   buildCounterAnnotateTextResponse--;
   return o;
@@ -381,12 +381,12 @@
 checkAnnotateTextResponse(api.AnnotateTextResponse o) {
   buildCounterAnnotateTextResponse++;
   if (buildCounterAnnotateTextResponse < 3) {
-    checkUnnamed922(o.categories);
+    checkUnnamed931(o.categories);
     checkSentiment(o.documentSentiment);
-    checkUnnamed923(o.entities);
+    checkUnnamed932(o.entities);
     unittest.expect(o.language, unittest.equals('foo'));
-    checkUnnamed924(o.sentences);
-    checkUnnamed925(o.tokens);
+    checkUnnamed933(o.sentences);
+    checkUnnamed934(o.tokens);
   }
   buildCounterAnnotateTextResponse--;
 }
@@ -431,14 +431,14 @@
   buildCounterClassifyTextRequest--;
 }
 
-buildUnnamed926() {
+buildUnnamed935() {
   var o = new core.List<api.ClassificationCategory>();
   o.add(buildClassificationCategory());
   o.add(buildClassificationCategory());
   return o;
 }
 
-checkUnnamed926(core.List<api.ClassificationCategory> o) {
+checkUnnamed935(core.List<api.ClassificationCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkClassificationCategory(o[0]);
   checkClassificationCategory(o[1]);
@@ -449,7 +449,7 @@
   var o = new api.ClassifyTextResponse();
   buildCounterClassifyTextResponse++;
   if (buildCounterClassifyTextResponse < 3) {
-    o.categories = buildUnnamed926();
+    o.categories = buildUnnamed935();
   }
   buildCounterClassifyTextResponse--;
   return o;
@@ -458,7 +458,7 @@
 checkClassifyTextResponse(api.ClassifyTextResponse o) {
   buildCounterClassifyTextResponse++;
   if (buildCounterClassifyTextResponse < 3) {
-    checkUnnamed926(o.categories);
+    checkUnnamed935(o.categories);
   }
   buildCounterClassifyTextResponse--;
 }
@@ -509,27 +509,27 @@
   buildCounterDocument--;
 }
 
-buildUnnamed927() {
+buildUnnamed936() {
   var o = new core.List<api.EntityMention>();
   o.add(buildEntityMention());
   o.add(buildEntityMention());
   return o;
 }
 
-checkUnnamed927(core.List<api.EntityMention> o) {
+checkUnnamed936(core.List<api.EntityMention> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityMention(o[0]);
   checkEntityMention(o[1]);
 }
 
-buildUnnamed928() {
+buildUnnamed937() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed928(core.Map<core.String, core.String> o) {
+checkUnnamed937(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'));
@@ -540,8 +540,8 @@
   var o = new api.Entity();
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
-    o.mentions = buildUnnamed927();
-    o.metadata = buildUnnamed928();
+    o.mentions = buildUnnamed936();
+    o.metadata = buildUnnamed937();
     o.name = "foo";
     o.salience = 42.0;
     o.sentiment = buildSentiment();
@@ -554,8 +554,8 @@
 checkEntity(api.Entity o) {
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
-    checkUnnamed927(o.mentions);
-    checkUnnamed928(o.metadata);
+    checkUnnamed936(o.mentions);
+    checkUnnamed937(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.salience, unittest.equals(42.0));
     checkSentiment(o.sentiment);
@@ -697,7 +697,7 @@
   buildCounterSentiment--;
 }
 
-buildUnnamed929() {
+buildUnnamed938() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -712,7 +712,7 @@
   return o;
 }
 
-checkUnnamed929(core.Map<core.String, core.Object> o) {
+checkUnnamed938(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));
@@ -726,17 +726,17 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed930() {
+buildUnnamed939() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed929());
-  o.add(buildUnnamed929());
+  o.add(buildUnnamed938());
+  o.add(buildUnnamed938());
   return o;
 }
 
-checkUnnamed930(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed939(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed929(o[0]);
-  checkUnnamed929(o[1]);
+  checkUnnamed938(o[0]);
+  checkUnnamed938(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -745,7 +745,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed930();
+    o.details = buildUnnamed939();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -756,7 +756,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed930(o.details);
+    checkUnnamed939(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
diff --git a/generated/googleapis/test/licensing/v1_test.dart b/generated/googleapis/test/licensing/v1_test.dart
index 6cdccea..b2d3d22 100644
--- a/generated/googleapis/test/licensing/v1_test.dart
+++ b/generated/googleapis/test/licensing/v1_test.dart
@@ -102,14 +102,14 @@
   buildCounterLicenseAssignmentInsert--;
 }
 
-buildUnnamed2177() {
+buildUnnamed2199() {
   var o = new core.List<api.LicenseAssignment>();
   o.add(buildLicenseAssignment());
   o.add(buildLicenseAssignment());
   return o;
 }
 
-checkUnnamed2177(core.List<api.LicenseAssignment> o) {
+checkUnnamed2199(core.List<api.LicenseAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLicenseAssignment(o[0]);
   checkLicenseAssignment(o[1]);
@@ -121,7 +121,7 @@
   buildCounterLicenseAssignmentList++;
   if (buildCounterLicenseAssignmentList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed2177();
+    o.items = buildUnnamed2199();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -133,7 +133,7 @@
   buildCounterLicenseAssignmentList++;
   if (buildCounterLicenseAssignmentList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed2177(o.items);
+    checkUnnamed2199(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/logging/v2_test.dart b/generated/googleapis/test/logging/v2_test.dart
index 3286559..b339274 100644
--- a/generated/googleapis/test/logging/v2_test.dart
+++ b/generated/googleapis/test/logging/v2_test.dart
@@ -88,14 +88,14 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed238() {
+buildUnnamed232() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed238(core.List<core.double> o) {
+checkUnnamed232(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));
@@ -106,7 +106,7 @@
   var o = new api.Explicit();
   buildCounterExplicit++;
   if (buildCounterExplicit < 3) {
-    o.bounds = buildUnnamed238();
+    o.bounds = buildUnnamed232();
   }
   buildCounterExplicit--;
   return o;
@@ -115,7 +115,7 @@
 checkExplicit(api.Explicit o) {
   buildCounterExplicit++;
   if (buildCounterExplicit < 3) {
-    checkUnnamed238(o.bounds);
+    checkUnnamed232(o.bounds);
   }
   buildCounterExplicit--;
 }
@@ -236,14 +236,14 @@
   buildCounterLinear--;
 }
 
-buildUnnamed239() {
+buildUnnamed233() {
   var o = new core.List<api.LogExclusion>();
   o.add(buildLogExclusion());
   o.add(buildLogExclusion());
   return o;
 }
 
-checkUnnamed239(core.List<api.LogExclusion> o) {
+checkUnnamed233(core.List<api.LogExclusion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogExclusion(o[0]);
   checkLogExclusion(o[1]);
@@ -254,7 +254,7 @@
   var o = new api.ListExclusionsResponse();
   buildCounterListExclusionsResponse++;
   if (buildCounterListExclusionsResponse < 3) {
-    o.exclusions = buildUnnamed239();
+    o.exclusions = buildUnnamed233();
     o.nextPageToken = "foo";
   }
   buildCounterListExclusionsResponse--;
@@ -264,33 +264,33 @@
 checkListExclusionsResponse(api.ListExclusionsResponse o) {
   buildCounterListExclusionsResponse++;
   if (buildCounterListExclusionsResponse < 3) {
-    checkUnnamed239(o.exclusions);
+    checkUnnamed233(o.exclusions);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListExclusionsResponse--;
 }
 
-buildUnnamed240() {
+buildUnnamed234() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed240(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'));
 }
 
-buildUnnamed241() {
+buildUnnamed235() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed241(core.List<core.String> o) {
+checkUnnamed235(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -305,8 +305,8 @@
     o.orderBy = "foo";
     o.pageSize = 42;
     o.pageToken = "foo";
-    o.projectIds = buildUnnamed240();
-    o.resourceNames = buildUnnamed241();
+    o.projectIds = buildUnnamed234();
+    o.resourceNames = buildUnnamed235();
   }
   buildCounterListLogEntriesRequest--;
   return o;
@@ -319,20 +319,20 @@
     unittest.expect(o.orderBy, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed240(o.projectIds);
-    checkUnnamed241(o.resourceNames);
+    checkUnnamed234(o.projectIds);
+    checkUnnamed235(o.resourceNames);
   }
   buildCounterListLogEntriesRequest--;
 }
 
-buildUnnamed242() {
+buildUnnamed236() {
   var o = new core.List<api.LogEntry>();
   o.add(buildLogEntry());
   o.add(buildLogEntry());
   return o;
 }
 
-checkUnnamed242(core.List<api.LogEntry> o) {
+checkUnnamed236(core.List<api.LogEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogEntry(o[0]);
   checkLogEntry(o[1]);
@@ -343,7 +343,7 @@
   var o = new api.ListLogEntriesResponse();
   buildCounterListLogEntriesResponse++;
   if (buildCounterListLogEntriesResponse < 3) {
-    o.entries = buildUnnamed242();
+    o.entries = buildUnnamed236();
     o.nextPageToken = "foo";
   }
   buildCounterListLogEntriesResponse--;
@@ -353,20 +353,20 @@
 checkListLogEntriesResponse(api.ListLogEntriesResponse o) {
   buildCounterListLogEntriesResponse++;
   if (buildCounterListLogEntriesResponse < 3) {
-    checkUnnamed242(o.entries);
+    checkUnnamed236(o.entries);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListLogEntriesResponse--;
 }
 
-buildUnnamed243() {
+buildUnnamed237() {
   var o = new core.List<api.LogMetric>();
   o.add(buildLogMetric());
   o.add(buildLogMetric());
   return o;
 }
 
-checkUnnamed243(core.List<api.LogMetric> o) {
+checkUnnamed237(core.List<api.LogMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogMetric(o[0]);
   checkLogMetric(o[1]);
@@ -377,7 +377,7 @@
   var o = new api.ListLogMetricsResponse();
   buildCounterListLogMetricsResponse++;
   if (buildCounterListLogMetricsResponse < 3) {
-    o.metrics = buildUnnamed243();
+    o.metrics = buildUnnamed237();
     o.nextPageToken = "foo";
   }
   buildCounterListLogMetricsResponse--;
@@ -387,20 +387,20 @@
 checkListLogMetricsResponse(api.ListLogMetricsResponse o) {
   buildCounterListLogMetricsResponse++;
   if (buildCounterListLogMetricsResponse < 3) {
-    checkUnnamed243(o.metrics);
+    checkUnnamed237(o.metrics);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListLogMetricsResponse--;
 }
 
-buildUnnamed244() {
+buildUnnamed238() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed244(core.List<core.String> o) {
+checkUnnamed238(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -411,7 +411,7 @@
   var o = new api.ListLogsResponse();
   buildCounterListLogsResponse++;
   if (buildCounterListLogsResponse < 3) {
-    o.logNames = buildUnnamed244();
+    o.logNames = buildUnnamed238();
     o.nextPageToken = "foo";
   }
   buildCounterListLogsResponse--;
@@ -421,20 +421,20 @@
 checkListLogsResponse(api.ListLogsResponse o) {
   buildCounterListLogsResponse++;
   if (buildCounterListLogsResponse < 3) {
-    checkUnnamed244(o.logNames);
+    checkUnnamed238(o.logNames);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListLogsResponse--;
 }
 
-buildUnnamed245() {
+buildUnnamed239() {
   var o = new core.List<api.MonitoredResourceDescriptor>();
   o.add(buildMonitoredResourceDescriptor());
   o.add(buildMonitoredResourceDescriptor());
   return o;
 }
 
-checkUnnamed245(core.List<api.MonitoredResourceDescriptor> o) {
+checkUnnamed239(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoredResourceDescriptor(o[0]);
   checkMonitoredResourceDescriptor(o[1]);
@@ -446,7 +446,7 @@
   buildCounterListMonitoredResourceDescriptorsResponse++;
   if (buildCounterListMonitoredResourceDescriptorsResponse < 3) {
     o.nextPageToken = "foo";
-    o.resourceDescriptors = buildUnnamed245();
+    o.resourceDescriptors = buildUnnamed239();
   }
   buildCounterListMonitoredResourceDescriptorsResponse--;
   return o;
@@ -457,19 +457,19 @@
   buildCounterListMonitoredResourceDescriptorsResponse++;
   if (buildCounterListMonitoredResourceDescriptorsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed245(o.resourceDescriptors);
+    checkUnnamed239(o.resourceDescriptors);
   }
   buildCounterListMonitoredResourceDescriptorsResponse--;
 }
 
-buildUnnamed246() {
+buildUnnamed240() {
   var o = new core.List<api.LogSink>();
   o.add(buildLogSink());
   o.add(buildLogSink());
   return o;
 }
 
-checkUnnamed246(core.List<api.LogSink> o) {
+checkUnnamed240(core.List<api.LogSink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogSink(o[0]);
   checkLogSink(o[1]);
@@ -481,7 +481,7 @@
   buildCounterListSinksResponse++;
   if (buildCounterListSinksResponse < 3) {
     o.nextPageToken = "foo";
-    o.sinks = buildUnnamed246();
+    o.sinks = buildUnnamed240();
   }
   buildCounterListSinksResponse--;
   return o;
@@ -491,12 +491,12 @@
   buildCounterListSinksResponse++;
   if (buildCounterListSinksResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed246(o.sinks);
+    checkUnnamed240(o.sinks);
   }
   buildCounterListSinksResponse--;
 }
 
-buildUnnamed247() {
+buildUnnamed241() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -511,7 +511,7 @@
   return o;
 }
 
-checkUnnamed247(core.Map<core.String, core.Object> o) {
+checkUnnamed241(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));
@@ -525,20 +525,20 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed248() {
+buildUnnamed242() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed248(core.Map<core.String, core.String> o) {
+checkUnnamed242(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'));
 }
 
-buildUnnamed249() {
+buildUnnamed243() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -553,7 +553,7 @@
   return o;
 }
 
-checkUnnamed249(core.Map<core.String, core.Object> o) {
+checkUnnamed243(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -574,11 +574,11 @@
   if (buildCounterLogEntry < 3) {
     o.httpRequest = buildHttpRequest();
     o.insertId = "foo";
-    o.jsonPayload = buildUnnamed247();
-    o.labels = buildUnnamed248();
+    o.jsonPayload = buildUnnamed241();
+    o.labels = buildUnnamed242();
     o.logName = "foo";
     o.operation = buildLogEntryOperation();
-    o.protoPayload = buildUnnamed249();
+    o.protoPayload = buildUnnamed243();
     o.receiveTimestamp = "foo";
     o.resource = buildMonitoredResource();
     o.severity = "foo";
@@ -597,11 +597,11 @@
   if (buildCounterLogEntry < 3) {
     checkHttpRequest(o.httpRequest);
     unittest.expect(o.insertId, unittest.equals('foo'));
-    checkUnnamed247(o.jsonPayload);
-    checkUnnamed248(o.labels);
+    checkUnnamed241(o.jsonPayload);
+    checkUnnamed242(o.labels);
     unittest.expect(o.logName, unittest.equals('foo'));
     checkLogEntryOperation(o.operation);
-    checkUnnamed249(o.protoPayload);
+    checkUnnamed243(o.protoPayload);
     unittest.expect(o.receiveTimestamp, unittest.equals('foo'));
     checkMonitoredResource(o.resource);
     unittest.expect(o.severity, unittest.equals('foo'));
@@ -712,14 +712,14 @@
   buildCounterLogLine--;
 }
 
-buildUnnamed250() {
+buildUnnamed244() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed250(core.Map<core.String, core.String> o) {
+checkUnnamed244(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'));
@@ -733,7 +733,7 @@
     o.bucketOptions = buildBucketOptions();
     o.description = "foo";
     o.filter = "foo";
-    o.labelExtractors = buildUnnamed250();
+    o.labelExtractors = buildUnnamed244();
     o.metricDescriptor = buildMetricDescriptor();
     o.name = "foo";
     o.valueExtractor = "foo";
@@ -749,7 +749,7 @@
     checkBucketOptions(o.bucketOptions);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.filter, unittest.equals('foo'));
-    checkUnnamed250(o.labelExtractors);
+    checkUnnamed244(o.labelExtractors);
     checkMetricDescriptor(o.metricDescriptor);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.valueExtractor, unittest.equals('foo'));
@@ -791,14 +791,14 @@
   buildCounterLogSink--;
 }
 
-buildUnnamed251() {
+buildUnnamed245() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed251(core.List<api.LabelDescriptor> o) {
+checkUnnamed245(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -811,7 +811,7 @@
   if (buildCounterMetricDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed251();
+    o.labels = buildUnnamed245();
     o.metricKind = "foo";
     o.name = "foo";
     o.type = "foo";
@@ -827,7 +827,7 @@
   if (buildCounterMetricDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed251(o.labels);
+    checkUnnamed245(o.labels);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -837,14 +837,14 @@
   buildCounterMetricDescriptor--;
 }
 
-buildUnnamed252() {
+buildUnnamed246() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed252(core.Map<core.String, core.String> o) {
+checkUnnamed246(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'));
@@ -855,7 +855,7 @@
   var o = new api.MonitoredResource();
   buildCounterMonitoredResource++;
   if (buildCounterMonitoredResource < 3) {
-    o.labels = buildUnnamed252();
+    o.labels = buildUnnamed246();
     o.type = "foo";
   }
   buildCounterMonitoredResource--;
@@ -865,20 +865,20 @@
 checkMonitoredResource(api.MonitoredResource o) {
   buildCounterMonitoredResource++;
   if (buildCounterMonitoredResource < 3) {
-    checkUnnamed252(o.labels);
+    checkUnnamed246(o.labels);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterMonitoredResource--;
 }
 
-buildUnnamed253() {
+buildUnnamed247() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed253(core.List<api.LabelDescriptor> o) {
+checkUnnamed247(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -891,7 +891,7 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed253();
+    o.labels = buildUnnamed247();
     o.name = "foo";
     o.type = "foo";
   }
@@ -904,34 +904,34 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed253(o.labels);
+    checkUnnamed247(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterMonitoredResourceDescriptor--;
 }
 
-buildUnnamed254() {
+buildUnnamed248() {
   var o = new core.List<api.LogLine>();
   o.add(buildLogLine());
   o.add(buildLogLine());
   return o;
 }
 
-checkUnnamed254(core.List<api.LogLine> o) {
+checkUnnamed248(core.List<api.LogLine> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogLine(o[0]);
   checkLogLine(o[1]);
 }
 
-buildUnnamed255() {
+buildUnnamed249() {
   var o = new core.List<api.SourceReference>();
   o.add(buildSourceReference());
   o.add(buildSourceReference());
   return o;
 }
 
-checkUnnamed255(core.List<api.SourceReference> o) {
+checkUnnamed249(core.List<api.SourceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSourceReference(o[0]);
   checkSourceReference(o[1]);
@@ -954,7 +954,7 @@
     o.instanceIndex = 42;
     o.ip = "foo";
     o.latency = "foo";
-    o.line = buildUnnamed254();
+    o.line = buildUnnamed248();
     o.megaCycles = "foo";
     o.method = "foo";
     o.moduleId = "foo";
@@ -964,7 +964,7 @@
     o.requestId = "foo";
     o.resource = "foo";
     o.responseSize = "foo";
-    o.sourceReference = buildUnnamed255();
+    o.sourceReference = buildUnnamed249();
     o.startTime = "foo";
     o.status = 42;
     o.taskName = "foo";
@@ -994,7 +994,7 @@
     unittest.expect(o.instanceIndex, unittest.equals(42));
     unittest.expect(o.ip, unittest.equals('foo'));
     unittest.expect(o.latency, unittest.equals('foo'));
-    checkUnnamed254(o.line);
+    checkUnnamed248(o.line);
     unittest.expect(o.megaCycles, unittest.equals('foo'));
     unittest.expect(o.method, unittest.equals('foo'));
     unittest.expect(o.moduleId, unittest.equals('foo'));
@@ -1004,7 +1004,7 @@
     unittest.expect(o.requestId, unittest.equals('foo'));
     unittest.expect(o.resource, unittest.equals('foo'));
     unittest.expect(o.responseSize, unittest.equals('foo'));
-    checkUnnamed255(o.sourceReference);
+    checkUnnamed249(o.sourceReference);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals(42));
     unittest.expect(o.taskName, unittest.equals('foo'));
@@ -1062,27 +1062,27 @@
   buildCounterSourceReference--;
 }
 
-buildUnnamed256() {
+buildUnnamed250() {
   var o = new core.List<api.LogEntry>();
   o.add(buildLogEntry());
   o.add(buildLogEntry());
   return o;
 }
 
-checkUnnamed256(core.List<api.LogEntry> o) {
+checkUnnamed250(core.List<api.LogEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogEntry(o[0]);
   checkLogEntry(o[1]);
 }
 
-buildUnnamed257() {
+buildUnnamed251() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed257(core.Map<core.String, core.String> o) {
+checkUnnamed251(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'));
@@ -1093,8 +1093,8 @@
   var o = new api.WriteLogEntriesRequest();
   buildCounterWriteLogEntriesRequest++;
   if (buildCounterWriteLogEntriesRequest < 3) {
-    o.entries = buildUnnamed256();
-    o.labels = buildUnnamed257();
+    o.entries = buildUnnamed250();
+    o.labels = buildUnnamed251();
     o.logName = "foo";
     o.partialSuccess = true;
     o.resource = buildMonitoredResource();
@@ -1106,8 +1106,8 @@
 checkWriteLogEntriesRequest(api.WriteLogEntriesRequest o) {
   buildCounterWriteLogEntriesRequest++;
   if (buildCounterWriteLogEntriesRequest < 3) {
-    checkUnnamed256(o.entries);
-    checkUnnamed257(o.labels);
+    checkUnnamed250(o.entries);
+    checkUnnamed251(o.labels);
     unittest.expect(o.logName, unittest.equals('foo'));
     unittest.expect(o.partialSuccess, unittest.isTrue);
     checkMonitoredResource(o.resource);
@@ -1705,8 +1705,8 @@
       api.BillingAccountsLogsResourceApi res =
           new api.LoggingApi(mock).billingAccounts.logs;
       var arg_parent = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1739,10 +1739,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1753,8 +1753,8 @@
       }), true);
       res
           .list(arg_parent,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListLogsResponse response) {
         checkListLogsResponse(response);
@@ -2390,8 +2390,8 @@
       var mock = new HttpServerMock();
       api.ExclusionsResourceApi res = new api.LoggingApi(mock).exclusions;
       var arg_parent = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2424,10 +2424,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2438,8 +2438,8 @@
       }), true);
       res
           .list(arg_parent,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListExclusionsResponse response) {
         checkListExclusionsResponse(response);
@@ -2672,8 +2672,8 @@
       api.FoldersExclusionsResourceApi res =
           new api.LoggingApi(mock).folders.exclusions;
       var arg_parent = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2706,10 +2706,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2720,8 +2720,8 @@
       }), true);
       res
           .list(arg_parent,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListExclusionsResponse response) {
         checkListExclusionsResponse(response);
@@ -2845,8 +2845,8 @@
       var mock = new HttpServerMock();
       api.FoldersLogsResourceApi res = new api.LoggingApi(mock).folders.logs;
       var arg_parent = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2879,10 +2879,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2893,8 +2893,8 @@
       }), true);
       res
           .list(arg_parent,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListLogsResponse response) {
         checkListLogsResponse(response);
@@ -3372,8 +3372,8 @@
       var mock = new HttpServerMock();
       api.MonitoredResourceDescriptorsResourceApi res =
           new api.LoggingApi(mock).monitoredResourceDescriptors;
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3405,10 +3405,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3420,8 +3420,8 @@
       }), true);
       res
           .list(
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(
               ((api.ListMonitoredResourceDescriptorsResponse response) {
@@ -3596,8 +3596,8 @@
       api.OrganizationsExclusionsResourceApi res =
           new api.LoggingApi(mock).organizations.exclusions;
       var arg_parent = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3630,10 +3630,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3644,8 +3644,8 @@
       }), true);
       res
           .list(arg_parent,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListExclusionsResponse response) {
         checkListExclusionsResponse(response);
@@ -3999,8 +3999,8 @@
       api.OrganizationsSinksResourceApi res =
           new api.LoggingApi(mock).organizations.sinks;
       var arg_parent = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -4033,10 +4033,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -4047,8 +4047,8 @@
       }), true);
       res
           .list(arg_parent,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListSinksResponse response) {
         checkListSinksResponse(response);
@@ -4748,8 +4748,8 @@
       api.ProjectsMetricsResourceApi res =
           new api.LoggingApi(mock).projects.metrics;
       var arg_parent = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -4782,10 +4782,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -4796,8 +4796,8 @@
       }), true);
       res
           .list(arg_parent,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListLogMetricsResponse response) {
         checkListLogMetricsResponse(response);
@@ -5386,8 +5386,8 @@
       var mock = new HttpServerMock();
       api.SinksResourceApi res = new api.LoggingApi(mock).sinks;
       var arg_parent = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -5420,10 +5420,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -5434,8 +5434,8 @@
       }), true);
       res
           .list(arg_parent,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListSinksResponse response) {
         checkListSinksResponse(response);
diff --git a/generated/googleapis/test/manufacturers/v1_test.dart b/generated/googleapis/test/manufacturers/v1_test.dart
index b6b2c99..a3d0e90 100644
--- a/generated/googleapis/test/manufacturers/v1_test.dart
+++ b/generated/googleapis/test/manufacturers/v1_test.dart
@@ -50,79 +50,79 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1663() {
+buildUnnamed1685() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed1663(core.List<api.Image> o) {
+checkUnnamed1685(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
 }
 
-buildUnnamed1664() {
+buildUnnamed1686() {
   var o = new core.List<api.FeatureDescription>();
   o.add(buildFeatureDescription());
   o.add(buildFeatureDescription());
   return o;
 }
 
-checkUnnamed1664(core.List<api.FeatureDescription> o) {
+checkUnnamed1686(core.List<api.FeatureDescription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFeatureDescription(o[0]);
   checkFeatureDescription(o[1]);
 }
 
-buildUnnamed1665() {
+buildUnnamed1687() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1665(core.List<core.String> o) {
+checkUnnamed1687(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1666() {
+buildUnnamed1688() {
   var o = new core.List<api.ProductDetail>();
   o.add(buildProductDetail());
   o.add(buildProductDetail());
   return o;
 }
 
-checkUnnamed1666(core.List<api.ProductDetail> o) {
+checkUnnamed1688(core.List<api.ProductDetail> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductDetail(o[0]);
   checkProductDetail(o[1]);
 }
 
-buildUnnamed1667() {
+buildUnnamed1689() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1667(core.List<core.String> o) {
+checkUnnamed1689(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1668() {
+buildUnnamed1690() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1668(core.List<core.String> o) {
+checkUnnamed1690(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -133,7 +133,7 @@
   var o = new api.Attributes();
   buildCounterAttributes++;
   if (buildCounterAttributes < 3) {
-    o.additionalImageLink = buildUnnamed1663();
+    o.additionalImageLink = buildUnnamed1685();
     o.ageGroup = "foo";
     o.brand = "foo";
     o.capacity = buildCapacity();
@@ -141,21 +141,21 @@
     o.count = buildCount();
     o.description = "foo";
     o.disclosureDate = "foo";
-    o.featureDescription = buildUnnamed1664();
+    o.featureDescription = buildUnnamed1686();
     o.flavor = "foo";
     o.format = "foo";
     o.gender = "foo";
-    o.gtin = buildUnnamed1665();
+    o.gtin = buildUnnamed1687();
     o.imageLink = buildImage();
     o.itemGroupId = "foo";
     o.material = "foo";
     o.mpn = "foo";
     o.pattern = "foo";
-    o.productDetail = buildUnnamed1666();
+    o.productDetail = buildUnnamed1688();
     o.productLine = "foo";
     o.productName = "foo";
     o.productPageUrl = "foo";
-    o.productType = buildUnnamed1667();
+    o.productType = buildUnnamed1689();
     o.releaseDate = "foo";
     o.scent = "foo";
     o.size = "foo";
@@ -165,7 +165,7 @@
     o.targetClientId = "foo";
     o.theme = "foo";
     o.title = "foo";
-    o.videoLink = buildUnnamed1668();
+    o.videoLink = buildUnnamed1690();
   }
   buildCounterAttributes--;
   return o;
@@ -174,7 +174,7 @@
 checkAttributes(api.Attributes o) {
   buildCounterAttributes++;
   if (buildCounterAttributes < 3) {
-    checkUnnamed1663(o.additionalImageLink);
+    checkUnnamed1685(o.additionalImageLink);
     unittest.expect(o.ageGroup, unittest.equals('foo'));
     unittest.expect(o.brand, unittest.equals('foo'));
     checkCapacity(o.capacity);
@@ -182,21 +182,21 @@
     checkCount(o.count);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.disclosureDate, unittest.equals('foo'));
-    checkUnnamed1664(o.featureDescription);
+    checkUnnamed1686(o.featureDescription);
     unittest.expect(o.flavor, unittest.equals('foo'));
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
-    checkUnnamed1665(o.gtin);
+    checkUnnamed1687(o.gtin);
     checkImage(o.imageLink);
     unittest.expect(o.itemGroupId, unittest.equals('foo'));
     unittest.expect(o.material, unittest.equals('foo'));
     unittest.expect(o.mpn, unittest.equals('foo'));
     unittest.expect(o.pattern, unittest.equals('foo'));
-    checkUnnamed1666(o.productDetail);
+    checkUnnamed1688(o.productDetail);
     unittest.expect(o.productLine, unittest.equals('foo'));
     unittest.expect(o.productName, unittest.equals('foo'));
     unittest.expect(o.productPageUrl, unittest.equals('foo'));
-    checkUnnamed1667(o.productType);
+    checkUnnamed1689(o.productType);
     unittest.expect(o.releaseDate, unittest.equals('foo'));
     unittest.expect(o.scent, unittest.equals('foo'));
     unittest.expect(o.size, unittest.equals('foo'));
@@ -206,7 +206,7 @@
     unittest.expect(o.targetClientId, unittest.equals('foo'));
     unittest.expect(o.theme, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    checkUnnamed1668(o.videoLink);
+    checkUnnamed1690(o.videoLink);
   }
   buildCounterAttributes--;
 }
@@ -341,14 +341,14 @@
   buildCounterIssue--;
 }
 
-buildUnnamed1669() {
+buildUnnamed1691() {
   var o = new core.List<api.Product>();
   o.add(buildProduct());
   o.add(buildProduct());
   return o;
 }
 
-checkUnnamed1669(core.List<api.Product> o) {
+checkUnnamed1691(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProduct(o[0]);
   checkProduct(o[1]);
@@ -360,7 +360,7 @@
   buildCounterListProductsResponse++;
   if (buildCounterListProductsResponse < 3) {
     o.nextPageToken = "foo";
-    o.products = buildUnnamed1669();
+    o.products = buildUnnamed1691();
   }
   buildCounterListProductsResponse--;
   return o;
@@ -370,7 +370,7 @@
   buildCounterListProductsResponse++;
   if (buildCounterListProductsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1669(o.products);
+    checkUnnamed1691(o.products);
   }
   buildCounterListProductsResponse--;
 }
@@ -396,27 +396,27 @@
   buildCounterPrice--;
 }
 
-buildUnnamed1670() {
+buildUnnamed1692() {
   var o = new core.List<api.Issue>();
   o.add(buildIssue());
   o.add(buildIssue());
   return o;
 }
 
-checkUnnamed1670(core.List<api.Issue> o) {
+checkUnnamed1692(core.List<api.Issue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIssue(o[0]);
   checkIssue(o[1]);
 }
 
-buildUnnamed1671() {
+buildUnnamed1693() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1671(core.List<core.String> o) {
+checkUnnamed1693(core.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,8 +429,8 @@
   if (buildCounterProduct < 3) {
     o.contentLanguage = "foo";
     o.finalAttributes = buildAttributes();
-    o.issues = buildUnnamed1670();
-    o.manuallyDeletedAttributes = buildUnnamed1671();
+    o.issues = buildUnnamed1692();
+    o.manuallyDeletedAttributes = buildUnnamed1693();
     o.manuallyProvidedAttributes = buildAttributes();
     o.name = "foo";
     o.parent = "foo";
@@ -447,8 +447,8 @@
   if (buildCounterProduct < 3) {
     unittest.expect(o.contentLanguage, unittest.equals('foo'));
     checkAttributes(o.finalAttributes);
-    checkUnnamed1670(o.issues);
-    checkUnnamed1671(o.manuallyDeletedAttributes);
+    checkUnnamed1692(o.issues);
+    checkUnnamed1693(o.manuallyDeletedAttributes);
     checkAttributes(o.manuallyProvidedAttributes);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
diff --git a/generated/googleapis/test/mirror/v1_test.dart b/generated/googleapis/test/mirror/v1_test.dart
index 199f39f..d259548 100644
--- a/generated/googleapis/test/mirror/v1_test.dart
+++ b/generated/googleapis/test/mirror/v1_test.dart
@@ -50,40 +50,40 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1540() {
+buildUnnamed1557() {
   var o = new core.List<api.AuthToken>();
   o.add(buildAuthToken());
   o.add(buildAuthToken());
   return o;
 }
 
-checkUnnamed1540(core.List<api.AuthToken> o) {
+checkUnnamed1557(core.List<api.AuthToken> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthToken(o[0]);
   checkAuthToken(o[1]);
 }
 
-buildUnnamed1541() {
+buildUnnamed1558() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1541(core.List<core.String> o) {
+checkUnnamed1558(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1542() {
+buildUnnamed1559() {
   var o = new core.List<api.UserData>();
   o.add(buildUserData());
   o.add(buildUserData());
   return o;
 }
 
-checkUnnamed1542(core.List<api.UserData> o) {
+checkUnnamed1559(core.List<api.UserData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserData(o[0]);
   checkUserData(o[1]);
@@ -94,10 +94,10 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.authTokens = buildUnnamed1540();
-    o.features = buildUnnamed1541();
+    o.authTokens = buildUnnamed1557();
+    o.features = buildUnnamed1558();
     o.password = "foo";
-    o.userData = buildUnnamed1542();
+    o.userData = buildUnnamed1559();
   }
   buildCounterAccount--;
   return o;
@@ -106,10 +106,10 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed1540(o.authTokens);
-    checkUnnamed1541(o.features);
+    checkUnnamed1557(o.authTokens);
+    checkUnnamed1558(o.features);
     unittest.expect(o.password, unittest.equals('foo'));
-    checkUnnamed1542(o.userData);
+    checkUnnamed1559(o.userData);
   }
   buildCounterAccount--;
 }
@@ -139,14 +139,14 @@
   buildCounterAttachment--;
 }
 
-buildUnnamed1543() {
+buildUnnamed1560() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed1543(core.List<api.Attachment> o) {
+checkUnnamed1560(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
@@ -157,7 +157,7 @@
   var o = new api.AttachmentsListResponse();
   buildCounterAttachmentsListResponse++;
   if (buildCounterAttachmentsListResponse < 3) {
-    o.items = buildUnnamed1543();
+    o.items = buildUnnamed1560();
     o.kind = "foo";
   }
   buildCounterAttachmentsListResponse--;
@@ -167,7 +167,7 @@
 checkAttachmentsListResponse(api.AttachmentsListResponse o) {
   buildCounterAttachmentsListResponse++;
   if (buildCounterAttachmentsListResponse < 3) {
-    checkUnnamed1543(o.items);
+    checkUnnamed1560(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAttachmentsListResponse--;
@@ -213,53 +213,53 @@
   buildCounterCommand--;
 }
 
-buildUnnamed1544() {
+buildUnnamed1561() {
   var o = new core.List<api.Command>();
   o.add(buildCommand());
   o.add(buildCommand());
   return o;
 }
 
-checkUnnamed1544(core.List<api.Command> o) {
+checkUnnamed1561(core.List<api.Command> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommand(o[0]);
   checkCommand(o[1]);
 }
 
-buildUnnamed1545() {
+buildUnnamed1562() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1545(core.List<core.String> o) {
+checkUnnamed1562(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1546() {
+buildUnnamed1563() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1546(core.List<core.String> o) {
+checkUnnamed1563(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1547() {
+buildUnnamed1564() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1547(core.List<core.String> o) {
+checkUnnamed1564(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -270,15 +270,15 @@
   var o = new api.Contact();
   buildCounterContact++;
   if (buildCounterContact < 3) {
-    o.acceptCommands = buildUnnamed1544();
-    o.acceptTypes = buildUnnamed1545();
+    o.acceptCommands = buildUnnamed1561();
+    o.acceptTypes = buildUnnamed1562();
     o.displayName = "foo";
     o.id = "foo";
-    o.imageUrls = buildUnnamed1546();
+    o.imageUrls = buildUnnamed1563();
     o.kind = "foo";
     o.phoneNumber = "foo";
     o.priority = 42;
-    o.sharingFeatures = buildUnnamed1547();
+    o.sharingFeatures = buildUnnamed1564();
     o.source = "foo";
     o.speakableName = "foo";
     o.type = "foo";
@@ -290,15 +290,15 @@
 checkContact(api.Contact o) {
   buildCounterContact++;
   if (buildCounterContact < 3) {
-    checkUnnamed1544(o.acceptCommands);
-    checkUnnamed1545(o.acceptTypes);
+    checkUnnamed1561(o.acceptCommands);
+    checkUnnamed1562(o.acceptTypes);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1546(o.imageUrls);
+    checkUnnamed1563(o.imageUrls);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
-    checkUnnamed1547(o.sharingFeatures);
+    checkUnnamed1564(o.sharingFeatures);
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.speakableName, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -306,14 +306,14 @@
   buildCounterContact--;
 }
 
-buildUnnamed1548() {
+buildUnnamed1565() {
   var o = new core.List<api.Contact>();
   o.add(buildContact());
   o.add(buildContact());
   return o;
 }
 
-checkUnnamed1548(core.List<api.Contact> o) {
+checkUnnamed1565(core.List<api.Contact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContact(o[0]);
   checkContact(o[1]);
@@ -324,7 +324,7 @@
   var o = new api.ContactsListResponse();
   buildCounterContactsListResponse++;
   if (buildCounterContactsListResponse < 3) {
-    o.items = buildUnnamed1548();
+    o.items = buildUnnamed1565();
     o.kind = "foo";
   }
   buildCounterContactsListResponse--;
@@ -334,7 +334,7 @@
 checkContactsListResponse(api.ContactsListResponse o) {
   buildCounterContactsListResponse++;
   if (buildCounterContactsListResponse < 3) {
-    checkUnnamed1548(o.items);
+    checkUnnamed1565(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterContactsListResponse--;
@@ -374,14 +374,14 @@
   buildCounterLocation--;
 }
 
-buildUnnamed1549() {
+buildUnnamed1566() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed1549(core.List<api.Location> o) {
+checkUnnamed1566(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
@@ -392,7 +392,7 @@
   var o = new api.LocationsListResponse();
   buildCounterLocationsListResponse++;
   if (buildCounterLocationsListResponse < 3) {
-    o.items = buildUnnamed1549();
+    o.items = buildUnnamed1566();
     o.kind = "foo";
   }
   buildCounterLocationsListResponse--;
@@ -402,20 +402,20 @@
 checkLocationsListResponse(api.LocationsListResponse o) {
   buildCounterLocationsListResponse++;
   if (buildCounterLocationsListResponse < 3) {
-    checkUnnamed1549(o.items);
+    checkUnnamed1566(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterLocationsListResponse--;
 }
 
-buildUnnamed1550() {
+buildUnnamed1567() {
   var o = new core.List<api.MenuValue>();
   o.add(buildMenuValue());
   o.add(buildMenuValue());
   return o;
 }
 
-checkUnnamed1550(core.List<api.MenuValue> o) {
+checkUnnamed1567(core.List<api.MenuValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMenuValue(o[0]);
   checkMenuValue(o[1]);
@@ -431,7 +431,7 @@
     o.id = "foo";
     o.payload = "foo";
     o.removeWhenSelected = true;
-    o.values = buildUnnamed1550();
+    o.values = buildUnnamed1567();
   }
   buildCounterMenuItem--;
   return o;
@@ -445,7 +445,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.payload, unittest.equals('foo'));
     unittest.expect(o.removeWhenSelected, unittest.isTrue);
-    checkUnnamed1550(o.values);
+    checkUnnamed1567(o.values);
   }
   buildCounterMenuItem--;
 }
@@ -473,14 +473,14 @@
   buildCounterMenuValue--;
 }
 
-buildUnnamed1551() {
+buildUnnamed1568() {
   var o = new core.List<api.UserAction>();
   o.add(buildUserAction());
   o.add(buildUserAction());
   return o;
 }
 
-checkUnnamed1551(core.List<api.UserAction> o) {
+checkUnnamed1568(core.List<api.UserAction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserAction(o[0]);
   checkUserAction(o[1]);
@@ -494,7 +494,7 @@
     o.collection = "foo";
     o.itemId = "foo";
     o.operation = "foo";
-    o.userActions = buildUnnamed1551();
+    o.userActions = buildUnnamed1568();
     o.userToken = "foo";
     o.verifyToken = "foo";
   }
@@ -508,7 +508,7 @@
     unittest.expect(o.collection, unittest.equals('foo'));
     unittest.expect(o.itemId, unittest.equals('foo'));
     unittest.expect(o.operation, unittest.equals('foo'));
-    checkUnnamed1551(o.userActions);
+    checkUnnamed1568(o.userActions);
     unittest.expect(o.userToken, unittest.equals('foo'));
     unittest.expect(o.verifyToken, unittest.equals('foo'));
   }
@@ -560,14 +560,14 @@
   buildCounterSetting--;
 }
 
-buildUnnamed1552() {
+buildUnnamed1569() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1552(core.List<core.String> o) {
+checkUnnamed1569(core.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,7 +583,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.notification = buildNotification();
-    o.operation = buildUnnamed1552();
+    o.operation = buildUnnamed1569();
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
     o.userToken = "foo";
     o.verifyToken = "foo";
@@ -600,7 +600,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNotification(o.notification);
-    checkUnnamed1552(o.operation);
+    checkUnnamed1569(o.operation);
     unittest.expect(
         o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.userToken, unittest.equals('foo'));
@@ -609,14 +609,14 @@
   buildCounterSubscription--;
 }
 
-buildUnnamed1553() {
+buildUnnamed1570() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed1553(core.List<api.Subscription> o) {
+checkUnnamed1570(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -627,7 +627,7 @@
   var o = new api.SubscriptionsListResponse();
   buildCounterSubscriptionsListResponse++;
   if (buildCounterSubscriptionsListResponse < 3) {
-    o.items = buildUnnamed1553();
+    o.items = buildUnnamed1570();
     o.kind = "foo";
   }
   buildCounterSubscriptionsListResponse--;
@@ -637,46 +637,46 @@
 checkSubscriptionsListResponse(api.SubscriptionsListResponse o) {
   buildCounterSubscriptionsListResponse++;
   if (buildCounterSubscriptionsListResponse < 3) {
-    checkUnnamed1553(o.items);
+    checkUnnamed1570(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSubscriptionsListResponse--;
 }
 
-buildUnnamed1554() {
+buildUnnamed1571() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed1554(core.List<api.Attachment> o) {
+checkUnnamed1571(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
 }
 
-buildUnnamed1555() {
+buildUnnamed1572() {
   var o = new core.List<api.MenuItem>();
   o.add(buildMenuItem());
   o.add(buildMenuItem());
   return o;
 }
 
-checkUnnamed1555(core.List<api.MenuItem> o) {
+checkUnnamed1572(core.List<api.MenuItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMenuItem(o[0]);
   checkMenuItem(o[1]);
 }
 
-buildUnnamed1556() {
+buildUnnamed1573() {
   var o = new core.List<api.Contact>();
   o.add(buildContact());
   o.add(buildContact());
   return o;
 }
 
-checkUnnamed1556(core.List<api.Contact> o) {
+checkUnnamed1573(core.List<api.Contact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContact(o[0]);
   checkContact(o[1]);
@@ -687,7 +687,7 @@
   var o = new api.TimelineItem();
   buildCounterTimelineItem++;
   if (buildCounterTimelineItem < 3) {
-    o.attachments = buildUnnamed1554();
+    o.attachments = buildUnnamed1571();
     o.bundleId = "foo";
     o.canonicalUrl = "foo";
     o.created = core.DateTime.parse("2002-02-27T14:01:02");
@@ -702,10 +702,10 @@
     o.isPinned = true;
     o.kind = "foo";
     o.location = buildLocation();
-    o.menuItems = buildUnnamed1555();
+    o.menuItems = buildUnnamed1572();
     o.notification = buildNotificationConfig();
     o.pinScore = 42;
-    o.recipients = buildUnnamed1556();
+    o.recipients = buildUnnamed1573();
     o.selfLink = "foo";
     o.sourceItemId = "foo";
     o.speakableText = "foo";
@@ -721,7 +721,7 @@
 checkTimelineItem(api.TimelineItem o) {
   buildCounterTimelineItem++;
   if (buildCounterTimelineItem < 3) {
-    checkUnnamed1554(o.attachments);
+    checkUnnamed1571(o.attachments);
     unittest.expect(o.bundleId, unittest.equals('foo'));
     unittest.expect(o.canonicalUrl, unittest.equals('foo'));
     unittest.expect(
@@ -738,10 +738,10 @@
     unittest.expect(o.isPinned, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkLocation(o.location);
-    checkUnnamed1555(o.menuItems);
+    checkUnnamed1572(o.menuItems);
     checkNotificationConfig(o.notification);
     unittest.expect(o.pinScore, unittest.equals(42));
-    checkUnnamed1556(o.recipients);
+    checkUnnamed1573(o.recipients);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.sourceItemId, unittest.equals('foo'));
     unittest.expect(o.speakableText, unittest.equals('foo'));
@@ -754,14 +754,14 @@
   buildCounterTimelineItem--;
 }
 
-buildUnnamed1557() {
+buildUnnamed1574() {
   var o = new core.List<api.TimelineItem>();
   o.add(buildTimelineItem());
   o.add(buildTimelineItem());
   return o;
 }
 
-checkUnnamed1557(core.List<api.TimelineItem> o) {
+checkUnnamed1574(core.List<api.TimelineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimelineItem(o[0]);
   checkTimelineItem(o[1]);
@@ -772,7 +772,7 @@
   var o = new api.TimelineListResponse();
   buildCounterTimelineListResponse++;
   if (buildCounterTimelineListResponse < 3) {
-    o.items = buildUnnamed1557();
+    o.items = buildUnnamed1574();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -783,7 +783,7 @@
 checkTimelineListResponse(api.TimelineListResponse o) {
   buildCounterTimelineListResponse++;
   if (buildCounterTimelineListResponse < 3) {
-    checkUnnamed1557(o.items);
+    checkUnnamed1574(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/ml/v1_test.dart b/generated/googleapis/test/ml/v1_test.dart
index 1fc9c68..7e086eb 100644
--- a/generated/googleapis/test/ml/v1_test.dart
+++ b/generated/googleapis/test/ml/v1_test.dart
@@ -172,6 +172,40 @@
   buildCounterGoogleCloudMlV1CancelJobRequest--;
 }
 
+buildUnnamed2() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterGoogleCloudMlV1Capability = 0;
+buildGoogleCloudMlV1Capability() {
+  var o = new api.GoogleCloudMlV1Capability();
+  buildCounterGoogleCloudMlV1Capability++;
+  if (buildCounterGoogleCloudMlV1Capability < 3) {
+    o.availableAccelerators = buildUnnamed2();
+    o.type = "foo";
+  }
+  buildCounterGoogleCloudMlV1Capability--;
+  return o;
+}
+
+checkGoogleCloudMlV1Capability(api.GoogleCloudMlV1Capability o) {
+  buildCounterGoogleCloudMlV1Capability++;
+  if (buildCounterGoogleCloudMlV1Capability < 3) {
+    checkUnnamed2(o.availableAccelerators);
+    unittest.expect(o.type, unittest.equals('foo'));
+  }
+  buildCounterGoogleCloudMlV1Capability--;
+}
+
 core.int buildCounterGoogleCloudMlV1GetConfigResponse = 0;
 buildGoogleCloudMlV1GetConfigResponse() {
   var o = new api.GoogleCloudMlV1GetConfigResponse();
@@ -193,7 +227,7 @@
   buildCounterGoogleCloudMlV1GetConfigResponse--;
 }
 
-buildUnnamed2() {
+buildUnnamed3() {
   var o = new core
       .List<api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric>();
   o.add(buildGoogleCloudMlV1HyperparameterOutputHyperparameterMetric());
@@ -201,21 +235,21 @@
   return o;
 }
 
-checkUnnamed2(
+checkUnnamed3(
     core.List<api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(o[0]);
   checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(o[1]);
 }
 
-buildUnnamed3() {
+buildUnnamed4() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3(core.Map<core.String, core.String> o) {
+checkUnnamed4(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'));
@@ -226,10 +260,10 @@
   var o = new api.GoogleCloudMlV1HyperparameterOutput();
   buildCounterGoogleCloudMlV1HyperparameterOutput++;
   if (buildCounterGoogleCloudMlV1HyperparameterOutput < 3) {
-    o.allMetrics = buildUnnamed2();
+    o.allMetrics = buildUnnamed3();
     o.finalMetric =
         buildGoogleCloudMlV1HyperparameterOutputHyperparameterMetric();
-    o.hyperparameters = buildUnnamed3();
+    o.hyperparameters = buildUnnamed4();
     o.trialId = "foo";
   }
   buildCounterGoogleCloudMlV1HyperparameterOutput--;
@@ -240,22 +274,22 @@
     api.GoogleCloudMlV1HyperparameterOutput o) {
   buildCounterGoogleCloudMlV1HyperparameterOutput++;
   if (buildCounterGoogleCloudMlV1HyperparameterOutput < 3) {
-    checkUnnamed2(o.allMetrics);
+    checkUnnamed3(o.allMetrics);
     checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(o.finalMetric);
-    checkUnnamed3(o.hyperparameters);
+    checkUnnamed4(o.hyperparameters);
     unittest.expect(o.trialId, unittest.equals('foo'));
   }
   buildCounterGoogleCloudMlV1HyperparameterOutput--;
 }
 
-buildUnnamed4() {
+buildUnnamed5() {
   var o = new core.List<api.GoogleCloudMlV1ParameterSpec>();
   o.add(buildGoogleCloudMlV1ParameterSpec());
   o.add(buildGoogleCloudMlV1ParameterSpec());
   return o;
 }
 
-checkUnnamed4(core.List<api.GoogleCloudMlV1ParameterSpec> o) {
+checkUnnamed5(core.List<api.GoogleCloudMlV1ParameterSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1ParameterSpec(o[0]);
   checkGoogleCloudMlV1ParameterSpec(o[1]);
@@ -270,7 +304,7 @@
     o.hyperparameterMetricTag = "foo";
     o.maxParallelTrials = 42;
     o.maxTrials = 42;
-    o.params = buildUnnamed4();
+    o.params = buildUnnamed5();
   }
   buildCounterGoogleCloudMlV1HyperparameterSpec--;
   return o;
@@ -284,19 +318,19 @@
     unittest.expect(o.hyperparameterMetricTag, unittest.equals('foo'));
     unittest.expect(o.maxParallelTrials, unittest.equals(42));
     unittest.expect(o.maxTrials, unittest.equals(42));
-    checkUnnamed4(o.params);
+    checkUnnamed5(o.params);
   }
   buildCounterGoogleCloudMlV1HyperparameterSpec--;
 }
 
-buildUnnamed5() {
+buildUnnamed6() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed5(core.Map<core.String, core.String> o) {
+checkUnnamed6(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'));
@@ -312,7 +346,7 @@
     o.errorMessage = "foo";
     o.etag = "foo";
     o.jobId = "foo";
-    o.labels = buildUnnamed5();
+    o.labels = buildUnnamed6();
     o.predictionInput = buildGoogleCloudMlV1PredictionInput();
     o.predictionOutput = buildGoogleCloudMlV1PredictionOutput();
     o.startTime = "foo";
@@ -332,7 +366,7 @@
     unittest.expect(o.errorMessage, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.jobId, unittest.equals('foo'));
-    checkUnnamed5(o.labels);
+    checkUnnamed6(o.labels);
     checkGoogleCloudMlV1PredictionInput(o.predictionInput);
     checkGoogleCloudMlV1PredictionOutput(o.predictionOutput);
     unittest.expect(o.startTime, unittest.equals('foo'));
@@ -343,14 +377,14 @@
   buildCounterGoogleCloudMlV1Job--;
 }
 
-buildUnnamed6() {
+buildUnnamed7() {
   var o = new core.List<api.GoogleCloudMlV1Job>();
   o.add(buildGoogleCloudMlV1Job());
   o.add(buildGoogleCloudMlV1Job());
   return o;
 }
 
-checkUnnamed6(core.List<api.GoogleCloudMlV1Job> o) {
+checkUnnamed7(core.List<api.GoogleCloudMlV1Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1Job(o[0]);
   checkGoogleCloudMlV1Job(o[1]);
@@ -361,7 +395,7 @@
   var o = new api.GoogleCloudMlV1ListJobsResponse();
   buildCounterGoogleCloudMlV1ListJobsResponse++;
   if (buildCounterGoogleCloudMlV1ListJobsResponse < 3) {
-    o.jobs = buildUnnamed6();
+    o.jobs = buildUnnamed7();
     o.nextPageToken = "foo";
   }
   buildCounterGoogleCloudMlV1ListJobsResponse--;
@@ -371,20 +405,55 @@
 checkGoogleCloudMlV1ListJobsResponse(api.GoogleCloudMlV1ListJobsResponse o) {
   buildCounterGoogleCloudMlV1ListJobsResponse++;
   if (buildCounterGoogleCloudMlV1ListJobsResponse < 3) {
-    checkUnnamed6(o.jobs);
+    checkUnnamed7(o.jobs);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterGoogleCloudMlV1ListJobsResponse--;
 }
 
-buildUnnamed7() {
+buildUnnamed8() {
+  var o = new core.List<api.GoogleCloudMlV1Location>();
+  o.add(buildGoogleCloudMlV1Location());
+  o.add(buildGoogleCloudMlV1Location());
+  return o;
+}
+
+checkUnnamed8(core.List<api.GoogleCloudMlV1Location> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkGoogleCloudMlV1Location(o[0]);
+  checkGoogleCloudMlV1Location(o[1]);
+}
+
+core.int buildCounterGoogleCloudMlV1ListLocationsResponse = 0;
+buildGoogleCloudMlV1ListLocationsResponse() {
+  var o = new api.GoogleCloudMlV1ListLocationsResponse();
+  buildCounterGoogleCloudMlV1ListLocationsResponse++;
+  if (buildCounterGoogleCloudMlV1ListLocationsResponse < 3) {
+    o.locations = buildUnnamed8();
+    o.nextPageToken = "foo";
+  }
+  buildCounterGoogleCloudMlV1ListLocationsResponse--;
+  return o;
+}
+
+checkGoogleCloudMlV1ListLocationsResponse(
+    api.GoogleCloudMlV1ListLocationsResponse o) {
+  buildCounterGoogleCloudMlV1ListLocationsResponse++;
+  if (buildCounterGoogleCloudMlV1ListLocationsResponse < 3) {
+    checkUnnamed8(o.locations);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterGoogleCloudMlV1ListLocationsResponse--;
+}
+
+buildUnnamed9() {
   var o = new core.List<api.GoogleCloudMlV1Model>();
   o.add(buildGoogleCloudMlV1Model());
   o.add(buildGoogleCloudMlV1Model());
   return o;
 }
 
-checkUnnamed7(core.List<api.GoogleCloudMlV1Model> o) {
+checkUnnamed9(core.List<api.GoogleCloudMlV1Model> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1Model(o[0]);
   checkGoogleCloudMlV1Model(o[1]);
@@ -395,7 +464,7 @@
   var o = new api.GoogleCloudMlV1ListModelsResponse();
   buildCounterGoogleCloudMlV1ListModelsResponse++;
   if (buildCounterGoogleCloudMlV1ListModelsResponse < 3) {
-    o.models = buildUnnamed7();
+    o.models = buildUnnamed9();
     o.nextPageToken = "foo";
   }
   buildCounterGoogleCloudMlV1ListModelsResponse--;
@@ -406,20 +475,20 @@
     api.GoogleCloudMlV1ListModelsResponse o) {
   buildCounterGoogleCloudMlV1ListModelsResponse++;
   if (buildCounterGoogleCloudMlV1ListModelsResponse < 3) {
-    checkUnnamed7(o.models);
+    checkUnnamed9(o.models);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterGoogleCloudMlV1ListModelsResponse--;
 }
 
-buildUnnamed8() {
+buildUnnamed10() {
   var o = new core.List<api.GoogleCloudMlV1Version>();
   o.add(buildGoogleCloudMlV1Version());
   o.add(buildGoogleCloudMlV1Version());
   return o;
 }
 
-checkUnnamed8(core.List<api.GoogleCloudMlV1Version> o) {
+checkUnnamed10(core.List<api.GoogleCloudMlV1Version> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1Version(o[0]);
   checkGoogleCloudMlV1Version(o[1]);
@@ -431,7 +500,7 @@
   buildCounterGoogleCloudMlV1ListVersionsResponse++;
   if (buildCounterGoogleCloudMlV1ListVersionsResponse < 3) {
     o.nextPageToken = "foo";
-    o.versions = buildUnnamed8();
+    o.versions = buildUnnamed10();
   }
   buildCounterGoogleCloudMlV1ListVersionsResponse--;
   return o;
@@ -442,11 +511,45 @@
   buildCounterGoogleCloudMlV1ListVersionsResponse++;
   if (buildCounterGoogleCloudMlV1ListVersionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed8(o.versions);
+    checkUnnamed10(o.versions);
   }
   buildCounterGoogleCloudMlV1ListVersionsResponse--;
 }
 
+buildUnnamed11() {
+  var o = new core.List<api.GoogleCloudMlV1Capability>();
+  o.add(buildGoogleCloudMlV1Capability());
+  o.add(buildGoogleCloudMlV1Capability());
+  return o;
+}
+
+checkUnnamed11(core.List<api.GoogleCloudMlV1Capability> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkGoogleCloudMlV1Capability(o[0]);
+  checkGoogleCloudMlV1Capability(o[1]);
+}
+
+core.int buildCounterGoogleCloudMlV1Location = 0;
+buildGoogleCloudMlV1Location() {
+  var o = new api.GoogleCloudMlV1Location();
+  buildCounterGoogleCloudMlV1Location++;
+  if (buildCounterGoogleCloudMlV1Location < 3) {
+    o.capabilities = buildUnnamed11();
+    o.name = "foo";
+  }
+  buildCounterGoogleCloudMlV1Location--;
+  return o;
+}
+
+checkGoogleCloudMlV1Location(api.GoogleCloudMlV1Location o) {
+  buildCounterGoogleCloudMlV1Location++;
+  if (buildCounterGoogleCloudMlV1Location < 3) {
+    checkUnnamed11(o.capabilities);
+    unittest.expect(o.name, unittest.equals('foo'));
+  }
+  buildCounterGoogleCloudMlV1Location--;
+}
+
 core.int buildCounterGoogleCloudMlV1ManualScaling = 0;
 buildGoogleCloudMlV1ManualScaling() {
   var o = new api.GoogleCloudMlV1ManualScaling();
@@ -466,27 +569,27 @@
   buildCounterGoogleCloudMlV1ManualScaling--;
 }
 
-buildUnnamed9() {
+buildUnnamed12() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed9(core.Map<core.String, core.String> o) {
+checkUnnamed12(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'));
 }
 
-buildUnnamed10() {
+buildUnnamed13() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed10(core.List<core.String> o) {
+checkUnnamed13(core.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,10 +603,10 @@
     o.defaultVersion = buildGoogleCloudMlV1Version();
     o.description = "foo";
     o.etag = "foo";
-    o.labels = buildUnnamed9();
+    o.labels = buildUnnamed12();
     o.name = "foo";
     o.onlinePredictionLogging = true;
-    o.regions = buildUnnamed10();
+    o.regions = buildUnnamed13();
   }
   buildCounterGoogleCloudMlV1Model--;
   return o;
@@ -515,22 +618,22 @@
     checkGoogleCloudMlV1Version(o.defaultVersion);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed9(o.labels);
+    checkUnnamed12(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.onlinePredictionLogging, unittest.isTrue);
-    checkUnnamed10(o.regions);
+    checkUnnamed13(o.regions);
   }
   buildCounterGoogleCloudMlV1Model--;
 }
 
-buildUnnamed11() {
+buildUnnamed14() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed11(core.Map<core.String, core.String> o) {
+checkUnnamed14(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 +647,7 @@
     o.createTime = "foo";
     o.endTime = "foo";
     o.isCancellationRequested = true;
-    o.labels = buildUnnamed11();
+    o.labels = buildUnnamed14();
     o.modelName = "foo";
     o.operationType = "foo";
     o.projectNumber = "foo";
@@ -561,7 +664,7 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.isCancellationRequested, unittest.isTrue);
-    checkUnnamed11(o.labels);
+    checkUnnamed14(o.labels);
     unittest.expect(o.modelName, unittest.equals('foo'));
     unittest.expect(o.operationType, unittest.equals('foo'));
     unittest.expect(o.projectNumber, unittest.equals('foo'));
@@ -571,27 +674,27 @@
   buildCounterGoogleCloudMlV1OperationMetadata--;
 }
 
-buildUnnamed12() {
+buildUnnamed15() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed12(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'));
 }
 
-buildUnnamed13() {
+buildUnnamed16() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed13(core.List<core.double> o) {
+checkUnnamed16(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));
@@ -602,8 +705,8 @@
   var o = new api.GoogleCloudMlV1ParameterSpec();
   buildCounterGoogleCloudMlV1ParameterSpec++;
   if (buildCounterGoogleCloudMlV1ParameterSpec < 3) {
-    o.categoricalValues = buildUnnamed12();
-    o.discreteValues = buildUnnamed13();
+    o.categoricalValues = buildUnnamed15();
+    o.discreteValues = buildUnnamed16();
     o.maxValue = 42.0;
     o.minValue = 42.0;
     o.parameterName = "foo";
@@ -617,8 +720,8 @@
 checkGoogleCloudMlV1ParameterSpec(api.GoogleCloudMlV1ParameterSpec o) {
   buildCounterGoogleCloudMlV1ParameterSpec++;
   if (buildCounterGoogleCloudMlV1ParameterSpec < 3) {
-    checkUnnamed12(o.categoricalValues);
-    checkUnnamed13(o.discreteValues);
+    checkUnnamed15(o.categoricalValues);
+    checkUnnamed16(o.discreteValues);
     unittest.expect(o.maxValue, unittest.equals(42.0));
     unittest.expect(o.minValue, unittest.equals(42.0));
     unittest.expect(o.parameterName, unittest.equals('foo'));
@@ -647,14 +750,14 @@
   buildCounterGoogleCloudMlV1PredictRequest--;
 }
 
-buildUnnamed14() {
+buildUnnamed17() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed14(core.List<core.String> o) {
+checkUnnamed17(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -667,7 +770,7 @@
   if (buildCounterGoogleCloudMlV1PredictionInput < 3) {
     o.batchSize = "foo";
     o.dataFormat = "foo";
-    o.inputPaths = buildUnnamed14();
+    o.inputPaths = buildUnnamed17();
     o.maxWorkerCount = "foo";
     o.modelName = "foo";
     o.outputPath = "foo";
@@ -686,7 +789,7 @@
   if (buildCounterGoogleCloudMlV1PredictionInput < 3) {
     unittest.expect(o.batchSize, unittest.equals('foo'));
     unittest.expect(o.dataFormat, unittest.equals('foo'));
-    checkUnnamed14(o.inputPaths);
+    checkUnnamed17(o.inputPaths);
     unittest.expect(o.maxWorkerCount, unittest.equals('foo'));
     unittest.expect(o.modelName, unittest.equals('foo'));
     unittest.expect(o.outputPath, unittest.equals('foo'));
@@ -740,27 +843,27 @@
   buildCounterGoogleCloudMlV1SetDefaultVersionRequest--;
 }
 
-buildUnnamed15() {
+buildUnnamed18() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed15(core.List<core.String> o) {
+checkUnnamed18(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed16() {
+buildUnnamed19() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed16(core.List<core.String> o) {
+checkUnnamed19(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -771,11 +874,11 @@
   var o = new api.GoogleCloudMlV1TrainingInput();
   buildCounterGoogleCloudMlV1TrainingInput++;
   if (buildCounterGoogleCloudMlV1TrainingInput < 3) {
-    o.args = buildUnnamed15();
+    o.args = buildUnnamed18();
     o.hyperparameters = buildGoogleCloudMlV1HyperparameterSpec();
     o.jobDir = "foo";
     o.masterType = "foo";
-    o.packageUris = buildUnnamed16();
+    o.packageUris = buildUnnamed19();
     o.parameterServerCount = "foo";
     o.parameterServerType = "foo";
     o.pythonModule = "foo";
@@ -793,11 +896,11 @@
 checkGoogleCloudMlV1TrainingInput(api.GoogleCloudMlV1TrainingInput o) {
   buildCounterGoogleCloudMlV1TrainingInput++;
   if (buildCounterGoogleCloudMlV1TrainingInput < 3) {
-    checkUnnamed15(o.args);
+    checkUnnamed18(o.args);
     checkGoogleCloudMlV1HyperparameterSpec(o.hyperparameters);
     unittest.expect(o.jobDir, unittest.equals('foo'));
     unittest.expect(o.masterType, unittest.equals('foo'));
-    checkUnnamed16(o.packageUris);
+    checkUnnamed19(o.packageUris);
     unittest.expect(o.parameterServerCount, unittest.equals('foo'));
     unittest.expect(o.parameterServerType, unittest.equals('foo'));
     unittest.expect(o.pythonModule, unittest.equals('foo'));
@@ -811,14 +914,14 @@
   buildCounterGoogleCloudMlV1TrainingInput--;
 }
 
-buildUnnamed17() {
+buildUnnamed20() {
   var o = new core.List<api.GoogleCloudMlV1HyperparameterOutput>();
   o.add(buildGoogleCloudMlV1HyperparameterOutput());
   o.add(buildGoogleCloudMlV1HyperparameterOutput());
   return o;
 }
 
-checkUnnamed17(core.List<api.GoogleCloudMlV1HyperparameterOutput> o) {
+checkUnnamed20(core.List<api.GoogleCloudMlV1HyperparameterOutput> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1HyperparameterOutput(o[0]);
   checkGoogleCloudMlV1HyperparameterOutput(o[1]);
@@ -832,7 +935,7 @@
     o.completedTrialCount = "foo";
     o.consumedMLUnits = 42.0;
     o.isHyperparameterTuningJob = true;
-    o.trials = buildUnnamed17();
+    o.trials = buildUnnamed20();
   }
   buildCounterGoogleCloudMlV1TrainingOutput--;
   return o;
@@ -844,19 +947,19 @@
     unittest.expect(o.completedTrialCount, unittest.equals('foo'));
     unittest.expect(o.consumedMLUnits, unittest.equals(42.0));
     unittest.expect(o.isHyperparameterTuningJob, unittest.isTrue);
-    checkUnnamed17(o.trials);
+    checkUnnamed20(o.trials);
   }
   buildCounterGoogleCloudMlV1TrainingOutput--;
 }
 
-buildUnnamed18() {
+buildUnnamed21() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed18(core.Map<core.String, core.String> o) {
+checkUnnamed21(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'));
@@ -874,7 +977,7 @@
     o.errorMessage = "foo";
     o.etag = "foo";
     o.isDefault = true;
-    o.labels = buildUnnamed18();
+    o.labels = buildUnnamed21();
     o.lastUseTime = "foo";
     o.manualScaling = buildGoogleCloudMlV1ManualScaling();
     o.name = "foo";
@@ -895,7 +998,7 @@
     unittest.expect(o.errorMessage, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.isDefault, unittest.isTrue);
-    checkUnnamed18(o.labels);
+    checkUnnamed21(o.labels);
     unittest.expect(o.lastUseTime, unittest.equals('foo'));
     checkGoogleCloudMlV1ManualScaling(o.manualScaling);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -905,27 +1008,27 @@
   buildCounterGoogleCloudMlV1Version--;
 }
 
-buildUnnamed19() {
+buildUnnamed22() {
   var o = new core.List<api.GoogleIamV1AuditLogConfig>();
   o.add(buildGoogleIamV1AuditLogConfig());
   o.add(buildGoogleIamV1AuditLogConfig());
   return o;
 }
 
-checkUnnamed19(core.List<api.GoogleIamV1AuditLogConfig> o) {
+checkUnnamed22(core.List<api.GoogleIamV1AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleIamV1AuditLogConfig(o[0]);
   checkGoogleIamV1AuditLogConfig(o[1]);
 }
 
-buildUnnamed20() {
+buildUnnamed23() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed20(core.List<core.String> o) {
+checkUnnamed23(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -936,8 +1039,8 @@
   var o = new api.GoogleIamV1AuditConfig();
   buildCounterGoogleIamV1AuditConfig++;
   if (buildCounterGoogleIamV1AuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed19();
-    o.exemptedMembers = buildUnnamed20();
+    o.auditLogConfigs = buildUnnamed22();
+    o.exemptedMembers = buildUnnamed23();
     o.service = "foo";
   }
   buildCounterGoogleIamV1AuditConfig--;
@@ -947,21 +1050,21 @@
 checkGoogleIamV1AuditConfig(api.GoogleIamV1AuditConfig o) {
   buildCounterGoogleIamV1AuditConfig++;
   if (buildCounterGoogleIamV1AuditConfig < 3) {
-    checkUnnamed19(o.auditLogConfigs);
-    checkUnnamed20(o.exemptedMembers);
+    checkUnnamed22(o.auditLogConfigs);
+    checkUnnamed23(o.exemptedMembers);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterGoogleIamV1AuditConfig--;
 }
 
-buildUnnamed21() {
+buildUnnamed24() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed21(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'));
@@ -972,7 +1075,7 @@
   var o = new api.GoogleIamV1AuditLogConfig();
   buildCounterGoogleIamV1AuditLogConfig++;
   if (buildCounterGoogleIamV1AuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed21();
+    o.exemptedMembers = buildUnnamed24();
     o.logType = "foo";
   }
   buildCounterGoogleIamV1AuditLogConfig--;
@@ -982,20 +1085,20 @@
 checkGoogleIamV1AuditLogConfig(api.GoogleIamV1AuditLogConfig o) {
   buildCounterGoogleIamV1AuditLogConfig++;
   if (buildCounterGoogleIamV1AuditLogConfig < 3) {
-    checkUnnamed21(o.exemptedMembers);
+    checkUnnamed24(o.exemptedMembers);
     unittest.expect(o.logType, unittest.equals('foo'));
   }
   buildCounterGoogleIamV1AuditLogConfig--;
 }
 
-buildUnnamed22() {
+buildUnnamed25() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed22(core.List<core.String> o) {
+checkUnnamed25(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1007,7 +1110,7 @@
   buildCounterGoogleIamV1Binding++;
   if (buildCounterGoogleIamV1Binding < 3) {
     o.condition = buildGoogleTypeExpr();
-    o.members = buildUnnamed22();
+    o.members = buildUnnamed25();
     o.role = "foo";
   }
   buildCounterGoogleIamV1Binding--;
@@ -1018,33 +1121,33 @@
   buildCounterGoogleIamV1Binding++;
   if (buildCounterGoogleIamV1Binding < 3) {
     checkGoogleTypeExpr(o.condition);
-    checkUnnamed22(o.members);
+    checkUnnamed25(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterGoogleIamV1Binding--;
 }
 
-buildUnnamed23() {
+buildUnnamed26() {
   var o = new core.List<api.GoogleIamV1AuditConfig>();
   o.add(buildGoogleIamV1AuditConfig());
   o.add(buildGoogleIamV1AuditConfig());
   return o;
 }
 
-checkUnnamed23(core.List<api.GoogleIamV1AuditConfig> o) {
+checkUnnamed26(core.List<api.GoogleIamV1AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleIamV1AuditConfig(o[0]);
   checkGoogleIamV1AuditConfig(o[1]);
 }
 
-buildUnnamed24() {
+buildUnnamed27() {
   var o = new core.List<api.GoogleIamV1Binding>();
   o.add(buildGoogleIamV1Binding());
   o.add(buildGoogleIamV1Binding());
   return o;
 }
 
-checkUnnamed24(core.List<api.GoogleIamV1Binding> o) {
+checkUnnamed27(core.List<api.GoogleIamV1Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleIamV1Binding(o[0]);
   checkGoogleIamV1Binding(o[1]);
@@ -1055,8 +1158,8 @@
   var o = new api.GoogleIamV1Policy();
   buildCounterGoogleIamV1Policy++;
   if (buildCounterGoogleIamV1Policy < 3) {
-    o.auditConfigs = buildUnnamed23();
-    o.bindings = buildUnnamed24();
+    o.auditConfigs = buildUnnamed26();
+    o.bindings = buildUnnamed27();
     o.etag = "foo";
     o.iamOwned = true;
     o.version = 42;
@@ -1068,8 +1171,8 @@
 checkGoogleIamV1Policy(api.GoogleIamV1Policy o) {
   buildCounterGoogleIamV1Policy++;
   if (buildCounterGoogleIamV1Policy < 3) {
-    checkUnnamed23(o.auditConfigs);
-    checkUnnamed24(o.bindings);
+    checkUnnamed26(o.auditConfigs);
+    checkUnnamed27(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.iamOwned, unittest.isTrue);
     unittest.expect(o.version, unittest.equals(42));
@@ -1098,14 +1201,14 @@
   buildCounterGoogleIamV1SetIamPolicyRequest--;
 }
 
-buildUnnamed25() {
+buildUnnamed28() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed25(core.List<core.String> o) {
+checkUnnamed28(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1116,7 +1219,7 @@
   var o = new api.GoogleIamV1TestIamPermissionsRequest();
   buildCounterGoogleIamV1TestIamPermissionsRequest++;
   if (buildCounterGoogleIamV1TestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed25();
+    o.permissions = buildUnnamed28();
   }
   buildCounterGoogleIamV1TestIamPermissionsRequest--;
   return o;
@@ -1126,19 +1229,19 @@
     api.GoogleIamV1TestIamPermissionsRequest o) {
   buildCounterGoogleIamV1TestIamPermissionsRequest++;
   if (buildCounterGoogleIamV1TestIamPermissionsRequest < 3) {
-    checkUnnamed25(o.permissions);
+    checkUnnamed28(o.permissions);
   }
   buildCounterGoogleIamV1TestIamPermissionsRequest--;
 }
 
-buildUnnamed26() {
+buildUnnamed29() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed26(core.List<core.String> o) {
+checkUnnamed29(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1149,7 +1252,7 @@
   var o = new api.GoogleIamV1TestIamPermissionsResponse();
   buildCounterGoogleIamV1TestIamPermissionsResponse++;
   if (buildCounterGoogleIamV1TestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed26();
+    o.permissions = buildUnnamed29();
   }
   buildCounterGoogleIamV1TestIamPermissionsResponse--;
   return o;
@@ -1159,19 +1262,19 @@
     api.GoogleIamV1TestIamPermissionsResponse o) {
   buildCounterGoogleIamV1TestIamPermissionsResponse++;
   if (buildCounterGoogleIamV1TestIamPermissionsResponse < 3) {
-    checkUnnamed26(o.permissions);
+    checkUnnamed29(o.permissions);
   }
   buildCounterGoogleIamV1TestIamPermissionsResponse--;
 }
 
-buildUnnamed27() {
+buildUnnamed30() {
   var o = new core.List<api.GoogleLongrunningOperation>();
   o.add(buildGoogleLongrunningOperation());
   o.add(buildGoogleLongrunningOperation());
   return o;
 }
 
-checkUnnamed27(core.List<api.GoogleLongrunningOperation> o) {
+checkUnnamed30(core.List<api.GoogleLongrunningOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleLongrunningOperation(o[0]);
   checkGoogleLongrunningOperation(o[1]);
@@ -1183,7 +1286,7 @@
   buildCounterGoogleLongrunningListOperationsResponse++;
   if (buildCounterGoogleLongrunningListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed27();
+    o.operations = buildUnnamed30();
   }
   buildCounterGoogleLongrunningListOperationsResponse--;
   return o;
@@ -1194,12 +1297,12 @@
   buildCounterGoogleLongrunningListOperationsResponse++;
   if (buildCounterGoogleLongrunningListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed27(o.operations);
+    checkUnnamed30(o.operations);
   }
   buildCounterGoogleLongrunningListOperationsResponse--;
 }
 
-buildUnnamed28() {
+buildUnnamed31() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1214,7 +1317,7 @@
   return o;
 }
 
-checkUnnamed28(core.Map<core.String, core.Object> o) {
+checkUnnamed31(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -1228,7 +1331,7 @@
   unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed29() {
+buildUnnamed32() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1243,7 +1346,7 @@
   return o;
 }
 
-checkUnnamed29(core.Map<core.String, core.Object> o) {
+checkUnnamed32(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -1264,9 +1367,9 @@
   if (buildCounterGoogleLongrunningOperation < 3) {
     o.done = true;
     o.error = buildGoogleRpcStatus();
-    o.metadata = buildUnnamed28();
+    o.metadata = buildUnnamed31();
     o.name = "foo";
-    o.response = buildUnnamed29();
+    o.response = buildUnnamed32();
   }
   buildCounterGoogleLongrunningOperation--;
   return o;
@@ -1277,9 +1380,9 @@
   if (buildCounterGoogleLongrunningOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkGoogleRpcStatus(o.error);
-    checkUnnamed28(o.metadata);
+    checkUnnamed31(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed29(o.response);
+    checkUnnamed32(o.response);
   }
   buildCounterGoogleLongrunningOperation--;
 }
@@ -1299,7 +1402,7 @@
   buildCounterGoogleProtobufEmpty--;
 }
 
-buildUnnamed30() {
+buildUnnamed33() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1314,7 +1417,7 @@
   return o;
 }
 
-checkUnnamed30(core.Map<core.String, core.Object> o) {
+checkUnnamed33(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o["x"]) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -1328,17 +1431,17 @@
   unittest.expect(casted8["string"], unittest.equals('foo'));
 }
 
-buildUnnamed31() {
+buildUnnamed34() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed30());
-  o.add(buildUnnamed30());
+  o.add(buildUnnamed33());
+  o.add(buildUnnamed33());
   return o;
 }
 
-checkUnnamed31(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed34(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed30(o[0]);
-  checkUnnamed30(o[1]);
+  checkUnnamed33(o[0]);
+  checkUnnamed33(o[1]);
 }
 
 core.int buildCounterGoogleRpcStatus = 0;
@@ -1347,7 +1450,7 @@
   buildCounterGoogleRpcStatus++;
   if (buildCounterGoogleRpcStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed31();
+    o.details = buildUnnamed34();
     o.message = "foo";
   }
   buildCounterGoogleRpcStatus--;
@@ -1358,7 +1461,7 @@
   buildCounterGoogleRpcStatus++;
   if (buildCounterGoogleRpcStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed31(o.details);
+    checkUnnamed34(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterGoogleRpcStatus--;
@@ -1425,6 +1528,14 @@
     });
   });
 
+  unittest.group("obj-schema-GoogleCloudMlV1Capability", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGoogleCloudMlV1Capability();
+      var od = new api.GoogleCloudMlV1Capability.fromJson(o.toJson());
+      checkGoogleCloudMlV1Capability(od);
+    });
+  });
+
   unittest.group("obj-schema-GoogleCloudMlV1GetConfigResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1GetConfigResponse();
@@ -1465,6 +1576,15 @@
     });
   });
 
+  unittest.group("obj-schema-GoogleCloudMlV1ListLocationsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGoogleCloudMlV1ListLocationsResponse();
+      var od =
+          new api.GoogleCloudMlV1ListLocationsResponse.fromJson(o.toJson());
+      checkGoogleCloudMlV1ListLocationsResponse(od);
+    });
+  });
+
   unittest.group("obj-schema-GoogleCloudMlV1ListModelsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1ListModelsResponse();
@@ -1481,6 +1601,14 @@
     });
   });
 
+  unittest.group("obj-schema-GoogleCloudMlV1Location", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGoogleCloudMlV1Location();
+      var od = new api.GoogleCloudMlV1Location.fromJson(o.toJson());
+      checkGoogleCloudMlV1Location(od);
+    });
+  });
+
   unittest.group("obj-schema-GoogleCloudMlV1ManualScaling", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1ManualScaling();
@@ -1993,9 +2121,9 @@
       var mock = new HttpServerMock();
       api.ProjectsJobsResourceApi res = new api.MlApi(mock).projects.jobs;
       var arg_parent = "foo";
+      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_filter = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2028,11 +2156,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2043,9 +2171,9 @@
       }), true);
       res
           .list(arg_parent,
+              filter: arg_filter,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
-              filter: arg_filter,
               $fields: arg_$fields)
           .then(unittest
               .expectAsync1(((api.GoogleCloudMlV1ListJobsResponse response) {
@@ -2225,6 +2353,123 @@
     });
   });
 
+  unittest.group("resource-ProjectsLocationsResourceApi", () {
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.ProjectsLocationsResourceApi res =
+          new api.MlApi(mock).projects.locations;
+      var arg_name = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildGoogleCloudMlV1Location());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_name, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.GoogleCloudMlV1Location response) {
+        checkGoogleCloudMlV1Location(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.ProjectsLocationsResourceApi res =
+          new api.MlApi(mock).projects.locations;
+      var arg_parent = "foo";
+      var arg_pageToken = "foo";
+      var arg_pageSize = 42;
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        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]));
+          }
+        }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp =
+            convert.JSON.encode(buildGoogleCloudMlV1ListLocationsResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_parent,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              $fields: arg_$fields)
+          .then(unittest.expectAsync1(
+              ((api.GoogleCloudMlV1ListLocationsResponse response) {
+        checkGoogleCloudMlV1ListLocationsResponse(response);
+      })));
+    });
+  });
+
   unittest.group("resource-ProjectsModelsResourceApi", () {
     unittest.test("method--create", () {
       var mock = new HttpServerMock();
diff --git a/generated/googleapis/test/monitoring/v3_test.dart b/generated/googleapis/test/monitoring/v3_test.dart
index a2999e2..4f1aa0f 100644
--- a/generated/googleapis/test/monitoring/v3_test.dart
+++ b/generated/googleapis/test/monitoring/v3_test.dart
@@ -94,27 +94,27 @@
   buildCounterBucketOptions--;
 }
 
-buildUnnamed1582() {
+buildUnnamed1602() {
   var o = new core.Map<core.String, api.TypedValue>();
   o["x"] = buildTypedValue();
   o["y"] = buildTypedValue();
   return o;
 }
 
-checkUnnamed1582(core.Map<core.String, api.TypedValue> o) {
+checkUnnamed1602(core.Map<core.String, api.TypedValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTypedValue(o["x"]);
   checkTypedValue(o["y"]);
 }
 
-buildUnnamed1583() {
+buildUnnamed1603() {
   var o = new core.List<api.CollectdValue>();
   o.add(buildCollectdValue());
   o.add(buildCollectdValue());
   return o;
 }
 
-checkUnnamed1583(core.List<api.CollectdValue> o) {
+checkUnnamed1603(core.List<api.CollectdValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCollectdValue(o[0]);
   checkCollectdValue(o[1]);
@@ -126,13 +126,13 @@
   buildCounterCollectdPayload++;
   if (buildCounterCollectdPayload < 3) {
     o.endTime = "foo";
-    o.metadata = buildUnnamed1582();
+    o.metadata = buildUnnamed1602();
     o.plugin = "foo";
     o.pluginInstance = "foo";
     o.startTime = "foo";
     o.type = "foo";
     o.typeInstance = "foo";
-    o.values = buildUnnamed1583();
+    o.values = buildUnnamed1603();
   }
   buildCounterCollectdPayload--;
   return o;
@@ -142,25 +142,25 @@
   buildCounterCollectdPayload++;
   if (buildCounterCollectdPayload < 3) {
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkUnnamed1582(o.metadata);
+    checkUnnamed1602(o.metadata);
     unittest.expect(o.plugin, unittest.equals('foo'));
     unittest.expect(o.pluginInstance, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.typeInstance, unittest.equals('foo'));
-    checkUnnamed1583(o.values);
+    checkUnnamed1603(o.values);
   }
   buildCounterCollectdPayload--;
 }
 
-buildUnnamed1584() {
+buildUnnamed1604() {
   var o = new core.List<api.CollectdValueError>();
   o.add(buildCollectdValueError());
   o.add(buildCollectdValueError());
   return o;
 }
 
-checkUnnamed1584(core.List<api.CollectdValueError> o) {
+checkUnnamed1604(core.List<api.CollectdValueError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCollectdValueError(o[0]);
   checkCollectdValueError(o[1]);
@@ -173,7 +173,7 @@
   if (buildCounterCollectdPayloadError < 3) {
     o.error = buildStatus();
     o.index = 42;
-    o.valueErrors = buildUnnamed1584();
+    o.valueErrors = buildUnnamed1604();
   }
   buildCounterCollectdPayloadError--;
   return o;
@@ -184,7 +184,7 @@
   if (buildCounterCollectdPayloadError < 3) {
     checkStatus(o.error);
     unittest.expect(o.index, unittest.equals(42));
-    checkUnnamed1584(o.valueErrors);
+    checkUnnamed1604(o.valueErrors);
   }
   buildCounterCollectdPayloadError--;
 }
@@ -252,14 +252,14 @@
   buildCounterContentMatcher--;
 }
 
-buildUnnamed1585() {
+buildUnnamed1605() {
   var o = new core.List<api.CollectdPayload>();
   o.add(buildCollectdPayload());
   o.add(buildCollectdPayload());
   return o;
 }
 
-checkUnnamed1585(core.List<api.CollectdPayload> o) {
+checkUnnamed1605(core.List<api.CollectdPayload> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCollectdPayload(o[0]);
   checkCollectdPayload(o[1]);
@@ -270,7 +270,7 @@
   var o = new api.CreateCollectdTimeSeriesRequest();
   buildCounterCreateCollectdTimeSeriesRequest++;
   if (buildCounterCreateCollectdTimeSeriesRequest < 3) {
-    o.collectdPayloads = buildUnnamed1585();
+    o.collectdPayloads = buildUnnamed1605();
     o.collectdVersion = "foo";
     o.resource = buildMonitoredResource();
   }
@@ -281,21 +281,21 @@
 checkCreateCollectdTimeSeriesRequest(api.CreateCollectdTimeSeriesRequest o) {
   buildCounterCreateCollectdTimeSeriesRequest++;
   if (buildCounterCreateCollectdTimeSeriesRequest < 3) {
-    checkUnnamed1585(o.collectdPayloads);
+    checkUnnamed1605(o.collectdPayloads);
     unittest.expect(o.collectdVersion, unittest.equals('foo'));
     checkMonitoredResource(o.resource);
   }
   buildCounterCreateCollectdTimeSeriesRequest--;
 }
 
-buildUnnamed1586() {
+buildUnnamed1606() {
   var o = new core.List<api.CollectdPayloadError>();
   o.add(buildCollectdPayloadError());
   o.add(buildCollectdPayloadError());
   return o;
 }
 
-checkUnnamed1586(core.List<api.CollectdPayloadError> o) {
+checkUnnamed1606(core.List<api.CollectdPayloadError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCollectdPayloadError(o[0]);
   checkCollectdPayloadError(o[1]);
@@ -306,7 +306,7 @@
   var o = new api.CreateCollectdTimeSeriesResponse();
   buildCounterCreateCollectdTimeSeriesResponse++;
   if (buildCounterCreateCollectdTimeSeriesResponse < 3) {
-    o.payloadErrors = buildUnnamed1586();
+    o.payloadErrors = buildUnnamed1606();
   }
   buildCounterCreateCollectdTimeSeriesResponse--;
   return o;
@@ -315,19 +315,19 @@
 checkCreateCollectdTimeSeriesResponse(api.CreateCollectdTimeSeriesResponse o) {
   buildCounterCreateCollectdTimeSeriesResponse++;
   if (buildCounterCreateCollectdTimeSeriesResponse < 3) {
-    checkUnnamed1586(o.payloadErrors);
+    checkUnnamed1606(o.payloadErrors);
   }
   buildCounterCreateCollectdTimeSeriesResponse--;
 }
 
-buildUnnamed1587() {
+buildUnnamed1607() {
   var o = new core.List<api.TimeSeries>();
   o.add(buildTimeSeries());
   o.add(buildTimeSeries());
   return o;
 }
 
-checkUnnamed1587(core.List<api.TimeSeries> o) {
+checkUnnamed1607(core.List<api.TimeSeries> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimeSeries(o[0]);
   checkTimeSeries(o[1]);
@@ -338,7 +338,7 @@
   var o = new api.CreateTimeSeriesRequest();
   buildCounterCreateTimeSeriesRequest++;
   if (buildCounterCreateTimeSeriesRequest < 3) {
-    o.timeSeries = buildUnnamed1587();
+    o.timeSeries = buildUnnamed1607();
   }
   buildCounterCreateTimeSeriesRequest--;
   return o;
@@ -347,19 +347,19 @@
 checkCreateTimeSeriesRequest(api.CreateTimeSeriesRequest o) {
   buildCounterCreateTimeSeriesRequest++;
   if (buildCounterCreateTimeSeriesRequest < 3) {
-    checkUnnamed1587(o.timeSeries);
+    checkUnnamed1607(o.timeSeries);
   }
   buildCounterCreateTimeSeriesRequest--;
 }
 
-buildUnnamed1588() {
+buildUnnamed1608() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1588(core.List<core.String> o) {
+checkUnnamed1608(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -370,7 +370,7 @@
   var o = new api.Distribution();
   buildCounterDistribution++;
   if (buildCounterDistribution < 3) {
-    o.bucketCounts = buildUnnamed1588();
+    o.bucketCounts = buildUnnamed1608();
     o.bucketOptions = buildBucketOptions();
     o.count = "foo";
     o.mean = 42.0;
@@ -384,7 +384,7 @@
 checkDistribution(api.Distribution o) {
   buildCounterDistribution++;
   if (buildCounterDistribution < 3) {
-    checkUnnamed1588(o.bucketCounts);
+    checkUnnamed1608(o.bucketCounts);
     checkBucketOptions(o.bucketOptions);
     unittest.expect(o.count, unittest.equals('foo'));
     unittest.expect(o.mean, unittest.equals(42.0));
@@ -409,14 +409,14 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed1589() {
+buildUnnamed1609() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1589(core.List<core.double> o) {
+checkUnnamed1609(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));
@@ -427,7 +427,7 @@
   var o = new api.Explicit();
   buildCounterExplicit++;
   if (buildCounterExplicit < 3) {
-    o.bounds = buildUnnamed1589();
+    o.bounds = buildUnnamed1609();
   }
   buildCounterExplicit--;
   return o;
@@ -436,7 +436,7 @@
 checkExplicit(api.Explicit o) {
   buildCounterExplicit++;
   if (buildCounterExplicit < 3) {
-    checkUnnamed1589(o.bounds);
+    checkUnnamed1609(o.bounds);
   }
   buildCounterExplicit--;
 }
@@ -464,14 +464,14 @@
   buildCounterExponential--;
 }
 
-buildUnnamed1590() {
+buildUnnamed1610() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1590(core.List<api.Option> o) {
+checkUnnamed1610(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -489,7 +489,7 @@
     o.name = "foo";
     o.number = 42;
     o.oneofIndex = 42;
-    o.options = buildUnnamed1590();
+    o.options = buildUnnamed1610();
     o.packed = true;
     o.typeUrl = "foo";
   }
@@ -507,7 +507,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals(42));
     unittest.expect(o.oneofIndex, unittest.equals(42));
-    checkUnnamed1590(o.options);
+    checkUnnamed1610(o.options);
     unittest.expect(o.packed, unittest.isTrue);
     unittest.expect(o.typeUrl, unittest.equals('foo'));
   }
@@ -541,14 +541,14 @@
   buildCounterGroup--;
 }
 
-buildUnnamed1591() {
+buildUnnamed1611() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1591(core.Map<core.String, core.String> o) {
+checkUnnamed1611(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'));
@@ -560,7 +560,7 @@
   buildCounterHttpCheck++;
   if (buildCounterHttpCheck < 3) {
     o.authInfo = buildBasicAuthentication();
-    o.headers = buildUnnamed1591();
+    o.headers = buildUnnamed1611();
     o.maskHeaders = true;
     o.path = "foo";
     o.port = 42;
@@ -574,7 +574,7 @@
   buildCounterHttpCheck++;
   if (buildCounterHttpCheck < 3) {
     checkBasicAuthentication(o.authInfo);
-    checkUnnamed1591(o.headers);
+    checkUnnamed1611(o.headers);
     unittest.expect(o.maskHeaders, unittest.isTrue);
     unittest.expect(o.path, unittest.equals('foo'));
     unittest.expect(o.port, unittest.equals(42));
@@ -656,14 +656,14 @@
   buildCounterLinear--;
 }
 
-buildUnnamed1592() {
+buildUnnamed1612() {
   var o = new core.List<api.MonitoredResource>();
   o.add(buildMonitoredResource());
   o.add(buildMonitoredResource());
   return o;
 }
 
-checkUnnamed1592(core.List<api.MonitoredResource> o) {
+checkUnnamed1612(core.List<api.MonitoredResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoredResource(o[0]);
   checkMonitoredResource(o[1]);
@@ -674,7 +674,7 @@
   var o = new api.ListGroupMembersResponse();
   buildCounterListGroupMembersResponse++;
   if (buildCounterListGroupMembersResponse < 3) {
-    o.members = buildUnnamed1592();
+    o.members = buildUnnamed1612();
     o.nextPageToken = "foo";
     o.totalSize = 42;
   }
@@ -685,21 +685,21 @@
 checkListGroupMembersResponse(api.ListGroupMembersResponse o) {
   buildCounterListGroupMembersResponse++;
   if (buildCounterListGroupMembersResponse < 3) {
-    checkUnnamed1592(o.members);
+    checkUnnamed1612(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterListGroupMembersResponse--;
 }
 
-buildUnnamed1593() {
+buildUnnamed1613() {
   var o = new core.List<api.Group>();
   o.add(buildGroup());
   o.add(buildGroup());
   return o;
 }
 
-checkUnnamed1593(core.List<api.Group> o) {
+checkUnnamed1613(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGroup(o[0]);
   checkGroup(o[1]);
@@ -710,7 +710,7 @@
   var o = new api.ListGroupsResponse();
   buildCounterListGroupsResponse++;
   if (buildCounterListGroupsResponse < 3) {
-    o.group = buildUnnamed1593();
+    o.group = buildUnnamed1613();
     o.nextPageToken = "foo";
   }
   buildCounterListGroupsResponse--;
@@ -720,20 +720,20 @@
 checkListGroupsResponse(api.ListGroupsResponse o) {
   buildCounterListGroupsResponse++;
   if (buildCounterListGroupsResponse < 3) {
-    checkUnnamed1593(o.group);
+    checkUnnamed1613(o.group);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListGroupsResponse--;
 }
 
-buildUnnamed1594() {
+buildUnnamed1614() {
   var o = new core.List<api.MetricDescriptor>();
   o.add(buildMetricDescriptor());
   o.add(buildMetricDescriptor());
   return o;
 }
 
-checkUnnamed1594(core.List<api.MetricDescriptor> o) {
+checkUnnamed1614(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptor(o[0]);
   checkMetricDescriptor(o[1]);
@@ -744,7 +744,7 @@
   var o = new api.ListMetricDescriptorsResponse();
   buildCounterListMetricDescriptorsResponse++;
   if (buildCounterListMetricDescriptorsResponse < 3) {
-    o.metricDescriptors = buildUnnamed1594();
+    o.metricDescriptors = buildUnnamed1614();
     o.nextPageToken = "foo";
   }
   buildCounterListMetricDescriptorsResponse--;
@@ -754,20 +754,20 @@
 checkListMetricDescriptorsResponse(api.ListMetricDescriptorsResponse o) {
   buildCounterListMetricDescriptorsResponse++;
   if (buildCounterListMetricDescriptorsResponse < 3) {
-    checkUnnamed1594(o.metricDescriptors);
+    checkUnnamed1614(o.metricDescriptors);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListMetricDescriptorsResponse--;
 }
 
-buildUnnamed1595() {
+buildUnnamed1615() {
   var o = new core.List<api.MonitoredResourceDescriptor>();
   o.add(buildMonitoredResourceDescriptor());
   o.add(buildMonitoredResourceDescriptor());
   return o;
 }
 
-checkUnnamed1595(core.List<api.MonitoredResourceDescriptor> o) {
+checkUnnamed1615(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoredResourceDescriptor(o[0]);
   checkMonitoredResourceDescriptor(o[1]);
@@ -779,7 +779,7 @@
   buildCounterListMonitoredResourceDescriptorsResponse++;
   if (buildCounterListMonitoredResourceDescriptorsResponse < 3) {
     o.nextPageToken = "foo";
-    o.resourceDescriptors = buildUnnamed1595();
+    o.resourceDescriptors = buildUnnamed1615();
   }
   buildCounterListMonitoredResourceDescriptorsResponse--;
   return o;
@@ -790,19 +790,19 @@
   buildCounterListMonitoredResourceDescriptorsResponse++;
   if (buildCounterListMonitoredResourceDescriptorsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1595(o.resourceDescriptors);
+    checkUnnamed1615(o.resourceDescriptors);
   }
   buildCounterListMonitoredResourceDescriptorsResponse--;
 }
 
-buildUnnamed1596() {
+buildUnnamed1616() {
   var o = new core.List<api.TimeSeries>();
   o.add(buildTimeSeries());
   o.add(buildTimeSeries());
   return o;
 }
 
-checkUnnamed1596(core.List<api.TimeSeries> o) {
+checkUnnamed1616(core.List<api.TimeSeries> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimeSeries(o[0]);
   checkTimeSeries(o[1]);
@@ -814,7 +814,7 @@
   buildCounterListTimeSeriesResponse++;
   if (buildCounterListTimeSeriesResponse < 3) {
     o.nextPageToken = "foo";
-    o.timeSeries = buildUnnamed1596();
+    o.timeSeries = buildUnnamed1616();
   }
   buildCounterListTimeSeriesResponse--;
   return o;
@@ -824,19 +824,19 @@
   buildCounterListTimeSeriesResponse++;
   if (buildCounterListTimeSeriesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1596(o.timeSeries);
+    checkUnnamed1616(o.timeSeries);
   }
   buildCounterListTimeSeriesResponse--;
 }
 
-buildUnnamed1597() {
+buildUnnamed1617() {
   var o = new core.List<api.UptimeCheckConfig>();
   o.add(buildUptimeCheckConfig());
   o.add(buildUptimeCheckConfig());
   return o;
 }
 
-checkUnnamed1597(core.List<api.UptimeCheckConfig> o) {
+checkUnnamed1617(core.List<api.UptimeCheckConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUptimeCheckConfig(o[0]);
   checkUptimeCheckConfig(o[1]);
@@ -848,7 +848,7 @@
   buildCounterListUptimeCheckConfigsResponse++;
   if (buildCounterListUptimeCheckConfigsResponse < 3) {
     o.nextPageToken = "foo";
-    o.uptimeCheckConfigs = buildUnnamed1597();
+    o.uptimeCheckConfigs = buildUnnamed1617();
   }
   buildCounterListUptimeCheckConfigsResponse--;
   return o;
@@ -858,19 +858,19 @@
   buildCounterListUptimeCheckConfigsResponse++;
   if (buildCounterListUptimeCheckConfigsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1597(o.uptimeCheckConfigs);
+    checkUnnamed1617(o.uptimeCheckConfigs);
   }
   buildCounterListUptimeCheckConfigsResponse--;
 }
 
-buildUnnamed1598() {
+buildUnnamed1618() {
   var o = new core.List<api.UptimeCheckIp>();
   o.add(buildUptimeCheckIp());
   o.add(buildUptimeCheckIp());
   return o;
 }
 
-checkUnnamed1598(core.List<api.UptimeCheckIp> o) {
+checkUnnamed1618(core.List<api.UptimeCheckIp> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUptimeCheckIp(o[0]);
   checkUptimeCheckIp(o[1]);
@@ -882,7 +882,7 @@
   buildCounterListUptimeCheckIpsResponse++;
   if (buildCounterListUptimeCheckIpsResponse < 3) {
     o.nextPageToken = "foo";
-    o.uptimeCheckIps = buildUnnamed1598();
+    o.uptimeCheckIps = buildUnnamed1618();
   }
   buildCounterListUptimeCheckIpsResponse--;
   return o;
@@ -892,19 +892,19 @@
   buildCounterListUptimeCheckIpsResponse++;
   if (buildCounterListUptimeCheckIpsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1598(o.uptimeCheckIps);
+    checkUnnamed1618(o.uptimeCheckIps);
   }
   buildCounterListUptimeCheckIpsResponse--;
 }
 
-buildUnnamed1599() {
+buildUnnamed1619() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1599(core.Map<core.String, core.String> o) {
+checkUnnamed1619(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'));
@@ -915,7 +915,7 @@
   var o = new api.Metric();
   buildCounterMetric++;
   if (buildCounterMetric < 3) {
-    o.labels = buildUnnamed1599();
+    o.labels = buildUnnamed1619();
     o.type = "foo";
   }
   buildCounterMetric--;
@@ -925,20 +925,20 @@
 checkMetric(api.Metric o) {
   buildCounterMetric++;
   if (buildCounterMetric < 3) {
-    checkUnnamed1599(o.labels);
+    checkUnnamed1619(o.labels);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterMetric--;
 }
 
-buildUnnamed1600() {
+buildUnnamed1620() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1600(core.List<api.LabelDescriptor> o) {
+checkUnnamed1620(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -951,7 +951,7 @@
   if (buildCounterMetricDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1600();
+    o.labels = buildUnnamed1620();
     o.metricKind = "foo";
     o.name = "foo";
     o.type = "foo";
@@ -967,7 +967,7 @@
   if (buildCounterMetricDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1600(o.labels);
+    checkUnnamed1620(o.labels);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -977,14 +977,14 @@
   buildCounterMetricDescriptor--;
 }
 
-buildUnnamed1601() {
+buildUnnamed1621() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1601(core.Map<core.String, core.String> o) {
+checkUnnamed1621(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'));
@@ -995,7 +995,7 @@
   var o = new api.MonitoredResource();
   buildCounterMonitoredResource++;
   if (buildCounterMonitoredResource < 3) {
-    o.labels = buildUnnamed1601();
+    o.labels = buildUnnamed1621();
     o.type = "foo";
   }
   buildCounterMonitoredResource--;
@@ -1005,20 +1005,20 @@
 checkMonitoredResource(api.MonitoredResource o) {
   buildCounterMonitoredResource++;
   if (buildCounterMonitoredResource < 3) {
-    checkUnnamed1601(o.labels);
+    checkUnnamed1621(o.labels);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterMonitoredResource--;
 }
 
-buildUnnamed1602() {
+buildUnnamed1622() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1602(core.List<api.LabelDescriptor> o) {
+checkUnnamed1622(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -1031,7 +1031,7 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1602();
+    o.labels = buildUnnamed1622();
     o.name = "foo";
     o.type = "foo";
   }
@@ -1044,14 +1044,14 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1602(o.labels);
+    checkUnnamed1622(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterMonitoredResourceDescriptor--;
 }
 
-buildUnnamed1603() {
+buildUnnamed1623() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1066,7 +1066,7 @@
   return o;
 }
 
-checkUnnamed1603(core.Map<core.String, core.Object> o) {
+checkUnnamed1623(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));
@@ -1080,13 +1080,76 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
+buildUnnamed1624() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
+  return o;
+}
+
+checkUnnamed1624(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'));
+}
+
+core.int buildCounterMonitoredResourceMetadata = 0;
+buildMonitoredResourceMetadata() {
+  var o = new api.MonitoredResourceMetadata();
+  buildCounterMonitoredResourceMetadata++;
+  if (buildCounterMonitoredResourceMetadata < 3) {
+    o.systemLabels = buildUnnamed1623();
+    o.userLabels = buildUnnamed1624();
+  }
+  buildCounterMonitoredResourceMetadata--;
+  return o;
+}
+
+checkMonitoredResourceMetadata(api.MonitoredResourceMetadata o) {
+  buildCounterMonitoredResourceMetadata++;
+  if (buildCounterMonitoredResourceMetadata < 3) {
+    checkUnnamed1623(o.systemLabels);
+    checkUnnamed1624(o.userLabels);
+  }
+  buildCounterMonitoredResourceMetadata--;
+}
+
+buildUnnamed1625() {
+  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;
+}
+
+checkUnnamed1625(core.Map<core.String, core.Object> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  var casted3 = (o["x"]) 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["y"]) 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'));
+}
+
 core.int buildCounterOption = 0;
 buildOption() {
   var o = new api.Option();
   buildCounterOption++;
   if (buildCounterOption < 3) {
     o.name = "foo";
-    o.value = buildUnnamed1603();
+    o.value = buildUnnamed1625();
   }
   buildCounterOption--;
   return o;
@@ -1096,7 +1159,7 @@
   buildCounterOption++;
   if (buildCounterOption < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1603(o.value);
+    checkUnnamed1625(o.value);
   }
   buildCounterOption--;
 }
@@ -1183,7 +1246,7 @@
   buildCounterSourceContext--;
 }
 
-buildUnnamed1604() {
+buildUnnamed1626() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1198,31 +1261,31 @@
   return o;
 }
 
-checkUnnamed1604(core.Map<core.String, core.Object> o) {
+checkUnnamed1626(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) 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["y"]) 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["x"]) 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["y"]) 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'));
 }
 
-buildUnnamed1605() {
+buildUnnamed1627() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1604());
-  o.add(buildUnnamed1604());
+  o.add(buildUnnamed1626());
+  o.add(buildUnnamed1626());
   return o;
 }
 
-checkUnnamed1605(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1627(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1604(o[0]);
-  checkUnnamed1604(o[1]);
+  checkUnnamed1626(o[0]);
+  checkUnnamed1626(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1231,7 +1294,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1605();
+    o.details = buildUnnamed1627();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1242,7 +1305,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1605(o.details);
+    checkUnnamed1627(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -1288,14 +1351,14 @@
   buildCounterTimeInterval--;
 }
 
-buildUnnamed1606() {
+buildUnnamed1628() {
   var o = new core.List<api.Point>();
   o.add(buildPoint());
   o.add(buildPoint());
   return o;
 }
 
-checkUnnamed1606(core.List<api.Point> o) {
+checkUnnamed1628(core.List<api.Point> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPoint(o[0]);
   checkPoint(o[1]);
@@ -1306,9 +1369,10 @@
   var o = new api.TimeSeries();
   buildCounterTimeSeries++;
   if (buildCounterTimeSeries < 3) {
+    o.metadata = buildMonitoredResourceMetadata();
     o.metric = buildMetric();
     o.metricKind = "foo";
-    o.points = buildUnnamed1606();
+    o.points = buildUnnamed1628();
     o.resource = buildMonitoredResource();
     o.valueType = "foo";
   }
@@ -1319,49 +1383,50 @@
 checkTimeSeries(api.TimeSeries o) {
   buildCounterTimeSeries++;
   if (buildCounterTimeSeries < 3) {
+    checkMonitoredResourceMetadata(o.metadata);
     checkMetric(o.metric);
     unittest.expect(o.metricKind, unittest.equals('foo'));
-    checkUnnamed1606(o.points);
+    checkUnnamed1628(o.points);
     checkMonitoredResource(o.resource);
     unittest.expect(o.valueType, unittest.equals('foo'));
   }
   buildCounterTimeSeries--;
 }
 
-buildUnnamed1607() {
+buildUnnamed1629() {
   var o = new core.List<api.Field>();
   o.add(buildField());
   o.add(buildField());
   return o;
 }
 
-checkUnnamed1607(core.List<api.Field> o) {
+checkUnnamed1629(core.List<api.Field> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkField(o[0]);
   checkField(o[1]);
 }
 
-buildUnnamed1608() {
+buildUnnamed1630() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1608(core.List<core.String> o) {
+checkUnnamed1630(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1609() {
+buildUnnamed1631() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1609(core.List<api.Option> o) {
+checkUnnamed1631(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -1372,10 +1437,10 @@
   var o = new api.Type();
   buildCounterType++;
   if (buildCounterType < 3) {
-    o.fields = buildUnnamed1607();
+    o.fields = buildUnnamed1629();
     o.name = "foo";
-    o.oneofs = buildUnnamed1608();
-    o.options = buildUnnamed1609();
+    o.oneofs = buildUnnamed1630();
+    o.options = buildUnnamed1631();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
   }
@@ -1386,10 +1451,10 @@
 checkType(api.Type o) {
   buildCounterType++;
   if (buildCounterType < 3) {
-    checkUnnamed1607(o.fields);
+    checkUnnamed1629(o.fields);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1608(o.oneofs);
-    checkUnnamed1609(o.options);
+    checkUnnamed1630(o.oneofs);
+    checkUnnamed1631(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
@@ -1423,40 +1488,40 @@
   buildCounterTypedValue--;
 }
 
-buildUnnamed1610() {
+buildUnnamed1632() {
   var o = new core.List<api.ContentMatcher>();
   o.add(buildContentMatcher());
   o.add(buildContentMatcher());
   return o;
 }
 
-checkUnnamed1610(core.List<api.ContentMatcher> o) {
+checkUnnamed1632(core.List<api.ContentMatcher> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContentMatcher(o[0]);
   checkContentMatcher(o[1]);
 }
 
-buildUnnamed1611() {
+buildUnnamed1633() {
   var o = new core.List<api.InternalChecker>();
   o.add(buildInternalChecker());
   o.add(buildInternalChecker());
   return o;
 }
 
-checkUnnamed1611(core.List<api.InternalChecker> o) {
+checkUnnamed1633(core.List<api.InternalChecker> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInternalChecker(o[0]);
   checkInternalChecker(o[1]);
 }
 
-buildUnnamed1612() {
+buildUnnamed1634() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1612(core.List<core.String> o) {
+checkUnnamed1634(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1467,16 +1532,16 @@
   var o = new api.UptimeCheckConfig();
   buildCounterUptimeCheckConfig++;
   if (buildCounterUptimeCheckConfig < 3) {
-    o.contentMatchers = buildUnnamed1610();
+    o.contentMatchers = buildUnnamed1632();
     o.displayName = "foo";
     o.httpCheck = buildHttpCheck();
-    o.internalCheckers = buildUnnamed1611();
+    o.internalCheckers = buildUnnamed1633();
     o.isInternal = true;
     o.monitoredResource = buildMonitoredResource();
     o.name = "foo";
     o.period = "foo";
     o.resourceGroup = buildResourceGroup();
-    o.selectedRegions = buildUnnamed1612();
+    o.selectedRegions = buildUnnamed1634();
     o.tcpCheck = buildTcpCheck();
     o.timeout = "foo";
   }
@@ -1487,16 +1552,16 @@
 checkUptimeCheckConfig(api.UptimeCheckConfig o) {
   buildCounterUptimeCheckConfig++;
   if (buildCounterUptimeCheckConfig < 3) {
-    checkUnnamed1610(o.contentMatchers);
+    checkUnnamed1632(o.contentMatchers);
     unittest.expect(o.displayName, unittest.equals('foo'));
     checkHttpCheck(o.httpCheck);
-    checkUnnamed1611(o.internalCheckers);
+    checkUnnamed1633(o.internalCheckers);
     unittest.expect(o.isInternal, unittest.isTrue);
     checkMonitoredResource(o.monitoredResource);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.period, unittest.equals('foo'));
     checkResourceGroup(o.resourceGroup);
-    checkUnnamed1612(o.selectedRegions);
+    checkUnnamed1634(o.selectedRegions);
     checkTcpCheck(o.tcpCheck);
     unittest.expect(o.timeout, unittest.equals('foo'));
   }
@@ -1526,14 +1591,14 @@
   buildCounterUptimeCheckIp--;
 }
 
-buildUnnamed1613() {
+buildUnnamed1635() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1613(core.List<core.String> o) {
+checkUnnamed1635(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1789,6 +1854,14 @@
     });
   });
 
+  unittest.group("obj-schema-MonitoredResourceMetadata", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildMonitoredResourceMetadata();
+      var od = new api.MonitoredResourceMetadata.fromJson(o.toJson());
+      checkMonitoredResourceMetadata(od);
+    });
+  });
+
   unittest.group("obj-schema-Option", () {
     unittest.test("to-json--from-json", () {
       var o = buildOption();
@@ -2120,11 +2193,11 @@
       api.ProjectsGroupsResourceApi res =
           new api.MonitoringApi(mock).projects.groups;
       var arg_name = "foo";
+      var arg_childrenOfGroup = "foo";
       var arg_descendantsOfGroup = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_ancestorsOfGroup = "foo";
-      var arg_childrenOfGroup = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2157,6 +2230,8 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["childrenOfGroup"].first,
+            unittest.equals(arg_childrenOfGroup));
         unittest.expect(queryMap["descendantsOfGroup"].first,
             unittest.equals(arg_descendantsOfGroup));
         unittest.expect(
@@ -2165,8 +2240,6 @@
             unittest.equals(arg_pageSize));
         unittest.expect(queryMap["ancestorsOfGroup"].first,
             unittest.equals(arg_ancestorsOfGroup));
-        unittest.expect(queryMap["childrenOfGroup"].first,
-            unittest.equals(arg_childrenOfGroup));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2177,11 +2250,11 @@
       }), true);
       res
           .list(arg_name,
+              childrenOfGroup: arg_childrenOfGroup,
               descendantsOfGroup: arg_descendantsOfGroup,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
               ancestorsOfGroup: arg_ancestorsOfGroup,
-              childrenOfGroup: arg_childrenOfGroup,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListGroupsResponse response) {
         checkListGroupsResponse(response);
@@ -2255,11 +2328,11 @@
       api.ProjectsGroupsMembersResourceApi res =
           new api.MonitoringApi(mock).projects.groups.members;
       var arg_name = "foo";
+      var arg_pageSize = 42;
+      var arg_interval_startTime = "foo";
       var arg_interval_endTime = "foo";
       var arg_filter = "foo";
       var arg_pageToken = "foo";
-      var arg_interval_startTime = "foo";
-      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2292,15 +2365,15 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["interval.startTime"].first,
+            unittest.equals(arg_interval_startTime));
         unittest.expect(queryMap["interval.endTime"].first,
             unittest.equals(arg_interval_endTime));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["interval.startTime"].first,
-            unittest.equals(arg_interval_startTime));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2311,11 +2384,11 @@
       }), true);
       res
           .list(arg_name,
+              pageSize: arg_pageSize,
+              interval_startTime: arg_interval_startTime,
               interval_endTime: arg_interval_endTime,
               filter: arg_filter,
               pageToken: arg_pageToken,
-              interval_startTime: arg_interval_startTime,
-              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListGroupMembersResponse response) {
         checkListGroupMembersResponse(response);
@@ -2608,9 +2681,9 @@
       api.ProjectsMonitoredResourceDescriptorsResourceApi res =
           new api.MonitoringApi(mock).projects.monitoredResourceDescriptors;
       var arg_name = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_filter = "foo";
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2643,11 +2716,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2659,9 +2732,9 @@
       }), true);
       res
           .list(arg_name,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
               filter: arg_filter,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(
               ((api.ListMonitoredResourceDescriptorsResponse response) {
@@ -2732,17 +2805,17 @@
       api.ProjectsTimeSeriesResourceApi res =
           new api.MonitoringApi(mock).projects.timeSeries;
       var arg_name = "foo";
+      var arg_interval_endTime = "foo";
+      var arg_aggregation_alignmentPeriod = "foo";
+      var arg_pageSize = 42;
+      var arg_orderBy = "foo";
       var arg_aggregation_crossSeriesReducer = "foo";
       var arg_filter = "foo";
       var arg_aggregation_perSeriesAligner = "foo";
       var arg_pageToken = "foo";
       var arg_interval_startTime = "foo";
       var arg_view = "foo";
-      var arg_aggregation_groupByFields = buildUnnamed1613();
-      var arg_interval_endTime = "foo";
-      var arg_aggregation_alignmentPeriod = "foo";
-      var arg_pageSize = 42;
-      var arg_orderBy = "foo";
+      var arg_aggregation_groupByFields = buildUnnamed1635();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2775,6 +2848,14 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["interval.endTime"].first,
+            unittest.equals(arg_interval_endTime));
+        unittest.expect(queryMap["aggregation.alignmentPeriod"].first,
+            unittest.equals(arg_aggregation_alignmentPeriod));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
         unittest.expect(queryMap["aggregation.crossSeriesReducer"].first,
             unittest.equals(arg_aggregation_crossSeriesReducer));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
@@ -2787,14 +2868,6 @@
         unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
         unittest.expect(queryMap["aggregation.groupByFields"],
             unittest.equals(arg_aggregation_groupByFields));
-        unittest.expect(queryMap["interval.endTime"].first,
-            unittest.equals(arg_interval_endTime));
-        unittest.expect(queryMap["aggregation.alignmentPeriod"].first,
-            unittest.equals(arg_aggregation_alignmentPeriod));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
-        unittest.expect(
-            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2805,6 +2878,10 @@
       }), true);
       res
           .list(arg_name,
+              interval_endTime: arg_interval_endTime,
+              aggregation_alignmentPeriod: arg_aggregation_alignmentPeriod,
+              pageSize: arg_pageSize,
+              orderBy: arg_orderBy,
               aggregation_crossSeriesReducer:
                   arg_aggregation_crossSeriesReducer,
               filter: arg_filter,
@@ -2813,10 +2890,6 @@
               interval_startTime: arg_interval_startTime,
               view: arg_view,
               aggregation_groupByFields: arg_aggregation_groupByFields,
-              interval_endTime: arg_interval_endTime,
-              aggregation_alignmentPeriod: arg_aggregation_alignmentPeriod,
-              pageSize: arg_pageSize,
-              orderBy: arg_orderBy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListTimeSeriesResponse response) {
         checkListTimeSeriesResponse(response);
diff --git a/generated/googleapis/test/oauth2/v2_test.dart b/generated/googleapis/test/oauth2/v2_test.dart
index 6288653..78aa40d 100644
--- a/generated/googleapis/test/oauth2/v2_test.dart
+++ b/generated/googleapis/test/oauth2/v2_test.dart
@@ -79,14 +79,14 @@
   buildCounterJwkKeys--;
 }
 
-buildUnnamed2669() {
+buildUnnamed2694() {
   var o = new core.List<api.JwkKeys>();
   o.add(buildJwkKeys());
   o.add(buildJwkKeys());
   return o;
 }
 
-checkUnnamed2669(core.List<api.JwkKeys> o) {
+checkUnnamed2694(core.List<api.JwkKeys> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJwkKeys(o[0]);
   checkJwkKeys(o[1]);
@@ -97,7 +97,7 @@
   var o = new api.Jwk();
   buildCounterJwk++;
   if (buildCounterJwk < 3) {
-    o.keys = buildUnnamed2669();
+    o.keys = buildUnnamed2694();
   }
   buildCounterJwk--;
   return o;
@@ -106,7 +106,7 @@
 checkJwk(api.Jwk o) {
   buildCounterJwk++;
   if (buildCounterJwk < 3) {
-    checkUnnamed2669(o.keys);
+    checkUnnamed2694(o.keys);
   }
   buildCounterJwk--;
 }
diff --git a/generated/googleapis/test/oslogin/v1_test.dart b/generated/googleapis/test/oslogin/v1_test.dart
index 8acb584..339a72f 100644
--- a/generated/googleapis/test/oslogin/v1_test.dart
+++ b/generated/googleapis/test/oslogin/v1_test.dart
@@ -84,27 +84,27 @@
   buildCounterImportSshPublicKeyResponse--;
 }
 
-buildUnnamed791() {
+buildUnnamed795() {
   var o = new core.List<api.PosixAccount>();
   o.add(buildPosixAccount());
   o.add(buildPosixAccount());
   return o;
 }
 
-checkUnnamed791(core.List<api.PosixAccount> o) {
+checkUnnamed795(core.List<api.PosixAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPosixAccount(o[0]);
   checkPosixAccount(o[1]);
 }
 
-buildUnnamed792() {
+buildUnnamed796() {
   var o = new core.Map<core.String, api.SshPublicKey>();
   o["x"] = buildSshPublicKey();
   o["y"] = buildSshPublicKey();
   return o;
 }
 
-checkUnnamed792(core.Map<core.String, api.SshPublicKey> o) {
+checkUnnamed796(core.Map<core.String, api.SshPublicKey> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSshPublicKey(o["x"]);
   checkSshPublicKey(o["y"]);
@@ -116,8 +116,8 @@
   buildCounterLoginProfile++;
   if (buildCounterLoginProfile < 3) {
     o.name = "foo";
-    o.posixAccounts = buildUnnamed791();
-    o.sshPublicKeys = buildUnnamed792();
+    o.posixAccounts = buildUnnamed795();
+    o.sshPublicKeys = buildUnnamed796();
     o.suspended = true;
   }
   buildCounterLoginProfile--;
@@ -128,8 +128,8 @@
   buildCounterLoginProfile++;
   if (buildCounterLoginProfile < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed791(o.posixAccounts);
-    checkUnnamed792(o.sshPublicKeys);
+    checkUnnamed795(o.posixAccounts);
+    checkUnnamed796(o.sshPublicKeys);
     unittest.expect(o.suspended, unittest.isTrue);
   }
   buildCounterLoginProfile--;
diff --git a/generated/googleapis/test/pagespeedonline/v1_test.dart b/generated/googleapis/test/pagespeedonline/v1_test.dart
index 4b07059..1b56a7b 100644
--- a/generated/googleapis/test/pagespeedonline/v1_test.dart
+++ b/generated/googleapis/test/pagespeedonline/v1_test.dart
@@ -75,7 +75,7 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs--;
 }
 
-buildUnnamed2670() {
+buildUnnamed2695() {
   var o = new core
       .List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs());
@@ -83,7 +83,7 @@
   return o;
 }
 
-checkUnnamed2670(
+checkUnnamed2695(
     core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs>
         o) {
   unittest.expect(o, unittest.hasLength(2));
@@ -96,7 +96,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksHeader();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader < 3) {
-    o.args = buildUnnamed2670();
+    o.args = buildUnnamed2695();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader--;
@@ -107,7 +107,7 @@
     api.ResultFormattedResultsRuleResultsValueUrlBlocksHeader o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader < 3) {
-    checkUnnamed2670(o.args);
+    checkUnnamed2695(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader--;
@@ -140,7 +140,7 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs--;
 }
 
-buildUnnamed2671() {
+buildUnnamed2696() {
   var o = new core.List<
       api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs());
@@ -148,7 +148,7 @@
   return o;
 }
 
-checkUnnamed2671(
+checkUnnamed2696(
     core.List<
             api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs>
         o) {
@@ -164,7 +164,7 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails <
       3) {
-    o.args = buildUnnamed2671();
+    o.args = buildUnnamed2696();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails--;
@@ -176,13 +176,13 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails <
       3) {
-    checkUnnamed2671(o.args);
+    checkUnnamed2696(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails--;
 }
 
-buildUnnamed2672() {
+buildUnnamed2697() {
   var o = new core
       .List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails());
@@ -190,7 +190,7 @@
   return o;
 }
 
-checkUnnamed2672(
+checkUnnamed2697(
     core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails>
         o) {
   unittest.expect(o, unittest.hasLength(2));
@@ -225,7 +225,7 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs--;
 }
 
-buildUnnamed2673() {
+buildUnnamed2698() {
   var o = new core.List<
       api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs());
@@ -233,7 +233,7 @@
   return o;
 }
 
-checkUnnamed2673(
+checkUnnamed2698(
     core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs>
         o) {
   unittest.expect(o, unittest.hasLength(2));
@@ -248,7 +248,7 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult <
       3) {
-    o.args = buildUnnamed2673();
+    o.args = buildUnnamed2698();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult--;
@@ -260,7 +260,7 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult <
       3) {
-    checkUnnamed2673(o.args);
+    checkUnnamed2698(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult--;
@@ -271,7 +271,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls < 3) {
-    o.details = buildUnnamed2672();
+    o.details = buildUnnamed2697();
     o.result = buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult();
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls--;
@@ -282,13 +282,13 @@
     api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls < 3) {
-    checkUnnamed2672(o.details);
+    checkUnnamed2697(o.details);
     checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult(o.result);
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls--;
 }
 
-buildUnnamed2674() {
+buildUnnamed2699() {
   var o =
       new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrls());
@@ -296,7 +296,7 @@
   return o;
 }
 
-checkUnnamed2674(
+checkUnnamed2699(
     core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(o[0]);
@@ -309,7 +309,7 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocks < 3) {
     o.header = buildResultFormattedResultsRuleResultsValueUrlBlocksHeader();
-    o.urls = buildUnnamed2674();
+    o.urls = buildUnnamed2699();
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks--;
   return o;
@@ -320,19 +320,19 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocks < 3) {
     checkResultFormattedResultsRuleResultsValueUrlBlocksHeader(o.header);
-    checkUnnamed2674(o.urls);
+    checkUnnamed2699(o.urls);
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks--;
 }
 
-buildUnnamed2675() {
+buildUnnamed2700() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocks());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocks());
   return o;
 }
 
-checkUnnamed2675(
+checkUnnamed2700(
     core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocks(o[0]);
@@ -346,7 +346,7 @@
   if (buildCounterResultFormattedResultsRuleResultsValue < 3) {
     o.localizedRuleName = "foo";
     o.ruleImpact = 42.0;
-    o.urlBlocks = buildUnnamed2675();
+    o.urlBlocks = buildUnnamed2700();
   }
   buildCounterResultFormattedResultsRuleResultsValue--;
   return o;
@@ -358,12 +358,12 @@
   if (buildCounterResultFormattedResultsRuleResultsValue < 3) {
     unittest.expect(o.localizedRuleName, unittest.equals('foo'));
     unittest.expect(o.ruleImpact, unittest.equals(42.0));
-    checkUnnamed2675(o.urlBlocks);
+    checkUnnamed2700(o.urlBlocks);
   }
   buildCounterResultFormattedResultsRuleResultsValue--;
 }
 
-buildUnnamed2676() {
+buildUnnamed2701() {
   var o =
       new core.Map<core.String, api.ResultFormattedResultsRuleResultsValue>();
   o["x"] = buildResultFormattedResultsRuleResultsValue();
@@ -371,7 +371,7 @@
   return o;
 }
 
-checkUnnamed2676(
+checkUnnamed2701(
     core.Map<core.String, api.ResultFormattedResultsRuleResultsValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValue(o["x"]);
@@ -384,7 +384,7 @@
   buildCounterResultFormattedResults++;
   if (buildCounterResultFormattedResults < 3) {
     o.locale = "foo";
-    o.ruleResults = buildUnnamed2676();
+    o.ruleResults = buildUnnamed2701();
   }
   buildCounterResultFormattedResults--;
   return o;
@@ -394,19 +394,19 @@
   buildCounterResultFormattedResults++;
   if (buildCounterResultFormattedResults < 3) {
     unittest.expect(o.locale, unittest.equals('foo'));
-    checkUnnamed2676(o.ruleResults);
+    checkUnnamed2701(o.ruleResults);
   }
   buildCounterResultFormattedResults--;
 }
 
-buildUnnamed2677() {
+buildUnnamed2702() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2677(core.List<core.String> o) {
+checkUnnamed2702(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -508,7 +508,7 @@
   if (buildCounterResult < 3) {
     o.formattedResults = buildResultFormattedResults();
     o.id = "foo";
-    o.invalidRules = buildUnnamed2677();
+    o.invalidRules = buildUnnamed2702();
     o.kind = "foo";
     o.pageStats = buildResultPageStats();
     o.responseCode = 42;
@@ -526,7 +526,7 @@
   if (buildCounterResult < 3) {
     checkResultFormattedResults(o.formattedResults);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2677(o.invalidRules);
+    checkUnnamed2702(o.invalidRules);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkResultPageStats(o.pageStats);
     unittest.expect(o.responseCode, unittest.equals(42));
@@ -538,14 +538,14 @@
   buildCounterResult--;
 }
 
-buildUnnamed2678() {
+buildUnnamed2703() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2678(core.List<core.String> o) {
+checkUnnamed2703(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -703,7 +703,7 @@
       var arg_url = "foo";
       var arg_filterThirdPartyResources = true;
       var arg_locale = "foo";
-      var arg_rule = buildUnnamed2678();
+      var arg_rule = buildUnnamed2703();
       var arg_screenshot = true;
       var arg_strategy = "foo";
       var arg_$fields = "foo";
diff --git a/generated/googleapis/test/pagespeedonline/v2_test.dart b/generated/googleapis/test/pagespeedonline/v2_test.dart
index 0c624c2..c9fe823 100644
--- a/generated/googleapis/test/pagespeedonline/v2_test.dart
+++ b/generated/googleapis/test/pagespeedonline/v2_test.dart
@@ -76,14 +76,14 @@
   buildCounterPagespeedApiFormatStringV2ArgsRects--;
 }
 
-buildUnnamed1287() {
+buildUnnamed1303() {
   var o = new core.List<api.PagespeedApiFormatStringV2ArgsRects>();
   o.add(buildPagespeedApiFormatStringV2ArgsRects());
   o.add(buildPagespeedApiFormatStringV2ArgsRects());
   return o;
 }
 
-checkUnnamed1287(core.List<api.PagespeedApiFormatStringV2ArgsRects> o) {
+checkUnnamed1303(core.List<api.PagespeedApiFormatStringV2ArgsRects> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPagespeedApiFormatStringV2ArgsRects(o[0]);
   checkPagespeedApiFormatStringV2ArgsRects(o[1]);
@@ -115,14 +115,14 @@
   buildCounterPagespeedApiFormatStringV2ArgsSecondaryRects--;
 }
 
-buildUnnamed1288() {
+buildUnnamed1304() {
   var o = new core.List<api.PagespeedApiFormatStringV2ArgsSecondaryRects>();
   o.add(buildPagespeedApiFormatStringV2ArgsSecondaryRects());
   o.add(buildPagespeedApiFormatStringV2ArgsSecondaryRects());
   return o;
 }
 
-checkUnnamed1288(
+checkUnnamed1304(
     core.List<api.PagespeedApiFormatStringV2ArgsSecondaryRects> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPagespeedApiFormatStringV2ArgsSecondaryRects(o[0]);
@@ -135,8 +135,8 @@
   buildCounterPagespeedApiFormatStringV2Args++;
   if (buildCounterPagespeedApiFormatStringV2Args < 3) {
     o.key = "foo";
-    o.rects = buildUnnamed1287();
-    o.secondaryRects = buildUnnamed1288();
+    o.rects = buildUnnamed1303();
+    o.secondaryRects = buildUnnamed1304();
     o.type = "foo";
     o.value = "foo";
   }
@@ -148,22 +148,22 @@
   buildCounterPagespeedApiFormatStringV2Args++;
   if (buildCounterPagespeedApiFormatStringV2Args < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkUnnamed1287(o.rects);
-    checkUnnamed1288(o.secondaryRects);
+    checkUnnamed1303(o.rects);
+    checkUnnamed1304(o.secondaryRects);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterPagespeedApiFormatStringV2Args--;
 }
 
-buildUnnamed1289() {
+buildUnnamed1305() {
   var o = new core.List<api.PagespeedApiFormatStringV2Args>();
   o.add(buildPagespeedApiFormatStringV2Args());
   o.add(buildPagespeedApiFormatStringV2Args());
   return o;
 }
 
-checkUnnamed1289(core.List<api.PagespeedApiFormatStringV2Args> o) {
+checkUnnamed1305(core.List<api.PagespeedApiFormatStringV2Args> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPagespeedApiFormatStringV2Args(o[0]);
   checkPagespeedApiFormatStringV2Args(o[1]);
@@ -174,7 +174,7 @@
   var o = new api.PagespeedApiFormatStringV2();
   buildCounterPagespeedApiFormatStringV2++;
   if (buildCounterPagespeedApiFormatStringV2 < 3) {
-    o.args = buildUnnamed1289();
+    o.args = buildUnnamed1305();
     o.format = "foo";
   }
   buildCounterPagespeedApiFormatStringV2--;
@@ -184,7 +184,7 @@
 checkPagespeedApiFormatStringV2(api.PagespeedApiFormatStringV2 o) {
   buildCounterPagespeedApiFormatStringV2++;
   if (buildCounterPagespeedApiFormatStringV2 < 3) {
-    checkUnnamed1289(o.args);
+    checkUnnamed1305(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterPagespeedApiFormatStringV2--;
@@ -244,27 +244,27 @@
   buildCounterPagespeedApiImageV2--;
 }
 
-buildUnnamed1290() {
+buildUnnamed1306() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1290(core.List<core.String> o) {
+checkUnnamed1306(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1291() {
+buildUnnamed1307() {
   var o = new core.List<api.PagespeedApiFormatStringV2>();
   o.add(buildPagespeedApiFormatStringV2());
   o.add(buildPagespeedApiFormatStringV2());
   return o;
 }
 
-checkUnnamed1291(core.List<api.PagespeedApiFormatStringV2> o) {
+checkUnnamed1307(core.List<api.PagespeedApiFormatStringV2> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPagespeedApiFormatStringV2(o[0]);
   checkPagespeedApiFormatStringV2(o[1]);
@@ -275,7 +275,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls < 3) {
-    o.details = buildUnnamed1291();
+    o.details = buildUnnamed1307();
     o.result = buildPagespeedApiFormatStringV2();
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls--;
@@ -286,13 +286,13 @@
     api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls < 3) {
-    checkUnnamed1291(o.details);
+    checkUnnamed1307(o.details);
     checkPagespeedApiFormatStringV2(o.result);
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls--;
 }
 
-buildUnnamed1292() {
+buildUnnamed1308() {
   var o =
       new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrls());
@@ -300,7 +300,7 @@
   return o;
 }
 
-checkUnnamed1292(
+checkUnnamed1308(
     core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(o[0]);
@@ -313,7 +313,7 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocks < 3) {
     o.header = buildPagespeedApiFormatStringV2();
-    o.urls = buildUnnamed1292();
+    o.urls = buildUnnamed1308();
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks--;
   return o;
@@ -324,19 +324,19 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocks < 3) {
     checkPagespeedApiFormatStringV2(o.header);
-    checkUnnamed1292(o.urls);
+    checkUnnamed1308(o.urls);
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks--;
 }
 
-buildUnnamed1293() {
+buildUnnamed1309() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocks());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocks());
   return o;
 }
 
-checkUnnamed1293(
+checkUnnamed1309(
     core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocks(o[0]);
@@ -348,11 +348,11 @@
   var o = new api.ResultFormattedResultsRuleResultsValue();
   buildCounterResultFormattedResultsRuleResultsValue++;
   if (buildCounterResultFormattedResultsRuleResultsValue < 3) {
-    o.groups = buildUnnamed1290();
+    o.groups = buildUnnamed1306();
     o.localizedRuleName = "foo";
     o.ruleImpact = 42.0;
     o.summary = buildPagespeedApiFormatStringV2();
-    o.urlBlocks = buildUnnamed1293();
+    o.urlBlocks = buildUnnamed1309();
   }
   buildCounterResultFormattedResultsRuleResultsValue--;
   return o;
@@ -362,16 +362,16 @@
     api.ResultFormattedResultsRuleResultsValue o) {
   buildCounterResultFormattedResultsRuleResultsValue++;
   if (buildCounterResultFormattedResultsRuleResultsValue < 3) {
-    checkUnnamed1290(o.groups);
+    checkUnnamed1306(o.groups);
     unittest.expect(o.localizedRuleName, unittest.equals('foo'));
     unittest.expect(o.ruleImpact, unittest.equals(42.0));
     checkPagespeedApiFormatStringV2(o.summary);
-    checkUnnamed1293(o.urlBlocks);
+    checkUnnamed1309(o.urlBlocks);
   }
   buildCounterResultFormattedResultsRuleResultsValue--;
 }
 
-buildUnnamed1294() {
+buildUnnamed1310() {
   var o =
       new core.Map<core.String, api.ResultFormattedResultsRuleResultsValue>();
   o["x"] = buildResultFormattedResultsRuleResultsValue();
@@ -379,7 +379,7 @@
   return o;
 }
 
-checkUnnamed1294(
+checkUnnamed1310(
     core.Map<core.String, api.ResultFormattedResultsRuleResultsValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValue(o["x"]);
@@ -392,7 +392,7 @@
   buildCounterResultFormattedResults++;
   if (buildCounterResultFormattedResults < 3) {
     o.locale = "foo";
-    o.ruleResults = buildUnnamed1294();
+    o.ruleResults = buildUnnamed1310();
   }
   buildCounterResultFormattedResults--;
   return o;
@@ -402,19 +402,19 @@
   buildCounterResultFormattedResults++;
   if (buildCounterResultFormattedResults < 3) {
     unittest.expect(o.locale, unittest.equals('foo'));
-    checkUnnamed1294(o.ruleResults);
+    checkUnnamed1310(o.ruleResults);
   }
   buildCounterResultFormattedResults--;
 }
 
-buildUnnamed1295() {
+buildUnnamed1311() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1295(core.List<core.String> o) {
+checkUnnamed1311(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -482,14 +482,14 @@
   buildCounterResultRuleGroupsValue--;
 }
 
-buildUnnamed1296() {
+buildUnnamed1312() {
   var o = new core.Map<core.String, api.ResultRuleGroupsValue>();
   o["x"] = buildResultRuleGroupsValue();
   o["y"] = buildResultRuleGroupsValue();
   return o;
 }
 
-checkUnnamed1296(core.Map<core.String, api.ResultRuleGroupsValue> o) {
+checkUnnamed1312(core.Map<core.String, api.ResultRuleGroupsValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultRuleGroupsValue(o["x"]);
   checkResultRuleGroupsValue(o["y"]);
@@ -523,11 +523,11 @@
   if (buildCounterResult < 3) {
     o.formattedResults = buildResultFormattedResults();
     o.id = "foo";
-    o.invalidRules = buildUnnamed1295();
+    o.invalidRules = buildUnnamed1311();
     o.kind = "foo";
     o.pageStats = buildResultPageStats();
     o.responseCode = 42;
-    o.ruleGroups = buildUnnamed1296();
+    o.ruleGroups = buildUnnamed1312();
     o.screenshot = buildPagespeedApiImageV2();
     o.title = "foo";
     o.version = buildResultVersion();
@@ -541,11 +541,11 @@
   if (buildCounterResult < 3) {
     checkResultFormattedResults(o.formattedResults);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1295(o.invalidRules);
+    checkUnnamed1311(o.invalidRules);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkResultPageStats(o.pageStats);
     unittest.expect(o.responseCode, unittest.equals(42));
-    checkUnnamed1296(o.ruleGroups);
+    checkUnnamed1312(o.ruleGroups);
     checkPagespeedApiImageV2(o.screenshot);
     unittest.expect(o.title, unittest.equals('foo'));
     checkResultVersion(o.version);
@@ -553,14 +553,14 @@
   buildCounterResult--;
 }
 
-buildUnnamed1297() {
+buildUnnamed1313() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1297(core.List<core.String> o) {
+checkUnnamed1313(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -694,7 +694,7 @@
       var arg_url = "foo";
       var arg_filterThirdPartyResources = true;
       var arg_locale = "foo";
-      var arg_rule = buildUnnamed1297();
+      var arg_rule = buildUnnamed1313();
       var arg_screenshot = true;
       var arg_strategy = "foo";
       var arg_$fields = "foo";
diff --git a/generated/googleapis/test/partners/v2_test.dart b/generated/googleapis/test/partners/v2_test.dart
index 640175e..19cc395 100644
--- a/generated/googleapis/test/partners/v2_test.dart
+++ b/generated/googleapis/test/partners/v2_test.dart
@@ -96,14 +96,14 @@
   buildCounterAnalytics--;
 }
 
-buildUnnamed2024() {
+buildUnnamed2046() {
   var o = new core.List<api.LatLng>();
   o.add(buildLatLng());
   o.add(buildLatLng());
   return o;
 }
 
-checkUnnamed2024(core.List<api.LatLng> o) {
+checkUnnamed2046(core.List<api.LatLng> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLatLng(o[0]);
   checkLatLng(o[1]);
@@ -115,7 +115,7 @@
   buildCounterAnalyticsDataPoint++;
   if (buildCounterAnalyticsDataPoint < 3) {
     o.eventCount = 42;
-    o.eventLocations = buildUnnamed2024();
+    o.eventLocations = buildUnnamed2046();
   }
   buildCounterAnalyticsDataPoint--;
   return o;
@@ -125,7 +125,7 @@
   buildCounterAnalyticsDataPoint++;
   if (buildCounterAnalyticsDataPoint < 3) {
     unittest.expect(o.eventCount, unittest.equals(42));
-    checkUnnamed2024(o.eventLocations);
+    checkUnnamed2046(o.eventLocations);
   }
   buildCounterAnalyticsDataPoint--;
 }
@@ -153,27 +153,27 @@
   buildCounterAnalyticsSummary--;
 }
 
-buildUnnamed2025() {
+buildUnnamed2047() {
   var o = new core.List<api.CountryOfferInfo>();
   o.add(buildCountryOfferInfo());
   o.add(buildCountryOfferInfo());
   return o;
 }
 
-checkUnnamed2025(core.List<api.CountryOfferInfo> o) {
+checkUnnamed2047(core.List<api.CountryOfferInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCountryOfferInfo(o[0]);
   checkCountryOfferInfo(o[1]);
 }
 
-buildUnnamed2026() {
+buildUnnamed2048() {
   var o = new core.List<api.OfferCustomer>();
   o.add(buildOfferCustomer());
   o.add(buildOfferCustomer());
   return o;
 }
 
-checkUnnamed2026(core.List<api.OfferCustomer> o) {
+checkUnnamed2048(core.List<api.OfferCustomer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfferCustomer(o[0]);
   checkOfferCustomer(o[1]);
@@ -185,14 +185,14 @@
   buildCounterAvailableOffer++;
   if (buildCounterAvailableOffer < 3) {
     o.available = 42;
-    o.countryOfferInfos = buildUnnamed2025();
+    o.countryOfferInfos = buildUnnamed2047();
     o.description = "foo";
     o.id = "foo";
     o.maxAccountAge = 42;
     o.name = "foo";
     o.offerLevel = "foo";
     o.offerType = "foo";
-    o.qualifiedCustomer = buildUnnamed2026();
+    o.qualifiedCustomer = buildUnnamed2048();
     o.qualifiedCustomersComplete = true;
     o.showSpecialOfferCopy = true;
     o.terms = "foo";
@@ -205,14 +205,14 @@
   buildCounterAvailableOffer++;
   if (buildCounterAvailableOffer < 3) {
     unittest.expect(o.available, unittest.equals(42));
-    checkUnnamed2025(o.countryOfferInfos);
+    checkUnnamed2047(o.countryOfferInfos);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.maxAccountAge, unittest.equals(42));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.offerLevel, unittest.equals('foo'));
     unittest.expect(o.offerType, unittest.equals('foo'));
-    checkUnnamed2026(o.qualifiedCustomer);
+    checkUnnamed2048(o.qualifiedCustomer);
     unittest.expect(o.qualifiedCustomersComplete, unittest.isTrue);
     unittest.expect(o.showSpecialOfferCopy, unittest.isTrue);
     unittest.expect(o.terms, unittest.equals('foo'));
@@ -268,14 +268,14 @@
   buildCounterCertificationExamStatus--;
 }
 
-buildUnnamed2027() {
+buildUnnamed2049() {
   var o = new core.List<api.CertificationExamStatus>();
   o.add(buildCertificationExamStatus());
   o.add(buildCertificationExamStatus());
   return o;
 }
 
-checkUnnamed2027(core.List<api.CertificationExamStatus> o) {
+checkUnnamed2049(core.List<api.CertificationExamStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCertificationExamStatus(o[0]);
   checkCertificationExamStatus(o[1]);
@@ -286,7 +286,7 @@
   var o = new api.CertificationStatus();
   buildCounterCertificationStatus++;
   if (buildCounterCertificationStatus < 3) {
-    o.examStatuses = buildUnnamed2027();
+    o.examStatuses = buildUnnamed2049();
     o.isCertified = true;
     o.type = "foo";
     o.userCount = 42;
@@ -298,7 +298,7 @@
 checkCertificationStatus(api.CertificationStatus o) {
   buildCounterCertificationStatus++;
   if (buildCounterCertificationStatus < 3) {
-    checkUnnamed2027(o.examStatuses);
+    checkUnnamed2049(o.examStatuses);
     unittest.expect(o.isCertified, unittest.isTrue);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.userCount, unittest.equals(42));
@@ -306,131 +306,131 @@
   buildCounterCertificationStatus--;
 }
 
-buildUnnamed2028() {
+buildUnnamed2050() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2028(core.List<core.String> o) {
+checkUnnamed2050(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2029() {
+buildUnnamed2051() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2029(core.List<core.String> o) {
+checkUnnamed2051(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2030() {
+buildUnnamed2052() {
   var o = new core.List<api.CertificationStatus>();
   o.add(buildCertificationStatus());
   o.add(buildCertificationStatus());
   return o;
 }
 
-checkUnnamed2030(core.List<api.CertificationStatus> o) {
+checkUnnamed2052(core.List<api.CertificationStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCertificationStatus(o[0]);
   checkCertificationStatus(o[1]);
 }
 
-buildUnnamed2031() {
+buildUnnamed2053() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2031(core.List<core.String> o) {
+checkUnnamed2053(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2032() {
+buildUnnamed2054() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2032(core.List<core.String> o) {
+checkUnnamed2054(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2033() {
+buildUnnamed2055() {
   var o = new core.List<api.LocalizedCompanyInfo>();
   o.add(buildLocalizedCompanyInfo());
   o.add(buildLocalizedCompanyInfo());
   return o;
 }
 
-checkUnnamed2033(core.List<api.LocalizedCompanyInfo> o) {
+checkUnnamed2055(core.List<api.LocalizedCompanyInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocalizedCompanyInfo(o[0]);
   checkLocalizedCompanyInfo(o[1]);
 }
 
-buildUnnamed2034() {
+buildUnnamed2056() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed2034(core.List<api.Location> o) {
+checkUnnamed2056(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
 }
 
-buildUnnamed2035() {
+buildUnnamed2057() {
   var o = new core.List<api.Rank>();
   o.add(buildRank());
   o.add(buildRank());
   return o;
 }
 
-checkUnnamed2035(core.List<api.Rank> o) {
+checkUnnamed2057(core.List<api.Rank> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRank(o[0]);
   checkRank(o[1]);
 }
 
-buildUnnamed2036() {
+buildUnnamed2058() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2036(core.List<core.String> o) {
+checkUnnamed2058(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2037() {
+buildUnnamed2059() {
   var o = new core.List<api.SpecializationStatus>();
   o.add(buildSpecializationStatus());
   o.add(buildSpecializationStatus());
   return o;
 }
 
-checkUnnamed2037(core.List<api.SpecializationStatus> o) {
+checkUnnamed2059(core.List<api.SpecializationStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSpecializationStatus(o[0]);
   checkSpecializationStatus(o[1]);
@@ -441,16 +441,16 @@
   var o = new api.Company();
   buildCounterCompany++;
   if (buildCounterCompany < 3) {
-    o.additionalWebsites = buildUnnamed2028();
-    o.autoApprovalEmailDomains = buildUnnamed2029();
+    o.additionalWebsites = buildUnnamed2050();
+    o.autoApprovalEmailDomains = buildUnnamed2051();
     o.badgeTier = "foo";
-    o.certificationStatuses = buildUnnamed2030();
-    o.companyTypes = buildUnnamed2031();
+    o.certificationStatuses = buildUnnamed2052();
+    o.companyTypes = buildUnnamed2053();
     o.convertedMinMonthlyBudget = buildMoney();
     o.id = "foo";
-    o.industries = buildUnnamed2032();
-    o.localizedInfos = buildUnnamed2033();
-    o.locations = buildUnnamed2034();
+    o.industries = buildUnnamed2054();
+    o.localizedInfos = buildUnnamed2055();
+    o.locations = buildUnnamed2056();
     o.name = "foo";
     o.originalMinMonthlyBudget = buildMoney();
     o.primaryAdwordsManagerAccountId = "foo";
@@ -458,9 +458,9 @@
     o.primaryLocation = buildLocation();
     o.profileStatus = "foo";
     o.publicProfile = buildPublicProfile();
-    o.ranks = buildUnnamed2035();
-    o.services = buildUnnamed2036();
-    o.specializationStatus = buildUnnamed2037();
+    o.ranks = buildUnnamed2057();
+    o.services = buildUnnamed2058();
+    o.specializationStatus = buildUnnamed2059();
     o.websiteUrl = "foo";
   }
   buildCounterCompany--;
@@ -470,16 +470,16 @@
 checkCompany(api.Company o) {
   buildCounterCompany++;
   if (buildCounterCompany < 3) {
-    checkUnnamed2028(o.additionalWebsites);
-    checkUnnamed2029(o.autoApprovalEmailDomains);
+    checkUnnamed2050(o.additionalWebsites);
+    checkUnnamed2051(o.autoApprovalEmailDomains);
     unittest.expect(o.badgeTier, unittest.equals('foo'));
-    checkUnnamed2030(o.certificationStatuses);
-    checkUnnamed2031(o.companyTypes);
+    checkUnnamed2052(o.certificationStatuses);
+    checkUnnamed2053(o.companyTypes);
     checkMoney(o.convertedMinMonthlyBudget);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2032(o.industries);
-    checkUnnamed2033(o.localizedInfos);
-    checkUnnamed2034(o.locations);
+    checkUnnamed2054(o.industries);
+    checkUnnamed2055(o.localizedInfos);
+    checkUnnamed2056(o.locations);
     unittest.expect(o.name, unittest.equals('foo'));
     checkMoney(o.originalMinMonthlyBudget);
     unittest.expect(o.primaryAdwordsManagerAccountId, unittest.equals('foo'));
@@ -487,35 +487,35 @@
     checkLocation(o.primaryLocation);
     unittest.expect(o.profileStatus, unittest.equals('foo'));
     checkPublicProfile(o.publicProfile);
-    checkUnnamed2035(o.ranks);
-    checkUnnamed2036(o.services);
-    checkUnnamed2037(o.specializationStatus);
+    checkUnnamed2057(o.ranks);
+    checkUnnamed2058(o.services);
+    checkUnnamed2059(o.specializationStatus);
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
   }
   buildCounterCompany--;
 }
 
-buildUnnamed2038() {
+buildUnnamed2060() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2038(core.List<core.String> o) {
+checkUnnamed2060(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2039() {
+buildUnnamed2061() {
   var o = new core.List<api.SpecializationStatus>();
   o.add(buildSpecializationStatus());
   o.add(buildSpecializationStatus());
   return o;
 }
 
-checkUnnamed2039(core.List<api.SpecializationStatus> o) {
+checkUnnamed2061(core.List<api.SpecializationStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSpecializationStatus(o[0]);
   checkSpecializationStatus(o[1]);
@@ -541,8 +541,8 @@
     o.primaryCountryCode = "foo";
     o.primaryLanguageCode = "foo";
     o.resolvedTimestamp = "foo";
-    o.segment = buildUnnamed2038();
-    o.specializationStatus = buildUnnamed2039();
+    o.segment = buildUnnamed2060();
+    o.specializationStatus = buildUnnamed2061();
     o.state = "foo";
     o.website = "foo";
   }
@@ -568,8 +568,8 @@
     unittest.expect(o.primaryCountryCode, unittest.equals('foo'));
     unittest.expect(o.primaryLanguageCode, unittest.equals('foo'));
     unittest.expect(o.resolvedTimestamp, unittest.equals('foo'));
-    checkUnnamed2038(o.segment);
-    checkUnnamed2039(o.specializationStatus);
+    checkUnnamed2060(o.segment);
+    checkUnnamed2061(o.specializationStatus);
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.website, unittest.equals('foo'));
   }
@@ -708,14 +708,14 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed2040() {
+buildUnnamed2062() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2040(core.List<core.String> o) {
+checkUnnamed2062(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -727,7 +727,7 @@
   buildCounterEventData++;
   if (buildCounterEventData < 3) {
     o.key = "foo";
-    o.values = buildUnnamed2040();
+    o.values = buildUnnamed2062();
   }
   buildCounterEventData--;
   return o;
@@ -737,7 +737,7 @@
   buildCounterEventData++;
   if (buildCounterEventData < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkUnnamed2040(o.values);
+    checkUnnamed2062(o.values);
   }
   buildCounterEventData--;
 }
@@ -896,14 +896,14 @@
   buildCounterLatLng--;
 }
 
-buildUnnamed2041() {
+buildUnnamed2063() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2041(core.List<core.String> o) {
+checkUnnamed2063(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -920,7 +920,7 @@
     o.email = "foo";
     o.familyName = "foo";
     o.givenName = "foo";
-    o.gpsMotivations = buildUnnamed2041();
+    o.gpsMotivations = buildUnnamed2063();
     o.id = "foo";
     o.languageCode = "foo";
     o.marketingOptIn = true;
@@ -943,7 +943,7 @@
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.familyName, unittest.equals('foo'));
     unittest.expect(o.givenName, unittest.equals('foo'));
-    checkUnnamed2041(o.gpsMotivations);
+    checkUnnamed2063(o.gpsMotivations);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.marketingOptIn, unittest.isTrue);
@@ -956,14 +956,14 @@
   buildCounterLead--;
 }
 
-buildUnnamed2042() {
+buildUnnamed2064() {
   var o = new core.List<api.Analytics>();
   o.add(buildAnalytics());
   o.add(buildAnalytics());
   return o;
 }
 
-checkUnnamed2042(core.List<api.Analytics> o) {
+checkUnnamed2064(core.List<api.Analytics> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalytics(o[0]);
   checkAnalytics(o[1]);
@@ -974,7 +974,7 @@
   var o = new api.ListAnalyticsResponse();
   buildCounterListAnalyticsResponse++;
   if (buildCounterListAnalyticsResponse < 3) {
-    o.analytics = buildUnnamed2042();
+    o.analytics = buildUnnamed2064();
     o.analyticsSummary = buildAnalyticsSummary();
     o.nextPageToken = "foo";
     o.responseMetadata = buildResponseMetadata();
@@ -986,7 +986,7 @@
 checkListAnalyticsResponse(api.ListAnalyticsResponse o) {
   buildCounterListAnalyticsResponse++;
   if (buildCounterListAnalyticsResponse < 3) {
-    checkUnnamed2042(o.analytics);
+    checkUnnamed2064(o.analytics);
     checkAnalyticsSummary(o.analyticsSummary);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkResponseMetadata(o.responseMetadata);
@@ -994,14 +994,14 @@
   buildCounterListAnalyticsResponse--;
 }
 
-buildUnnamed2043() {
+buildUnnamed2065() {
   var o = new core.List<api.Company>();
   o.add(buildCompany());
   o.add(buildCompany());
   return o;
 }
 
-checkUnnamed2043(core.List<api.Company> o) {
+checkUnnamed2065(core.List<api.Company> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCompany(o[0]);
   checkCompany(o[1]);
@@ -1012,7 +1012,7 @@
   var o = new api.ListCompaniesResponse();
   buildCounterListCompaniesResponse++;
   if (buildCounterListCompaniesResponse < 3) {
-    o.companies = buildUnnamed2043();
+    o.companies = buildUnnamed2065();
     o.nextPageToken = "foo";
     o.responseMetadata = buildResponseMetadata();
   }
@@ -1023,21 +1023,21 @@
 checkListCompaniesResponse(api.ListCompaniesResponse o) {
   buildCounterListCompaniesResponse++;
   if (buildCounterListCompaniesResponse < 3) {
-    checkUnnamed2043(o.companies);
+    checkUnnamed2065(o.companies);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkResponseMetadata(o.responseMetadata);
   }
   buildCounterListCompaniesResponse--;
 }
 
-buildUnnamed2044() {
+buildUnnamed2066() {
   var o = new core.List<api.Lead>();
   o.add(buildLead());
   o.add(buildLead());
   return o;
 }
 
-checkUnnamed2044(core.List<api.Lead> o) {
+checkUnnamed2066(core.List<api.Lead> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLead(o[0]);
   checkLead(o[1]);
@@ -1048,7 +1048,7 @@
   var o = new api.ListLeadsResponse();
   buildCounterListLeadsResponse++;
   if (buildCounterListLeadsResponse < 3) {
-    o.leads = buildUnnamed2044();
+    o.leads = buildUnnamed2066();
     o.nextPageToken = "foo";
     o.responseMetadata = buildResponseMetadata();
     o.totalSize = 42;
@@ -1060,7 +1060,7 @@
 checkListLeadsResponse(api.ListLeadsResponse o) {
   buildCounterListLeadsResponse++;
   if (buildCounterListLeadsResponse < 3) {
-    checkUnnamed2044(o.leads);
+    checkUnnamed2066(o.leads);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkResponseMetadata(o.responseMetadata);
     unittest.expect(o.totalSize, unittest.equals(42));
@@ -1068,14 +1068,14 @@
   buildCounterListLeadsResponse--;
 }
 
-buildUnnamed2045() {
+buildUnnamed2067() {
   var o = new core.List<api.HistoricalOffer>();
   o.add(buildHistoricalOffer());
   o.add(buildHistoricalOffer());
   return o;
 }
 
-checkUnnamed2045(core.List<api.HistoricalOffer> o) {
+checkUnnamed2067(core.List<api.HistoricalOffer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHistoricalOffer(o[0]);
   checkHistoricalOffer(o[1]);
@@ -1088,7 +1088,7 @@
   if (buildCounterListOffersHistoryResponse < 3) {
     o.canShowEntireCompany = true;
     o.nextPageToken = "foo";
-    o.offers = buildUnnamed2045();
+    o.offers = buildUnnamed2067();
     o.responseMetadata = buildResponseMetadata();
     o.showingEntireCompany = true;
     o.totalResults = 42;
@@ -1102,7 +1102,7 @@
   if (buildCounterListOffersHistoryResponse < 3) {
     unittest.expect(o.canShowEntireCompany, unittest.isTrue);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2045(o.offers);
+    checkUnnamed2067(o.offers);
     checkResponseMetadata(o.responseMetadata);
     unittest.expect(o.showingEntireCompany, unittest.isTrue);
     unittest.expect(o.totalResults, unittest.equals(42));
@@ -1110,14 +1110,14 @@
   buildCounterListOffersHistoryResponse--;
 }
 
-buildUnnamed2046() {
+buildUnnamed2068() {
   var o = new core.List<api.AvailableOffer>();
   o.add(buildAvailableOffer());
   o.add(buildAvailableOffer());
   return o;
 }
 
-checkUnnamed2046(core.List<api.AvailableOffer> o) {
+checkUnnamed2068(core.List<api.AvailableOffer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAvailableOffer(o[0]);
   checkAvailableOffer(o[1]);
@@ -1128,7 +1128,7 @@
   var o = new api.ListOffersResponse();
   buildCounterListOffersResponse++;
   if (buildCounterListOffersResponse < 3) {
-    o.availableOffers = buildUnnamed2046();
+    o.availableOffers = buildUnnamed2068();
     o.noOfferReason = "foo";
     o.responseMetadata = buildResponseMetadata();
   }
@@ -1139,21 +1139,21 @@
 checkListOffersResponse(api.ListOffersResponse o) {
   buildCounterListOffersResponse++;
   if (buildCounterListOffersResponse < 3) {
-    checkUnnamed2046(o.availableOffers);
+    checkUnnamed2068(o.availableOffers);
     unittest.expect(o.noOfferReason, unittest.equals('foo'));
     checkResponseMetadata(o.responseMetadata);
   }
   buildCounterListOffersResponse--;
 }
 
-buildUnnamed2047() {
+buildUnnamed2069() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2047(core.List<core.String> o) {
+checkUnnamed2069(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1165,7 +1165,7 @@
   buildCounterListUserStatesResponse++;
   if (buildCounterListUserStatesResponse < 3) {
     o.responseMetadata = buildResponseMetadata();
-    o.userStates = buildUnnamed2047();
+    o.userStates = buildUnnamed2069();
   }
   buildCounterListUserStatesResponse--;
   return o;
@@ -1175,19 +1175,19 @@
   buildCounterListUserStatesResponse++;
   if (buildCounterListUserStatesResponse < 3) {
     checkResponseMetadata(o.responseMetadata);
-    checkUnnamed2047(o.userStates);
+    checkUnnamed2069(o.userStates);
   }
   buildCounterListUserStatesResponse--;
 }
 
-buildUnnamed2048() {
+buildUnnamed2070() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2048(core.List<core.String> o) {
+checkUnnamed2070(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1198,7 +1198,7 @@
   var o = new api.LocalizedCompanyInfo();
   buildCounterLocalizedCompanyInfo++;
   if (buildCounterLocalizedCompanyInfo < 3) {
-    o.countryCodes = buildUnnamed2048();
+    o.countryCodes = buildUnnamed2070();
     o.displayName = "foo";
     o.languageCode = "foo";
     o.overview = "foo";
@@ -1210,7 +1210,7 @@
 checkLocalizedCompanyInfo(api.LocalizedCompanyInfo o) {
   buildCounterLocalizedCompanyInfo++;
   if (buildCounterLocalizedCompanyInfo < 3) {
-    checkUnnamed2048(o.countryCodes);
+    checkUnnamed2070(o.countryCodes);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.overview, unittest.equals('foo'));
@@ -1218,14 +1218,14 @@
   buildCounterLocalizedCompanyInfo--;
 }
 
-buildUnnamed2049() {
+buildUnnamed2071() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2049(core.List<core.String> o) {
+checkUnnamed2071(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1237,7 +1237,7 @@
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
     o.address = "foo";
-    o.addressLine = buildUnnamed2049();
+    o.addressLine = buildUnnamed2071();
     o.administrativeArea = "foo";
     o.dependentLocality = "foo";
     o.languageCode = "foo";
@@ -1255,7 +1255,7 @@
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
     unittest.expect(o.address, unittest.equals('foo'));
-    checkUnnamed2049(o.addressLine);
+    checkUnnamed2071(o.addressLine);
     unittest.expect(o.administrativeArea, unittest.equals('foo'));
     unittest.expect(o.dependentLocality, unittest.equals('foo'));
     unittest.expect(o.languageCode, unittest.equals('foo'));
@@ -1268,14 +1268,14 @@
   buildCounterLocation--;
 }
 
-buildUnnamed2050() {
+buildUnnamed2072() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2050(core.Map<core.String, core.String> o) {
+checkUnnamed2072(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'));
@@ -1286,7 +1286,7 @@
   var o = new api.LogMessageRequest();
   buildCounterLogMessageRequest++;
   if (buildCounterLogMessageRequest < 3) {
-    o.clientInfo = buildUnnamed2050();
+    o.clientInfo = buildUnnamed2072();
     o.details = "foo";
     o.level = "foo";
     o.requestMetadata = buildRequestMetadata();
@@ -1298,7 +1298,7 @@
 checkLogMessageRequest(api.LogMessageRequest o) {
   buildCounterLogMessageRequest++;
   if (buildCounterLogMessageRequest < 3) {
-    checkUnnamed2050(o.clientInfo);
+    checkUnnamed2072(o.clientInfo);
     unittest.expect(o.details, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     checkRequestMetadata(o.requestMetadata);
@@ -1325,14 +1325,14 @@
   buildCounterLogMessageResponse--;
 }
 
-buildUnnamed2051() {
+buildUnnamed2073() {
   var o = new core.List<api.EventData>();
   o.add(buildEventData());
   o.add(buildEventData());
   return o;
 }
 
-checkUnnamed2051(core.List<api.EventData> o) {
+checkUnnamed2073(core.List<api.EventData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventData(o[0]);
   checkEventData(o[1]);
@@ -1345,7 +1345,7 @@
   if (buildCounterLogUserEventRequest < 3) {
     o.eventAction = "foo";
     o.eventCategory = "foo";
-    o.eventDatas = buildUnnamed2051();
+    o.eventDatas = buildUnnamed2073();
     o.eventScope = "foo";
     o.lead = buildLead();
     o.requestMetadata = buildRequestMetadata();
@@ -1360,7 +1360,7 @@
   if (buildCounterLogUserEventRequest < 3) {
     unittest.expect(o.eventAction, unittest.equals('foo'));
     unittest.expect(o.eventCategory, unittest.equals('foo'));
-    checkUnnamed2051(o.eventDatas);
+    checkUnnamed2073(o.eventDatas);
     unittest.expect(o.eventScope, unittest.equals('foo'));
     checkLead(o.lead);
     checkRequestMetadata(o.requestMetadata);
@@ -1542,14 +1542,14 @@
   buildCounterRecaptchaChallenge--;
 }
 
-buildUnnamed2052() {
+buildUnnamed2074() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2052(core.List<core.String> o) {
+checkUnnamed2074(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1560,7 +1560,7 @@
   var o = new api.RequestMetadata();
   buildCounterRequestMetadata++;
   if (buildCounterRequestMetadata < 3) {
-    o.experimentIds = buildUnnamed2052();
+    o.experimentIds = buildUnnamed2074();
     o.locale = "foo";
     o.partnersSessionId = "foo";
     o.trafficSource = buildTrafficSource();
@@ -1573,7 +1573,7 @@
 checkRequestMetadata(api.RequestMetadata o) {
   buildCounterRequestMetadata++;
   if (buildCounterRequestMetadata < 3) {
-    checkUnnamed2052(o.experimentIds);
+    checkUnnamed2074(o.experimentIds);
     unittest.expect(o.locale, unittest.equals('foo'));
     unittest.expect(o.partnersSessionId, unittest.equals('foo'));
     checkTrafficSource(o.trafficSource);
@@ -1643,53 +1643,53 @@
   buildCounterTrafficSource--;
 }
 
-buildUnnamed2053() {
+buildUnnamed2075() {
   var o = new core.List<api.AdWordsManagerAccountInfo>();
   o.add(buildAdWordsManagerAccountInfo());
   o.add(buildAdWordsManagerAccountInfo());
   return o;
 }
 
-checkUnnamed2053(core.List<api.AdWordsManagerAccountInfo> o) {
+checkUnnamed2075(core.List<api.AdWordsManagerAccountInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdWordsManagerAccountInfo(o[0]);
   checkAdWordsManagerAccountInfo(o[1]);
 }
 
-buildUnnamed2054() {
+buildUnnamed2076() {
   var o = new core.List<api.Certification>();
   o.add(buildCertification());
   o.add(buildCertification());
   return o;
 }
 
-checkUnnamed2054(core.List<api.Certification> o) {
+checkUnnamed2076(core.List<api.Certification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCertification(o[0]);
   checkCertification(o[1]);
 }
 
-buildUnnamed2055() {
+buildUnnamed2077() {
   var o = new core.List<api.ExamStatus>();
   o.add(buildExamStatus());
   o.add(buildExamStatus());
   return o;
 }
 
-checkUnnamed2055(core.List<api.ExamStatus> o) {
+checkUnnamed2077(core.List<api.ExamStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExamStatus(o[0]);
   checkExamStatus(o[1]);
 }
 
-buildUnnamed2056() {
+buildUnnamed2078() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2056(core.List<core.String> o) {
+checkUnnamed2078(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1700,15 +1700,15 @@
   var o = new api.User();
   buildCounterUser++;
   if (buildCounterUser < 3) {
-    o.availableAdwordsManagerAccounts = buildUnnamed2053();
-    o.certificationStatus = buildUnnamed2054();
+    o.availableAdwordsManagerAccounts = buildUnnamed2075();
+    o.certificationStatus = buildUnnamed2076();
     o.company = buildCompanyRelation();
     o.companyVerificationEmail = "foo";
-    o.examStatus = buildUnnamed2055();
+    o.examStatus = buildUnnamed2077();
     o.id = "foo";
     o.internalId = "foo";
     o.lastAccessTime = "foo";
-    o.primaryEmails = buildUnnamed2056();
+    o.primaryEmails = buildUnnamed2078();
     o.profile = buildUserProfile();
     o.publicProfile = buildPublicProfile();
   }
@@ -1719,15 +1719,15 @@
 checkUser(api.User o) {
   buildCounterUser++;
   if (buildCounterUser < 3) {
-    checkUnnamed2053(o.availableAdwordsManagerAccounts);
-    checkUnnamed2054(o.certificationStatus);
+    checkUnnamed2075(o.availableAdwordsManagerAccounts);
+    checkUnnamed2076(o.certificationStatus);
     checkCompanyRelation(o.company);
     unittest.expect(o.companyVerificationEmail, unittest.equals('foo'));
-    checkUnnamed2055(o.examStatus);
+    checkUnnamed2077(o.examStatus);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.internalId, unittest.equals('foo'));
     unittest.expect(o.lastAccessTime, unittest.equals('foo'));
-    checkUnnamed2056(o.primaryEmails);
+    checkUnnamed2078(o.primaryEmails);
     checkUserProfile(o.profile);
     checkPublicProfile(o.publicProfile);
   }
@@ -1755,339 +1755,6 @@
   buildCounterUserOverrides--;
 }
 
-buildUnnamed2057() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2057(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2058() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2058(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2059() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2059(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2060() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2060(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2061() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2061(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterUserProfile = 0;
-buildUserProfile() {
-  var o = new api.UserProfile();
-  buildCounterUserProfile++;
-  if (buildCounterUserProfile < 3) {
-    o.address = buildLocation();
-    o.adwordsManagerAccount = "foo";
-    o.channels = buildUnnamed2057();
-    o.emailAddress = "foo";
-    o.emailOptIns = buildOptIns();
-    o.familyName = "foo";
-    o.givenName = "foo";
-    o.industries = buildUnnamed2058();
-    o.jobFunctions = buildUnnamed2059();
-    o.languages = buildUnnamed2060();
-    o.markets = buildUnnamed2061();
-    o.migrateToAfa = true;
-    o.phoneNumber = "foo";
-    o.primaryCountryCode = "foo";
-    o.profilePublic = true;
-  }
-  buildCounterUserProfile--;
-  return o;
-}
-
-checkUserProfile(api.UserProfile o) {
-  buildCounterUserProfile++;
-  if (buildCounterUserProfile < 3) {
-    checkLocation(o.address);
-    unittest.expect(o.adwordsManagerAccount, unittest.equals('foo'));
-    checkUnnamed2057(o.channels);
-    unittest.expect(o.emailAddress, unittest.equals('foo'));
-    checkOptIns(o.emailOptIns);
-    unittest.expect(o.familyName, unittest.equals('foo'));
-    unittest.expect(o.givenName, unittest.equals('foo'));
-    checkUnnamed2058(o.industries);
-    checkUnnamed2059(o.jobFunctions);
-    checkUnnamed2060(o.languages);
-    checkUnnamed2061(o.markets);
-    unittest.expect(o.migrateToAfa, unittest.isTrue);
-    unittest.expect(o.phoneNumber, unittest.equals('foo'));
-    unittest.expect(o.primaryCountryCode, unittest.equals('foo'));
-    unittest.expect(o.profilePublic, unittest.isTrue);
-  }
-  buildCounterUserProfile--;
-}
-
-buildUnnamed2062() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2062(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2063() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2063(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2064() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2064(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2065() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2065(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2066() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2066(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2067() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2067(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2068() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2068(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2069() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2069(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2070() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2070(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2071() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2071(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2072() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2072(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2073() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2073(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2074() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2074(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2075() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2075(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2076() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2076(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2077() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2077(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2078() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2078(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed2079() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -2127,6 +1794,339 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed2082() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2082(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2083() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2083(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterUserProfile = 0;
+buildUserProfile() {
+  var o = new api.UserProfile();
+  buildCounterUserProfile++;
+  if (buildCounterUserProfile < 3) {
+    o.address = buildLocation();
+    o.adwordsManagerAccount = "foo";
+    o.channels = buildUnnamed2079();
+    o.emailAddress = "foo";
+    o.emailOptIns = buildOptIns();
+    o.familyName = "foo";
+    o.givenName = "foo";
+    o.industries = buildUnnamed2080();
+    o.jobFunctions = buildUnnamed2081();
+    o.languages = buildUnnamed2082();
+    o.markets = buildUnnamed2083();
+    o.migrateToAfa = true;
+    o.phoneNumber = "foo";
+    o.primaryCountryCode = "foo";
+    o.profilePublic = true;
+  }
+  buildCounterUserProfile--;
+  return o;
+}
+
+checkUserProfile(api.UserProfile o) {
+  buildCounterUserProfile++;
+  if (buildCounterUserProfile < 3) {
+    checkLocation(o.address);
+    unittest.expect(o.adwordsManagerAccount, unittest.equals('foo'));
+    checkUnnamed2079(o.channels);
+    unittest.expect(o.emailAddress, unittest.equals('foo'));
+    checkOptIns(o.emailOptIns);
+    unittest.expect(o.familyName, unittest.equals('foo'));
+    unittest.expect(o.givenName, unittest.equals('foo'));
+    checkUnnamed2080(o.industries);
+    checkUnnamed2081(o.jobFunctions);
+    checkUnnamed2082(o.languages);
+    checkUnnamed2083(o.markets);
+    unittest.expect(o.migrateToAfa, unittest.isTrue);
+    unittest.expect(o.phoneNumber, unittest.equals('foo'));
+    unittest.expect(o.primaryCountryCode, unittest.equals('foo'));
+    unittest.expect(o.profilePublic, unittest.isTrue);
+  }
+  buildCounterUserProfile--;
+}
+
+buildUnnamed2084() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2084(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2085() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2085(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2086() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2086(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2087() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2087(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2088() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2088(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2089() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2089(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2090() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2090(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2091() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2091(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2092() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2092(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2093() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2093(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2094() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2094(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2095() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2095(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2096() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2096(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2097() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2097(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2098() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2098(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2099() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2099(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2100() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2100(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2101() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2101(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2102() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2102(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2103() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2103(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 main() {
   unittest.group("obj-schema-AdWordsManagerAccountInfo", () {
     unittest.test("to-json--from-json", () {
@@ -2524,15 +2524,15 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.AnalyticsResourceApi res = new api.PartnersApi(mock).analytics;
-      var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
-      var arg_requestMetadata_locale = "foo";
-      var arg_requestMetadata_userOverrides_ipAddress = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2062();
-      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
       var arg_requestMetadata_partnersSessionId = "foo";
       var arg_requestMetadata_userOverrides_userId = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
+      var arg_requestMetadata_locale = "foo";
+      var arg_requestMetadata_userOverrides_ipAddress = "foo";
+      var arg_requestMetadata_experimentIds = buildUnnamed2084();
+      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2564,6 +2564,14 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
+            unittest.equals(arg_requestMetadata_partnersSessionId));
+        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
+            unittest.equals(arg_requestMetadata_userOverrides_userId));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(
             queryMap["requestMetadata.trafficSource.trafficSourceId"].first,
             unittest.equals(arg_requestMetadata_trafficSource_trafficSourceId));
@@ -2577,14 +2585,6 @@
         unittest.expect(
             queryMap["requestMetadata.trafficSource.trafficSubId"].first,
             unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
-        unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
-            unittest.equals(arg_requestMetadata_partnersSessionId));
-        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
-            unittest.equals(arg_requestMetadata_userOverrides_userId));
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2595,6 +2595,12 @@
       }), true);
       res
           .list(
+              requestMetadata_partnersSessionId:
+                  arg_requestMetadata_partnersSessionId,
+              requestMetadata_userOverrides_userId:
+                  arg_requestMetadata_userOverrides_userId,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
               requestMetadata_trafficSource_trafficSourceId:
                   arg_requestMetadata_trafficSource_trafficSourceId,
               requestMetadata_locale: arg_requestMetadata_locale,
@@ -2603,12 +2609,6 @@
               requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
               requestMetadata_trafficSource_trafficSubId:
                   arg_requestMetadata_trafficSource_trafficSubId,
-              requestMetadata_partnersSessionId:
-                  arg_requestMetadata_partnersSessionId,
-              requestMetadata_userOverrides_userId:
-                  arg_requestMetadata_userOverrides_userId,
-              pageToken: arg_pageToken,
-              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListAnalyticsResponse response) {
         checkListAnalyticsResponse(response);
@@ -2677,6 +2677,8 @@
       var mock = new HttpServerMock();
       api.CompaniesResourceApi res = new api.PartnersApi(mock).companies;
       var arg_companyId = "foo";
+      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
+      var arg_orderBy = "foo";
       var arg_requestMetadata_partnersSessionId = "foo";
       var arg_requestMetadata_userOverrides_userId = "foo";
       var arg_view = "foo";
@@ -2685,9 +2687,7 @@
       var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_requestMetadata_userOverrides_ipAddress = "foo";
       var arg_currencyCode = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2063();
-      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
-      var arg_orderBy = "foo";
+      var arg_requestMetadata_experimentIds = buildUnnamed2085();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2722,6 +2722,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(
+            queryMap["requestMetadata.trafficSource.trafficSubId"].first,
+            unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
         unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
             unittest.equals(arg_requestMetadata_partnersSessionId));
         unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
@@ -2741,11 +2746,6 @@
             queryMap["currencyCode"].first, unittest.equals(arg_currencyCode));
         unittest.expect(queryMap["requestMetadata.experimentIds"],
             unittest.equals(arg_requestMetadata_experimentIds));
-        unittest.expect(
-            queryMap["requestMetadata.trafficSource.trafficSubId"].first,
-            unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
-        unittest.expect(
-            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2756,6 +2756,9 @@
       }), true);
       res
           .get(arg_companyId,
+              requestMetadata_trafficSource_trafficSubId:
+                  arg_requestMetadata_trafficSource_trafficSubId,
+              orderBy: arg_orderBy,
               requestMetadata_partnersSessionId:
                   arg_requestMetadata_partnersSessionId,
               requestMetadata_userOverrides_userId:
@@ -2769,9 +2772,6 @@
                   arg_requestMetadata_userOverrides_ipAddress,
               currencyCode: arg_currencyCode,
               requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
-              requestMetadata_trafficSource_trafficSubId:
-                  arg_requestMetadata_trafficSource_trafficSubId,
-              orderBy: arg_orderBy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.GetCompanyResponse response) {
         checkGetCompanyResponse(response);
@@ -2781,31 +2781,31 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.CompaniesResourceApi res = new api.PartnersApi(mock).companies;
-      var arg_languageCodes = buildUnnamed2064();
-      var arg_pageSize = 42;
       var arg_requestMetadata_userOverrides_ipAddress = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2065();
+      var arg_requestMetadata_experimentIds = buildUnnamed2086();
       var arg_orderBy = "foo";
-      var arg_specializations = buildUnnamed2066();
+      var arg_specializations = buildUnnamed2087();
       var arg_maxMonthlyBudget_currencyCode = "foo";
-      var arg_requestMetadata_userOverrides_userId = "foo";
       var arg_minMonthlyBudget_currencyCode = "foo";
+      var arg_requestMetadata_userOverrides_userId = "foo";
       var arg_view = "foo";
-      var arg_requestMetadata_locale = "foo";
       var arg_address = "foo";
+      var arg_requestMetadata_locale = "foo";
       var arg_minMonthlyBudget_units = "foo";
       var arg_maxMonthlyBudget_nanos = 42;
-      var arg_services = buildUnnamed2067();
+      var arg_services = buildUnnamed2088();
       var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_maxMonthlyBudget_units = "foo";
-      var arg_minMonthlyBudget_nanos = 42;
       var arg_requestMetadata_trafficSource_trafficSubId = "foo";
+      var arg_minMonthlyBudget_nanos = 42;
       var arg_requestMetadata_partnersSessionId = "foo";
       var arg_companyName = "foo";
       var arg_pageToken = "foo";
-      var arg_industries = buildUnnamed2068();
+      var arg_industries = buildUnnamed2089();
       var arg_websiteUrl = "foo";
-      var arg_gpsMotivations = buildUnnamed2069();
+      var arg_gpsMotivations = buildUnnamed2090();
+      var arg_languageCodes = buildUnnamed2091();
+      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2838,10 +2838,6 @@
           }
         }
         unittest.expect(
-            queryMap["languageCodes"], unittest.equals(arg_languageCodes));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
-        unittest.expect(
             queryMap["requestMetadata.userOverrides.ipAddress"].first,
             unittest.equals(arg_requestMetadata_userOverrides_ipAddress));
         unittest.expect(queryMap["requestMetadata.experimentIds"],
@@ -2852,15 +2848,15 @@
             queryMap["specializations"], unittest.equals(arg_specializations));
         unittest.expect(queryMap["maxMonthlyBudget.currencyCode"].first,
             unittest.equals(arg_maxMonthlyBudget_currencyCode));
-        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
-            unittest.equals(arg_requestMetadata_userOverrides_userId));
         unittest.expect(queryMap["minMonthlyBudget.currencyCode"].first,
             unittest.equals(arg_minMonthlyBudget_currencyCode));
+        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
+            unittest.equals(arg_requestMetadata_userOverrides_userId));
         unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
-        unittest.expect(queryMap["requestMetadata.locale"].first,
-            unittest.equals(arg_requestMetadata_locale));
         unittest.expect(
             queryMap["address"].first, unittest.equals(arg_address));
+        unittest.expect(queryMap["requestMetadata.locale"].first,
+            unittest.equals(arg_requestMetadata_locale));
         unittest.expect(queryMap["minMonthlyBudget.units"].first,
             unittest.equals(arg_minMonthlyBudget_units));
         unittest.expect(
@@ -2873,11 +2869,11 @@
         unittest.expect(queryMap["maxMonthlyBudget.units"].first,
             unittest.equals(arg_maxMonthlyBudget_units));
         unittest.expect(
-            core.int.parse(queryMap["minMonthlyBudget.nanos"].first),
-            unittest.equals(arg_minMonthlyBudget_nanos));
-        unittest.expect(
             queryMap["requestMetadata.trafficSource.trafficSubId"].first,
             unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
+        unittest.expect(
+            core.int.parse(queryMap["minMonthlyBudget.nanos"].first),
+            unittest.equals(arg_minMonthlyBudget_nanos));
         unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
             unittest.equals(arg_requestMetadata_partnersSessionId));
         unittest.expect(
@@ -2890,6 +2886,10 @@
             queryMap["websiteUrl"].first, unittest.equals(arg_websiteUrl));
         unittest.expect(
             queryMap["gpsMotivations"], unittest.equals(arg_gpsMotivations));
+        unittest.expect(
+            queryMap["languageCodes"], unittest.equals(arg_languageCodes));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2900,29 +2900,27 @@
       }), true);
       res
           .list(
-              languageCodes: arg_languageCodes,
-              pageSize: arg_pageSize,
               requestMetadata_userOverrides_ipAddress:
                   arg_requestMetadata_userOverrides_ipAddress,
               requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
               orderBy: arg_orderBy,
               specializations: arg_specializations,
               maxMonthlyBudget_currencyCode: arg_maxMonthlyBudget_currencyCode,
+              minMonthlyBudget_currencyCode: arg_minMonthlyBudget_currencyCode,
               requestMetadata_userOverrides_userId:
                   arg_requestMetadata_userOverrides_userId,
-              minMonthlyBudget_currencyCode: arg_minMonthlyBudget_currencyCode,
               view: arg_view,
-              requestMetadata_locale: arg_requestMetadata_locale,
               address: arg_address,
+              requestMetadata_locale: arg_requestMetadata_locale,
               minMonthlyBudget_units: arg_minMonthlyBudget_units,
               maxMonthlyBudget_nanos: arg_maxMonthlyBudget_nanos,
               services: arg_services,
               requestMetadata_trafficSource_trafficSourceId:
                   arg_requestMetadata_trafficSource_trafficSourceId,
               maxMonthlyBudget_units: arg_maxMonthlyBudget_units,
-              minMonthlyBudget_nanos: arg_minMonthlyBudget_nanos,
               requestMetadata_trafficSource_trafficSubId:
                   arg_requestMetadata_trafficSource_trafficSubId,
+              minMonthlyBudget_nanos: arg_minMonthlyBudget_nanos,
               requestMetadata_partnersSessionId:
                   arg_requestMetadata_partnersSessionId,
               companyName: arg_companyName,
@@ -2930,6 +2928,8 @@
               industries: arg_industries,
               websiteUrl: arg_websiteUrl,
               gpsMotivations: arg_gpsMotivations,
+              languageCodes: arg_languageCodes,
+              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListCompaniesResponse response) {
         checkListCompaniesResponse(response);
@@ -3008,13 +3008,13 @@
       var mock = new HttpServerMock();
       api.ExamsResourceApi res = new api.PartnersApi(mock).exams;
       var arg_examType = "foo";
-      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
-      var arg_requestMetadata_userOverrides_userId = "foo";
-      var arg_requestMetadata_partnersSessionId = "foo";
       var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_requestMetadata_locale = "foo";
       var arg_requestMetadata_userOverrides_ipAddress = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2070();
+      var arg_requestMetadata_experimentIds = buildUnnamed2092();
+      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
+      var arg_requestMetadata_userOverrides_userId = "foo";
+      var arg_requestMetadata_partnersSessionId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3056,13 +3056,6 @@
           }
         }
         unittest.expect(
-            queryMap["requestMetadata.trafficSource.trafficSubId"].first,
-            unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
-        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
-            unittest.equals(arg_requestMetadata_userOverrides_userId));
-        unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
-            unittest.equals(arg_requestMetadata_partnersSessionId));
-        unittest.expect(
             queryMap["requestMetadata.trafficSource.trafficSourceId"].first,
             unittest.equals(arg_requestMetadata_trafficSource_trafficSourceId));
         unittest.expect(queryMap["requestMetadata.locale"].first,
@@ -3072,6 +3065,13 @@
             unittest.equals(arg_requestMetadata_userOverrides_ipAddress));
         unittest.expect(queryMap["requestMetadata.experimentIds"],
             unittest.equals(arg_requestMetadata_experimentIds));
+        unittest.expect(
+            queryMap["requestMetadata.trafficSource.trafficSubId"].first,
+            unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
+        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
+            unittest.equals(arg_requestMetadata_userOverrides_userId));
+        unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
+            unittest.equals(arg_requestMetadata_partnersSessionId));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3082,18 +3082,18 @@
       }), true);
       res
           .getToken(arg_examType,
-              requestMetadata_trafficSource_trafficSubId:
-                  arg_requestMetadata_trafficSource_trafficSubId,
-              requestMetadata_userOverrides_userId:
-                  arg_requestMetadata_userOverrides_userId,
-              requestMetadata_partnersSessionId:
-                  arg_requestMetadata_partnersSessionId,
               requestMetadata_trafficSource_trafficSourceId:
                   arg_requestMetadata_trafficSource_trafficSourceId,
               requestMetadata_locale: arg_requestMetadata_locale,
               requestMetadata_userOverrides_ipAddress:
                   arg_requestMetadata_userOverrides_ipAddress,
               requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
+              requestMetadata_trafficSource_trafficSubId:
+                  arg_requestMetadata_trafficSource_trafficSubId,
+              requestMetadata_userOverrides_userId:
+                  arg_requestMetadata_userOverrides_userId,
+              requestMetadata_partnersSessionId:
+                  arg_requestMetadata_partnersSessionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ExamToken response) {
         checkExamToken(response);
@@ -3105,16 +3105,16 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.LeadsResourceApi res = new api.PartnersApi(mock).leads;
+      var arg_requestMetadata_locale = "foo";
+      var arg_requestMetadata_userOverrides_ipAddress = "foo";
+      var arg_requestMetadata_experimentIds = buildUnnamed2093();
+      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
+      var arg_orderBy = "foo";
+      var arg_requestMetadata_userOverrides_userId = "foo";
+      var arg_requestMetadata_partnersSessionId = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
-      var arg_requestMetadata_locale = "foo";
-      var arg_requestMetadata_userOverrides_ipAddress = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2071();
-      var arg_orderBy = "foo";
-      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
-      var arg_requestMetadata_userOverrides_userId = "foo";
-      var arg_requestMetadata_partnersSessionId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3146,13 +3146,6 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
-        unittest.expect(
-            queryMap["requestMetadata.trafficSource.trafficSourceId"].first,
-            unittest.equals(arg_requestMetadata_trafficSource_trafficSourceId));
         unittest.expect(queryMap["requestMetadata.locale"].first,
             unittest.equals(arg_requestMetadata_locale));
         unittest.expect(
@@ -3161,14 +3154,21 @@
         unittest.expect(queryMap["requestMetadata.experimentIds"],
             unittest.equals(arg_requestMetadata_experimentIds));
         unittest.expect(
-            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(
             queryMap["requestMetadata.trafficSource.trafficSubId"].first,
             unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
         unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
             unittest.equals(arg_requestMetadata_userOverrides_userId));
         unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
             unittest.equals(arg_requestMetadata_partnersSessionId));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["requestMetadata.trafficSource.trafficSourceId"].first,
+            unittest.equals(arg_requestMetadata_trafficSource_trafficSourceId));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3179,21 +3179,21 @@
       }), true);
       res
           .list(
-              pageToken: arg_pageToken,
-              pageSize: arg_pageSize,
-              requestMetadata_trafficSource_trafficSourceId:
-                  arg_requestMetadata_trafficSource_trafficSourceId,
               requestMetadata_locale: arg_requestMetadata_locale,
               requestMetadata_userOverrides_ipAddress:
                   arg_requestMetadata_userOverrides_ipAddress,
               requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
-              orderBy: arg_orderBy,
               requestMetadata_trafficSource_trafficSubId:
                   arg_requestMetadata_trafficSource_trafficSubId,
+              orderBy: arg_orderBy,
               requestMetadata_userOverrides_userId:
                   arg_requestMetadata_userOverrides_userId,
               requestMetadata_partnersSessionId:
                   arg_requestMetadata_partnersSessionId,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              requestMetadata_trafficSource_trafficSourceId:
+                  arg_requestMetadata_trafficSource_trafficSourceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListLeadsResponse response) {
         checkListLeadsResponse(response);
@@ -3205,13 +3205,13 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.OffersResourceApi res = new api.PartnersApi(mock).offers;
-      var arg_requestMetadata_partnersSessionId = "foo";
+      var arg_requestMetadata_userOverrides_ipAddress = "foo";
+      var arg_requestMetadata_experimentIds = buildUnnamed2094();
+      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
       var arg_requestMetadata_userOverrides_userId = "foo";
+      var arg_requestMetadata_partnersSessionId = "foo";
       var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_requestMetadata_locale = "foo";
-      var arg_requestMetadata_userOverrides_ipAddress = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2072();
-      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3243,15 +3243,6 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
-            unittest.equals(arg_requestMetadata_partnersSessionId));
-        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
-            unittest.equals(arg_requestMetadata_userOverrides_userId));
-        unittest.expect(
-            queryMap["requestMetadata.trafficSource.trafficSourceId"].first,
-            unittest.equals(arg_requestMetadata_trafficSource_trafficSourceId));
-        unittest.expect(queryMap["requestMetadata.locale"].first,
-            unittest.equals(arg_requestMetadata_locale));
         unittest.expect(
             queryMap["requestMetadata.userOverrides.ipAddress"].first,
             unittest.equals(arg_requestMetadata_userOverrides_ipAddress));
@@ -3260,6 +3251,15 @@
         unittest.expect(
             queryMap["requestMetadata.trafficSource.trafficSubId"].first,
             unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
+        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
+            unittest.equals(arg_requestMetadata_userOverrides_userId));
+        unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
+            unittest.equals(arg_requestMetadata_partnersSessionId));
+        unittest.expect(
+            queryMap["requestMetadata.trafficSource.trafficSourceId"].first,
+            unittest.equals(arg_requestMetadata_trafficSource_trafficSourceId));
+        unittest.expect(queryMap["requestMetadata.locale"].first,
+            unittest.equals(arg_requestMetadata_locale));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3270,18 +3270,18 @@
       }), true);
       res
           .list(
-              requestMetadata_partnersSessionId:
-                  arg_requestMetadata_partnersSessionId,
-              requestMetadata_userOverrides_userId:
-                  arg_requestMetadata_userOverrides_userId,
-              requestMetadata_trafficSource_trafficSourceId:
-                  arg_requestMetadata_trafficSource_trafficSourceId,
-              requestMetadata_locale: arg_requestMetadata_locale,
               requestMetadata_userOverrides_ipAddress:
                   arg_requestMetadata_userOverrides_ipAddress,
               requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
               requestMetadata_trafficSource_trafficSubId:
                   arg_requestMetadata_trafficSource_trafficSubId,
+              requestMetadata_userOverrides_userId:
+                  arg_requestMetadata_userOverrides_userId,
+              requestMetadata_partnersSessionId:
+                  arg_requestMetadata_partnersSessionId,
+              requestMetadata_trafficSource_trafficSourceId:
+                  arg_requestMetadata_trafficSource_trafficSourceId,
+              requestMetadata_locale: arg_requestMetadata_locale,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListOffersResponse response) {
         checkListOffersResponse(response);
@@ -3294,10 +3294,6 @@
       var mock = new HttpServerMock();
       api.OffersHistoryResourceApi res =
           new api.PartnersApi(mock).offers.history;
-      var arg_requestMetadata_experimentIds = buildUnnamed2073();
-      var arg_entireCompany = true;
-      var arg_orderBy = "foo";
-      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
       var arg_requestMetadata_userOverrides_userId = "foo";
       var arg_requestMetadata_partnersSessionId = "foo";
       var arg_pageToken = "foo";
@@ -3305,6 +3301,10 @@
       var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_requestMetadata_locale = "foo";
       var arg_requestMetadata_userOverrides_ipAddress = "foo";
+      var arg_requestMetadata_experimentIds = buildUnnamed2095();
+      var arg_entireCompany = true;
+      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
+      var arg_orderBy = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3336,15 +3336,6 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestMetadata.experimentIds"],
-            unittest.equals(arg_requestMetadata_experimentIds));
-        unittest.expect(queryMap["entireCompany"].first,
-            unittest.equals("$arg_entireCompany"));
-        unittest.expect(
-            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(
-            queryMap["requestMetadata.trafficSource.trafficSubId"].first,
-            unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
         unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
             unittest.equals(arg_requestMetadata_userOverrides_userId));
         unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
@@ -3361,6 +3352,15 @@
         unittest.expect(
             queryMap["requestMetadata.userOverrides.ipAddress"].first,
             unittest.equals(arg_requestMetadata_userOverrides_ipAddress));
+        unittest.expect(queryMap["requestMetadata.experimentIds"],
+            unittest.equals(arg_requestMetadata_experimentIds));
+        unittest.expect(queryMap["entireCompany"].first,
+            unittest.equals("$arg_entireCompany"));
+        unittest.expect(
+            queryMap["requestMetadata.trafficSource.trafficSubId"].first,
+            unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3371,11 +3371,6 @@
       }), true);
       res
           .list(
-              requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
-              entireCompany: arg_entireCompany,
-              orderBy: arg_orderBy,
-              requestMetadata_trafficSource_trafficSubId:
-                  arg_requestMetadata_trafficSource_trafficSubId,
               requestMetadata_userOverrides_userId:
                   arg_requestMetadata_userOverrides_userId,
               requestMetadata_partnersSessionId:
@@ -3387,6 +3382,11 @@
               requestMetadata_locale: arg_requestMetadata_locale,
               requestMetadata_userOverrides_ipAddress:
                   arg_requestMetadata_userOverrides_ipAddress,
+              requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
+              entireCompany: arg_entireCompany,
+              requestMetadata_trafficSource_trafficSubId:
+                  arg_requestMetadata_trafficSource_trafficSubId,
+              orderBy: arg_orderBy,
               $fields: arg_$fields)
           .then(
               unittest.expectAsync1(((api.ListOffersHistoryResponse response) {
@@ -3457,10 +3457,10 @@
       var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_requestMetadata_locale = "foo";
       var arg_requestMetadata_userOverrides_ipAddress = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2074();
+      var arg_requestMetadata_experimentIds = buildUnnamed2096();
       var arg_requestMetadata_trafficSource_trafficSubId = "foo";
-      var arg_requestMetadata_userOverrides_userId = "foo";
       var arg_requestMetadata_partnersSessionId = "foo";
+      var arg_requestMetadata_userOverrides_userId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3505,10 +3505,10 @@
         unittest.expect(
             queryMap["requestMetadata.trafficSource.trafficSubId"].first,
             unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
-        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
-            unittest.equals(arg_requestMetadata_userOverrides_userId));
         unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
             unittest.equals(arg_requestMetadata_partnersSessionId));
+        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
+            unittest.equals(arg_requestMetadata_userOverrides_userId));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3527,10 +3527,10 @@
               requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
               requestMetadata_trafficSource_trafficSubId:
                   arg_requestMetadata_trafficSource_trafficSubId,
-              requestMetadata_userOverrides_userId:
-                  arg_requestMetadata_userOverrides_userId,
               requestMetadata_partnersSessionId:
                   arg_requestMetadata_partnersSessionId,
+              requestMetadata_userOverrides_userId:
+                  arg_requestMetadata_userOverrides_userId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListUserStatesResponse response) {
         checkListUserStatesResponse(response);
@@ -3544,13 +3544,13 @@
       api.UsersResourceApi res = new api.PartnersApi(mock).users;
       var arg_request = buildCompanyRelation();
       var arg_userId = "foo";
+      var arg_requestMetadata_experimentIds = buildUnnamed2097();
+      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
       var arg_requestMetadata_userOverrides_userId = "foo";
       var arg_requestMetadata_partnersSessionId = "foo";
       var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_requestMetadata_locale = "foo";
       var arg_requestMetadata_userOverrides_ipAddress = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2075();
-      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.CompanyRelation.fromJson(json);
@@ -3594,6 +3594,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["requestMetadata.experimentIds"],
+            unittest.equals(arg_requestMetadata_experimentIds));
+        unittest.expect(
+            queryMap["requestMetadata.trafficSource.trafficSubId"].first,
+            unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
         unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
             unittest.equals(arg_requestMetadata_userOverrides_userId));
         unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
@@ -3606,11 +3611,6 @@
         unittest.expect(
             queryMap["requestMetadata.userOverrides.ipAddress"].first,
             unittest.equals(arg_requestMetadata_userOverrides_ipAddress));
-        unittest.expect(queryMap["requestMetadata.experimentIds"],
-            unittest.equals(arg_requestMetadata_experimentIds));
-        unittest.expect(
-            queryMap["requestMetadata.trafficSource.trafficSubId"].first,
-            unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3621,6 +3621,9 @@
       }), true);
       res
           .createCompanyRelation(arg_request, arg_userId,
+              requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
+              requestMetadata_trafficSource_trafficSubId:
+                  arg_requestMetadata_trafficSource_trafficSubId,
               requestMetadata_userOverrides_userId:
                   arg_requestMetadata_userOverrides_userId,
               requestMetadata_partnersSessionId:
@@ -3630,9 +3633,6 @@
               requestMetadata_locale: arg_requestMetadata_locale,
               requestMetadata_userOverrides_ipAddress:
                   arg_requestMetadata_userOverrides_ipAddress,
-              requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
-              requestMetadata_trafficSource_trafficSubId:
-                  arg_requestMetadata_trafficSource_trafficSubId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.CompanyRelation response) {
         checkCompanyRelation(response);
@@ -3643,13 +3643,13 @@
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.PartnersApi(mock).users;
       var arg_userId = "foo";
-      var arg_requestMetadata_partnersSessionId = "foo";
-      var arg_requestMetadata_userOverrides_userId = "foo";
-      var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_requestMetadata_locale = "foo";
       var arg_requestMetadata_userOverrides_ipAddress = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2076();
+      var arg_requestMetadata_experimentIds = buildUnnamed2098();
       var arg_requestMetadata_trafficSource_trafficSubId = "foo";
+      var arg_requestMetadata_userOverrides_userId = "foo";
+      var arg_requestMetadata_partnersSessionId = "foo";
+      var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3690,13 +3690,6 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
-            unittest.equals(arg_requestMetadata_partnersSessionId));
-        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
-            unittest.equals(arg_requestMetadata_userOverrides_userId));
-        unittest.expect(
-            queryMap["requestMetadata.trafficSource.trafficSourceId"].first,
-            unittest.equals(arg_requestMetadata_trafficSource_trafficSourceId));
         unittest.expect(queryMap["requestMetadata.locale"].first,
             unittest.equals(arg_requestMetadata_locale));
         unittest.expect(
@@ -3707,6 +3700,13 @@
         unittest.expect(
             queryMap["requestMetadata.trafficSource.trafficSubId"].first,
             unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
+        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
+            unittest.equals(arg_requestMetadata_userOverrides_userId));
+        unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
+            unittest.equals(arg_requestMetadata_partnersSessionId));
+        unittest.expect(
+            queryMap["requestMetadata.trafficSource.trafficSourceId"].first,
+            unittest.equals(arg_requestMetadata_trafficSource_trafficSourceId));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3717,18 +3717,18 @@
       }), true);
       res
           .deleteCompanyRelation(arg_userId,
-              requestMetadata_partnersSessionId:
-                  arg_requestMetadata_partnersSessionId,
-              requestMetadata_userOverrides_userId:
-                  arg_requestMetadata_userOverrides_userId,
-              requestMetadata_trafficSource_trafficSourceId:
-                  arg_requestMetadata_trafficSource_trafficSourceId,
               requestMetadata_locale: arg_requestMetadata_locale,
               requestMetadata_userOverrides_ipAddress:
                   arg_requestMetadata_userOverrides_ipAddress,
               requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
               requestMetadata_trafficSource_trafficSubId:
                   arg_requestMetadata_trafficSource_trafficSubId,
+              requestMetadata_userOverrides_userId:
+                  arg_requestMetadata_userOverrides_userId,
+              requestMetadata_partnersSessionId:
+                  arg_requestMetadata_partnersSessionId,
+              requestMetadata_trafficSource_trafficSourceId:
+                  arg_requestMetadata_trafficSource_trafficSourceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
@@ -3739,14 +3739,14 @@
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.PartnersApi(mock).users;
       var arg_userId = "foo";
-      var arg_userView = "foo";
-      var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_requestMetadata_locale = "foo";
       var arg_requestMetadata_userOverrides_ipAddress = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2077();
+      var arg_requestMetadata_experimentIds = buildUnnamed2099();
       var arg_requestMetadata_trafficSource_trafficSubId = "foo";
-      var arg_requestMetadata_userOverrides_userId = "foo";
       var arg_requestMetadata_partnersSessionId = "foo";
+      var arg_requestMetadata_userOverrides_userId = "foo";
+      var arg_userView = "foo";
+      var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3781,11 +3781,6 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["userView"].first, unittest.equals(arg_userView));
-        unittest.expect(
-            queryMap["requestMetadata.trafficSource.trafficSourceId"].first,
-            unittest.equals(arg_requestMetadata_trafficSource_trafficSourceId));
         unittest.expect(queryMap["requestMetadata.locale"].first,
             unittest.equals(arg_requestMetadata_locale));
         unittest.expect(
@@ -3796,10 +3791,15 @@
         unittest.expect(
             queryMap["requestMetadata.trafficSource.trafficSubId"].first,
             unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
-        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
-            unittest.equals(arg_requestMetadata_userOverrides_userId));
         unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
             unittest.equals(arg_requestMetadata_partnersSessionId));
+        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
+            unittest.equals(arg_requestMetadata_userOverrides_userId));
+        unittest.expect(
+            queryMap["userView"].first, unittest.equals(arg_userView));
+        unittest.expect(
+            queryMap["requestMetadata.trafficSource.trafficSourceId"].first,
+            unittest.equals(arg_requestMetadata_trafficSource_trafficSourceId));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3810,19 +3810,19 @@
       }), true);
       res
           .get(arg_userId,
-              userView: arg_userView,
-              requestMetadata_trafficSource_trafficSourceId:
-                  arg_requestMetadata_trafficSource_trafficSourceId,
               requestMetadata_locale: arg_requestMetadata_locale,
               requestMetadata_userOverrides_ipAddress:
                   arg_requestMetadata_userOverrides_ipAddress,
               requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
               requestMetadata_trafficSource_trafficSubId:
                   arg_requestMetadata_trafficSource_trafficSubId,
-              requestMetadata_userOverrides_userId:
-                  arg_requestMetadata_userOverrides_userId,
               requestMetadata_partnersSessionId:
                   arg_requestMetadata_partnersSessionId,
+              requestMetadata_userOverrides_userId:
+                  arg_requestMetadata_userOverrides_userId,
+              userView: arg_userView,
+              requestMetadata_trafficSource_trafficSourceId:
+                  arg_requestMetadata_trafficSource_trafficSourceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.User response) {
         checkUser(response);
@@ -3833,13 +3833,13 @@
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.PartnersApi(mock).users;
       var arg_request = buildUserProfile();
+      var arg_requestMetadata_userOverrides_userId = "foo";
+      var arg_requestMetadata_partnersSessionId = "foo";
       var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_requestMetadata_locale = "foo";
       var arg_requestMetadata_userOverrides_ipAddress = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2078();
+      var arg_requestMetadata_experimentIds = buildUnnamed2100();
       var arg_requestMetadata_trafficSource_trafficSubId = "foo";
-      var arg_requestMetadata_partnersSessionId = "foo";
-      var arg_requestMetadata_userOverrides_userId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.UserProfile.fromJson(json);
@@ -3874,6 +3874,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
+            unittest.equals(arg_requestMetadata_userOverrides_userId));
+        unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
+            unittest.equals(arg_requestMetadata_partnersSessionId));
         unittest.expect(
             queryMap["requestMetadata.trafficSource.trafficSourceId"].first,
             unittest.equals(arg_requestMetadata_trafficSource_trafficSourceId));
@@ -3887,10 +3891,6 @@
         unittest.expect(
             queryMap["requestMetadata.trafficSource.trafficSubId"].first,
             unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
-        unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
-            unittest.equals(arg_requestMetadata_partnersSessionId));
-        unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
-            unittest.equals(arg_requestMetadata_userOverrides_userId));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3901,6 +3901,10 @@
       }), true);
       res
           .updateProfile(arg_request,
+              requestMetadata_userOverrides_userId:
+                  arg_requestMetadata_userOverrides_userId,
+              requestMetadata_partnersSessionId:
+                  arg_requestMetadata_partnersSessionId,
               requestMetadata_trafficSource_trafficSourceId:
                   arg_requestMetadata_trafficSource_trafficSourceId,
               requestMetadata_locale: arg_requestMetadata_locale,
@@ -3909,10 +3913,6 @@
               requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
               requestMetadata_trafficSource_trafficSubId:
                   arg_requestMetadata_trafficSource_trafficSubId,
-              requestMetadata_partnersSessionId:
-                  arg_requestMetadata_partnersSessionId,
-              requestMetadata_userOverrides_userId:
-                  arg_requestMetadata_userOverrides_userId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.UserProfile response) {
         checkUserProfile(response);
@@ -3929,7 +3929,7 @@
       var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_requestMetadata_locale = "foo";
       var arg_requestMetadata_userOverrides_ipAddress = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2079();
+      var arg_requestMetadata_experimentIds = buildUnnamed2101();
       var arg_requestMetadata_trafficSource_trafficSubId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4018,7 +4018,7 @@
       var arg_requestMetadata_locale = "foo";
       var arg_requestMetadata_userOverrides_ipAddress = "foo";
       var arg_updateMask = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2080();
+      var arg_requestMetadata_experimentIds = buildUnnamed2102();
       var arg_requestMetadata_trafficSource_trafficSubId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4106,14 +4106,14 @@
       var mock = new HttpServerMock();
       api.V2ResourceApi res = new api.PartnersApi(mock).v2;
       var arg_request = buildLead();
+      var arg_requestMetadata_experimentIds = buildUnnamed2103();
+      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
       var arg_requestMetadata_userOverrides_userId = "foo";
       var arg_requestMetadata_partnersSessionId = "foo";
       var arg_requestMetadata_trafficSource_trafficSourceId = "foo";
       var arg_requestMetadata_locale = "foo";
       var arg_requestMetadata_userOverrides_ipAddress = "foo";
       var arg_updateMask = "foo";
-      var arg_requestMetadata_experimentIds = buildUnnamed2081();
-      var arg_requestMetadata_trafficSource_trafficSubId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.Lead.fromJson(json);
@@ -4148,6 +4148,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["requestMetadata.experimentIds"],
+            unittest.equals(arg_requestMetadata_experimentIds));
+        unittest.expect(
+            queryMap["requestMetadata.trafficSource.trafficSubId"].first,
+            unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
         unittest.expect(queryMap["requestMetadata.userOverrides.userId"].first,
             unittest.equals(arg_requestMetadata_userOverrides_userId));
         unittest.expect(queryMap["requestMetadata.partnersSessionId"].first,
@@ -4162,11 +4167,6 @@
             unittest.equals(arg_requestMetadata_userOverrides_ipAddress));
         unittest.expect(
             queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-        unittest.expect(queryMap["requestMetadata.experimentIds"],
-            unittest.equals(arg_requestMetadata_experimentIds));
-        unittest.expect(
-            queryMap["requestMetadata.trafficSource.trafficSubId"].first,
-            unittest.equals(arg_requestMetadata_trafficSource_trafficSubId));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -4177,6 +4177,9 @@
       }), true);
       res
           .updateLeads(arg_request,
+              requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
+              requestMetadata_trafficSource_trafficSubId:
+                  arg_requestMetadata_trafficSource_trafficSubId,
               requestMetadata_userOverrides_userId:
                   arg_requestMetadata_userOverrides_userId,
               requestMetadata_partnersSessionId:
@@ -4187,9 +4190,6 @@
               requestMetadata_userOverrides_ipAddress:
                   arg_requestMetadata_userOverrides_ipAddress,
               updateMask: arg_updateMask,
-              requestMetadata_experimentIds: arg_requestMetadata_experimentIds,
-              requestMetadata_trafficSource_trafficSubId:
-                  arg_requestMetadata_trafficSource_trafficSubId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.Lead response) {
         checkLead(response);
diff --git a/generated/googleapis/test/people/v1_test.dart b/generated/googleapis/test/people/v1_test.dart
index 2b9c5e0..55f4ff9 100644
--- a/generated/googleapis/test/people/v1_test.dart
+++ b/generated/googleapis/test/people/v1_test.dart
@@ -112,14 +112,14 @@
   buildCounterAgeRangeType--;
 }
 
-buildUnnamed1497() {
+buildUnnamed1514() {
   var o = new core.List<api.ContactGroupResponse>();
   o.add(buildContactGroupResponse());
   o.add(buildContactGroupResponse());
   return o;
 }
 
-checkUnnamed1497(core.List<api.ContactGroupResponse> o) {
+checkUnnamed1514(core.List<api.ContactGroupResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContactGroupResponse(o[0]);
   checkContactGroupResponse(o[1]);
@@ -130,7 +130,7 @@
   var o = new api.BatchGetContactGroupsResponse();
   buildCounterBatchGetContactGroupsResponse++;
   if (buildCounterBatchGetContactGroupsResponse < 3) {
-    o.responses = buildUnnamed1497();
+    o.responses = buildUnnamed1514();
   }
   buildCounterBatchGetContactGroupsResponse--;
   return o;
@@ -139,7 +139,7 @@
 checkBatchGetContactGroupsResponse(api.BatchGetContactGroupsResponse o) {
   buildCounterBatchGetContactGroupsResponse++;
   if (buildCounterBatchGetContactGroupsResponse < 3) {
-    checkUnnamed1497(o.responses);
+    checkUnnamed1514(o.responses);
   }
   buildCounterBatchGetContactGroupsResponse--;
 }
@@ -211,14 +211,14 @@
   buildCounterBraggingRights--;
 }
 
-buildUnnamed1498() {
+buildUnnamed1515() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1498(core.List<core.String> o) {
+checkUnnamed1515(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -233,7 +233,7 @@
     o.formattedName = "foo";
     o.groupType = "foo";
     o.memberCount = 42;
-    o.memberResourceNames = buildUnnamed1498();
+    o.memberResourceNames = buildUnnamed1515();
     o.metadata = buildContactGroupMetadata();
     o.name = "foo";
     o.resourceName = "foo";
@@ -249,7 +249,7 @@
     unittest.expect(o.formattedName, unittest.equals('foo'));
     unittest.expect(o.groupType, unittest.equals('foo'));
     unittest.expect(o.memberCount, unittest.equals(42));
-    checkUnnamed1498(o.memberResourceNames);
+    checkUnnamed1515(o.memberResourceNames);
     checkContactGroupMetadata(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.resourceName, unittest.equals('foo'));
@@ -517,14 +517,14 @@
   buildCounterGender--;
 }
 
-buildUnnamed1499() {
+buildUnnamed1516() {
   var o = new core.List<api.PersonResponse>();
   o.add(buildPersonResponse());
   o.add(buildPersonResponse());
   return o;
 }
 
-checkUnnamed1499(core.List<api.PersonResponse> o) {
+checkUnnamed1516(core.List<api.PersonResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonResponse(o[0]);
   checkPersonResponse(o[1]);
@@ -535,7 +535,7 @@
   var o = new api.GetPeopleResponse();
   buildCounterGetPeopleResponse++;
   if (buildCounterGetPeopleResponse < 3) {
-    o.responses = buildUnnamed1499();
+    o.responses = buildUnnamed1516();
   }
   buildCounterGetPeopleResponse--;
   return o;
@@ -544,7 +544,7 @@
 checkGetPeopleResponse(api.GetPeopleResponse o) {
   buildCounterGetPeopleResponse++;
   if (buildCounterGetPeopleResponse < 3) {
-    checkUnnamed1499(o.responses);
+    checkUnnamed1516(o.responses);
   }
   buildCounterGetPeopleResponse--;
 }
@@ -599,14 +599,14 @@
   buildCounterInterest--;
 }
 
-buildUnnamed1500() {
+buildUnnamed1517() {
   var o = new core.List<api.Person>();
   o.add(buildPerson());
   o.add(buildPerson());
   return o;
 }
 
-checkUnnamed1500(core.List<api.Person> o) {
+checkUnnamed1517(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerson(o[0]);
   checkPerson(o[1]);
@@ -617,7 +617,7 @@
   var o = new api.ListConnectionsResponse();
   buildCounterListConnectionsResponse++;
   if (buildCounterListConnectionsResponse < 3) {
-    o.connections = buildUnnamed1500();
+    o.connections = buildUnnamed1517();
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
     o.totalItems = 42;
@@ -630,7 +630,7 @@
 checkListConnectionsResponse(api.ListConnectionsResponse o) {
   buildCounterListConnectionsResponse++;
   if (buildCounterListConnectionsResponse < 3) {
-    checkUnnamed1500(o.connections);
+    checkUnnamed1517(o.connections);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -639,14 +639,14 @@
   buildCounterListConnectionsResponse--;
 }
 
-buildUnnamed1501() {
+buildUnnamed1518() {
   var o = new core.List<api.ContactGroup>();
   o.add(buildContactGroup());
   o.add(buildContactGroup());
   return o;
 }
 
-checkUnnamed1501(core.List<api.ContactGroup> o) {
+checkUnnamed1518(core.List<api.ContactGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContactGroup(o[0]);
   checkContactGroup(o[1]);
@@ -657,7 +657,7 @@
   var o = new api.ListContactGroupsResponse();
   buildCounterListContactGroupsResponse++;
   if (buildCounterListContactGroupsResponse < 3) {
-    o.contactGroups = buildUnnamed1501();
+    o.contactGroups = buildUnnamed1518();
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
     o.totalItems = 42;
@@ -669,7 +669,7 @@
 checkListContactGroupsResponse(api.ListContactGroupsResponse o) {
   buildCounterListContactGroupsResponse++;
   if (buildCounterListContactGroupsResponse < 3) {
-    checkUnnamed1501(o.contactGroups);
+    checkUnnamed1518(o.contactGroups);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -721,27 +721,27 @@
   buildCounterMembership--;
 }
 
-buildUnnamed1502() {
+buildUnnamed1519() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1502(core.List<core.String> o) {
+checkUnnamed1519(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1503() {
+buildUnnamed1520() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1503(core.List<core.String> o) {
+checkUnnamed1520(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -752,8 +752,8 @@
   var o = new api.ModifyContactGroupMembersRequest();
   buildCounterModifyContactGroupMembersRequest++;
   if (buildCounterModifyContactGroupMembersRequest < 3) {
-    o.resourceNamesToAdd = buildUnnamed1502();
-    o.resourceNamesToRemove = buildUnnamed1503();
+    o.resourceNamesToAdd = buildUnnamed1519();
+    o.resourceNamesToRemove = buildUnnamed1520();
   }
   buildCounterModifyContactGroupMembersRequest--;
   return o;
@@ -762,20 +762,20 @@
 checkModifyContactGroupMembersRequest(api.ModifyContactGroupMembersRequest o) {
   buildCounterModifyContactGroupMembersRequest++;
   if (buildCounterModifyContactGroupMembersRequest < 3) {
-    checkUnnamed1502(o.resourceNamesToAdd);
-    checkUnnamed1503(o.resourceNamesToRemove);
+    checkUnnamed1519(o.resourceNamesToAdd);
+    checkUnnamed1520(o.resourceNamesToRemove);
   }
   buildCounterModifyContactGroupMembersRequest--;
 }
 
-buildUnnamed1504() {
+buildUnnamed1521() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1504(core.List<core.String> o) {
+checkUnnamed1521(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -786,7 +786,7 @@
   var o = new api.ModifyContactGroupMembersResponse();
   buildCounterModifyContactGroupMembersResponse++;
   if (buildCounterModifyContactGroupMembersResponse < 3) {
-    o.notFoundResourceNames = buildUnnamed1504();
+    o.notFoundResourceNames = buildUnnamed1521();
   }
   buildCounterModifyContactGroupMembersResponse--;
   return o;
@@ -796,7 +796,7 @@
     api.ModifyContactGroupMembersResponse o) {
   buildCounterModifyContactGroupMembersResponse++;
   if (buildCounterModifyContactGroupMembersResponse < 3) {
-    checkUnnamed1504(o.notFoundResourceNames);
+    checkUnnamed1521(o.notFoundResourceNames);
   }
   buildCounterModifyContactGroupMembersResponse--;
 }
@@ -935,352 +935,352 @@
   buildCounterOrganization--;
 }
 
-buildUnnamed1505() {
+buildUnnamed1522() {
   var o = new core.List<api.Address>();
   o.add(buildAddress());
   o.add(buildAddress());
   return o;
 }
 
-checkUnnamed1505(core.List<api.Address> o) {
+checkUnnamed1522(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddress(o[0]);
   checkAddress(o[1]);
 }
 
-buildUnnamed1506() {
+buildUnnamed1523() {
   var o = new core.List<api.AgeRangeType>();
   o.add(buildAgeRangeType());
   o.add(buildAgeRangeType());
   return o;
 }
 
-checkUnnamed1506(core.List<api.AgeRangeType> o) {
+checkUnnamed1523(core.List<api.AgeRangeType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAgeRangeType(o[0]);
   checkAgeRangeType(o[1]);
 }
 
-buildUnnamed1507() {
+buildUnnamed1524() {
   var o = new core.List<api.Biography>();
   o.add(buildBiography());
   o.add(buildBiography());
   return o;
 }
 
-checkUnnamed1507(core.List<api.Biography> o) {
+checkUnnamed1524(core.List<api.Biography> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBiography(o[0]);
   checkBiography(o[1]);
 }
 
-buildUnnamed1508() {
+buildUnnamed1525() {
   var o = new core.List<api.Birthday>();
   o.add(buildBirthday());
   o.add(buildBirthday());
   return o;
 }
 
-checkUnnamed1508(core.List<api.Birthday> o) {
+checkUnnamed1525(core.List<api.Birthday> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBirthday(o[0]);
   checkBirthday(o[1]);
 }
 
-buildUnnamed1509() {
+buildUnnamed1526() {
   var o = new core.List<api.BraggingRights>();
   o.add(buildBraggingRights());
   o.add(buildBraggingRights());
   return o;
 }
 
-checkUnnamed1509(core.List<api.BraggingRights> o) {
+checkUnnamed1526(core.List<api.BraggingRights> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBraggingRights(o[0]);
   checkBraggingRights(o[1]);
 }
 
-buildUnnamed1510() {
+buildUnnamed1527() {
   var o = new core.List<api.CoverPhoto>();
   o.add(buildCoverPhoto());
   o.add(buildCoverPhoto());
   return o;
 }
 
-checkUnnamed1510(core.List<api.CoverPhoto> o) {
+checkUnnamed1527(core.List<api.CoverPhoto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCoverPhoto(o[0]);
   checkCoverPhoto(o[1]);
 }
 
-buildUnnamed1511() {
+buildUnnamed1528() {
   var o = new core.List<api.EmailAddress>();
   o.add(buildEmailAddress());
   o.add(buildEmailAddress());
   return o;
 }
 
-checkUnnamed1511(core.List<api.EmailAddress> o) {
+checkUnnamed1528(core.List<api.EmailAddress> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEmailAddress(o[0]);
   checkEmailAddress(o[1]);
 }
 
-buildUnnamed1512() {
+buildUnnamed1529() {
   var o = new core.List<api.Event>();
   o.add(buildEvent());
   o.add(buildEvent());
   return o;
 }
 
-checkUnnamed1512(core.List<api.Event> o) {
+checkUnnamed1529(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEvent(o[0]);
   checkEvent(o[1]);
 }
 
-buildUnnamed1513() {
+buildUnnamed1530() {
   var o = new core.List<api.Gender>();
   o.add(buildGender());
   o.add(buildGender());
   return o;
 }
 
-checkUnnamed1513(core.List<api.Gender> o) {
+checkUnnamed1530(core.List<api.Gender> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGender(o[0]);
   checkGender(o[1]);
 }
 
-buildUnnamed1514() {
+buildUnnamed1531() {
   var o = new core.List<api.ImClient>();
   o.add(buildImClient());
   o.add(buildImClient());
   return o;
 }
 
-checkUnnamed1514(core.List<api.ImClient> o) {
+checkUnnamed1531(core.List<api.ImClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImClient(o[0]);
   checkImClient(o[1]);
 }
 
-buildUnnamed1515() {
+buildUnnamed1532() {
   var o = new core.List<api.Interest>();
   o.add(buildInterest());
   o.add(buildInterest());
   return o;
 }
 
-checkUnnamed1515(core.List<api.Interest> o) {
+checkUnnamed1532(core.List<api.Interest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInterest(o[0]);
   checkInterest(o[1]);
 }
 
-buildUnnamed1516() {
+buildUnnamed1533() {
   var o = new core.List<api.Locale>();
   o.add(buildLocale());
   o.add(buildLocale());
   return o;
 }
 
-checkUnnamed1516(core.List<api.Locale> o) {
+checkUnnamed1533(core.List<api.Locale> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocale(o[0]);
   checkLocale(o[1]);
 }
 
-buildUnnamed1517() {
+buildUnnamed1534() {
   var o = new core.List<api.Membership>();
   o.add(buildMembership());
   o.add(buildMembership());
   return o;
 }
 
-checkUnnamed1517(core.List<api.Membership> o) {
+checkUnnamed1534(core.List<api.Membership> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMembership(o[0]);
   checkMembership(o[1]);
 }
 
-buildUnnamed1518() {
+buildUnnamed1535() {
   var o = new core.List<api.Name>();
   o.add(buildName());
   o.add(buildName());
   return o;
 }
 
-checkUnnamed1518(core.List<api.Name> o) {
+checkUnnamed1535(core.List<api.Name> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkName(o[0]);
   checkName(o[1]);
 }
 
-buildUnnamed1519() {
+buildUnnamed1536() {
   var o = new core.List<api.Nickname>();
   o.add(buildNickname());
   o.add(buildNickname());
   return o;
 }
 
-checkUnnamed1519(core.List<api.Nickname> o) {
+checkUnnamed1536(core.List<api.Nickname> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNickname(o[0]);
   checkNickname(o[1]);
 }
 
-buildUnnamed1520() {
+buildUnnamed1537() {
   var o = new core.List<api.Occupation>();
   o.add(buildOccupation());
   o.add(buildOccupation());
   return o;
 }
 
-checkUnnamed1520(core.List<api.Occupation> o) {
+checkUnnamed1537(core.List<api.Occupation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOccupation(o[0]);
   checkOccupation(o[1]);
 }
 
-buildUnnamed1521() {
+buildUnnamed1538() {
   var o = new core.List<api.Organization>();
   o.add(buildOrganization());
   o.add(buildOrganization());
   return o;
 }
 
-checkUnnamed1521(core.List<api.Organization> o) {
+checkUnnamed1538(core.List<api.Organization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrganization(o[0]);
   checkOrganization(o[1]);
 }
 
-buildUnnamed1522() {
+buildUnnamed1539() {
   var o = new core.List<api.PhoneNumber>();
   o.add(buildPhoneNumber());
   o.add(buildPhoneNumber());
   return o;
 }
 
-checkUnnamed1522(core.List<api.PhoneNumber> o) {
+checkUnnamed1539(core.List<api.PhoneNumber> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPhoneNumber(o[0]);
   checkPhoneNumber(o[1]);
 }
 
-buildUnnamed1523() {
+buildUnnamed1540() {
   var o = new core.List<api.Photo>();
   o.add(buildPhoto());
   o.add(buildPhoto());
   return o;
 }
 
-checkUnnamed1523(core.List<api.Photo> o) {
+checkUnnamed1540(core.List<api.Photo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPhoto(o[0]);
   checkPhoto(o[1]);
 }
 
-buildUnnamed1524() {
+buildUnnamed1541() {
   var o = new core.List<api.Relation>();
   o.add(buildRelation());
   o.add(buildRelation());
   return o;
 }
 
-checkUnnamed1524(core.List<api.Relation> o) {
+checkUnnamed1541(core.List<api.Relation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRelation(o[0]);
   checkRelation(o[1]);
 }
 
-buildUnnamed1525() {
+buildUnnamed1542() {
   var o = new core.List<api.RelationshipInterest>();
   o.add(buildRelationshipInterest());
   o.add(buildRelationshipInterest());
   return o;
 }
 
-checkUnnamed1525(core.List<api.RelationshipInterest> o) {
+checkUnnamed1542(core.List<api.RelationshipInterest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRelationshipInterest(o[0]);
   checkRelationshipInterest(o[1]);
 }
 
-buildUnnamed1526() {
+buildUnnamed1543() {
   var o = new core.List<api.RelationshipStatus>();
   o.add(buildRelationshipStatus());
   o.add(buildRelationshipStatus());
   return o;
 }
 
-checkUnnamed1526(core.List<api.RelationshipStatus> o) {
+checkUnnamed1543(core.List<api.RelationshipStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRelationshipStatus(o[0]);
   checkRelationshipStatus(o[1]);
 }
 
-buildUnnamed1527() {
+buildUnnamed1544() {
   var o = new core.List<api.Residence>();
   o.add(buildResidence());
   o.add(buildResidence());
   return o;
 }
 
-checkUnnamed1527(core.List<api.Residence> o) {
+checkUnnamed1544(core.List<api.Residence> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResidence(o[0]);
   checkResidence(o[1]);
 }
 
-buildUnnamed1528() {
+buildUnnamed1545() {
   var o = new core.List<api.Skill>();
   o.add(buildSkill());
   o.add(buildSkill());
   return o;
 }
 
-checkUnnamed1528(core.List<api.Skill> o) {
+checkUnnamed1545(core.List<api.Skill> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSkill(o[0]);
   checkSkill(o[1]);
 }
 
-buildUnnamed1529() {
+buildUnnamed1546() {
   var o = new core.List<api.Tagline>();
   o.add(buildTagline());
   o.add(buildTagline());
   return o;
 }
 
-checkUnnamed1529(core.List<api.Tagline> o) {
+checkUnnamed1546(core.List<api.Tagline> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTagline(o[0]);
   checkTagline(o[1]);
 }
 
-buildUnnamed1530() {
+buildUnnamed1547() {
   var o = new core.List<api.Url>();
   o.add(buildUrl());
   o.add(buildUrl());
   return o;
 }
 
-checkUnnamed1530(core.List<api.Url> o) {
+checkUnnamed1547(core.List<api.Url> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrl(o[0]);
   checkUrl(o[1]);
 }
 
-buildUnnamed1531() {
+buildUnnamed1548() {
   var o = new core.List<api.UserDefined>();
   o.add(buildUserDefined());
   o.add(buildUserDefined());
   return o;
 }
 
-checkUnnamed1531(core.List<api.UserDefined> o) {
+checkUnnamed1548(core.List<api.UserDefined> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserDefined(o[0]);
   checkUserDefined(o[1]);
@@ -1291,37 +1291,37 @@
   var o = new api.Person();
   buildCounterPerson++;
   if (buildCounterPerson < 3) {
-    o.addresses = buildUnnamed1505();
+    o.addresses = buildUnnamed1522();
     o.ageRange = "foo";
-    o.ageRanges = buildUnnamed1506();
-    o.biographies = buildUnnamed1507();
-    o.birthdays = buildUnnamed1508();
-    o.braggingRights = buildUnnamed1509();
-    o.coverPhotos = buildUnnamed1510();
-    o.emailAddresses = buildUnnamed1511();
+    o.ageRanges = buildUnnamed1523();
+    o.biographies = buildUnnamed1524();
+    o.birthdays = buildUnnamed1525();
+    o.braggingRights = buildUnnamed1526();
+    o.coverPhotos = buildUnnamed1527();
+    o.emailAddresses = buildUnnamed1528();
     o.etag = "foo";
-    o.events = buildUnnamed1512();
-    o.genders = buildUnnamed1513();
-    o.imClients = buildUnnamed1514();
-    o.interests = buildUnnamed1515();
-    o.locales = buildUnnamed1516();
-    o.memberships = buildUnnamed1517();
+    o.events = buildUnnamed1529();
+    o.genders = buildUnnamed1530();
+    o.imClients = buildUnnamed1531();
+    o.interests = buildUnnamed1532();
+    o.locales = buildUnnamed1533();
+    o.memberships = buildUnnamed1534();
     o.metadata = buildPersonMetadata();
-    o.names = buildUnnamed1518();
-    o.nicknames = buildUnnamed1519();
-    o.occupations = buildUnnamed1520();
-    o.organizations = buildUnnamed1521();
-    o.phoneNumbers = buildUnnamed1522();
-    o.photos = buildUnnamed1523();
-    o.relations = buildUnnamed1524();
-    o.relationshipInterests = buildUnnamed1525();
-    o.relationshipStatuses = buildUnnamed1526();
-    o.residences = buildUnnamed1527();
+    o.names = buildUnnamed1535();
+    o.nicknames = buildUnnamed1536();
+    o.occupations = buildUnnamed1537();
+    o.organizations = buildUnnamed1538();
+    o.phoneNumbers = buildUnnamed1539();
+    o.photos = buildUnnamed1540();
+    o.relations = buildUnnamed1541();
+    o.relationshipInterests = buildUnnamed1542();
+    o.relationshipStatuses = buildUnnamed1543();
+    o.residences = buildUnnamed1544();
     o.resourceName = "foo";
-    o.skills = buildUnnamed1528();
-    o.taglines = buildUnnamed1529();
-    o.urls = buildUnnamed1530();
-    o.userDefined = buildUnnamed1531();
+    o.skills = buildUnnamed1545();
+    o.taglines = buildUnnamed1546();
+    o.urls = buildUnnamed1547();
+    o.userDefined = buildUnnamed1548();
   }
   buildCounterPerson--;
   return o;
@@ -1330,75 +1330,75 @@
 checkPerson(api.Person o) {
   buildCounterPerson++;
   if (buildCounterPerson < 3) {
-    checkUnnamed1505(o.addresses);
+    checkUnnamed1522(o.addresses);
     unittest.expect(o.ageRange, unittest.equals('foo'));
-    checkUnnamed1506(o.ageRanges);
-    checkUnnamed1507(o.biographies);
-    checkUnnamed1508(o.birthdays);
-    checkUnnamed1509(o.braggingRights);
-    checkUnnamed1510(o.coverPhotos);
-    checkUnnamed1511(o.emailAddresses);
+    checkUnnamed1523(o.ageRanges);
+    checkUnnamed1524(o.biographies);
+    checkUnnamed1525(o.birthdays);
+    checkUnnamed1526(o.braggingRights);
+    checkUnnamed1527(o.coverPhotos);
+    checkUnnamed1528(o.emailAddresses);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1512(o.events);
-    checkUnnamed1513(o.genders);
-    checkUnnamed1514(o.imClients);
-    checkUnnamed1515(o.interests);
-    checkUnnamed1516(o.locales);
-    checkUnnamed1517(o.memberships);
+    checkUnnamed1529(o.events);
+    checkUnnamed1530(o.genders);
+    checkUnnamed1531(o.imClients);
+    checkUnnamed1532(o.interests);
+    checkUnnamed1533(o.locales);
+    checkUnnamed1534(o.memberships);
     checkPersonMetadata(o.metadata);
-    checkUnnamed1518(o.names);
-    checkUnnamed1519(o.nicknames);
-    checkUnnamed1520(o.occupations);
-    checkUnnamed1521(o.organizations);
-    checkUnnamed1522(o.phoneNumbers);
-    checkUnnamed1523(o.photos);
-    checkUnnamed1524(o.relations);
-    checkUnnamed1525(o.relationshipInterests);
-    checkUnnamed1526(o.relationshipStatuses);
-    checkUnnamed1527(o.residences);
+    checkUnnamed1535(o.names);
+    checkUnnamed1536(o.nicknames);
+    checkUnnamed1537(o.occupations);
+    checkUnnamed1538(o.organizations);
+    checkUnnamed1539(o.phoneNumbers);
+    checkUnnamed1540(o.photos);
+    checkUnnamed1541(o.relations);
+    checkUnnamed1542(o.relationshipInterests);
+    checkUnnamed1543(o.relationshipStatuses);
+    checkUnnamed1544(o.residences);
     unittest.expect(o.resourceName, unittest.equals('foo'));
-    checkUnnamed1528(o.skills);
-    checkUnnamed1529(o.taglines);
-    checkUnnamed1530(o.urls);
-    checkUnnamed1531(o.userDefined);
+    checkUnnamed1545(o.skills);
+    checkUnnamed1546(o.taglines);
+    checkUnnamed1547(o.urls);
+    checkUnnamed1548(o.userDefined);
   }
   buildCounterPerson--;
 }
 
-buildUnnamed1532() {
+buildUnnamed1549() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1532(core.List<core.String> o) {
+checkUnnamed1549(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1533() {
+buildUnnamed1550() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1533(core.List<core.String> o) {
+checkUnnamed1550(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1534() {
+buildUnnamed1551() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed1534(core.List<api.Source> o) {
+checkUnnamed1551(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -1410,10 +1410,10 @@
   buildCounterPersonMetadata++;
   if (buildCounterPersonMetadata < 3) {
     o.deleted = true;
-    o.linkedPeopleResourceNames = buildUnnamed1532();
+    o.linkedPeopleResourceNames = buildUnnamed1549();
     o.objectType = "foo";
-    o.previousResourceNames = buildUnnamed1533();
-    o.sources = buildUnnamed1534();
+    o.previousResourceNames = buildUnnamed1550();
+    o.sources = buildUnnamed1551();
   }
   buildCounterPersonMetadata--;
   return o;
@@ -1423,10 +1423,10 @@
   buildCounterPersonMetadata++;
   if (buildCounterPersonMetadata < 3) {
     unittest.expect(o.deleted, unittest.isTrue);
-    checkUnnamed1532(o.linkedPeopleResourceNames);
+    checkUnnamed1549(o.linkedPeopleResourceNames);
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkUnnamed1533(o.previousResourceNames);
-    checkUnnamed1534(o.sources);
+    checkUnnamed1550(o.previousResourceNames);
+    checkUnnamed1551(o.sources);
   }
   buildCounterPersonMetadata--;
 }
@@ -1506,14 +1506,14 @@
   buildCounterPhoto--;
 }
 
-buildUnnamed1535() {
+buildUnnamed1552() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1535(core.List<core.String> o) {
+checkUnnamed1552(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1525,7 +1525,7 @@
   buildCounterProfileMetadata++;
   if (buildCounterProfileMetadata < 3) {
     o.objectType = "foo";
-    o.userTypes = buildUnnamed1535();
+    o.userTypes = buildUnnamed1552();
   }
   buildCounterProfileMetadata--;
   return o;
@@ -1535,7 +1535,7 @@
   buildCounterProfileMetadata++;
   if (buildCounterProfileMetadata < 3) {
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkUnnamed1535(o.userTypes);
+    checkUnnamed1552(o.userTypes);
   }
   buildCounterProfileMetadata--;
 }
@@ -1682,7 +1682,7 @@
   buildCounterSource--;
 }
 
-buildUnnamed1536() {
+buildUnnamed1553() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1697,7 +1697,7 @@
   return o;
 }
 
-checkUnnamed1536(core.Map<core.String, core.Object> o) {
+checkUnnamed1553(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));
@@ -1711,17 +1711,17 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1537() {
+buildUnnamed1554() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1536());
-  o.add(buildUnnamed1536());
+  o.add(buildUnnamed1553());
+  o.add(buildUnnamed1553());
   return o;
 }
 
-checkUnnamed1537(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1554(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1536(o[0]);
-  checkUnnamed1536(o[1]);
+  checkUnnamed1553(o[0]);
+  checkUnnamed1553(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1730,7 +1730,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1537();
+    o.details = buildUnnamed1554();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1741,7 +1741,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1537(o.details);
+    checkUnnamed1554(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -1835,27 +1835,27 @@
   buildCounterUserDefined--;
 }
 
-buildUnnamed1538() {
+buildUnnamed1555() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1538(core.List<core.String> o) {
+checkUnnamed1555(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1539() {
+buildUnnamed1556() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1539(core.List<core.String> o) {
+checkUnnamed1556(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2259,7 +2259,7 @@
       var mock = new HttpServerMock();
       api.ContactGroupsResourceApi res = new api.PeopleApi(mock).contactGroups;
       var arg_maxMembers = 42;
-      var arg_resourceNames = buildUnnamed1538();
+      var arg_resourceNames = buildUnnamed1555();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2825,9 +2825,9 @@
     unittest.test("method--getBatchGet", () {
       var mock = new HttpServerMock();
       api.PeopleResourceApi res = new api.PeopleApi(mock).people;
-      var arg_requestMask_includeField = "foo";
-      var arg_resourceNames = buildUnnamed1539();
       var arg_personFields = "foo";
+      var arg_requestMask_includeField = "foo";
+      var arg_resourceNames = buildUnnamed1556();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2859,12 +2859,12 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(
+            queryMap["personFields"].first, unittest.equals(arg_personFields));
         unittest.expect(queryMap["requestMask.includeField"].first,
             unittest.equals(arg_requestMask_includeField));
         unittest.expect(
             queryMap["resourceNames"], unittest.equals(arg_resourceNames));
-        unittest.expect(
-            queryMap["personFields"].first, unittest.equals(arg_personFields));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2875,9 +2875,9 @@
       }), true);
       res
           .getBatchGet(
+              personFields: arg_personFields,
               requestMask_includeField: arg_requestMask_includeField,
               resourceNames: arg_resourceNames,
-              personFields: arg_personFields,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.GetPeopleResponse response) {
         checkGetPeopleResponse(response);
diff --git a/generated/googleapis/test/plus/v1_test.dart b/generated/googleapis/test/plus/v1_test.dart
index 95ae368..d05b6a2 100644
--- a/generated/googleapis/test/plus/v1_test.dart
+++ b/generated/googleapis/test/plus/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed138() {
+buildUnnamed132() {
   var o = new core.List<api.PlusAclentryResource>();
   o.add(buildPlusAclentryResource());
   o.add(buildPlusAclentryResource());
   return o;
 }
 
-checkUnnamed138(core.List<api.PlusAclentryResource> o) {
+checkUnnamed132(core.List<api.PlusAclentryResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlusAclentryResource(o[0]);
   checkPlusAclentryResource(o[1]);
@@ -69,7 +69,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     o.description = "foo";
-    o.items = buildUnnamed138();
+    o.items = buildUnnamed132();
     o.kind = "foo";
   }
   buildCounterAcl--;
@@ -80,7 +80,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed138(o.items);
+    checkUnnamed132(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAcl--;
@@ -453,14 +453,14 @@
   buildCounterActivityObjectAttachmentsThumbnails--;
 }
 
-buildUnnamed139() {
+buildUnnamed133() {
   var o = new core.List<api.ActivityObjectAttachmentsThumbnails>();
   o.add(buildActivityObjectAttachmentsThumbnails());
   o.add(buildActivityObjectAttachmentsThumbnails());
   return o;
 }
 
-checkUnnamed139(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
+checkUnnamed133(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsThumbnails(o[0]);
   checkActivityObjectAttachmentsThumbnails(o[1]);
@@ -478,7 +478,7 @@
     o.id = "foo";
     o.image = buildActivityObjectAttachmentsImage();
     o.objectType = "foo";
-    o.thumbnails = buildUnnamed139();
+    o.thumbnails = buildUnnamed133();
     o.url = "foo";
   }
   buildCounterActivityObjectAttachments--;
@@ -495,20 +495,20 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkActivityObjectAttachmentsImage(o.image);
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkUnnamed139(o.thumbnails);
+    checkUnnamed133(o.thumbnails);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterActivityObjectAttachments--;
 }
 
-buildUnnamed140() {
+buildUnnamed134() {
   var o = new core.List<api.ActivityObjectAttachments>();
   o.add(buildActivityObjectAttachments());
   o.add(buildActivityObjectAttachments());
   return o;
 }
 
-checkUnnamed140(core.List<api.ActivityObjectAttachments> o) {
+checkUnnamed134(core.List<api.ActivityObjectAttachments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachments(o[0]);
   checkActivityObjectAttachments(o[1]);
@@ -583,7 +583,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     o.actor = buildActivityObjectActor();
-    o.attachments = buildUnnamed140();
+    o.attachments = buildUnnamed134();
     o.content = "foo";
     o.id = "foo";
     o.objectType = "foo";
@@ -601,7 +601,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     checkActivityObjectActor(o.actor);
-    checkUnnamed140(o.attachments);
+    checkUnnamed134(o.attachments);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
@@ -692,14 +692,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed141() {
+buildUnnamed135() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed141(core.List<api.Activity> o) {
+checkUnnamed135(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -712,7 +712,7 @@
   if (buildCounterActivityFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed141();
+    o.items = buildUnnamed135();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -729,7 +729,7 @@
   if (buildCounterActivityFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed141(o.items);
+    checkUnnamed135(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -871,14 +871,14 @@
   buildCounterCommentInReplyTo--;
 }
 
-buildUnnamed142() {
+buildUnnamed136() {
   var o = new core.List<api.CommentInReplyTo>();
   o.add(buildCommentInReplyTo());
   o.add(buildCommentInReplyTo());
   return o;
 }
 
-checkUnnamed142(core.List<api.CommentInReplyTo> o) {
+checkUnnamed136(core.List<api.CommentInReplyTo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentInReplyTo(o[0]);
   checkCommentInReplyTo(o[1]);
@@ -934,7 +934,7 @@
     o.actor = buildCommentActor();
     o.etag = "foo";
     o.id = "foo";
-    o.inReplyTo = buildUnnamed142();
+    o.inReplyTo = buildUnnamed136();
     o.kind = "foo";
     o.object = buildCommentObject();
     o.plusoners = buildCommentPlusoners();
@@ -953,7 +953,7 @@
     checkCommentActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed142(o.inReplyTo);
+    checkUnnamed136(o.inReplyTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkCommentObject(o.object);
     checkCommentPlusoners(o.plusoners);
@@ -967,14 +967,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed143() {
+buildUnnamed137() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed143(core.List<api.Comment> o) {
+checkUnnamed137(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -987,7 +987,7 @@
   if (buildCounterCommentFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed143();
+    o.items = buildUnnamed137();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -1003,7 +1003,7 @@
   if (buildCounterCommentFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed143(o.items);
+    checkUnnamed137(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1014,14 +1014,14 @@
   buildCounterCommentFeed--;
 }
 
-buildUnnamed144() {
+buildUnnamed138() {
   var o = new core.List<api.Person>();
   o.add(buildPerson());
   o.add(buildPerson());
   return o;
 }
 
-checkUnnamed144(core.List<api.Person> o) {
+checkUnnamed138(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerson(o[0]);
   checkPerson(o[1]);
@@ -1033,7 +1033,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed144();
+    o.items = buildUnnamed138();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1048,7 +1048,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed144(o.items);
+    checkUnnamed138(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1167,14 +1167,14 @@
   buildCounterPersonEmails--;
 }
 
-buildUnnamed145() {
+buildUnnamed139() {
   var o = new core.List<api.PersonEmails>();
   o.add(buildPersonEmails());
   o.add(buildPersonEmails());
   return o;
 }
 
-checkUnnamed145(core.List<api.PersonEmails> o) {
+checkUnnamed139(core.List<api.PersonEmails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonEmails(o[0]);
   checkPersonEmails(o[1]);
@@ -1265,14 +1265,14 @@
   buildCounterPersonOrganizations--;
 }
 
-buildUnnamed146() {
+buildUnnamed140() {
   var o = new core.List<api.PersonOrganizations>();
   o.add(buildPersonOrganizations());
   o.add(buildPersonOrganizations());
   return o;
 }
 
-checkUnnamed146(core.List<api.PersonOrganizations> o) {
+checkUnnamed140(core.List<api.PersonOrganizations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonOrganizations(o[0]);
   checkPersonOrganizations(o[1]);
@@ -1299,14 +1299,14 @@
   buildCounterPersonPlacesLived--;
 }
 
-buildUnnamed147() {
+buildUnnamed141() {
   var o = new core.List<api.PersonPlacesLived>();
   o.add(buildPersonPlacesLived());
   o.add(buildPersonPlacesLived());
   return o;
 }
 
-checkUnnamed147(core.List<api.PersonPlacesLived> o) {
+checkUnnamed141(core.List<api.PersonPlacesLived> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonPlacesLived(o[0]);
   checkPersonPlacesLived(o[1]);
@@ -1335,14 +1335,14 @@
   buildCounterPersonUrls--;
 }
 
-buildUnnamed148() {
+buildUnnamed142() {
   var o = new core.List<api.PersonUrls>();
   o.add(buildPersonUrls());
   o.add(buildPersonUrls());
   return o;
 }
 
-checkUnnamed148(core.List<api.PersonUrls> o) {
+checkUnnamed142(core.List<api.PersonUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonUrls(o[0]);
   checkPersonUrls(o[1]);
@@ -1362,7 +1362,7 @@
     o.currentLocation = "foo";
     o.displayName = "foo";
     o.domain = "foo";
-    o.emails = buildUnnamed145();
+    o.emails = buildUnnamed139();
     o.etag = "foo";
     o.gender = "foo";
     o.id = "foo";
@@ -1374,14 +1374,14 @@
     o.nickname = "foo";
     o.objectType = "foo";
     o.occupation = "foo";
-    o.organizations = buildUnnamed146();
-    o.placesLived = buildUnnamed147();
+    o.organizations = buildUnnamed140();
+    o.placesLived = buildUnnamed141();
     o.plusOneCount = 42;
     o.relationshipStatus = "foo";
     o.skills = "foo";
     o.tagline = "foo";
     o.url = "foo";
-    o.urls = buildUnnamed148();
+    o.urls = buildUnnamed142();
     o.verified = true;
   }
   buildCounterPerson--;
@@ -1400,7 +1400,7 @@
     unittest.expect(o.currentLocation, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
-    checkUnnamed145(o.emails);
+    checkUnnamed139(o.emails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1412,14 +1412,14 @@
     unittest.expect(o.nickname, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.occupation, unittest.equals('foo'));
-    checkUnnamed146(o.organizations);
-    checkUnnamed147(o.placesLived);
+    checkUnnamed140(o.organizations);
+    checkUnnamed141(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'));
-    checkUnnamed148(o.urls);
+    checkUnnamed142(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 546d53e..66db280 100644
--- a/generated/googleapis/test/plusdomains/v1_test.dart
+++ b/generated/googleapis/test/plusdomains/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1107() {
+buildUnnamed1116() {
   var o = new core.List<api.PlusDomainsAclentryResource>();
   o.add(buildPlusDomainsAclentryResource());
   o.add(buildPlusDomainsAclentryResource());
   return o;
 }
 
-checkUnnamed1107(core.List<api.PlusDomainsAclentryResource> o) {
+checkUnnamed1116(core.List<api.PlusDomainsAclentryResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlusDomainsAclentryResource(o[0]);
   checkPlusDomainsAclentryResource(o[1]);
@@ -70,7 +70,7 @@
   if (buildCounterAcl < 3) {
     o.description = "foo";
     o.domainRestricted = true;
-    o.items = buildUnnamed1107();
+    o.items = buildUnnamed1116();
     o.kind = "foo";
   }
   buildCounterAcl--;
@@ -82,7 +82,7 @@
   if (buildCounterAcl < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.domainRestricted, unittest.isTrue);
-    checkUnnamed1107(o.items);
+    checkUnnamed1116(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAcl--;
@@ -425,14 +425,14 @@
   buildCounterActivityObjectAttachmentsPreviewThumbnails--;
 }
 
-buildUnnamed1108() {
+buildUnnamed1117() {
   var o = new core.List<api.ActivityObjectAttachmentsPreviewThumbnails>();
   o.add(buildActivityObjectAttachmentsPreviewThumbnails());
   o.add(buildActivityObjectAttachmentsPreviewThumbnails());
   return o;
 }
 
-checkUnnamed1108(core.List<api.ActivityObjectAttachmentsPreviewThumbnails> o) {
+checkUnnamed1117(core.List<api.ActivityObjectAttachmentsPreviewThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsPreviewThumbnails(o[0]);
   checkActivityObjectAttachmentsPreviewThumbnails(o[1]);
@@ -488,14 +488,14 @@
   buildCounterActivityObjectAttachmentsThumbnails--;
 }
 
-buildUnnamed1109() {
+buildUnnamed1118() {
   var o = new core.List<api.ActivityObjectAttachmentsThumbnails>();
   o.add(buildActivityObjectAttachmentsThumbnails());
   o.add(buildActivityObjectAttachmentsThumbnails());
   return o;
 }
 
-checkUnnamed1109(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
+checkUnnamed1118(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsThumbnails(o[0]);
   checkActivityObjectAttachmentsThumbnails(o[1]);
@@ -513,8 +513,8 @@
     o.id = "foo";
     o.image = buildActivityObjectAttachmentsImage();
     o.objectType = "foo";
-    o.previewThumbnails = buildUnnamed1108();
-    o.thumbnails = buildUnnamed1109();
+    o.previewThumbnails = buildUnnamed1117();
+    o.thumbnails = buildUnnamed1118();
     o.url = "foo";
   }
   buildCounterActivityObjectAttachments--;
@@ -531,21 +531,21 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkActivityObjectAttachmentsImage(o.image);
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkUnnamed1108(o.previewThumbnails);
-    checkUnnamed1109(o.thumbnails);
+    checkUnnamed1117(o.previewThumbnails);
+    checkUnnamed1118(o.thumbnails);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterActivityObjectAttachments--;
 }
 
-buildUnnamed1110() {
+buildUnnamed1119() {
   var o = new core.List<api.ActivityObjectAttachments>();
   o.add(buildActivityObjectAttachments());
   o.add(buildActivityObjectAttachments());
   return o;
 }
 
-checkUnnamed1110(core.List<api.ActivityObjectAttachments> o) {
+checkUnnamed1119(core.List<api.ActivityObjectAttachments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachments(o[0]);
   checkActivityObjectAttachments(o[1]);
@@ -647,7 +647,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     o.actor = buildActivityObjectActor();
-    o.attachments = buildUnnamed1110();
+    o.attachments = buildUnnamed1119();
     o.content = "foo";
     o.id = "foo";
     o.objectType = "foo";
@@ -666,7 +666,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     checkActivityObjectActor(o.actor);
-    checkUnnamed1110(o.attachments);
+    checkUnnamed1119(o.attachments);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
@@ -758,14 +758,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed1111() {
+buildUnnamed1120() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed1111(core.List<api.Activity> o) {
+checkUnnamed1120(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -778,7 +778,7 @@
   if (buildCounterActivityFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed1111();
+    o.items = buildUnnamed1120();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -795,7 +795,7 @@
   if (buildCounterActivityFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1111(o.items);
+    checkUnnamed1120(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -834,14 +834,14 @@
   buildCounterAudience--;
 }
 
-buildUnnamed1112() {
+buildUnnamed1121() {
   var o = new core.List<api.Audience>();
   o.add(buildAudience());
   o.add(buildAudience());
   return o;
 }
 
-checkUnnamed1112(core.List<api.Audience> o) {
+checkUnnamed1121(core.List<api.Audience> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAudience(o[0]);
   checkAudience(o[1]);
@@ -853,7 +853,7 @@
   buildCounterAudiencesFeed++;
   if (buildCounterAudiencesFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1112();
+    o.items = buildUnnamed1121();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -866,7 +866,7 @@
   buildCounterAudiencesFeed++;
   if (buildCounterAudiencesFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1112(o.items);
+    checkUnnamed1121(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -924,14 +924,14 @@
   buildCounterCircle--;
 }
 
-buildUnnamed1113() {
+buildUnnamed1122() {
   var o = new core.List<api.Circle>();
   o.add(buildCircle());
   o.add(buildCircle());
   return o;
 }
 
-checkUnnamed1113(core.List<api.Circle> o) {
+checkUnnamed1122(core.List<api.Circle> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCircle(o[0]);
   checkCircle(o[1]);
@@ -943,7 +943,7 @@
   buildCounterCircleFeed++;
   if (buildCounterCircleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1113();
+    o.items = buildUnnamed1122();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -959,7 +959,7 @@
   buildCounterCircleFeed++;
   if (buildCounterCircleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1113(o.items);
+    checkUnnamed1122(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1100,14 +1100,14 @@
   buildCounterCommentInReplyTo--;
 }
 
-buildUnnamed1114() {
+buildUnnamed1123() {
   var o = new core.List<api.CommentInReplyTo>();
   o.add(buildCommentInReplyTo());
   o.add(buildCommentInReplyTo());
   return o;
 }
 
-checkUnnamed1114(core.List<api.CommentInReplyTo> o) {
+checkUnnamed1123(core.List<api.CommentInReplyTo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentInReplyTo(o[0]);
   checkCommentInReplyTo(o[1]);
@@ -1163,7 +1163,7 @@
     o.actor = buildCommentActor();
     o.etag = "foo";
     o.id = "foo";
-    o.inReplyTo = buildUnnamed1114();
+    o.inReplyTo = buildUnnamed1123();
     o.kind = "foo";
     o.object = buildCommentObject();
     o.plusoners = buildCommentPlusoners();
@@ -1182,7 +1182,7 @@
     checkCommentActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1114(o.inReplyTo);
+    checkUnnamed1123(o.inReplyTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkCommentObject(o.object);
     checkCommentPlusoners(o.plusoners);
@@ -1196,14 +1196,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed1115() {
+buildUnnamed1124() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed1115(core.List<api.Comment> o) {
+checkUnnamed1124(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -1216,7 +1216,7 @@
   if (buildCounterCommentFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed1115();
+    o.items = buildUnnamed1124();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -1232,7 +1232,7 @@
   if (buildCounterCommentFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1115(o.items);
+    checkUnnamed1124(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1307,14 +1307,14 @@
   buildCounterMediaExif--;
 }
 
-buildUnnamed1116() {
+buildUnnamed1125() {
   var o = new core.List<api.Videostream>();
   o.add(buildVideostream());
   o.add(buildVideostream());
   return o;
 }
 
-checkUnnamed1116(core.List<api.Videostream> o) {
+checkUnnamed1125(core.List<api.Videostream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideostream(o[0]);
   checkVideostream(o[1]);
@@ -1336,7 +1336,7 @@
     o.mediaUrl = "foo";
     o.published = core.DateTime.parse("2002-02-27T14:01:02");
     o.sizeBytes = "foo";
-    o.streams = buildUnnamed1116();
+    o.streams = buildUnnamed1125();
     o.summary = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
     o.url = "foo";
@@ -1364,7 +1364,7 @@
     unittest.expect(o.published,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.sizeBytes, unittest.equals('foo'));
-    checkUnnamed1116(o.streams);
+    checkUnnamed1125(o.streams);
     unittest.expect(o.summary, unittest.equals('foo'));
     unittest.expect(
         o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -1376,14 +1376,14 @@
   buildCounterMedia--;
 }
 
-buildUnnamed1117() {
+buildUnnamed1126() {
   var o = new core.List<api.Person>();
   o.add(buildPerson());
   o.add(buildPerson());
   return o;
 }
 
-checkUnnamed1117(core.List<api.Person> o) {
+checkUnnamed1126(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerson(o[0]);
   checkPerson(o[1]);
@@ -1395,7 +1395,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1117();
+    o.items = buildUnnamed1126();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1410,7 +1410,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1117(o.items);
+    checkUnnamed1126(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1508,14 +1508,14 @@
   buildCounterPersonEmails--;
 }
 
-buildUnnamed1118() {
+buildUnnamed1127() {
   var o = new core.List<api.PersonEmails>();
   o.add(buildPersonEmails());
   o.add(buildPersonEmails());
   return o;
 }
 
-checkUnnamed1118(core.List<api.PersonEmails> o) {
+checkUnnamed1127(core.List<api.PersonEmails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonEmails(o[0]);
   checkPersonEmails(o[1]);
@@ -1606,14 +1606,14 @@
   buildCounterPersonOrganizations--;
 }
 
-buildUnnamed1119() {
+buildUnnamed1128() {
   var o = new core.List<api.PersonOrganizations>();
   o.add(buildPersonOrganizations());
   o.add(buildPersonOrganizations());
   return o;
 }
 
-checkUnnamed1119(core.List<api.PersonOrganizations> o) {
+checkUnnamed1128(core.List<api.PersonOrganizations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonOrganizations(o[0]);
   checkPersonOrganizations(o[1]);
@@ -1640,14 +1640,14 @@
   buildCounterPersonPlacesLived--;
 }
 
-buildUnnamed1120() {
+buildUnnamed1129() {
   var o = new core.List<api.PersonPlacesLived>();
   o.add(buildPersonPlacesLived());
   o.add(buildPersonPlacesLived());
   return o;
 }
 
-checkUnnamed1120(core.List<api.PersonPlacesLived> o) {
+checkUnnamed1129(core.List<api.PersonPlacesLived> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonPlacesLived(o[0]);
   checkPersonPlacesLived(o[1]);
@@ -1676,14 +1676,14 @@
   buildCounterPersonUrls--;
 }
 
-buildUnnamed1121() {
+buildUnnamed1130() {
   var o = new core.List<api.PersonUrls>();
   o.add(buildPersonUrls());
   o.add(buildPersonUrls());
   return o;
 }
 
-checkUnnamed1121(core.List<api.PersonUrls> o) {
+checkUnnamed1130(core.List<api.PersonUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonUrls(o[0]);
   checkPersonUrls(o[1]);
@@ -1702,7 +1702,7 @@
     o.currentLocation = "foo";
     o.displayName = "foo";
     o.domain = "foo";
-    o.emails = buildUnnamed1118();
+    o.emails = buildUnnamed1127();
     o.etag = "foo";
     o.gender = "foo";
     o.id = "foo";
@@ -1713,14 +1713,14 @@
     o.nickname = "foo";
     o.objectType = "foo";
     o.occupation = "foo";
-    o.organizations = buildUnnamed1119();
-    o.placesLived = buildUnnamed1120();
+    o.organizations = buildUnnamed1128();
+    o.placesLived = buildUnnamed1129();
     o.plusOneCount = 42;
     o.relationshipStatus = "foo";
     o.skills = "foo";
     o.tagline = "foo";
     o.url = "foo";
-    o.urls = buildUnnamed1121();
+    o.urls = buildUnnamed1130();
     o.verified = true;
   }
   buildCounterPerson--;
@@ -1738,7 +1738,7 @@
     unittest.expect(o.currentLocation, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
-    checkUnnamed1118(o.emails);
+    checkUnnamed1127(o.emails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1749,14 +1749,14 @@
     unittest.expect(o.nickname, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.occupation, unittest.equals('foo'));
-    checkUnnamed1119(o.organizations);
-    checkUnnamed1120(o.placesLived);
+    checkUnnamed1128(o.organizations);
+    checkUnnamed1129(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'));
-    checkUnnamed1121(o.urls);
+    checkUnnamed1130(o.urls);
     unittest.expect(o.verified, unittest.isTrue);
   }
   buildCounterPerson--;
@@ -1877,53 +1877,53 @@
   buildCounterVideostream--;
 }
 
-buildUnnamed1122() {
+buildUnnamed1131() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1122(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'));
 }
 
-buildUnnamed1123() {
+buildUnnamed1132() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1123(core.List<core.String> o) {
+checkUnnamed1132(core.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() {
+buildUnnamed1133() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1124(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'));
 }
 
-buildUnnamed1125() {
+buildUnnamed1134() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1125(core.List<core.String> o) {
+checkUnnamed1134(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2721,8 +2721,8 @@
       var mock = new HttpServerMock();
       api.CirclesResourceApi res = new api.PlusDomainsApi(mock).circles;
       var arg_circleId = "foo";
-      var arg_email = buildUnnamed1122();
-      var arg_userId = buildUnnamed1123();
+      var arg_email = buildUnnamed1131();
+      var arg_userId = buildUnnamed1132();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3095,8 +3095,8 @@
       var mock = new HttpServerMock();
       api.CirclesResourceApi res = new api.PlusDomainsApi(mock).circles;
       var arg_circleId = "foo";
-      var arg_email = buildUnnamed1124();
-      var arg_userId = buildUnnamed1125();
+      var arg_email = buildUnnamed1133();
+      var arg_userId = buildUnnamed1134();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/poly/v1_test.dart b/generated/googleapis/test/poly/v1_test.dart
index 583d9e9..d0e5b3a 100644
--- a/generated/googleapis/test/poly/v1_test.dart
+++ b/generated/googleapis/test/poly/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed507() {
+buildUnnamed505() {
   var o = new core.List<api.Format>();
   o.add(buildFormat());
   o.add(buildFormat());
   return o;
 }
 
-checkUnnamed507(core.List<api.Format> o) {
+checkUnnamed505(core.List<api.Format> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFormat(o[0]);
   checkFormat(o[1]);
@@ -72,7 +72,7 @@
     o.createTime = "foo";
     o.description = "foo";
     o.displayName = "foo";
-    o.formats = buildUnnamed507();
+    o.formats = buildUnnamed505();
     o.isCurated = true;
     o.license = "foo";
     o.name = "foo";
@@ -92,7 +92,7 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed507(o.formats);
+    checkUnnamed505(o.formats);
     unittest.expect(o.isCurated, unittest.isTrue);
     unittest.expect(o.license, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -127,14 +127,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed508() {
+buildUnnamed506() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed508(core.List<api.File> o) {
+checkUnnamed506(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -147,7 +147,7 @@
   if (buildCounterFormat < 3) {
     o.formatComplexity = buildFormatComplexity();
     o.formatType = "foo";
-    o.resources = buildUnnamed508();
+    o.resources = buildUnnamed506();
     o.root = buildFile();
   }
   buildCounterFormat--;
@@ -159,7 +159,7 @@
   if (buildCounterFormat < 3) {
     checkFormatComplexity(o.formatComplexity);
     unittest.expect(o.formatType, unittest.equals('foo'));
-    checkUnnamed508(o.resources);
+    checkUnnamed506(o.resources);
     checkFile(o.root);
   }
   buildCounterFormat--;
@@ -186,14 +186,14 @@
   buildCounterFormatComplexity--;
 }
 
-buildUnnamed509() {
+buildUnnamed507() {
   var o = new core.List<api.Asset>();
   o.add(buildAsset());
   o.add(buildAsset());
   return o;
 }
 
-checkUnnamed509(core.List<api.Asset> o) {
+checkUnnamed507(core.List<api.Asset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAsset(o[0]);
   checkAsset(o[1]);
@@ -204,7 +204,7 @@
   var o = new api.ListAssetsResponse();
   buildCounterListAssetsResponse++;
   if (buildCounterListAssetsResponse < 3) {
-    o.assets = buildUnnamed509();
+    o.assets = buildUnnamed507();
     o.nextPageToken = "foo";
     o.totalSize = 42;
   }
@@ -215,21 +215,21 @@
 checkListAssetsResponse(api.ListAssetsResponse o) {
   buildCounterListAssetsResponse++;
   if (buildCounterListAssetsResponse < 3) {
-    checkUnnamed509(o.assets);
+    checkUnnamed507(o.assets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterListAssetsResponse--;
 }
 
-buildUnnamed510() {
+buildUnnamed508() {
   var o = new core.List<api.Asset>();
   o.add(buildAsset());
   o.add(buildAsset());
   return o;
 }
 
-checkUnnamed510(core.List<api.Asset> o) {
+checkUnnamed508(core.List<api.Asset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAsset(o[0]);
   checkAsset(o[1]);
@@ -240,7 +240,7 @@
   var o = new api.ListLikedAssetsResponse();
   buildCounterListLikedAssetsResponse++;
   if (buildCounterListLikedAssetsResponse < 3) {
-    o.assets = buildUnnamed510();
+    o.assets = buildUnnamed508();
     o.nextPageToken = "foo";
     o.totalSize = 42;
   }
@@ -251,21 +251,21 @@
 checkListLikedAssetsResponse(api.ListLikedAssetsResponse o) {
   buildCounterListLikedAssetsResponse++;
   if (buildCounterListLikedAssetsResponse < 3) {
-    checkUnnamed510(o.assets);
+    checkUnnamed508(o.assets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterListLikedAssetsResponse--;
 }
 
-buildUnnamed511() {
+buildUnnamed509() {
   var o = new core.List<api.UserAsset>();
   o.add(buildUserAsset());
   o.add(buildUserAsset());
   return o;
 }
 
-checkUnnamed511(core.List<api.UserAsset> o) {
+checkUnnamed509(core.List<api.UserAsset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserAsset(o[0]);
   checkUserAsset(o[1]);
@@ -278,7 +278,7 @@
   if (buildCounterListUserAssetsResponse < 3) {
     o.nextPageToken = "foo";
     o.totalSize = 42;
-    o.userAssets = buildUnnamed511();
+    o.userAssets = buildUnnamed509();
   }
   buildCounterListUserAssetsResponse--;
   return o;
@@ -289,7 +289,7 @@
   if (buildCounterListUserAssetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
-    checkUnnamed511(o.userAssets);
+    checkUnnamed509(o.userAssets);
   }
   buildCounterListUserAssetsResponse--;
 }
@@ -495,14 +495,14 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.AssetsResourceApi res = new api.PolyApi(mock).assets;
+      var arg_pageToken = "foo";
+      var arg_maxComplexity = "foo";
+      var arg_pageSize = 42;
       var arg_keywords = "foo";
       var arg_orderBy = "foo";
       var arg_format = "foo";
       var arg_curated = true;
       var arg_category = "foo";
-      var arg_pageToken = "foo";
-      var arg_maxComplexity = "foo";
-      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -535,6 +535,12 @@
           }
         }
         unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["maxComplexity"].first,
+            unittest.equals(arg_maxComplexity));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
             queryMap["keywords"].first, unittest.equals(arg_keywords));
         unittest.expect(
             queryMap["orderBy"].first, unittest.equals(arg_orderBy));
@@ -543,12 +549,6 @@
             queryMap["curated"].first, unittest.equals("$arg_curated"));
         unittest.expect(
             queryMap["category"].first, unittest.equals(arg_category));
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["maxComplexity"].first,
-            unittest.equals(arg_maxComplexity));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -559,14 +559,14 @@
       }), true);
       res
           .list(
+              pageToken: arg_pageToken,
+              maxComplexity: arg_maxComplexity,
+              pageSize: arg_pageSize,
               keywords: arg_keywords,
               orderBy: arg_orderBy,
               format: arg_format,
               curated: arg_curated,
               category: arg_category,
-              pageToken: arg_pageToken,
-              maxComplexity: arg_maxComplexity,
-              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListAssetsResponse response) {
         checkListAssetsResponse(response);
@@ -579,11 +579,11 @@
       var mock = new HttpServerMock();
       api.UsersAssetsResourceApi res = new api.PolyApi(mock).users.assets;
       var arg_name = "foo";
-      var arg_pageSize = 42;
       var arg_visibility = "foo";
       var arg_orderBy = "foo";
       var arg_format = "foo";
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -616,8 +616,6 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(
             queryMap["visibility"].first, unittest.equals(arg_visibility));
         unittest.expect(
@@ -625,6 +623,8 @@
         unittest.expect(queryMap["format"].first, unittest.equals(arg_format));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -635,11 +635,11 @@
       }), true);
       res
           .list(arg_name,
-              pageSize: arg_pageSize,
               visibility: arg_visibility,
               orderBy: arg_orderBy,
               format: arg_format,
               pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListUserAssetsResponse response) {
         checkListUserAssetsResponse(response);
diff --git a/generated/googleapis/test/prediction/v1_6_test.dart b/generated/googleapis/test/prediction/v1_6_test.dart
index 6601022..33baed8 100644
--- a/generated/googleapis/test/prediction/v1_6_test.dart
+++ b/generated/googleapis/test/prediction/v1_6_test.dart
@@ -72,14 +72,14 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategoricalValues--;
 }
 
-buildUnnamed1957() {
+buildUnnamed1979() {
   var o = new core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues>();
   o.add(buildAnalyzeDataDescriptionFeaturesCategoricalValues());
   o.add(buildAnalyzeDataDescriptionFeaturesCategoricalValues());
   return o;
 }
 
-checkUnnamed1957(
+checkUnnamed1979(
     core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionFeaturesCategoricalValues(o[0]);
@@ -92,7 +92,7 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategorical++;
   if (buildCounterAnalyzeDataDescriptionFeaturesCategorical < 3) {
     o.count = "foo";
-    o.values = buildUnnamed1957();
+    o.values = buildUnnamed1979();
   }
   buildCounterAnalyzeDataDescriptionFeaturesCategorical--;
   return o;
@@ -103,7 +103,7 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategorical++;
   if (buildCounterAnalyzeDataDescriptionFeaturesCategorical < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
-    checkUnnamed1957(o.values);
+    checkUnnamed1979(o.values);
   }
   buildCounterAnalyzeDataDescriptionFeaturesCategorical--;
 }
@@ -177,14 +177,14 @@
   buildCounterAnalyzeDataDescriptionFeatures--;
 }
 
-buildUnnamed1958() {
+buildUnnamed1980() {
   var o = new core.List<api.AnalyzeDataDescriptionFeatures>();
   o.add(buildAnalyzeDataDescriptionFeatures());
   o.add(buildAnalyzeDataDescriptionFeatures());
   return o;
 }
 
-checkUnnamed1958(core.List<api.AnalyzeDataDescriptionFeatures> o) {
+checkUnnamed1980(core.List<api.AnalyzeDataDescriptionFeatures> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionFeatures(o[0]);
   checkAnalyzeDataDescriptionFeatures(o[1]);
@@ -236,14 +236,14 @@
   buildCounterAnalyzeDataDescriptionOutputFeatureText--;
 }
 
-buildUnnamed1959() {
+buildUnnamed1981() {
   var o = new core.List<api.AnalyzeDataDescriptionOutputFeatureText>();
   o.add(buildAnalyzeDataDescriptionOutputFeatureText());
   o.add(buildAnalyzeDataDescriptionOutputFeatureText());
   return o;
 }
 
-checkUnnamed1959(core.List<api.AnalyzeDataDescriptionOutputFeatureText> o) {
+checkUnnamed1981(core.List<api.AnalyzeDataDescriptionOutputFeatureText> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionOutputFeatureText(o[0]);
   checkAnalyzeDataDescriptionOutputFeatureText(o[1]);
@@ -255,7 +255,7 @@
   buildCounterAnalyzeDataDescriptionOutputFeature++;
   if (buildCounterAnalyzeDataDescriptionOutputFeature < 3) {
     o.numeric = buildAnalyzeDataDescriptionOutputFeatureNumeric();
-    o.text = buildUnnamed1959();
+    o.text = buildUnnamed1981();
   }
   buildCounterAnalyzeDataDescriptionOutputFeature--;
   return o;
@@ -266,7 +266,7 @@
   buildCounterAnalyzeDataDescriptionOutputFeature++;
   if (buildCounterAnalyzeDataDescriptionOutputFeature < 3) {
     checkAnalyzeDataDescriptionOutputFeatureNumeric(o.numeric);
-    checkUnnamed1959(o.text);
+    checkUnnamed1981(o.text);
   }
   buildCounterAnalyzeDataDescriptionOutputFeature--;
 }
@@ -276,7 +276,7 @@
   var o = new api.AnalyzeDataDescription();
   buildCounterAnalyzeDataDescription++;
   if (buildCounterAnalyzeDataDescription < 3) {
-    o.features = buildUnnamed1958();
+    o.features = buildUnnamed1980();
     o.outputFeature = buildAnalyzeDataDescriptionOutputFeature();
   }
   buildCounterAnalyzeDataDescription--;
@@ -286,72 +286,72 @@
 checkAnalyzeDataDescription(api.AnalyzeDataDescription o) {
   buildCounterAnalyzeDataDescription++;
   if (buildCounterAnalyzeDataDescription < 3) {
-    checkUnnamed1958(o.features);
+    checkUnnamed1980(o.features);
     checkAnalyzeDataDescriptionOutputFeature(o.outputFeature);
   }
   buildCounterAnalyzeDataDescription--;
 }
 
-buildUnnamed1960() {
+buildUnnamed1982() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1960(core.Map<core.String, core.String> o) {
+checkUnnamed1982(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'));
 }
 
-buildUnnamed1961() {
+buildUnnamed1983() {
   var o = new core.List<core.Map<core.String, core.String>>();
-  o.add(buildUnnamed1960());
-  o.add(buildUnnamed1960());
+  o.add(buildUnnamed1982());
+  o.add(buildUnnamed1982());
   return o;
 }
 
-checkUnnamed1961(core.List<core.Map<core.String, core.String>> o) {
+checkUnnamed1983(core.List<core.Map<core.String, core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1960(o[0]);
-  checkUnnamed1960(o[1]);
+  checkUnnamed1982(o[0]);
+  checkUnnamed1982(o[1]);
 }
 
-buildUnnamed1962() {
+buildUnnamed1984() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1962(core.Map<core.String, core.String> o) {
+checkUnnamed1984(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'));
 }
 
-buildUnnamed1963() {
+buildUnnamed1985() {
   var o = new core.Map<core.String, core.Map<core.String, core.String>>();
-  o["x"] = buildUnnamed1962();
-  o["y"] = buildUnnamed1962();
+  o["x"] = buildUnnamed1984();
+  o["y"] = buildUnnamed1984();
   return o;
 }
 
-checkUnnamed1963(core.Map<core.String, core.Map<core.String, core.String>> o) {
+checkUnnamed1985(core.Map<core.String, core.Map<core.String, core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1962(o["x"]);
-  checkUnnamed1962(o["y"]);
+  checkUnnamed1984(o["x"]);
+  checkUnnamed1984(o["y"]);
 }
 
-buildUnnamed1964() {
+buildUnnamed1986() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1964(core.Map<core.String, core.String> o) {
+checkUnnamed1986(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'));
@@ -362,8 +362,8 @@
   var o = new api.AnalyzeModelDescription();
   buildCounterAnalyzeModelDescription++;
   if (buildCounterAnalyzeModelDescription < 3) {
-    o.confusionMatrix = buildUnnamed1963();
-    o.confusionMatrixRowTotals = buildUnnamed1964();
+    o.confusionMatrix = buildUnnamed1985();
+    o.confusionMatrixRowTotals = buildUnnamed1986();
     o.modelinfo = buildInsert2();
   }
   buildCounterAnalyzeModelDescription--;
@@ -373,8 +373,8 @@
 checkAnalyzeModelDescription(api.AnalyzeModelDescription o) {
   buildCounterAnalyzeModelDescription++;
   if (buildCounterAnalyzeModelDescription < 3) {
-    checkUnnamed1963(o.confusionMatrix);
-    checkUnnamed1964(o.confusionMatrixRowTotals);
+    checkUnnamed1985(o.confusionMatrix);
+    checkUnnamed1986(o.confusionMatrixRowTotals);
     checkInsert2(o.modelinfo);
   }
   buildCounterAnalyzeModelDescription--;
@@ -386,7 +386,7 @@
   buildCounterAnalyze++;
   if (buildCounterAnalyze < 3) {
     o.dataDescription = buildAnalyzeDataDescription();
-    o.errors = buildUnnamed1961();
+    o.errors = buildUnnamed1983();
     o.id = "foo";
     o.kind = "foo";
     o.modelDescription = buildAnalyzeModelDescription();
@@ -400,7 +400,7 @@
   buildCounterAnalyze++;
   if (buildCounterAnalyze < 3) {
     checkAnalyzeDataDescription(o.dataDescription);
-    checkUnnamed1961(o.errors);
+    checkUnnamed1983(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkAnalyzeModelDescription(o.modelDescription);
@@ -409,7 +409,7 @@
   buildCounterAnalyze--;
 }
 
-buildUnnamed1965() {
+buildUnnamed1987() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -424,7 +424,7 @@
   return o;
 }
 
-checkUnnamed1965(core.List<core.Object> o) {
+checkUnnamed1987(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map;
   unittest.expect(casted1, unittest.hasLength(3));
@@ -443,7 +443,7 @@
   var o = new api.InputInput();
   buildCounterInputInput++;
   if (buildCounterInputInput < 3) {
-    o.csvInstance = buildUnnamed1965();
+    o.csvInstance = buildUnnamed1987();
   }
   buildCounterInputInput--;
   return o;
@@ -452,7 +452,7 @@
 checkInputInput(api.InputInput o) {
   buildCounterInputInput++;
   if (buildCounterInputInput < 3) {
-    checkUnnamed1965(o.csvInstance);
+    checkUnnamed1987(o.csvInstance);
   }
   buildCounterInputInput--;
 }
@@ -476,7 +476,7 @@
   buildCounterInput--;
 }
 
-buildUnnamed1966() {
+buildUnnamed1988() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -491,7 +491,7 @@
   return o;
 }
 
-checkUnnamed1966(core.List<core.Object> o) {
+checkUnnamed1988(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o[0]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -510,7 +510,7 @@
   var o = new api.InsertTrainingInstances();
   buildCounterInsertTrainingInstances++;
   if (buildCounterInsertTrainingInstances < 3) {
-    o.csvInstance = buildUnnamed1966();
+    o.csvInstance = buildUnnamed1988();
     o.output = "foo";
   }
   buildCounterInsertTrainingInstances--;
@@ -520,49 +520,49 @@
 checkInsertTrainingInstances(api.InsertTrainingInstances o) {
   buildCounterInsertTrainingInstances++;
   if (buildCounterInsertTrainingInstances < 3) {
-    checkUnnamed1966(o.csvInstance);
+    checkUnnamed1988(o.csvInstance);
     unittest.expect(o.output, unittest.equals('foo'));
   }
   buildCounterInsertTrainingInstances--;
 }
 
-buildUnnamed1967() {
+buildUnnamed1989() {
   var o = new core.List<api.InsertTrainingInstances>();
   o.add(buildInsertTrainingInstances());
   o.add(buildInsertTrainingInstances());
   return o;
 }
 
-checkUnnamed1967(core.List<api.InsertTrainingInstances> o) {
+checkUnnamed1989(core.List<api.InsertTrainingInstances> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInsertTrainingInstances(o[0]);
   checkInsertTrainingInstances(o[1]);
 }
 
-buildUnnamed1968() {
+buildUnnamed1990() {
   var o = new core.Map<core.String, core.double>();
   o["x"] = 42.0;
   o["y"] = 42.0;
   return o;
 }
 
-checkUnnamed1968(core.Map<core.String, core.double> o) {
+checkUnnamed1990(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));
 }
 
-buildUnnamed1969() {
+buildUnnamed1991() {
   var o = new core.List<core.Map<core.String, core.double>>();
-  o.add(buildUnnamed1968());
-  o.add(buildUnnamed1968());
+  o.add(buildUnnamed1990());
+  o.add(buildUnnamed1990());
   return o;
 }
 
-checkUnnamed1969(core.List<core.Map<core.String, core.double>> o) {
+checkUnnamed1991(core.List<core.Map<core.String, core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1968(o[0]);
-  checkUnnamed1968(o[1]);
+  checkUnnamed1990(o[0]);
+  checkUnnamed1990(o[1]);
 }
 
 core.int buildCounterInsert = 0;
@@ -576,8 +576,8 @@
     o.storageDataLocation = "foo";
     o.storagePMMLLocation = "foo";
     o.storagePMMLModelLocation = "foo";
-    o.trainingInstances = buildUnnamed1967();
-    o.utility = buildUnnamed1969();
+    o.trainingInstances = buildUnnamed1989();
+    o.utility = buildUnnamed1991();
   }
   buildCounterInsert--;
   return o;
@@ -592,8 +592,8 @@
     unittest.expect(o.storageDataLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLModelLocation, unittest.equals('foo'));
-    checkUnnamed1967(o.trainingInstances);
-    checkUnnamed1969(o.utility);
+    checkUnnamed1989(o.trainingInstances);
+    checkUnnamed1991(o.utility);
   }
   buildCounterInsert--;
 }
@@ -668,14 +668,14 @@
   buildCounterInsert2--;
 }
 
-buildUnnamed1970() {
+buildUnnamed1992() {
   var o = new core.List<api.Insert2>();
   o.add(buildInsert2());
   o.add(buildInsert2());
   return o;
 }
 
-checkUnnamed1970(core.List<api.Insert2> o) {
+checkUnnamed1992(core.List<api.Insert2> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInsert2(o[0]);
   checkInsert2(o[1]);
@@ -686,7 +686,7 @@
   var o = new api.List();
   buildCounterList++;
   if (buildCounterList < 3) {
-    o.items = buildUnnamed1970();
+    o.items = buildUnnamed1992();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -698,7 +698,7 @@
 checkList(api.List o) {
   buildCounterList++;
   if (buildCounterList < 3) {
-    checkUnnamed1970(o.items);
+    checkUnnamed1992(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -727,14 +727,14 @@
   buildCounterOutputOutputMulti--;
 }
 
-buildUnnamed1971() {
+buildUnnamed1993() {
   var o = new core.List<api.OutputOutputMulti>();
   o.add(buildOutputOutputMulti());
   o.add(buildOutputOutputMulti());
   return o;
 }
 
-checkUnnamed1971(core.List<api.OutputOutputMulti> o) {
+checkUnnamed1993(core.List<api.OutputOutputMulti> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOutputOutputMulti(o[0]);
   checkOutputOutputMulti(o[1]);
@@ -748,7 +748,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.outputLabel = "foo";
-    o.outputMulti = buildUnnamed1971();
+    o.outputMulti = buildUnnamed1993();
     o.outputValue = "foo";
     o.selfLink = "foo";
   }
@@ -762,14 +762,14 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.outputLabel, unittest.equals('foo'));
-    checkUnnamed1971(o.outputMulti);
+    checkUnnamed1993(o.outputMulti);
     unittest.expect(o.outputValue, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterOutput--;
 }
 
-buildUnnamed1972() {
+buildUnnamed1994() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -784,7 +784,7 @@
   return o;
 }
 
-checkUnnamed1972(core.List<core.Object> o) {
+checkUnnamed1994(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o[0]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -803,7 +803,7 @@
   var o = new api.Update();
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
-    o.csvInstance = buildUnnamed1972();
+    o.csvInstance = buildUnnamed1994();
     o.output = "foo";
   }
   buildCounterUpdate--;
@@ -813,7 +813,7 @@
 checkUpdate(api.Update o) {
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
-    checkUnnamed1972(o.csvInstance);
+    checkUnnamed1994(o.csvInstance);
     unittest.expect(o.output, unittest.equals('foo'));
   }
   buildCounterUpdate--;
diff --git a/generated/googleapis/test/pubsub/v1_test.dart b/generated/googleapis/test/pubsub/v1_test.dart
index f97cd0c..a97255b 100644
--- a/generated/googleapis/test/pubsub/v1_test.dart
+++ b/generated/googleapis/test/pubsub/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1313() {
+buildUnnamed1329() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1313(core.List<core.String> o) {
+checkUnnamed1329(core.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.AcknowledgeRequest();
   buildCounterAcknowledgeRequest++;
   if (buildCounterAcknowledgeRequest < 3) {
-    o.ackIds = buildUnnamed1313();
+    o.ackIds = buildUnnamed1329();
   }
   buildCounterAcknowledgeRequest--;
   return o;
@@ -77,19 +77,19 @@
 checkAcknowledgeRequest(api.AcknowledgeRequest o) {
   buildCounterAcknowledgeRequest++;
   if (buildCounterAcknowledgeRequest < 3) {
-    checkUnnamed1313(o.ackIds);
+    checkUnnamed1329(o.ackIds);
   }
   buildCounterAcknowledgeRequest--;
 }
 
-buildUnnamed1314() {
+buildUnnamed1330() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1314(core.List<core.String> o) {
+checkUnnamed1330(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -100,7 +100,7 @@
   var o = new api.Binding();
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    o.members = buildUnnamed1314();
+    o.members = buildUnnamed1330();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -110,7 +110,7 @@
 checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkUnnamed1314(o.members);
+    checkUnnamed1330(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
@@ -150,14 +150,14 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed1315() {
+buildUnnamed1331() {
   var o = new core.List<api.Snapshot>();
   o.add(buildSnapshot());
   o.add(buildSnapshot());
   return o;
 }
 
-checkUnnamed1315(core.List<api.Snapshot> o) {
+checkUnnamed1331(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSnapshot(o[0]);
   checkSnapshot(o[1]);
@@ -169,7 +169,7 @@
   buildCounterListSnapshotsResponse++;
   if (buildCounterListSnapshotsResponse < 3) {
     o.nextPageToken = "foo";
-    o.snapshots = buildUnnamed1315();
+    o.snapshots = buildUnnamed1331();
   }
   buildCounterListSnapshotsResponse--;
   return o;
@@ -179,19 +179,19 @@
   buildCounterListSnapshotsResponse++;
   if (buildCounterListSnapshotsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1315(o.snapshots);
+    checkUnnamed1331(o.snapshots);
   }
   buildCounterListSnapshotsResponse--;
 }
 
-buildUnnamed1316() {
+buildUnnamed1332() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed1316(core.List<api.Subscription> o) {
+checkUnnamed1332(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -203,7 +203,7 @@
   buildCounterListSubscriptionsResponse++;
   if (buildCounterListSubscriptionsResponse < 3) {
     o.nextPageToken = "foo";
-    o.subscriptions = buildUnnamed1316();
+    o.subscriptions = buildUnnamed1332();
   }
   buildCounterListSubscriptionsResponse--;
   return o;
@@ -213,19 +213,19 @@
   buildCounterListSubscriptionsResponse++;
   if (buildCounterListSubscriptionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1316(o.subscriptions);
+    checkUnnamed1332(o.subscriptions);
   }
   buildCounterListSubscriptionsResponse--;
 }
 
-buildUnnamed1317() {
+buildUnnamed1333() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1317(core.List<core.String> o) {
+checkUnnamed1333(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -237,7 +237,7 @@
   buildCounterListTopicSnapshotsResponse++;
   if (buildCounterListTopicSnapshotsResponse < 3) {
     o.nextPageToken = "foo";
-    o.snapshots = buildUnnamed1317();
+    o.snapshots = buildUnnamed1333();
   }
   buildCounterListTopicSnapshotsResponse--;
   return o;
@@ -247,19 +247,19 @@
   buildCounterListTopicSnapshotsResponse++;
   if (buildCounterListTopicSnapshotsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1317(o.snapshots);
+    checkUnnamed1333(o.snapshots);
   }
   buildCounterListTopicSnapshotsResponse--;
 }
 
-buildUnnamed1318() {
+buildUnnamed1334() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1318(core.List<core.String> o) {
+checkUnnamed1334(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -271,7 +271,7 @@
   buildCounterListTopicSubscriptionsResponse++;
   if (buildCounterListTopicSubscriptionsResponse < 3) {
     o.nextPageToken = "foo";
-    o.subscriptions = buildUnnamed1318();
+    o.subscriptions = buildUnnamed1334();
   }
   buildCounterListTopicSubscriptionsResponse--;
   return o;
@@ -281,19 +281,19 @@
   buildCounterListTopicSubscriptionsResponse++;
   if (buildCounterListTopicSubscriptionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1318(o.subscriptions);
+    checkUnnamed1334(o.subscriptions);
   }
   buildCounterListTopicSubscriptionsResponse--;
 }
 
-buildUnnamed1319() {
+buildUnnamed1335() {
   var o = new core.List<api.Topic>();
   o.add(buildTopic());
   o.add(buildTopic());
   return o;
 }
 
-checkUnnamed1319(core.List<api.Topic> o) {
+checkUnnamed1335(core.List<api.Topic> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTopic(o[0]);
   checkTopic(o[1]);
@@ -305,7 +305,7 @@
   buildCounterListTopicsResponse++;
   if (buildCounterListTopicsResponse < 3) {
     o.nextPageToken = "foo";
-    o.topics = buildUnnamed1319();
+    o.topics = buildUnnamed1335();
   }
   buildCounterListTopicsResponse--;
   return o;
@@ -315,19 +315,19 @@
   buildCounterListTopicsResponse++;
   if (buildCounterListTopicsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1319(o.topics);
+    checkUnnamed1335(o.topics);
   }
   buildCounterListTopicsResponse--;
 }
 
-buildUnnamed1320() {
+buildUnnamed1336() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1320(core.List<core.String> o) {
+checkUnnamed1336(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -339,7 +339,7 @@
   buildCounterModifyAckDeadlineRequest++;
   if (buildCounterModifyAckDeadlineRequest < 3) {
     o.ackDeadlineSeconds = 42;
-    o.ackIds = buildUnnamed1320();
+    o.ackIds = buildUnnamed1336();
   }
   buildCounterModifyAckDeadlineRequest--;
   return o;
@@ -349,7 +349,7 @@
   buildCounterModifyAckDeadlineRequest++;
   if (buildCounterModifyAckDeadlineRequest < 3) {
     unittest.expect(o.ackDeadlineSeconds, unittest.equals(42));
-    checkUnnamed1320(o.ackIds);
+    checkUnnamed1336(o.ackIds);
   }
   buildCounterModifyAckDeadlineRequest--;
 }
@@ -373,14 +373,14 @@
   buildCounterModifyPushConfigRequest--;
 }
 
-buildUnnamed1321() {
+buildUnnamed1337() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed1321(core.List<api.Binding> o) {
+checkUnnamed1337(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -391,7 +391,7 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.bindings = buildUnnamed1321();
+    o.bindings = buildUnnamed1337();
     o.etag = "foo";
     o.version = 42;
   }
@@ -402,21 +402,21 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed1321(o.bindings);
+    checkUnnamed1337(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterPolicy--;
 }
 
-buildUnnamed1322() {
+buildUnnamed1338() {
   var o = new core.List<api.PubsubMessage>();
   o.add(buildPubsubMessage());
   o.add(buildPubsubMessage());
   return o;
 }
 
-checkUnnamed1322(core.List<api.PubsubMessage> o) {
+checkUnnamed1338(core.List<api.PubsubMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPubsubMessage(o[0]);
   checkPubsubMessage(o[1]);
@@ -427,7 +427,7 @@
   var o = new api.PublishRequest();
   buildCounterPublishRequest++;
   if (buildCounterPublishRequest < 3) {
-    o.messages = buildUnnamed1322();
+    o.messages = buildUnnamed1338();
   }
   buildCounterPublishRequest--;
   return o;
@@ -436,19 +436,19 @@
 checkPublishRequest(api.PublishRequest o) {
   buildCounterPublishRequest++;
   if (buildCounterPublishRequest < 3) {
-    checkUnnamed1322(o.messages);
+    checkUnnamed1338(o.messages);
   }
   buildCounterPublishRequest--;
 }
 
-buildUnnamed1323() {
+buildUnnamed1339() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1323(core.List<core.String> o) {
+checkUnnamed1339(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -459,7 +459,7 @@
   var o = new api.PublishResponse();
   buildCounterPublishResponse++;
   if (buildCounterPublishResponse < 3) {
-    o.messageIds = buildUnnamed1323();
+    o.messageIds = buildUnnamed1339();
   }
   buildCounterPublishResponse--;
   return o;
@@ -468,19 +468,19 @@
 checkPublishResponse(api.PublishResponse o) {
   buildCounterPublishResponse++;
   if (buildCounterPublishResponse < 3) {
-    checkUnnamed1323(o.messageIds);
+    checkUnnamed1339(o.messageIds);
   }
   buildCounterPublishResponse--;
 }
 
-buildUnnamed1324() {
+buildUnnamed1340() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1324(core.Map<core.String, core.String> o) {
+checkUnnamed1340(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'));
@@ -491,7 +491,7 @@
   var o = new api.PubsubMessage();
   buildCounterPubsubMessage++;
   if (buildCounterPubsubMessage < 3) {
-    o.attributes = buildUnnamed1324();
+    o.attributes = buildUnnamed1340();
     o.data = "foo";
     o.messageId = "foo";
     o.publishTime = "foo";
@@ -503,7 +503,7 @@
 checkPubsubMessage(api.PubsubMessage o) {
   buildCounterPubsubMessage++;
   if (buildCounterPubsubMessage < 3) {
-    checkUnnamed1324(o.attributes);
+    checkUnnamed1340(o.attributes);
     unittest.expect(o.data, unittest.equals('foo'));
     unittest.expect(o.messageId, unittest.equals('foo'));
     unittest.expect(o.publishTime, unittest.equals('foo'));
@@ -532,14 +532,14 @@
   buildCounterPullRequest--;
 }
 
-buildUnnamed1325() {
+buildUnnamed1341() {
   var o = new core.List<api.ReceivedMessage>();
   o.add(buildReceivedMessage());
   o.add(buildReceivedMessage());
   return o;
 }
 
-checkUnnamed1325(core.List<api.ReceivedMessage> o) {
+checkUnnamed1341(core.List<api.ReceivedMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReceivedMessage(o[0]);
   checkReceivedMessage(o[1]);
@@ -550,7 +550,7 @@
   var o = new api.PullResponse();
   buildCounterPullResponse++;
   if (buildCounterPullResponse < 3) {
-    o.receivedMessages = buildUnnamed1325();
+    o.receivedMessages = buildUnnamed1341();
   }
   buildCounterPullResponse--;
   return o;
@@ -559,19 +559,19 @@
 checkPullResponse(api.PullResponse o) {
   buildCounterPullResponse++;
   if (buildCounterPullResponse < 3) {
-    checkUnnamed1325(o.receivedMessages);
+    checkUnnamed1341(o.receivedMessages);
   }
   buildCounterPullResponse--;
 }
 
-buildUnnamed1326() {
+buildUnnamed1342() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1326(core.Map<core.String, core.String> o) {
+checkUnnamed1342(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'));
@@ -582,7 +582,7 @@
   var o = new api.PushConfig();
   buildCounterPushConfig++;
   if (buildCounterPushConfig < 3) {
-    o.attributes = buildUnnamed1326();
+    o.attributes = buildUnnamed1342();
     o.pushEndpoint = "foo";
   }
   buildCounterPushConfig--;
@@ -592,7 +592,7 @@
 checkPushConfig(api.PushConfig o) {
   buildCounterPushConfig++;
   if (buildCounterPushConfig < 3) {
-    checkUnnamed1326(o.attributes);
+    checkUnnamed1342(o.attributes);
     unittest.expect(o.pushEndpoint, unittest.equals('foo'));
   }
   buildCounterPushConfig--;
@@ -726,14 +726,14 @@
   buildCounterSubscription--;
 }
 
-buildUnnamed1327() {
+buildUnnamed1343() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1327(core.List<core.String> o) {
+checkUnnamed1343(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -744,7 +744,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed1327();
+    o.permissions = buildUnnamed1343();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -753,19 +753,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed1327(o.permissions);
+    checkUnnamed1343(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed1328() {
+buildUnnamed1344() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1328(core.List<core.String> o) {
+checkUnnamed1344(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -776,7 +776,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed1328();
+    o.permissions = buildUnnamed1344();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -785,7 +785,7 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed1328(o.permissions);
+    checkUnnamed1344(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
@@ -1750,8 +1750,8 @@
       api.ProjectsSubscriptionsResourceApi res =
           new api.PubsubApi(mock).projects.subscriptions;
       var arg_project = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1784,10 +1784,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1798,8 +1798,8 @@
       }), true);
       res
           .list(arg_project,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(
               unittest.expectAsync1(((api.ListSubscriptionsResponse response) {
@@ -2420,8 +2420,8 @@
       api.ProjectsTopicsResourceApi res =
           new api.PubsubApi(mock).projects.topics;
       var arg_project = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2454,10 +2454,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2468,8 +2468,8 @@
       }), true);
       res
           .list(arg_project,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListTopicsResponse response) {
         checkListTopicsResponse(response);
@@ -2652,8 +2652,8 @@
       api.ProjectsTopicsSnapshotsResourceApi res =
           new api.PubsubApi(mock).projects.topics.snapshots;
       var arg_topic = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2686,10 +2686,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2700,8 +2700,8 @@
       }), true);
       res
           .list(arg_topic,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(
               unittest.expectAsync1(((api.ListTopicSnapshotsResponse response) {
diff --git a/generated/googleapis/test/reseller/v1_test.dart b/generated/googleapis/test/reseller/v1_test.dart
index 766ecec..d66565c 100644
--- a/generated/googleapis/test/reseller/v1_test.dart
+++ b/generated/googleapis/test/reseller/v1_test.dart
@@ -168,14 +168,14 @@
   buildCounterRenewalSettings--;
 }
 
-buildUnnamed2602() {
+buildUnnamed2627() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2602(core.List<core.String> o) {
+checkUnnamed2627(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -186,7 +186,7 @@
   var o = new api.ResellernotifyGetwatchdetailsResponse();
   buildCounterResellernotifyGetwatchdetailsResponse++;
   if (buildCounterResellernotifyGetwatchdetailsResponse < 3) {
-    o.serviceAccountEmailAddresses = buildUnnamed2602();
+    o.serviceAccountEmailAddresses = buildUnnamed2627();
     o.topicName = "foo";
   }
   buildCounterResellernotifyGetwatchdetailsResponse--;
@@ -197,7 +197,7 @@
     api.ResellernotifyGetwatchdetailsResponse o) {
   buildCounterResellernotifyGetwatchdetailsResponse++;
   if (buildCounterResellernotifyGetwatchdetailsResponse < 3) {
-    checkUnnamed2602(o.serviceAccountEmailAddresses);
+    checkUnnamed2627(o.serviceAccountEmailAddresses);
     unittest.expect(o.topicName, unittest.equals('foo'));
   }
   buildCounterResellernotifyGetwatchdetailsResponse--;
@@ -292,14 +292,14 @@
   buildCounterSubscriptionPlan--;
 }
 
-buildUnnamed2603() {
+buildUnnamed2628() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2603(core.List<core.String> o) {
+checkUnnamed2628(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -367,7 +367,7 @@
     o.skuName = "foo";
     o.status = "foo";
     o.subscriptionId = "foo";
-    o.suspensionReasons = buildUnnamed2603();
+    o.suspensionReasons = buildUnnamed2628();
     o.transferInfo = buildSubscriptionTransferInfo();
     o.trialSettings = buildSubscriptionTrialSettings();
   }
@@ -393,21 +393,21 @@
     unittest.expect(o.skuName, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.subscriptionId, unittest.equals('foo'));
-    checkUnnamed2603(o.suspensionReasons);
+    checkUnnamed2628(o.suspensionReasons);
     checkSubscriptionTransferInfo(o.transferInfo);
     checkSubscriptionTrialSettings(o.trialSettings);
   }
   buildCounterSubscription--;
 }
 
-buildUnnamed2604() {
+buildUnnamed2629() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed2604(core.List<api.Subscription> o) {
+checkUnnamed2629(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -420,7 +420,7 @@
   if (buildCounterSubscriptions < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.subscriptions = buildUnnamed2604();
+    o.subscriptions = buildUnnamed2629();
   }
   buildCounterSubscriptions--;
   return o;
@@ -431,7 +431,7 @@
   if (buildCounterSubscriptions < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2604(o.subscriptions);
+    checkUnnamed2629(o.subscriptions);
   }
   buildCounterSubscriptions--;
 }
diff --git a/generated/googleapis/test/runtimeconfig/v1_test.dart b/generated/googleapis/test/runtimeconfig/v1_test.dart
index a281c5d..fe696d8 100644
--- a/generated/googleapis/test/runtimeconfig/v1_test.dart
+++ b/generated/googleapis/test/runtimeconfig/v1_test.dart
@@ -80,14 +80,14 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed2019() {
+buildUnnamed2041() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed2019(core.List<api.Operation> o) {
+checkUnnamed2041(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -99,7 +99,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed2019();
+    o.operations = buildUnnamed2041();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -109,12 +109,12 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2019(o.operations);
+    checkUnnamed2041(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed2020() {
+buildUnnamed2042() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -129,7 +129,7 @@
   return o;
 }
 
-checkUnnamed2020(core.Map<core.String, core.Object> o) {
+checkUnnamed2042(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));
@@ -143,7 +143,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2021() {
+buildUnnamed2043() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -158,7 +158,7 @@
   return o;
 }
 
-checkUnnamed2021(core.Map<core.String, core.Object> o) {
+checkUnnamed2043(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -179,9 +179,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed2020();
+    o.metadata = buildUnnamed2042();
     o.name = "foo";
-    o.response = buildUnnamed2021();
+    o.response = buildUnnamed2043();
   }
   buildCounterOperation--;
   return o;
@@ -192,14 +192,14 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed2020(o.metadata);
+    checkUnnamed2042(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2021(o.response);
+    checkUnnamed2043(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed2022() {
+buildUnnamed2044() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -214,7 +214,7 @@
   return o;
 }
 
-checkUnnamed2022(core.Map<core.String, core.Object> o) {
+checkUnnamed2044(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -228,17 +228,17 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2023() {
+buildUnnamed2045() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed2022());
-  o.add(buildUnnamed2022());
+  o.add(buildUnnamed2044());
+  o.add(buildUnnamed2044());
   return o;
 }
 
-checkUnnamed2023(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed2045(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2022(o[0]);
-  checkUnnamed2022(o[1]);
+  checkUnnamed2044(o[0]);
+  checkUnnamed2044(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -247,7 +247,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed2023();
+    o.details = buildUnnamed2045();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -258,7 +258,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed2023(o.details);
+    checkUnnamed2045(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
diff --git a/generated/googleapis/test/safebrowsing/v4_test.dart b/generated/googleapis/test/safebrowsing/v4_test.dart
index 40bea51..a18ec3a 100644
--- a/generated/googleapis/test/safebrowsing/v4_test.dart
+++ b/generated/googleapis/test/safebrowsing/v4_test.dart
@@ -90,14 +90,14 @@
   buildCounterClientInfo--;
 }
 
-buildUnnamed1129() {
+buildUnnamed1139() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1129(core.List<core.String> o) {
+checkUnnamed1139(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -111,7 +111,7 @@
     o.maxDatabaseEntries = 42;
     o.maxUpdateEntries = 42;
     o.region = "foo";
-    o.supportedCompressions = buildUnnamed1129();
+    o.supportedCompressions = buildUnnamed1139();
   }
   buildCounterConstraints--;
   return o;
@@ -123,19 +123,34 @@
     unittest.expect(o.maxDatabaseEntries, unittest.equals(42));
     unittest.expect(o.maxUpdateEntries, unittest.equals(42));
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed1129(o.supportedCompressions);
+    checkUnnamed1139(o.supportedCompressions);
   }
   buildCounterConstraints--;
 }
 
-buildUnnamed1130() {
+core.int buildCounterEmpty = 0;
+buildEmpty() {
+  var o = new api.Empty();
+  buildCounterEmpty++;
+  if (buildCounterEmpty < 3) {}
+  buildCounterEmpty--;
+  return o;
+}
+
+checkEmpty(api.Empty o) {
+  buildCounterEmpty++;
+  if (buildCounterEmpty < 3) {}
+  buildCounterEmpty--;
+}
+
+buildUnnamed1140() {
   var o = new core.List<api.ListUpdateRequest>();
   o.add(buildListUpdateRequest());
   o.add(buildListUpdateRequest());
   return o;
 }
 
-checkUnnamed1130(core.List<api.ListUpdateRequest> o) {
+checkUnnamed1140(core.List<api.ListUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListUpdateRequest(o[0]);
   checkListUpdateRequest(o[1]);
@@ -147,7 +162,7 @@
   buildCounterFetchThreatListUpdatesRequest++;
   if (buildCounterFetchThreatListUpdatesRequest < 3) {
     o.client = buildClientInfo();
-    o.listUpdateRequests = buildUnnamed1130();
+    o.listUpdateRequests = buildUnnamed1140();
   }
   buildCounterFetchThreatListUpdatesRequest--;
   return o;
@@ -157,19 +172,19 @@
   buildCounterFetchThreatListUpdatesRequest++;
   if (buildCounterFetchThreatListUpdatesRequest < 3) {
     checkClientInfo(o.client);
-    checkUnnamed1130(o.listUpdateRequests);
+    checkUnnamed1140(o.listUpdateRequests);
   }
   buildCounterFetchThreatListUpdatesRequest--;
 }
 
-buildUnnamed1131() {
+buildUnnamed1141() {
   var o = new core.List<api.ListUpdateResponse>();
   o.add(buildListUpdateResponse());
   o.add(buildListUpdateResponse());
   return o;
 }
 
-checkUnnamed1131(core.List<api.ListUpdateResponse> o) {
+checkUnnamed1141(core.List<api.ListUpdateResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListUpdateResponse(o[0]);
   checkListUpdateResponse(o[1]);
@@ -180,7 +195,7 @@
   var o = new api.FetchThreatListUpdatesResponse();
   buildCounterFetchThreatListUpdatesResponse++;
   if (buildCounterFetchThreatListUpdatesResponse < 3) {
-    o.listUpdateResponses = buildUnnamed1131();
+    o.listUpdateResponses = buildUnnamed1141();
     o.minimumWaitDuration = "foo";
   }
   buildCounterFetchThreatListUpdatesResponse--;
@@ -190,20 +205,20 @@
 checkFetchThreatListUpdatesResponse(api.FetchThreatListUpdatesResponse o) {
   buildCounterFetchThreatListUpdatesResponse++;
   if (buildCounterFetchThreatListUpdatesResponse < 3) {
-    checkUnnamed1131(o.listUpdateResponses);
+    checkUnnamed1141(o.listUpdateResponses);
     unittest.expect(o.minimumWaitDuration, unittest.equals('foo'));
   }
   buildCounterFetchThreatListUpdatesResponse--;
 }
 
-buildUnnamed1132() {
+buildUnnamed1142() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1132(core.List<core.String> o) {
+checkUnnamed1142(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -216,7 +231,7 @@
   if (buildCounterFindFullHashesRequest < 3) {
     o.apiClient = buildClientInfo();
     o.client = buildClientInfo();
-    o.clientStates = buildUnnamed1132();
+    o.clientStates = buildUnnamed1142();
     o.threatInfo = buildThreatInfo();
   }
   buildCounterFindFullHashesRequest--;
@@ -228,20 +243,20 @@
   if (buildCounterFindFullHashesRequest < 3) {
     checkClientInfo(o.apiClient);
     checkClientInfo(o.client);
-    checkUnnamed1132(o.clientStates);
+    checkUnnamed1142(o.clientStates);
     checkThreatInfo(o.threatInfo);
   }
   buildCounterFindFullHashesRequest--;
 }
 
-buildUnnamed1133() {
+buildUnnamed1143() {
   var o = new core.List<api.ThreatMatch>();
   o.add(buildThreatMatch());
   o.add(buildThreatMatch());
   return o;
 }
 
-checkUnnamed1133(core.List<api.ThreatMatch> o) {
+checkUnnamed1143(core.List<api.ThreatMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThreatMatch(o[0]);
   checkThreatMatch(o[1]);
@@ -252,7 +267,7 @@
   var o = new api.FindFullHashesResponse();
   buildCounterFindFullHashesResponse++;
   if (buildCounterFindFullHashesResponse < 3) {
-    o.matches = buildUnnamed1133();
+    o.matches = buildUnnamed1143();
     o.minimumWaitDuration = "foo";
     o.negativeCacheDuration = "foo";
   }
@@ -263,7 +278,7 @@
 checkFindFullHashesResponse(api.FindFullHashesResponse o) {
   buildCounterFindFullHashesResponse++;
   if (buildCounterFindFullHashesResponse < 3) {
-    checkUnnamed1133(o.matches);
+    checkUnnamed1143(o.matches);
     unittest.expect(o.minimumWaitDuration, unittest.equals('foo'));
     unittest.expect(o.negativeCacheDuration, unittest.equals('foo'));
   }
@@ -291,14 +306,14 @@
   buildCounterFindThreatMatchesRequest--;
 }
 
-buildUnnamed1134() {
+buildUnnamed1144() {
   var o = new core.List<api.ThreatMatch>();
   o.add(buildThreatMatch());
   o.add(buildThreatMatch());
   return o;
 }
 
-checkUnnamed1134(core.List<api.ThreatMatch> o) {
+checkUnnamed1144(core.List<api.ThreatMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThreatMatch(o[0]);
   checkThreatMatch(o[1]);
@@ -309,7 +324,7 @@
   var o = new api.FindThreatMatchesResponse();
   buildCounterFindThreatMatchesResponse++;
   if (buildCounterFindThreatMatchesResponse < 3) {
-    o.matches = buildUnnamed1134();
+    o.matches = buildUnnamed1144();
   }
   buildCounterFindThreatMatchesResponse--;
   return o;
@@ -318,19 +333,19 @@
 checkFindThreatMatchesResponse(api.FindThreatMatchesResponse o) {
   buildCounterFindThreatMatchesResponse++;
   if (buildCounterFindThreatMatchesResponse < 3) {
-    checkUnnamed1134(o.matches);
+    checkUnnamed1144(o.matches);
   }
   buildCounterFindThreatMatchesResponse--;
 }
 
-buildUnnamed1135() {
+buildUnnamed1145() {
   var o = new core.List<api.ThreatListDescriptor>();
   o.add(buildThreatListDescriptor());
   o.add(buildThreatListDescriptor());
   return o;
 }
 
-checkUnnamed1135(core.List<api.ThreatListDescriptor> o) {
+checkUnnamed1145(core.List<api.ThreatListDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThreatListDescriptor(o[0]);
   checkThreatListDescriptor(o[1]);
@@ -341,7 +356,7 @@
   var o = new api.ListThreatListsResponse();
   buildCounterListThreatListsResponse++;
   if (buildCounterListThreatListsResponse < 3) {
-    o.threatLists = buildUnnamed1135();
+    o.threatLists = buildUnnamed1145();
   }
   buildCounterListThreatListsResponse--;
   return o;
@@ -350,7 +365,7 @@
 checkListThreatListsResponse(api.ListThreatListsResponse o) {
   buildCounterListThreatListsResponse++;
   if (buildCounterListThreatListsResponse < 3) {
-    checkUnnamed1135(o.threatLists);
+    checkUnnamed1145(o.threatLists);
   }
   buildCounterListThreatListsResponse--;
 }
@@ -382,27 +397,27 @@
   buildCounterListUpdateRequest--;
 }
 
-buildUnnamed1136() {
+buildUnnamed1146() {
   var o = new core.List<api.ThreatEntrySet>();
   o.add(buildThreatEntrySet());
   o.add(buildThreatEntrySet());
   return o;
 }
 
-checkUnnamed1136(core.List<api.ThreatEntrySet> o) {
+checkUnnamed1146(core.List<api.ThreatEntrySet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThreatEntrySet(o[0]);
   checkThreatEntrySet(o[1]);
 }
 
-buildUnnamed1137() {
+buildUnnamed1147() {
   var o = new core.List<api.ThreatEntrySet>();
   o.add(buildThreatEntrySet());
   o.add(buildThreatEntrySet());
   return o;
 }
 
-checkUnnamed1137(core.List<api.ThreatEntrySet> o) {
+checkUnnamed1147(core.List<api.ThreatEntrySet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThreatEntrySet(o[0]);
   checkThreatEntrySet(o[1]);
@@ -413,11 +428,11 @@
   var o = new api.ListUpdateResponse();
   buildCounterListUpdateResponse++;
   if (buildCounterListUpdateResponse < 3) {
-    o.additions = buildUnnamed1136();
+    o.additions = buildUnnamed1146();
     o.checksum = buildChecksum();
     o.newClientState = "foo";
     o.platformType = "foo";
-    o.removals = buildUnnamed1137();
+    o.removals = buildUnnamed1147();
     o.responseType = "foo";
     o.threatEntryType = "foo";
     o.threatType = "foo";
@@ -429,11 +444,11 @@
 checkListUpdateResponse(api.ListUpdateResponse o) {
   buildCounterListUpdateResponse++;
   if (buildCounterListUpdateResponse < 3) {
-    checkUnnamed1136(o.additions);
+    checkUnnamed1146(o.additions);
     checkChecksum(o.checksum);
     unittest.expect(o.newClientState, unittest.equals('foo'));
     unittest.expect(o.platformType, unittest.equals('foo'));
-    checkUnnamed1137(o.removals);
+    checkUnnamed1147(o.removals);
     unittest.expect(o.responseType, unittest.equals('foo'));
     unittest.expect(o.threatEntryType, unittest.equals('foo'));
     unittest.expect(o.threatType, unittest.equals('foo'));
@@ -483,14 +498,14 @@
   buildCounterRawHashes--;
 }
 
-buildUnnamed1138() {
+buildUnnamed1148() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1138(core.List<core.int> o) {
+checkUnnamed1148(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));
@@ -501,7 +516,7 @@
   var o = new api.RawIndices();
   buildCounterRawIndices++;
   if (buildCounterRawIndices < 3) {
-    o.indices = buildUnnamed1138();
+    o.indices = buildUnnamed1148();
   }
   buildCounterRawIndices--;
   return o;
@@ -510,7 +525,7 @@
 checkRawIndices(api.RawIndices o) {
   buildCounterRawIndices++;
   if (buildCounterRawIndices < 3) {
-    checkUnnamed1138(o.indices);
+    checkUnnamed1148(o.indices);
   }
   buildCounterRawIndices--;
 }
@@ -563,14 +578,14 @@
   buildCounterThreatEntry--;
 }
 
-buildUnnamed1139() {
+buildUnnamed1149() {
   var o = new core.List<api.MetadataEntry>();
   o.add(buildMetadataEntry());
   o.add(buildMetadataEntry());
   return o;
 }
 
-checkUnnamed1139(core.List<api.MetadataEntry> o) {
+checkUnnamed1149(core.List<api.MetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataEntry(o[0]);
   checkMetadataEntry(o[1]);
@@ -581,7 +596,7 @@
   var o = new api.ThreatEntryMetadata();
   buildCounterThreatEntryMetadata++;
   if (buildCounterThreatEntryMetadata < 3) {
-    o.entries = buildUnnamed1139();
+    o.entries = buildUnnamed1149();
   }
   buildCounterThreatEntryMetadata--;
   return o;
@@ -590,7 +605,7 @@
 checkThreatEntryMetadata(api.ThreatEntryMetadata o) {
   buildCounterThreatEntryMetadata++;
   if (buildCounterThreatEntryMetadata < 3) {
-    checkUnnamed1139(o.entries);
+    checkUnnamed1149(o.entries);
   }
   buildCounterThreatEntryMetadata--;
 }
@@ -622,53 +637,95 @@
   buildCounterThreatEntrySet--;
 }
 
-buildUnnamed1140() {
+buildUnnamed1150() {
+  var o = new core.List<api.ThreatSource>();
+  o.add(buildThreatSource());
+  o.add(buildThreatSource());
+  return o;
+}
+
+checkUnnamed1150(core.List<api.ThreatSource> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkThreatSource(o[0]);
+  checkThreatSource(o[1]);
+}
+
+core.int buildCounterThreatHit = 0;
+buildThreatHit() {
+  var o = new api.ThreatHit();
+  buildCounterThreatHit++;
+  if (buildCounterThreatHit < 3) {
+    o.clientInfo = buildClientInfo();
+    o.entry = buildThreatEntry();
+    o.platformType = "foo";
+    o.resources = buildUnnamed1150();
+    o.threatType = "foo";
+    o.userInfo = buildUserInfo();
+  }
+  buildCounterThreatHit--;
+  return o;
+}
+
+checkThreatHit(api.ThreatHit o) {
+  buildCounterThreatHit++;
+  if (buildCounterThreatHit < 3) {
+    checkClientInfo(o.clientInfo);
+    checkThreatEntry(o.entry);
+    unittest.expect(o.platformType, unittest.equals('foo'));
+    checkUnnamed1150(o.resources);
+    unittest.expect(o.threatType, unittest.equals('foo'));
+    checkUserInfo(o.userInfo);
+  }
+  buildCounterThreatHit--;
+}
+
+buildUnnamed1151() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1140(core.List<core.String> o) {
+checkUnnamed1151(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1141() {
+buildUnnamed1152() {
   var o = new core.List<api.ThreatEntry>();
   o.add(buildThreatEntry());
   o.add(buildThreatEntry());
   return o;
 }
 
-checkUnnamed1141(core.List<api.ThreatEntry> o) {
+checkUnnamed1152(core.List<api.ThreatEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThreatEntry(o[0]);
   checkThreatEntry(o[1]);
 }
 
-buildUnnamed1142() {
+buildUnnamed1153() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1142(core.List<core.String> o) {
+checkUnnamed1153(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1143() {
+buildUnnamed1154() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1143(core.List<core.String> o) {
+checkUnnamed1154(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -679,10 +736,10 @@
   var o = new api.ThreatInfo();
   buildCounterThreatInfo++;
   if (buildCounterThreatInfo < 3) {
-    o.platformTypes = buildUnnamed1140();
-    o.threatEntries = buildUnnamed1141();
-    o.threatEntryTypes = buildUnnamed1142();
-    o.threatTypes = buildUnnamed1143();
+    o.platformTypes = buildUnnamed1151();
+    o.threatEntries = buildUnnamed1152();
+    o.threatEntryTypes = buildUnnamed1153();
+    o.threatTypes = buildUnnamed1154();
   }
   buildCounterThreatInfo--;
   return o;
@@ -691,10 +748,10 @@
 checkThreatInfo(api.ThreatInfo o) {
   buildCounterThreatInfo++;
   if (buildCounterThreatInfo < 3) {
-    checkUnnamed1140(o.platformTypes);
-    checkUnnamed1141(o.threatEntries);
-    checkUnnamed1142(o.threatEntryTypes);
-    checkUnnamed1143(o.threatTypes);
+    checkUnnamed1151(o.platformTypes);
+    checkUnnamed1152(o.threatEntries);
+    checkUnnamed1153(o.threatEntryTypes);
+    checkUnnamed1154(o.threatTypes);
   }
   buildCounterThreatInfo--;
 }
@@ -751,6 +808,52 @@
   buildCounterThreatMatch--;
 }
 
+core.int buildCounterThreatSource = 0;
+buildThreatSource() {
+  var o = new api.ThreatSource();
+  buildCounterThreatSource++;
+  if (buildCounterThreatSource < 3) {
+    o.referrer = "foo";
+    o.remoteIp = "foo";
+    o.type = "foo";
+    o.url = "foo";
+  }
+  buildCounterThreatSource--;
+  return o;
+}
+
+checkThreatSource(api.ThreatSource o) {
+  buildCounterThreatSource++;
+  if (buildCounterThreatSource < 3) {
+    unittest.expect(o.referrer, unittest.equals('foo'));
+    unittest.expect(o.remoteIp, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+    unittest.expect(o.url, unittest.equals('foo'));
+  }
+  buildCounterThreatSource--;
+}
+
+core.int buildCounterUserInfo = 0;
+buildUserInfo() {
+  var o = new api.UserInfo();
+  buildCounterUserInfo++;
+  if (buildCounterUserInfo < 3) {
+    o.regionCode = "foo";
+    o.userId = "foo";
+  }
+  buildCounterUserInfo--;
+  return o;
+}
+
+checkUserInfo(api.UserInfo o) {
+  buildCounterUserInfo++;
+  if (buildCounterUserInfo < 3) {
+    unittest.expect(o.regionCode, unittest.equals('foo'));
+    unittest.expect(o.userId, unittest.equals('foo'));
+  }
+  buildCounterUserInfo--;
+}
+
 main() {
   unittest.group("obj-schema-Checksum", () {
     unittest.test("to-json--from-json", () {
@@ -776,6 +879,14 @@
     });
   });
 
+  unittest.group("obj-schema-Empty", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildEmpty();
+      var od = new api.Empty.fromJson(o.toJson());
+      checkEmpty(od);
+    });
+  });
+
   unittest.group("obj-schema-FetchThreatListUpdatesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildFetchThreatListUpdatesRequest();
@@ -904,6 +1015,14 @@
     });
   });
 
+  unittest.group("obj-schema-ThreatHit", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildThreatHit();
+      var od = new api.ThreatHit.fromJson(o.toJson());
+      checkThreatHit(od);
+    });
+  });
+
   unittest.group("obj-schema-ThreatInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildThreatInfo();
@@ -928,14 +1047,30 @@
     });
   });
 
+  unittest.group("obj-schema-ThreatSource", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildThreatSource();
+      var od = new api.ThreatSource.fromJson(o.toJson());
+      checkThreatSource(od);
+    });
+  });
+
+  unittest.group("obj-schema-UserInfo", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildUserInfo();
+      var od = new api.UserInfo.fromJson(o.toJson());
+      checkUserInfo(od);
+    });
+  });
+
   unittest.group("resource-EncodedFullHashesResourceApi", () {
     unittest.test("method--get", () {
       var mock = new HttpServerMock();
       api.EncodedFullHashesResourceApi res =
           new api.SafebrowsingApi(mock).encodedFullHashes;
       var arg_encodedRequest = "foo";
-      var arg_clientVersion = "foo";
       var arg_clientId = "foo";
+      var arg_clientVersion = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -970,10 +1105,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["clientVersion"].first,
-            unittest.equals(arg_clientVersion));
         unittest.expect(
             queryMap["clientId"].first, unittest.equals(arg_clientId));
+        unittest.expect(queryMap["clientVersion"].first,
+            unittest.equals(arg_clientVersion));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -984,8 +1119,8 @@
       }), true);
       res
           .get(arg_encodedRequest,
-              clientVersion: arg_clientVersion,
               clientId: arg_clientId,
+              clientVersion: arg_clientVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.FindFullHashesResponse response) {
         checkFindFullHashesResponse(response);
@@ -1114,6 +1249,61 @@
     });
   });
 
+  unittest.group("resource-ThreatHitsResourceApi", () {
+    unittest.test("method--create", () {
+      var mock = new HttpServerMock();
+      api.ThreatHitsResourceApi res = new api.SafebrowsingApi(mock).threatHits;
+      var arg_request = buildThreatHit();
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.ThreatHit.fromJson(json);
+        checkThreatHit(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 + 13),
+            unittest.equals("v4/threatHits"));
+        pathOffset += 13;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildEmpty());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .create(arg_request, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Empty response) {
+        checkEmpty(response);
+      })));
+    });
+  });
+
   unittest.group("resource-ThreatListUpdatesResourceApi", () {
     unittest.test("method--fetch", () {
       var mock = new HttpServerMock();
diff --git a/generated/googleapis/test/script/v1_test.dart b/generated/googleapis/test/script/v1_test.dart
index 800e41e..cfd8c4d 100644
--- a/generated/googleapis/test/script/v1_test.dart
+++ b/generated/googleapis/test/script/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed843() {
+buildUnnamed848() {
   var o = new core.List<api.ScriptStackTraceElement>();
   o.add(buildScriptStackTraceElement());
   o.add(buildScriptStackTraceElement());
   return o;
 }
 
-checkUnnamed843(core.List<api.ScriptStackTraceElement> o) {
+checkUnnamed848(core.List<api.ScriptStackTraceElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkScriptStackTraceElement(o[0]);
   checkScriptStackTraceElement(o[1]);
@@ -70,7 +70,7 @@
   if (buildCounterExecutionError < 3) {
     o.errorMessage = "foo";
     o.errorType = "foo";
-    o.scriptStackTraceElements = buildUnnamed843();
+    o.scriptStackTraceElements = buildUnnamed848();
   }
   buildCounterExecutionError--;
   return o;
@@ -81,12 +81,12 @@
   if (buildCounterExecutionError < 3) {
     unittest.expect(o.errorMessage, unittest.equals('foo'));
     unittest.expect(o.errorType, unittest.equals('foo'));
-    checkUnnamed843(o.scriptStackTraceElements);
+    checkUnnamed848(o.scriptStackTraceElements);
   }
   buildCounterExecutionError--;
 }
 
-buildUnnamed844() {
+buildUnnamed849() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -101,7 +101,7 @@
   return o;
 }
 
-checkUnnamed844(core.List<core.Object> o) {
+checkUnnamed849(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map;
   unittest.expect(casted1, unittest.hasLength(3));
@@ -122,7 +122,7 @@
   if (buildCounterExecutionRequest < 3) {
     o.devMode = true;
     o.function = "foo";
-    o.parameters = buildUnnamed844();
+    o.parameters = buildUnnamed849();
     o.sessionState = "foo";
   }
   buildCounterExecutionRequest--;
@@ -134,7 +134,7 @@
   if (buildCounterExecutionRequest < 3) {
     unittest.expect(o.devMode, unittest.isTrue);
     unittest.expect(o.function, unittest.equals('foo'));
-    checkUnnamed844(o.parameters);
+    checkUnnamed849(o.parameters);
     unittest.expect(o.sessionState, unittest.equals('foo'));
   }
   buildCounterExecutionRequest--;
@@ -167,7 +167,7 @@
   buildCounterExecutionResponse--;
 }
 
-buildUnnamed845() {
+buildUnnamed850() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -182,7 +182,7 @@
   return o;
 }
 
-checkUnnamed845(core.Map<core.String, core.Object> o) {
+checkUnnamed850(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted4 = (o["x"]) as core.Map;
   unittest.expect(casted4, unittest.hasLength(3));
@@ -203,7 +203,7 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.response = buildUnnamed845();
+    o.response = buildUnnamed850();
   }
   buildCounterOperation--;
   return o;
@@ -214,7 +214,7 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed845(o.response);
+    checkUnnamed850(o.response);
   }
   buildCounterOperation--;
 }
@@ -240,7 +240,7 @@
   buildCounterScriptStackTraceElement--;
 }
 
-buildUnnamed846() {
+buildUnnamed851() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -255,7 +255,7 @@
   return o;
 }
 
-checkUnnamed846(core.Map<core.String, core.Object> o) {
+checkUnnamed851(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted6 = (o["x"]) as core.Map;
   unittest.expect(casted6, unittest.hasLength(3));
@@ -269,17 +269,17 @@
   unittest.expect(casted7["string"], unittest.equals('foo'));
 }
 
-buildUnnamed847() {
+buildUnnamed852() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed846());
-  o.add(buildUnnamed846());
+  o.add(buildUnnamed851());
+  o.add(buildUnnamed851());
   return o;
 }
 
-checkUnnamed847(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed852(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed846(o[0]);
-  checkUnnamed846(o[1]);
+  checkUnnamed851(o[0]);
+  checkUnnamed851(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -288,7 +288,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed847();
+    o.details = buildUnnamed852();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -299,7 +299,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed847(o.details);
+    checkUnnamed852(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
diff --git a/generated/googleapis/test/searchconsole/v1_test.dart b/generated/googleapis/test/searchconsole/v1_test.dart
index c70cece..1884d3a 100644
--- a/generated/googleapis/test/searchconsole/v1_test.dart
+++ b/generated/googleapis/test/searchconsole/v1_test.dart
@@ -149,27 +149,27 @@
   buildCounterRunMobileFriendlyTestRequest--;
 }
 
-buildUnnamed1273() {
+buildUnnamed1289() {
   var o = new core.List<api.MobileFriendlyIssue>();
   o.add(buildMobileFriendlyIssue());
   o.add(buildMobileFriendlyIssue());
   return o;
 }
 
-checkUnnamed1273(core.List<api.MobileFriendlyIssue> o) {
+checkUnnamed1289(core.List<api.MobileFriendlyIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileFriendlyIssue(o[0]);
   checkMobileFriendlyIssue(o[1]);
 }
 
-buildUnnamed1274() {
+buildUnnamed1290() {
   var o = new core.List<api.ResourceIssue>();
   o.add(buildResourceIssue());
   o.add(buildResourceIssue());
   return o;
 }
 
-checkUnnamed1274(core.List<api.ResourceIssue> o) {
+checkUnnamed1290(core.List<api.ResourceIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceIssue(o[0]);
   checkResourceIssue(o[1]);
@@ -181,8 +181,8 @@
   buildCounterRunMobileFriendlyTestResponse++;
   if (buildCounterRunMobileFriendlyTestResponse < 3) {
     o.mobileFriendliness = "foo";
-    o.mobileFriendlyIssues = buildUnnamed1273();
-    o.resourceIssues = buildUnnamed1274();
+    o.mobileFriendlyIssues = buildUnnamed1289();
+    o.resourceIssues = buildUnnamed1290();
     o.screenshot = buildImage();
     o.testStatus = buildTestStatus();
   }
@@ -194,8 +194,8 @@
   buildCounterRunMobileFriendlyTestResponse++;
   if (buildCounterRunMobileFriendlyTestResponse < 3) {
     unittest.expect(o.mobileFriendliness, unittest.equals('foo'));
-    checkUnnamed1273(o.mobileFriendlyIssues);
-    checkUnnamed1274(o.resourceIssues);
+    checkUnnamed1289(o.mobileFriendlyIssues);
+    checkUnnamed1290(o.resourceIssues);
     checkImage(o.screenshot);
     checkTestStatus(o.testStatus);
   }
diff --git a/generated/googleapis/test/serviceconsumermanagement/v1_test.dart b/generated/googleapis/test/serviceconsumermanagement/v1_test.dart
index df55ef1..63f51bc 100644
--- a/generated/googleapis/test/serviceconsumermanagement/v1_test.dart
+++ b/generated/googleapis/test/serviceconsumermanagement/v1_test.dart
@@ -71,40 +71,40 @@
   buildCounterAddTenantProjectRequest--;
 }
 
-buildUnnamed3512() {
+buildUnnamed3541() {
   var o = new core.List<api.Method>();
   o.add(buildMethod());
   o.add(buildMethod());
   return o;
 }
 
-checkUnnamed3512(core.List<api.Method> o) {
+checkUnnamed3541(core.List<api.Method> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMethod(o[0]);
   checkMethod(o[1]);
 }
 
-buildUnnamed3513() {
+buildUnnamed3542() {
   var o = new core.List<api.Mixin>();
   o.add(buildMixin());
   o.add(buildMixin());
   return o;
 }
 
-checkUnnamed3513(core.List<api.Mixin> o) {
+checkUnnamed3542(core.List<api.Mixin> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMixin(o[0]);
   checkMixin(o[1]);
 }
 
-buildUnnamed3514() {
+buildUnnamed3543() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed3514(core.List<api.Option> o) {
+checkUnnamed3543(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -115,10 +115,10 @@
   var o = new api.Api();
   buildCounterApi++;
   if (buildCounterApi < 3) {
-    o.methods = buildUnnamed3512();
-    o.mixins = buildUnnamed3513();
+    o.methods = buildUnnamed3541();
+    o.mixins = buildUnnamed3542();
     o.name = "foo";
-    o.options = buildUnnamed3514();
+    o.options = buildUnnamed3543();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
     o.version = "foo";
@@ -130,10 +130,10 @@
 checkApi(api.Api o) {
   buildCounterApi++;
   if (buildCounterApi < 3) {
-    checkUnnamed3512(o.methods);
-    checkUnnamed3513(o.mixins);
+    checkUnnamed3541(o.methods);
+    checkUnnamed3542(o.mixins);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3514(o.options);
+    checkUnnamed3543(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
@@ -189,27 +189,27 @@
   buildCounterAuthRequirement--;
 }
 
-buildUnnamed3515() {
+buildUnnamed3544() {
   var o = new core.List<api.AuthProvider>();
   o.add(buildAuthProvider());
   o.add(buildAuthProvider());
   return o;
 }
 
-checkUnnamed3515(core.List<api.AuthProvider> o) {
+checkUnnamed3544(core.List<api.AuthProvider> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthProvider(o[0]);
   checkAuthProvider(o[1]);
 }
 
-buildUnnamed3516() {
+buildUnnamed3545() {
   var o = new core.List<api.AuthenticationRule>();
   o.add(buildAuthenticationRule());
   o.add(buildAuthenticationRule());
   return o;
 }
 
-checkUnnamed3516(core.List<api.AuthenticationRule> o) {
+checkUnnamed3545(core.List<api.AuthenticationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthenticationRule(o[0]);
   checkAuthenticationRule(o[1]);
@@ -220,8 +220,8 @@
   var o = new api.Authentication();
   buildCounterAuthentication++;
   if (buildCounterAuthentication < 3) {
-    o.providers = buildUnnamed3515();
-    o.rules = buildUnnamed3516();
+    o.providers = buildUnnamed3544();
+    o.rules = buildUnnamed3545();
   }
   buildCounterAuthentication--;
   return o;
@@ -230,20 +230,20 @@
 checkAuthentication(api.Authentication o) {
   buildCounterAuthentication++;
   if (buildCounterAuthentication < 3) {
-    checkUnnamed3515(o.providers);
-    checkUnnamed3516(o.rules);
+    checkUnnamed3544(o.providers);
+    checkUnnamed3545(o.rules);
   }
   buildCounterAuthentication--;
 }
 
-buildUnnamed3517() {
+buildUnnamed3546() {
   var o = new core.List<api.AuthRequirement>();
   o.add(buildAuthRequirement());
   o.add(buildAuthRequirement());
   return o;
 }
 
-checkUnnamed3517(core.List<api.AuthRequirement> o) {
+checkUnnamed3546(core.List<api.AuthRequirement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthRequirement(o[0]);
   checkAuthRequirement(o[1]);
@@ -257,7 +257,7 @@
     o.allowWithoutCredential = true;
     o.customAuth = buildCustomAuthRequirements();
     o.oauth = buildOAuthRequirements();
-    o.requirements = buildUnnamed3517();
+    o.requirements = buildUnnamed3546();
     o.selector = "foo";
   }
   buildCounterAuthenticationRule--;
@@ -270,7 +270,7 @@
     unittest.expect(o.allowWithoutCredential, unittest.isTrue);
     checkCustomAuthRequirements(o.customAuth);
     checkOAuthRequirements(o.oauth);
-    checkUnnamed3517(o.requirements);
+    checkUnnamed3546(o.requirements);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterAuthenticationRule--;
@@ -316,14 +316,14 @@
   buildCounterAuthorizationRule--;
 }
 
-buildUnnamed3518() {
+buildUnnamed3547() {
   var o = new core.List<api.BackendRule>();
   o.add(buildBackendRule());
   o.add(buildBackendRule());
   return o;
 }
 
-checkUnnamed3518(core.List<api.BackendRule> o) {
+checkUnnamed3547(core.List<api.BackendRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendRule(o[0]);
   checkBackendRule(o[1]);
@@ -334,7 +334,7 @@
   var o = new api.Backend();
   buildCounterBackend++;
   if (buildCounterBackend < 3) {
-    o.rules = buildUnnamed3518();
+    o.rules = buildUnnamed3547();
   }
   buildCounterBackend--;
   return o;
@@ -343,7 +343,7 @@
 checkBackend(api.Backend o) {
   buildCounterBackend++;
   if (buildCounterBackend < 3) {
-    checkUnnamed3518(o.rules);
+    checkUnnamed3547(o.rules);
   }
   buildCounterBackend--;
 }
@@ -373,14 +373,14 @@
   buildCounterBackendRule--;
 }
 
-buildUnnamed3519() {
+buildUnnamed3548() {
   var o = new core.List<api.BillingDestination>();
   o.add(buildBillingDestination());
   o.add(buildBillingDestination());
   return o;
 }
 
-checkUnnamed3519(core.List<api.BillingDestination> o) {
+checkUnnamed3548(core.List<api.BillingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBillingDestination(o[0]);
   checkBillingDestination(o[1]);
@@ -391,7 +391,7 @@
   var o = new api.Billing();
   buildCounterBilling++;
   if (buildCounterBilling < 3) {
-    o.consumerDestinations = buildUnnamed3519();
+    o.consumerDestinations = buildUnnamed3548();
   }
   buildCounterBilling--;
   return o;
@@ -400,7 +400,7 @@
 checkBilling(api.Billing o) {
   buildCounterBilling++;
   if (buildCounterBilling < 3) {
-    checkUnnamed3519(o.consumerDestinations);
+    checkUnnamed3548(o.consumerDestinations);
   }
   buildCounterBilling--;
 }
@@ -424,14 +424,14 @@
   buildCounterBillingConfig--;
 }
 
-buildUnnamed3520() {
+buildUnnamed3549() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3520(core.List<core.String> o) {
+checkUnnamed3549(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -442,7 +442,7 @@
   var o = new api.BillingDestination();
   buildCounterBillingDestination++;
   if (buildCounterBillingDestination < 3) {
-    o.metrics = buildUnnamed3520();
+    o.metrics = buildUnnamed3549();
     o.monitoredResource = "foo";
   }
   buildCounterBillingDestination--;
@@ -452,7 +452,7 @@
 checkBillingDestination(api.BillingDestination o) {
   buildCounterBillingDestination++;
   if (buildCounterBillingDestination < 3) {
-    checkUnnamed3520(o.metrics);
+    checkUnnamed3549(o.metrics);
     unittest.expect(o.monitoredResource, unittest.equals('foo'));
   }
   buildCounterBillingDestination--;
@@ -473,14 +473,14 @@
   buildCounterCancelOperationRequest--;
 }
 
-buildUnnamed3521() {
+buildUnnamed3550() {
   var o = new core.List<api.ContextRule>();
   o.add(buildContextRule());
   o.add(buildContextRule());
   return o;
 }
 
-checkUnnamed3521(core.List<api.ContextRule> o) {
+checkUnnamed3550(core.List<api.ContextRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContextRule(o[0]);
   checkContextRule(o[1]);
@@ -491,7 +491,7 @@
   var o = new api.Context();
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    o.rules = buildUnnamed3521();
+    o.rules = buildUnnamed3550();
   }
   buildCounterContext--;
   return o;
@@ -500,32 +500,32 @@
 checkContext(api.Context o) {
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    checkUnnamed3521(o.rules);
+    checkUnnamed3550(o.rules);
   }
   buildCounterContext--;
 }
 
-buildUnnamed3522() {
+buildUnnamed3551() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3522(core.List<core.String> o) {
+checkUnnamed3551(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3523() {
+buildUnnamed3552() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3523(core.List<core.String> o) {
+checkUnnamed3552(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -536,8 +536,8 @@
   var o = new api.ContextRule();
   buildCounterContextRule++;
   if (buildCounterContextRule < 3) {
-    o.provided = buildUnnamed3522();
-    o.requested = buildUnnamed3523();
+    o.provided = buildUnnamed3551();
+    o.requested = buildUnnamed3552();
     o.selector = "foo";
   }
   buildCounterContextRule--;
@@ -547,8 +547,8 @@
 checkContextRule(api.ContextRule o) {
   buildCounterContextRule++;
   if (buildCounterContextRule < 3) {
-    checkUnnamed3522(o.provided);
-    checkUnnamed3523(o.requested);
+    checkUnnamed3551(o.provided);
+    checkUnnamed3552(o.requested);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterContextRule--;
@@ -611,27 +611,27 @@
   buildCounterCustomAuthRequirements--;
 }
 
-buildUnnamed3524() {
+buildUnnamed3553() {
   var o = new core.List<api.CustomErrorRule>();
   o.add(buildCustomErrorRule());
   o.add(buildCustomErrorRule());
   return o;
 }
 
-checkUnnamed3524(core.List<api.CustomErrorRule> o) {
+checkUnnamed3553(core.List<api.CustomErrorRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomErrorRule(o[0]);
   checkCustomErrorRule(o[1]);
 }
 
-buildUnnamed3525() {
+buildUnnamed3554() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3525(core.List<core.String> o) {
+checkUnnamed3554(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -642,8 +642,8 @@
   var o = new api.CustomError();
   buildCounterCustomError++;
   if (buildCounterCustomError < 3) {
-    o.rules = buildUnnamed3524();
-    o.types = buildUnnamed3525();
+    o.rules = buildUnnamed3553();
+    o.types = buildUnnamed3554();
   }
   buildCounterCustomError--;
   return o;
@@ -652,8 +652,8 @@
 checkCustomError(api.CustomError o) {
   buildCounterCustomError++;
   if (buildCounterCustomError < 3) {
-    checkUnnamed3524(o.rules);
-    checkUnnamed3525(o.types);
+    checkUnnamed3553(o.rules);
+    checkUnnamed3554(o.types);
   }
   buildCounterCustomError--;
 }
@@ -700,27 +700,27 @@
   buildCounterCustomHttpPattern--;
 }
 
-buildUnnamed3526() {
+buildUnnamed3555() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed3526(core.List<api.Page> o) {
+checkUnnamed3555(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
 }
 
-buildUnnamed3527() {
+buildUnnamed3556() {
   var o = new core.List<api.DocumentationRule>();
   o.add(buildDocumentationRule());
   o.add(buildDocumentationRule());
   return o;
 }
 
-checkUnnamed3527(core.List<api.DocumentationRule> o) {
+checkUnnamed3556(core.List<api.DocumentationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDocumentationRule(o[0]);
   checkDocumentationRule(o[1]);
@@ -733,8 +733,8 @@
   if (buildCounterDocumentation < 3) {
     o.documentationRootUrl = "foo";
     o.overview = "foo";
-    o.pages = buildUnnamed3526();
-    o.rules = buildUnnamed3527();
+    o.pages = buildUnnamed3555();
+    o.rules = buildUnnamed3556();
     o.summary = "foo";
   }
   buildCounterDocumentation--;
@@ -746,8 +746,8 @@
   if (buildCounterDocumentation < 3) {
     unittest.expect(o.documentationRootUrl, unittest.equals('foo'));
     unittest.expect(o.overview, unittest.equals('foo'));
-    checkUnnamed3526(o.pages);
-    checkUnnamed3527(o.rules);
+    checkUnnamed3555(o.pages);
+    checkUnnamed3556(o.rules);
     unittest.expect(o.summary, unittest.equals('foo'));
   }
   buildCounterDocumentation--;
@@ -791,27 +791,27 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed3528() {
+buildUnnamed3557() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3528(core.List<core.String> o) {
+checkUnnamed3557(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3529() {
+buildUnnamed3558() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3529(core.List<core.String> o) {
+checkUnnamed3558(core.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,9 +822,9 @@
   var o = new api.Endpoint();
   buildCounterEndpoint++;
   if (buildCounterEndpoint < 3) {
-    o.aliases = buildUnnamed3528();
+    o.aliases = buildUnnamed3557();
     o.allowCors = true;
-    o.features = buildUnnamed3529();
+    o.features = buildUnnamed3558();
     o.name = "foo";
     o.target = "foo";
   }
@@ -835,36 +835,36 @@
 checkEndpoint(api.Endpoint o) {
   buildCounterEndpoint++;
   if (buildCounterEndpoint < 3) {
-    checkUnnamed3528(o.aliases);
+    checkUnnamed3557(o.aliases);
     unittest.expect(o.allowCors, unittest.isTrue);
-    checkUnnamed3529(o.features);
+    checkUnnamed3558(o.features);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
   }
   buildCounterEndpoint--;
 }
 
-buildUnnamed3530() {
+buildUnnamed3559() {
   var o = new core.List<api.EnumValue>();
   o.add(buildEnumValue());
   o.add(buildEnumValue());
   return o;
 }
 
-checkUnnamed3530(core.List<api.EnumValue> o) {
+checkUnnamed3559(core.List<api.EnumValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnumValue(o[0]);
   checkEnumValue(o[1]);
 }
 
-buildUnnamed3531() {
+buildUnnamed3560() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed3531(core.List<api.Option> o) {
+checkUnnamed3560(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -875,9 +875,9 @@
   var o = new api.Enum();
   buildCounterEnum++;
   if (buildCounterEnum < 3) {
-    o.enumvalue = buildUnnamed3530();
+    o.enumvalue = buildUnnamed3559();
     o.name = "foo";
-    o.options = buildUnnamed3531();
+    o.options = buildUnnamed3560();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
   }
@@ -888,23 +888,23 @@
 checkEnum(api.Enum o) {
   buildCounterEnum++;
   if (buildCounterEnum < 3) {
-    checkUnnamed3530(o.enumvalue);
+    checkUnnamed3559(o.enumvalue);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3531(o.options);
+    checkUnnamed3560(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterEnum--;
 }
 
-buildUnnamed3532() {
+buildUnnamed3561() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed3532(core.List<api.Option> o) {
+checkUnnamed3561(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -917,7 +917,7 @@
   if (buildCounterEnumValue < 3) {
     o.name = "foo";
     o.number = 42;
-    o.options = buildUnnamed3532();
+    o.options = buildUnnamed3561();
   }
   buildCounterEnumValue--;
   return o;
@@ -928,7 +928,7 @@
   if (buildCounterEnumValue < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals(42));
-    checkUnnamed3532(o.options);
+    checkUnnamed3561(o.options);
   }
   buildCounterEnumValue--;
 }
@@ -952,14 +952,14 @@
   buildCounterExperimental--;
 }
 
-buildUnnamed3533() {
+buildUnnamed3562() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed3533(core.List<api.Option> o) {
+checkUnnamed3562(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -977,7 +977,7 @@
     o.name = "foo";
     o.number = 42;
     o.oneofIndex = 42;
-    o.options = buildUnnamed3533();
+    o.options = buildUnnamed3562();
     o.packed = true;
     o.typeUrl = "foo";
   }
@@ -995,21 +995,21 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals(42));
     unittest.expect(o.oneofIndex, unittest.equals(42));
-    checkUnnamed3533(o.options);
+    checkUnnamed3562(o.options);
     unittest.expect(o.packed, unittest.isTrue);
     unittest.expect(o.typeUrl, unittest.equals('foo'));
   }
   buildCounterField--;
 }
 
-buildUnnamed3534() {
+buildUnnamed3563() {
   var o = new core.List<api.HttpRule>();
   o.add(buildHttpRule());
   o.add(buildHttpRule());
   return o;
 }
 
-checkUnnamed3534(core.List<api.HttpRule> o) {
+checkUnnamed3563(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpRule(o[0]);
   checkHttpRule(o[1]);
@@ -1021,7 +1021,7 @@
   buildCounterHttp++;
   if (buildCounterHttp < 3) {
     o.fullyDecodeReservedExpansion = true;
-    o.rules = buildUnnamed3534();
+    o.rules = buildUnnamed3563();
   }
   buildCounterHttp--;
   return o;
@@ -1031,32 +1031,32 @@
   buildCounterHttp++;
   if (buildCounterHttp < 3) {
     unittest.expect(o.fullyDecodeReservedExpansion, unittest.isTrue);
-    checkUnnamed3534(o.rules);
+    checkUnnamed3563(o.rules);
   }
   buildCounterHttp--;
 }
 
-buildUnnamed3535() {
+buildUnnamed3564() {
   var o = new core.List<api.HttpRule>();
   o.add(buildHttpRule());
   o.add(buildHttpRule());
   return o;
 }
 
-checkUnnamed3535(core.List<api.HttpRule> o) {
+checkUnnamed3564(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpRule(o[0]);
   checkHttpRule(o[1]);
 }
 
-buildUnnamed3536() {
+buildUnnamed3565() {
   var o = new core.List<api.AuthorizationRule>();
   o.add(buildAuthorizationRule());
   o.add(buildAuthorizationRule());
   return o;
 }
 
-checkUnnamed3536(core.List<api.AuthorizationRule> o) {
+checkUnnamed3565(core.List<api.AuthorizationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthorizationRule(o[0]);
   checkAuthorizationRule(o[1]);
@@ -1067,8 +1067,8 @@
   var o = new api.HttpRule();
   buildCounterHttpRule++;
   if (buildCounterHttpRule < 3) {
-    o.additionalBindings = buildUnnamed3535();
-    o.authorizations = buildUnnamed3536();
+    o.additionalBindings = buildUnnamed3564();
+    o.authorizations = buildUnnamed3565();
     o.body = "foo";
     o.custom = buildCustomHttpPattern();
     o.delete = "foo";
@@ -1090,8 +1090,8 @@
 checkHttpRule(api.HttpRule o) {
   buildCounterHttpRule++;
   if (buildCounterHttpRule < 3) {
-    checkUnnamed3535(o.additionalBindings);
-    checkUnnamed3536(o.authorizations);
+    checkUnnamed3564(o.additionalBindings);
+    checkUnnamed3565(o.authorizations);
     unittest.expect(o.body, unittest.equals('foo'));
     checkCustomHttpPattern(o.custom);
     unittest.expect(o.delete, unittest.equals('foo'));
@@ -1132,14 +1132,14 @@
   buildCounterLabelDescriptor--;
 }
 
-buildUnnamed3537() {
+buildUnnamed3566() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed3537(core.List<api.Operation> o) {
+checkUnnamed3566(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -1151,7 +1151,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed3537();
+    o.operations = buildUnnamed3566();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -1161,19 +1161,19 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3537(o.operations);
+    checkUnnamed3566(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed3538() {
+buildUnnamed3567() {
   var o = new core.List<api.TenancyUnit>();
   o.add(buildTenancyUnit());
   o.add(buildTenancyUnit());
   return o;
 }
 
-checkUnnamed3538(core.List<api.TenancyUnit> o) {
+checkUnnamed3567(core.List<api.TenancyUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTenancyUnit(o[0]);
   checkTenancyUnit(o[1]);
@@ -1185,7 +1185,7 @@
   buildCounterListTenancyUnitsResponse++;
   if (buildCounterListTenancyUnitsResponse < 3) {
     o.nextPageToken = "foo";
-    o.tenancyUnits = buildUnnamed3538();
+    o.tenancyUnits = buildUnnamed3567();
   }
   buildCounterListTenancyUnitsResponse--;
   return o;
@@ -1195,19 +1195,19 @@
   buildCounterListTenancyUnitsResponse++;
   if (buildCounterListTenancyUnitsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3538(o.tenancyUnits);
+    checkUnnamed3567(o.tenancyUnits);
   }
   buildCounterListTenancyUnitsResponse--;
 }
 
-buildUnnamed3539() {
+buildUnnamed3568() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed3539(core.List<api.LabelDescriptor> o) {
+checkUnnamed3568(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -1220,7 +1220,7 @@
   if (buildCounterLogDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed3539();
+    o.labels = buildUnnamed3568();
     o.name = "foo";
   }
   buildCounterLogDescriptor--;
@@ -1232,33 +1232,33 @@
   if (buildCounterLogDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed3539(o.labels);
+    checkUnnamed3568(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterLogDescriptor--;
 }
 
-buildUnnamed3540() {
+buildUnnamed3569() {
   var o = new core.List<api.LoggingDestination>();
   o.add(buildLoggingDestination());
   o.add(buildLoggingDestination());
   return o;
 }
 
-checkUnnamed3540(core.List<api.LoggingDestination> o) {
+checkUnnamed3569(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLoggingDestination(o[0]);
   checkLoggingDestination(o[1]);
 }
 
-buildUnnamed3541() {
+buildUnnamed3570() {
   var o = new core.List<api.LoggingDestination>();
   o.add(buildLoggingDestination());
   o.add(buildLoggingDestination());
   return o;
 }
 
-checkUnnamed3541(core.List<api.LoggingDestination> o) {
+checkUnnamed3570(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLoggingDestination(o[0]);
   checkLoggingDestination(o[1]);
@@ -1269,8 +1269,8 @@
   var o = new api.Logging();
   buildCounterLogging++;
   if (buildCounterLogging < 3) {
-    o.consumerDestinations = buildUnnamed3540();
-    o.producerDestinations = buildUnnamed3541();
+    o.consumerDestinations = buildUnnamed3569();
+    o.producerDestinations = buildUnnamed3570();
   }
   buildCounterLogging--;
   return o;
@@ -1279,20 +1279,20 @@
 checkLogging(api.Logging o) {
   buildCounterLogging++;
   if (buildCounterLogging < 3) {
-    checkUnnamed3540(o.consumerDestinations);
-    checkUnnamed3541(o.producerDestinations);
+    checkUnnamed3569(o.consumerDestinations);
+    checkUnnamed3570(o.producerDestinations);
   }
   buildCounterLogging--;
 }
 
-buildUnnamed3542() {
+buildUnnamed3571() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3542(core.List<core.String> o) {
+checkUnnamed3571(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1303,7 +1303,7 @@
   var o = new api.LoggingDestination();
   buildCounterLoggingDestination++;
   if (buildCounterLoggingDestination < 3) {
-    o.logs = buildUnnamed3542();
+    o.logs = buildUnnamed3571();
     o.monitoredResource = "foo";
   }
   buildCounterLoggingDestination--;
@@ -1313,7 +1313,7 @@
 checkLoggingDestination(api.LoggingDestination o) {
   buildCounterLoggingDestination++;
   if (buildCounterLoggingDestination < 3) {
-    checkUnnamed3542(o.logs);
+    checkUnnamed3571(o.logs);
     unittest.expect(o.monitoredResource, unittest.equals('foo'));
   }
   buildCounterLoggingDestination--;
@@ -1348,14 +1348,14 @@
   buildCounterMediaDownload--;
 }
 
-buildUnnamed3543() {
+buildUnnamed3572() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3543(core.List<core.String> o) {
+checkUnnamed3572(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1370,7 +1370,7 @@
     o.dropzone = "foo";
     o.enabled = true;
     o.maxSize = "foo";
-    o.mimeTypes = buildUnnamed3543();
+    o.mimeTypes = buildUnnamed3572();
     o.progressNotification = true;
     o.startNotification = true;
     o.uploadService = "foo";
@@ -1386,7 +1386,7 @@
     unittest.expect(o.dropzone, unittest.equals('foo'));
     unittest.expect(o.enabled, unittest.isTrue);
     unittest.expect(o.maxSize, unittest.equals('foo'));
-    checkUnnamed3543(o.mimeTypes);
+    checkUnnamed3572(o.mimeTypes);
     unittest.expect(o.progressNotification, unittest.isTrue);
     unittest.expect(o.startNotification, unittest.isTrue);
     unittest.expect(o.uploadService, unittest.equals('foo'));
@@ -1394,14 +1394,14 @@
   buildCounterMediaUpload--;
 }
 
-buildUnnamed3544() {
+buildUnnamed3573() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed3544(core.List<api.Option> o) {
+checkUnnamed3573(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -1413,7 +1413,7 @@
   buildCounterMethod++;
   if (buildCounterMethod < 3) {
     o.name = "foo";
-    o.options = buildUnnamed3544();
+    o.options = buildUnnamed3573();
     o.requestStreaming = true;
     o.requestTypeUrl = "foo";
     o.responseStreaming = true;
@@ -1428,7 +1428,7 @@
   buildCounterMethod++;
   if (buildCounterMethod < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3544(o.options);
+    checkUnnamed3573(o.options);
     unittest.expect(o.requestStreaming, unittest.isTrue);
     unittest.expect(o.requestTypeUrl, unittest.equals('foo'));
     unittest.expect(o.responseStreaming, unittest.isTrue);
@@ -1438,14 +1438,14 @@
   buildCounterMethod--;
 }
 
-buildUnnamed3545() {
+buildUnnamed3574() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed3545(core.List<api.LabelDescriptor> o) {
+checkUnnamed3574(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -1458,7 +1458,7 @@
   if (buildCounterMetricDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed3545();
+    o.labels = buildUnnamed3574();
     o.metricKind = "foo";
     o.name = "foo";
     o.type = "foo";
@@ -1474,7 +1474,7 @@
   if (buildCounterMetricDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed3545(o.labels);
+    checkUnnamed3574(o.labels);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1484,14 +1484,14 @@
   buildCounterMetricDescriptor--;
 }
 
-buildUnnamed3546() {
+buildUnnamed3575() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3546(core.Map<core.String, core.String> o) {
+checkUnnamed3575(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'));
@@ -1502,7 +1502,7 @@
   var o = new api.MetricRule();
   buildCounterMetricRule++;
   if (buildCounterMetricRule < 3) {
-    o.metricCosts = buildUnnamed3546();
+    o.metricCosts = buildUnnamed3575();
     o.selector = "foo";
   }
   buildCounterMetricRule--;
@@ -1512,7 +1512,7 @@
 checkMetricRule(api.MetricRule o) {
   buildCounterMetricRule++;
   if (buildCounterMetricRule < 3) {
-    checkUnnamed3546(o.metricCosts);
+    checkUnnamed3575(o.metricCosts);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterMetricRule--;
@@ -1539,14 +1539,14 @@
   buildCounterMixin--;
 }
 
-buildUnnamed3547() {
+buildUnnamed3576() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed3547(core.List<api.LabelDescriptor> o) {
+checkUnnamed3576(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -1559,7 +1559,7 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed3547();
+    o.labels = buildUnnamed3576();
     o.name = "foo";
     o.type = "foo";
   }
@@ -1572,34 +1572,34 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed3547(o.labels);
+    checkUnnamed3576(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterMonitoredResourceDescriptor--;
 }
 
-buildUnnamed3548() {
+buildUnnamed3577() {
   var o = new core.List<api.MonitoringDestination>();
   o.add(buildMonitoringDestination());
   o.add(buildMonitoringDestination());
   return o;
 }
 
-checkUnnamed3548(core.List<api.MonitoringDestination> o) {
+checkUnnamed3577(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoringDestination(o[0]);
   checkMonitoringDestination(o[1]);
 }
 
-buildUnnamed3549() {
+buildUnnamed3578() {
   var o = new core.List<api.MonitoringDestination>();
   o.add(buildMonitoringDestination());
   o.add(buildMonitoringDestination());
   return o;
 }
 
-checkUnnamed3549(core.List<api.MonitoringDestination> o) {
+checkUnnamed3578(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoringDestination(o[0]);
   checkMonitoringDestination(o[1]);
@@ -1610,8 +1610,8 @@
   var o = new api.Monitoring();
   buildCounterMonitoring++;
   if (buildCounterMonitoring < 3) {
-    o.consumerDestinations = buildUnnamed3548();
-    o.producerDestinations = buildUnnamed3549();
+    o.consumerDestinations = buildUnnamed3577();
+    o.producerDestinations = buildUnnamed3578();
   }
   buildCounterMonitoring--;
   return o;
@@ -1620,20 +1620,20 @@
 checkMonitoring(api.Monitoring o) {
   buildCounterMonitoring++;
   if (buildCounterMonitoring < 3) {
-    checkUnnamed3548(o.consumerDestinations);
-    checkUnnamed3549(o.producerDestinations);
+    checkUnnamed3577(o.consumerDestinations);
+    checkUnnamed3578(o.producerDestinations);
   }
   buildCounterMonitoring--;
 }
 
-buildUnnamed3550() {
+buildUnnamed3579() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3550(core.List<core.String> o) {
+checkUnnamed3579(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1644,7 +1644,7 @@
   var o = new api.MonitoringDestination();
   buildCounterMonitoringDestination++;
   if (buildCounterMonitoringDestination < 3) {
-    o.metrics = buildUnnamed3550();
+    o.metrics = buildUnnamed3579();
     o.monitoredResource = "foo";
   }
   buildCounterMonitoringDestination--;
@@ -1654,7 +1654,7 @@
 checkMonitoringDestination(api.MonitoringDestination o) {
   buildCounterMonitoringDestination++;
   if (buildCounterMonitoringDestination < 3) {
-    checkUnnamed3550(o.metrics);
+    checkUnnamed3579(o.metrics);
     unittest.expect(o.monitoredResource, unittest.equals('foo'));
   }
   buildCounterMonitoringDestination--;
@@ -1679,7 +1679,7 @@
   buildCounterOAuthRequirements--;
 }
 
-buildUnnamed3551() {
+buildUnnamed3580() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1694,7 +1694,7 @@
   return o;
 }
 
-checkUnnamed3551(core.Map<core.String, core.Object> o) {
+checkUnnamed3580(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));
@@ -1708,7 +1708,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3552() {
+buildUnnamed3581() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1723,7 +1723,7 @@
   return o;
 }
 
-checkUnnamed3552(core.Map<core.String, core.Object> o) {
+checkUnnamed3581(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -1744,9 +1744,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed3551();
+    o.metadata = buildUnnamed3580();
     o.name = "foo";
-    o.response = buildUnnamed3552();
+    o.response = buildUnnamed3581();
   }
   buildCounterOperation--;
   return o;
@@ -1757,14 +1757,14 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed3551(o.metadata);
+    checkUnnamed3580(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3552(o.response);
+    checkUnnamed3581(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed3553() {
+buildUnnamed3582() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1779,7 +1779,7 @@
   return o;
 }
 
-checkUnnamed3553(core.Map<core.String, core.Object> o) {
+checkUnnamed3582(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -1799,7 +1799,7 @@
   buildCounterOption++;
   if (buildCounterOption < 3) {
     o.name = "foo";
-    o.value = buildUnnamed3553();
+    o.value = buildUnnamed3582();
   }
   buildCounterOption--;
   return o;
@@ -1809,19 +1809,19 @@
   buildCounterOption++;
   if (buildCounterOption < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3553(o.value);
+    checkUnnamed3582(o.value);
   }
   buildCounterOption--;
 }
 
-buildUnnamed3554() {
+buildUnnamed3583() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed3554(core.List<api.Page> o) {
+checkUnnamed3583(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
@@ -1834,7 +1834,7 @@
   if (buildCounterPage < 3) {
     o.content = "foo";
     o.name = "foo";
-    o.subpages = buildUnnamed3554();
+    o.subpages = buildUnnamed3583();
   }
   buildCounterPage--;
   return o;
@@ -1845,19 +1845,19 @@
   if (buildCounterPage < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3554(o.subpages);
+    checkUnnamed3583(o.subpages);
   }
   buildCounterPage--;
 }
 
-buildUnnamed3555() {
+buildUnnamed3584() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3555(core.List<core.String> o) {
+checkUnnamed3584(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1868,7 +1868,7 @@
   var o = new api.PolicyBinding();
   buildCounterPolicyBinding++;
   if (buildCounterPolicyBinding < 3) {
-    o.members = buildUnnamed3555();
+    o.members = buildUnnamed3584();
     o.role = "foo";
   }
   buildCounterPolicyBinding--;
@@ -1878,33 +1878,33 @@
 checkPolicyBinding(api.PolicyBinding o) {
   buildCounterPolicyBinding++;
   if (buildCounterPolicyBinding < 3) {
-    checkUnnamed3555(o.members);
+    checkUnnamed3584(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterPolicyBinding--;
 }
 
-buildUnnamed3556() {
+buildUnnamed3585() {
   var o = new core.List<api.QuotaLimit>();
   o.add(buildQuotaLimit());
   o.add(buildQuotaLimit());
   return o;
 }
 
-checkUnnamed3556(core.List<api.QuotaLimit> o) {
+checkUnnamed3585(core.List<api.QuotaLimit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuotaLimit(o[0]);
   checkQuotaLimit(o[1]);
 }
 
-buildUnnamed3557() {
+buildUnnamed3586() {
   var o = new core.List<api.MetricRule>();
   o.add(buildMetricRule());
   o.add(buildMetricRule());
   return o;
 }
 
-checkUnnamed3557(core.List<api.MetricRule> o) {
+checkUnnamed3586(core.List<api.MetricRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricRule(o[0]);
   checkMetricRule(o[1]);
@@ -1915,8 +1915,8 @@
   var o = new api.Quota();
   buildCounterQuota++;
   if (buildCounterQuota < 3) {
-    o.limits = buildUnnamed3556();
-    o.metricRules = buildUnnamed3557();
+    o.limits = buildUnnamed3585();
+    o.metricRules = buildUnnamed3586();
   }
   buildCounterQuota--;
   return o;
@@ -1925,20 +1925,20 @@
 checkQuota(api.Quota o) {
   buildCounterQuota++;
   if (buildCounterQuota < 3) {
-    checkUnnamed3556(o.limits);
-    checkUnnamed3557(o.metricRules);
+    checkUnnamed3585(o.limits);
+    checkUnnamed3586(o.metricRules);
   }
   buildCounterQuota--;
 }
 
-buildUnnamed3558() {
+buildUnnamed3587() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3558(core.Map<core.String, core.String> o) {
+checkUnnamed3587(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'));
@@ -1958,7 +1958,7 @@
     o.metric = "foo";
     o.name = "foo";
     o.unit = "foo";
-    o.values = buildUnnamed3558();
+    o.values = buildUnnamed3587();
   }
   buildCounterQuotaLimit--;
   return o;
@@ -1976,7 +1976,7 @@
     unittest.expect(o.metric, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.unit, unittest.equals('foo'));
-    checkUnnamed3558(o.values);
+    checkUnnamed3587(o.values);
   }
   buildCounterQuotaLimit--;
 }
@@ -2000,14 +2000,14 @@
   buildCounterRemoveTenantProjectRequest--;
 }
 
-buildUnnamed3559() {
+buildUnnamed3588() {
   var o = new core.List<api.TenancyUnit>();
   o.add(buildTenancyUnit());
   o.add(buildTenancyUnit());
   return o;
 }
 
-checkUnnamed3559(core.List<api.TenancyUnit> o) {
+checkUnnamed3588(core.List<api.TenancyUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTenancyUnit(o[0]);
   checkTenancyUnit(o[1]);
@@ -2019,7 +2019,7 @@
   buildCounterSearchTenancyUnitsResponse++;
   if (buildCounterSearchTenancyUnitsResponse < 3) {
     o.nextPageToken = "foo";
-    o.tenancyUnits = buildUnnamed3559();
+    o.tenancyUnits = buildUnnamed3588();
   }
   buildCounterSearchTenancyUnitsResponse--;
   return o;
@@ -2029,110 +2029,110 @@
   buildCounterSearchTenancyUnitsResponse++;
   if (buildCounterSearchTenancyUnitsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3559(o.tenancyUnits);
+    checkUnnamed3588(o.tenancyUnits);
   }
   buildCounterSearchTenancyUnitsResponse--;
 }
 
-buildUnnamed3560() {
+buildUnnamed3589() {
   var o = new core.List<api.Api>();
   o.add(buildApi());
   o.add(buildApi());
   return o;
 }
 
-checkUnnamed3560(core.List<api.Api> o) {
+checkUnnamed3589(core.List<api.Api> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApi(o[0]);
   checkApi(o[1]);
 }
 
-buildUnnamed3561() {
+buildUnnamed3590() {
   var o = new core.List<api.Endpoint>();
   o.add(buildEndpoint());
   o.add(buildEndpoint());
   return o;
 }
 
-checkUnnamed3561(core.List<api.Endpoint> o) {
+checkUnnamed3590(core.List<api.Endpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEndpoint(o[0]);
   checkEndpoint(o[1]);
 }
 
-buildUnnamed3562() {
+buildUnnamed3591() {
   var o = new core.List<api.Enum>();
   o.add(buildEnum());
   o.add(buildEnum());
   return o;
 }
 
-checkUnnamed3562(core.List<api.Enum> o) {
+checkUnnamed3591(core.List<api.Enum> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnum(o[0]);
   checkEnum(o[1]);
 }
 
-buildUnnamed3563() {
+buildUnnamed3592() {
   var o = new core.List<api.LogDescriptor>();
   o.add(buildLogDescriptor());
   o.add(buildLogDescriptor());
   return o;
 }
 
-checkUnnamed3563(core.List<api.LogDescriptor> o) {
+checkUnnamed3592(core.List<api.LogDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogDescriptor(o[0]);
   checkLogDescriptor(o[1]);
 }
 
-buildUnnamed3564() {
+buildUnnamed3593() {
   var o = new core.List<api.MetricDescriptor>();
   o.add(buildMetricDescriptor());
   o.add(buildMetricDescriptor());
   return o;
 }
 
-checkUnnamed3564(core.List<api.MetricDescriptor> o) {
+checkUnnamed3593(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptor(o[0]);
   checkMetricDescriptor(o[1]);
 }
 
-buildUnnamed3565() {
+buildUnnamed3594() {
   var o = new core.List<api.MonitoredResourceDescriptor>();
   o.add(buildMonitoredResourceDescriptor());
   o.add(buildMonitoredResourceDescriptor());
   return o;
 }
 
-checkUnnamed3565(core.List<api.MonitoredResourceDescriptor> o) {
+checkUnnamed3594(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoredResourceDescriptor(o[0]);
   checkMonitoredResourceDescriptor(o[1]);
 }
 
-buildUnnamed3566() {
+buildUnnamed3595() {
   var o = new core.List<api.Type>();
   o.add(buildType());
   o.add(buildType());
   return o;
 }
 
-checkUnnamed3566(core.List<api.Type> o) {
+checkUnnamed3595(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o[0]);
   checkType(o[1]);
 }
 
-buildUnnamed3567() {
+buildUnnamed3596() {
   var o = new core.List<api.Type>();
   o.add(buildType());
   o.add(buildType());
   return o;
 }
 
-checkUnnamed3567(core.List<api.Type> o) {
+checkUnnamed3596(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o[0]);
   checkType(o[1]);
@@ -2143,7 +2143,7 @@
   var o = new api.Service();
   buildCounterService++;
   if (buildCounterService < 3) {
-    o.apis = buildUnnamed3560();
+    o.apis = buildUnnamed3589();
     o.authentication = buildAuthentication();
     o.backend = buildBackend();
     o.billing = buildBilling();
@@ -2152,24 +2152,24 @@
     o.control = buildControl();
     o.customError = buildCustomError();
     o.documentation = buildDocumentation();
-    o.endpoints = buildUnnamed3561();
-    o.enums = buildUnnamed3562();
+    o.endpoints = buildUnnamed3590();
+    o.enums = buildUnnamed3591();
     o.experimental = buildExperimental();
     o.http = buildHttp();
     o.id = "foo";
     o.logging = buildLogging();
-    o.logs = buildUnnamed3563();
-    o.metrics = buildUnnamed3564();
-    o.monitoredResources = buildUnnamed3565();
+    o.logs = buildUnnamed3592();
+    o.metrics = buildUnnamed3593();
+    o.monitoredResources = buildUnnamed3594();
     o.monitoring = buildMonitoring();
     o.name = "foo";
     o.producerProjectId = "foo";
     o.quota = buildQuota();
     o.sourceInfo = buildSourceInfo();
     o.systemParameters = buildSystemParameters();
-    o.systemTypes = buildUnnamed3566();
+    o.systemTypes = buildUnnamed3595();
     o.title = "foo";
-    o.types = buildUnnamed3567();
+    o.types = buildUnnamed3596();
     o.usage = buildUsage();
     o.visibility = buildVisibility();
   }
@@ -2180,7 +2180,7 @@
 checkService(api.Service o) {
   buildCounterService++;
   if (buildCounterService < 3) {
-    checkUnnamed3560(o.apis);
+    checkUnnamed3589(o.apis);
     checkAuthentication(o.authentication);
     checkBackend(o.backend);
     checkBilling(o.billing);
@@ -2189,38 +2189,38 @@
     checkControl(o.control);
     checkCustomError(o.customError);
     checkDocumentation(o.documentation);
-    checkUnnamed3561(o.endpoints);
-    checkUnnamed3562(o.enums);
+    checkUnnamed3590(o.endpoints);
+    checkUnnamed3591(o.enums);
     checkExperimental(o.experimental);
     checkHttp(o.http);
     unittest.expect(o.id, unittest.equals('foo'));
     checkLogging(o.logging);
-    checkUnnamed3563(o.logs);
-    checkUnnamed3564(o.metrics);
-    checkUnnamed3565(o.monitoredResources);
+    checkUnnamed3592(o.logs);
+    checkUnnamed3593(o.metrics);
+    checkUnnamed3594(o.monitoredResources);
     checkMonitoring(o.monitoring);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.producerProjectId, unittest.equals('foo'));
     checkQuota(o.quota);
     checkSourceInfo(o.sourceInfo);
     checkSystemParameters(o.systemParameters);
-    checkUnnamed3566(o.systemTypes);
+    checkUnnamed3595(o.systemTypes);
     unittest.expect(o.title, unittest.equals('foo'));
-    checkUnnamed3567(o.types);
+    checkUnnamed3596(o.types);
     checkUsage(o.usage);
     checkVisibility(o.visibility);
   }
   buildCounterService--;
 }
 
-buildUnnamed3568() {
+buildUnnamed3597() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3568(core.List<core.String> o) {
+checkUnnamed3597(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2232,7 +2232,7 @@
   buildCounterServiceAccountConfig++;
   if (buildCounterServiceAccountConfig < 3) {
     o.accountId = "foo";
-    o.tenantProjectRoles = buildUnnamed3568();
+    o.tenantProjectRoles = buildUnnamed3597();
   }
   buildCounterServiceAccountConfig--;
   return o;
@@ -2242,7 +2242,7 @@
   buildCounterServiceAccountConfig++;
   if (buildCounterServiceAccountConfig < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed3568(o.tenantProjectRoles);
+    checkUnnamed3597(o.tenantProjectRoles);
   }
   buildCounterServiceAccountConfig--;
 }
@@ -2266,7 +2266,7 @@
   buildCounterSourceContext--;
 }
 
-buildUnnamed3569() {
+buildUnnamed3598() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -2281,7 +2281,7 @@
   return o;
 }
 
-checkUnnamed3569(core.Map<core.String, core.Object> o) {
+checkUnnamed3598(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o["x"]) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -2295,17 +2295,17 @@
   unittest.expect(casted8["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3570() {
+buildUnnamed3599() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed3569());
-  o.add(buildUnnamed3569());
+  o.add(buildUnnamed3598());
+  o.add(buildUnnamed3598());
   return o;
 }
 
-checkUnnamed3570(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed3599(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3569(o[0]);
-  checkUnnamed3569(o[1]);
+  checkUnnamed3598(o[0]);
+  checkUnnamed3598(o[1]);
 }
 
 core.int buildCounterSourceInfo = 0;
@@ -2313,7 +2313,7 @@
   var o = new api.SourceInfo();
   buildCounterSourceInfo++;
   if (buildCounterSourceInfo < 3) {
-    o.sourceFiles = buildUnnamed3570();
+    o.sourceFiles = buildUnnamed3599();
   }
   buildCounterSourceInfo--;
   return o;
@@ -2322,12 +2322,12 @@
 checkSourceInfo(api.SourceInfo o) {
   buildCounterSourceInfo++;
   if (buildCounterSourceInfo < 3) {
-    checkUnnamed3570(o.sourceFiles);
+    checkUnnamed3599(o.sourceFiles);
   }
   buildCounterSourceInfo--;
 }
 
-buildUnnamed3571() {
+buildUnnamed3600() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -2342,7 +2342,7 @@
   return o;
 }
 
-checkUnnamed3571(core.Map<core.String, core.Object> o) {
+checkUnnamed3600(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted9 = (o["x"]) as core.Map;
   unittest.expect(casted9, unittest.hasLength(3));
@@ -2356,17 +2356,17 @@
   unittest.expect(casted10["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3572() {
+buildUnnamed3601() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed3571());
-  o.add(buildUnnamed3571());
+  o.add(buildUnnamed3600());
+  o.add(buildUnnamed3600());
   return o;
 }
 
-checkUnnamed3572(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed3601(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3571(o[0]);
-  checkUnnamed3571(o[1]);
+  checkUnnamed3600(o[0]);
+  checkUnnamed3600(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -2375,7 +2375,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed3572();
+    o.details = buildUnnamed3601();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -2386,7 +2386,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed3572(o.details);
+    checkUnnamed3601(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -2415,14 +2415,14 @@
   buildCounterSystemParameter--;
 }
 
-buildUnnamed3573() {
+buildUnnamed3602() {
   var o = new core.List<api.SystemParameter>();
   o.add(buildSystemParameter());
   o.add(buildSystemParameter());
   return o;
 }
 
-checkUnnamed3573(core.List<api.SystemParameter> o) {
+checkUnnamed3602(core.List<api.SystemParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSystemParameter(o[0]);
   checkSystemParameter(o[1]);
@@ -2433,7 +2433,7 @@
   var o = new api.SystemParameterRule();
   buildCounterSystemParameterRule++;
   if (buildCounterSystemParameterRule < 3) {
-    o.parameters = buildUnnamed3573();
+    o.parameters = buildUnnamed3602();
     o.selector = "foo";
   }
   buildCounterSystemParameterRule--;
@@ -2443,20 +2443,20 @@
 checkSystemParameterRule(api.SystemParameterRule o) {
   buildCounterSystemParameterRule++;
   if (buildCounterSystemParameterRule < 3) {
-    checkUnnamed3573(o.parameters);
+    checkUnnamed3602(o.parameters);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterSystemParameterRule--;
 }
 
-buildUnnamed3574() {
+buildUnnamed3603() {
   var o = new core.List<api.SystemParameterRule>();
   o.add(buildSystemParameterRule());
   o.add(buildSystemParameterRule());
   return o;
 }
 
-checkUnnamed3574(core.List<api.SystemParameterRule> o) {
+checkUnnamed3603(core.List<api.SystemParameterRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSystemParameterRule(o[0]);
   checkSystemParameterRule(o[1]);
@@ -2467,7 +2467,7 @@
   var o = new api.SystemParameters();
   buildCounterSystemParameters++;
   if (buildCounterSystemParameters < 3) {
-    o.rules = buildUnnamed3574();
+    o.rules = buildUnnamed3603();
   }
   buildCounterSystemParameters--;
   return o;
@@ -2476,19 +2476,19 @@
 checkSystemParameters(api.SystemParameters o) {
   buildCounterSystemParameters++;
   if (buildCounterSystemParameters < 3) {
-    checkUnnamed3574(o.rules);
+    checkUnnamed3603(o.rules);
   }
   buildCounterSystemParameters--;
 }
 
-buildUnnamed3575() {
+buildUnnamed3604() {
   var o = new core.List<api.TenantResource>();
   o.add(buildTenantResource());
   o.add(buildTenantResource());
   return o;
 }
 
-checkUnnamed3575(core.List<api.TenantResource> o) {
+checkUnnamed3604(core.List<api.TenantResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTenantResource(o[0]);
   checkTenantResource(o[1]);
@@ -2503,7 +2503,7 @@
     o.createTime = "foo";
     o.name = "foo";
     o.service = "foo";
-    o.tenantResources = buildUnnamed3575();
+    o.tenantResources = buildUnnamed3604();
   }
   buildCounterTenancyUnit--;
   return o;
@@ -2516,32 +2516,32 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.service, unittest.equals('foo'));
-    checkUnnamed3575(o.tenantResources);
+    checkUnnamed3604(o.tenantResources);
   }
   buildCounterTenancyUnit--;
 }
 
-buildUnnamed3576() {
+buildUnnamed3605() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed3576(core.Map<core.String, core.String> o) {
+checkUnnamed3605(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'));
 }
 
-buildUnnamed3577() {
+buildUnnamed3606() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3577(core.List<core.String> o) {
+checkUnnamed3606(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2554,9 +2554,9 @@
   if (buildCounterTenantProjectConfig < 3) {
     o.billingConfig = buildBillingConfig();
     o.folder = "foo";
-    o.labels = buildUnnamed3576();
+    o.labels = buildUnnamed3605();
     o.serviceAccountConfig = buildServiceAccountConfig();
-    o.services = buildUnnamed3577();
+    o.services = buildUnnamed3606();
     o.tenantProjectPolicy = buildTenantProjectPolicy();
   }
   buildCounterTenantProjectConfig--;
@@ -2568,22 +2568,22 @@
   if (buildCounterTenantProjectConfig < 3) {
     checkBillingConfig(o.billingConfig);
     unittest.expect(o.folder, unittest.equals('foo'));
-    checkUnnamed3576(o.labels);
+    checkUnnamed3605(o.labels);
     checkServiceAccountConfig(o.serviceAccountConfig);
-    checkUnnamed3577(o.services);
+    checkUnnamed3606(o.services);
     checkTenantProjectPolicy(o.tenantProjectPolicy);
   }
   buildCounterTenantProjectConfig--;
 }
 
-buildUnnamed3578() {
+buildUnnamed3607() {
   var o = new core.List<api.PolicyBinding>();
   o.add(buildPolicyBinding());
   o.add(buildPolicyBinding());
   return o;
 }
 
-checkUnnamed3578(core.List<api.PolicyBinding> o) {
+checkUnnamed3607(core.List<api.PolicyBinding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPolicyBinding(o[0]);
   checkPolicyBinding(o[1]);
@@ -2594,7 +2594,7 @@
   var o = new api.TenantProjectPolicy();
   buildCounterTenantProjectPolicy++;
   if (buildCounterTenantProjectPolicy < 3) {
-    o.policyBindings = buildUnnamed3578();
+    o.policyBindings = buildUnnamed3607();
   }
   buildCounterTenantProjectPolicy--;
   return o;
@@ -2603,7 +2603,7 @@
 checkTenantProjectPolicy(api.TenantProjectPolicy o) {
   buildCounterTenantProjectPolicy++;
   if (buildCounterTenantProjectPolicy < 3) {
-    checkUnnamed3578(o.policyBindings);
+    checkUnnamed3607(o.policyBindings);
   }
   buildCounterTenantProjectPolicy--;
 }
@@ -2631,40 +2631,40 @@
   buildCounterTenantResource--;
 }
 
-buildUnnamed3579() {
+buildUnnamed3608() {
   var o = new core.List<api.Field>();
   o.add(buildField());
   o.add(buildField());
   return o;
 }
 
-checkUnnamed3579(core.List<api.Field> o) {
+checkUnnamed3608(core.List<api.Field> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkField(o[0]);
   checkField(o[1]);
 }
 
-buildUnnamed3580() {
+buildUnnamed3609() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3580(core.List<core.String> o) {
+checkUnnamed3609(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3581() {
+buildUnnamed3610() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed3581(core.List<api.Option> o) {
+checkUnnamed3610(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -2675,10 +2675,10 @@
   var o = new api.Type();
   buildCounterType++;
   if (buildCounterType < 3) {
-    o.fields = buildUnnamed3579();
+    o.fields = buildUnnamed3608();
     o.name = "foo";
-    o.oneofs = buildUnnamed3580();
-    o.options = buildUnnamed3581();
+    o.oneofs = buildUnnamed3609();
+    o.options = buildUnnamed3610();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
   }
@@ -2689,37 +2689,37 @@
 checkType(api.Type o) {
   buildCounterType++;
   if (buildCounterType < 3) {
-    checkUnnamed3579(o.fields);
+    checkUnnamed3608(o.fields);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3580(o.oneofs);
-    checkUnnamed3581(o.options);
+    checkUnnamed3609(o.oneofs);
+    checkUnnamed3610(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterType--;
 }
 
-buildUnnamed3582() {
+buildUnnamed3611() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3582(core.List<core.String> o) {
+checkUnnamed3611(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3583() {
+buildUnnamed3612() {
   var o = new core.List<api.UsageRule>();
   o.add(buildUsageRule());
   o.add(buildUsageRule());
   return o;
 }
 
-checkUnnamed3583(core.List<api.UsageRule> o) {
+checkUnnamed3612(core.List<api.UsageRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageRule(o[0]);
   checkUsageRule(o[1]);
@@ -2731,8 +2731,8 @@
   buildCounterUsage++;
   if (buildCounterUsage < 3) {
     o.producerNotificationChannel = "foo";
-    o.requirements = buildUnnamed3582();
-    o.rules = buildUnnamed3583();
+    o.requirements = buildUnnamed3611();
+    o.rules = buildUnnamed3612();
   }
   buildCounterUsage--;
   return o;
@@ -2742,8 +2742,8 @@
   buildCounterUsage++;
   if (buildCounterUsage < 3) {
     unittest.expect(o.producerNotificationChannel, unittest.equals('foo'));
-    checkUnnamed3582(o.requirements);
-    checkUnnamed3583(o.rules);
+    checkUnnamed3611(o.requirements);
+    checkUnnamed3612(o.rules);
   }
   buildCounterUsage--;
 }
@@ -2771,14 +2771,14 @@
   buildCounterUsageRule--;
 }
 
-buildUnnamed3584() {
+buildUnnamed3613() {
   var o = new core.List<api.VisibilityRule>();
   o.add(buildVisibilityRule());
   o.add(buildVisibilityRule());
   return o;
 }
 
-checkUnnamed3584(core.List<api.VisibilityRule> o) {
+checkUnnamed3613(core.List<api.VisibilityRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVisibilityRule(o[0]);
   checkVisibilityRule(o[1]);
@@ -2789,7 +2789,7 @@
   var o = new api.Visibility();
   buildCounterVisibility++;
   if (buildCounterVisibility < 3) {
-    o.rules = buildUnnamed3584();
+    o.rules = buildUnnamed3613();
   }
   buildCounterVisibility--;
   return o;
@@ -2798,7 +2798,7 @@
 checkVisibility(api.Visibility o) {
   buildCounterVisibility++;
   if (buildCounterVisibility < 3) {
-    checkUnnamed3584(o.rules);
+    checkUnnamed3613(o.rules);
   }
   buildCounterVisibility--;
 }
@@ -3575,9 +3575,9 @@
       api.OperationsResourceApi res =
           new api.ServiceconsumermanagementApi(mock).operations;
       var arg_name = "foo";
-      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_filter = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3610,11 +3610,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3625,9 +3625,9 @@
       }), true);
       res
           .list(arg_name,
-              filter: arg_filter,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              filter: arg_filter,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
diff --git a/generated/googleapis/test/servicecontrol/v1_test.dart b/generated/googleapis/test/servicecontrol/v1_test.dart
index f32aa8f..f88799b 100644
--- a/generated/googleapis/test/servicecontrol/v1_test.dart
+++ b/generated/googleapis/test/servicecontrol/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1755() {
+buildUnnamed1777() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1755(core.List<core.String> o) {
+checkUnnamed1777(core.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.AllocateInfo();
   buildCounterAllocateInfo++;
   if (buildCounterAllocateInfo < 3) {
-    o.unusedArguments = buildUnnamed1755();
+    o.unusedArguments = buildUnnamed1777();
   }
   buildCounterAllocateInfo--;
   return o;
@@ -77,7 +77,7 @@
 checkAllocateInfo(api.AllocateInfo o) {
   buildCounterAllocateInfo++;
   if (buildCounterAllocateInfo < 3) {
-    checkUnnamed1755(o.unusedArguments);
+    checkUnnamed1777(o.unusedArguments);
   }
   buildCounterAllocateInfo--;
 }
@@ -103,27 +103,27 @@
   buildCounterAllocateQuotaRequest--;
 }
 
-buildUnnamed1756() {
+buildUnnamed1778() {
   var o = new core.List<api.QuotaError>();
   o.add(buildQuotaError());
   o.add(buildQuotaError());
   return o;
 }
 
-checkUnnamed1756(core.List<api.QuotaError> o) {
+checkUnnamed1778(core.List<api.QuotaError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuotaError(o[0]);
   checkQuotaError(o[1]);
 }
 
-buildUnnamed1757() {
+buildUnnamed1779() {
   var o = new core.List<api.MetricValueSet>();
   o.add(buildMetricValueSet());
   o.add(buildMetricValueSet());
   return o;
 }
 
-checkUnnamed1757(core.List<api.MetricValueSet> o) {
+checkUnnamed1779(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValueSet(o[0]);
   checkMetricValueSet(o[1]);
@@ -134,10 +134,10 @@
   var o = new api.AllocateQuotaResponse();
   buildCounterAllocateQuotaResponse++;
   if (buildCounterAllocateQuotaResponse < 3) {
-    o.allocateErrors = buildUnnamed1756();
+    o.allocateErrors = buildUnnamed1778();
     o.allocateInfo = buildAllocateInfo();
     o.operationId = "foo";
-    o.quotaMetrics = buildUnnamed1757();
+    o.quotaMetrics = buildUnnamed1779();
     o.serviceConfigId = "foo";
   }
   buildCounterAllocateQuotaResponse--;
@@ -147,29 +147,29 @@
 checkAllocateQuotaResponse(api.AllocateQuotaResponse o) {
   buildCounterAllocateQuotaResponse++;
   if (buildCounterAllocateQuotaResponse < 3) {
-    checkUnnamed1756(o.allocateErrors);
+    checkUnnamed1778(o.allocateErrors);
     checkAllocateInfo(o.allocateInfo);
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkUnnamed1757(o.quotaMetrics);
+    checkUnnamed1779(o.quotaMetrics);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
   }
   buildCounterAllocateQuotaResponse--;
 }
 
-buildUnnamed1758() {
+buildUnnamed1780() {
   var o = new core.List<api.AuthorizationInfo>();
   o.add(buildAuthorizationInfo());
   o.add(buildAuthorizationInfo());
   return o;
 }
 
-checkUnnamed1758(core.List<api.AuthorizationInfo> o) {
+checkUnnamed1780(core.List<api.AuthorizationInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthorizationInfo(o[0]);
   checkAuthorizationInfo(o[1]);
 }
 
-buildUnnamed1759() {
+buildUnnamed1781() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -184,7 +184,7 @@
   return o;
 }
 
-checkUnnamed1759(core.Map<core.String, core.Object> o) {
+checkUnnamed1781(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));
@@ -198,7 +198,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1760() {
+buildUnnamed1782() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -213,7 +213,7 @@
   return o;
 }
 
-checkUnnamed1760(core.Map<core.String, core.Object> o) {
+checkUnnamed1782(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -227,7 +227,7 @@
   unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1761() {
+buildUnnamed1783() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -242,7 +242,7 @@
   return o;
 }
 
-checkUnnamed1761(core.Map<core.String, core.Object> o) {
+checkUnnamed1783(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -256,7 +256,7 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1762() {
+buildUnnamed1784() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -271,7 +271,7 @@
   return o;
 }
 
-checkUnnamed1762(core.Map<core.String, core.Object> o) {
+checkUnnamed1784(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o["x"]) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -291,15 +291,15 @@
   buildCounterAuditLog++;
   if (buildCounterAuditLog < 3) {
     o.authenticationInfo = buildAuthenticationInfo();
-    o.authorizationInfo = buildUnnamed1758();
-    o.metadata = buildUnnamed1759();
+    o.authorizationInfo = buildUnnamed1780();
+    o.metadata = buildUnnamed1781();
     o.methodName = "foo";
     o.numResponseItems = "foo";
-    o.request = buildUnnamed1760();
+    o.request = buildUnnamed1782();
     o.requestMetadata = buildRequestMetadata();
     o.resourceName = "foo";
-    o.response = buildUnnamed1761();
-    o.serviceData = buildUnnamed1762();
+    o.response = buildUnnamed1783();
+    o.serviceData = buildUnnamed1784();
     o.serviceName = "foo";
     o.status = buildStatus();
   }
@@ -311,22 +311,22 @@
   buildCounterAuditLog++;
   if (buildCounterAuditLog < 3) {
     checkAuthenticationInfo(o.authenticationInfo);
-    checkUnnamed1758(o.authorizationInfo);
-    checkUnnamed1759(o.metadata);
+    checkUnnamed1780(o.authorizationInfo);
+    checkUnnamed1781(o.metadata);
     unittest.expect(o.methodName, unittest.equals('foo'));
     unittest.expect(o.numResponseItems, unittest.equals('foo'));
-    checkUnnamed1760(o.request);
+    checkUnnamed1782(o.request);
     checkRequestMetadata(o.requestMetadata);
     unittest.expect(o.resourceName, unittest.equals('foo'));
-    checkUnnamed1761(o.response);
-    checkUnnamed1762(o.serviceData);
+    checkUnnamed1783(o.response);
+    checkUnnamed1784(o.serviceData);
     unittest.expect(o.serviceName, unittest.equals('foo'));
     checkStatus(o.status);
   }
   buildCounterAuditLog--;
 }
 
-buildUnnamed1763() {
+buildUnnamed1785() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -341,7 +341,7 @@
   return o;
 }
 
-checkUnnamed1763(core.Map<core.String, core.Object> o) {
+checkUnnamed1785(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted9 = (o["x"]) as core.Map;
   unittest.expect(casted9, unittest.hasLength(3));
@@ -362,7 +362,7 @@
   if (buildCounterAuthenticationInfo < 3) {
     o.authoritySelector = "foo";
     o.principalEmail = "foo";
-    o.thirdPartyPrincipal = buildUnnamed1763();
+    o.thirdPartyPrincipal = buildUnnamed1785();
   }
   buildCounterAuthenticationInfo--;
   return o;
@@ -373,7 +373,7 @@
   if (buildCounterAuthenticationInfo < 3) {
     unittest.expect(o.authoritySelector, unittest.equals('foo'));
     unittest.expect(o.principalEmail, unittest.equals('foo'));
-    checkUnnamed1763(o.thirdPartyPrincipal);
+    checkUnnamed1785(o.thirdPartyPrincipal);
   }
   buildCounterAuthenticationInfo--;
 }
@@ -408,6 +408,7 @@
   if (buildCounterCheckError < 3) {
     o.code = "foo";
     o.detail = "foo";
+    o.subject = "foo";
   }
   buildCounterCheckError--;
   return o;
@@ -418,18 +419,19 @@
   if (buildCounterCheckError < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
     unittest.expect(o.detail, unittest.equals('foo'));
+    unittest.expect(o.subject, unittest.equals('foo'));
   }
   buildCounterCheckError--;
 }
 
-buildUnnamed1764() {
+buildUnnamed1786() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1764(core.List<core.String> o) {
+checkUnnamed1786(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -441,7 +443,7 @@
   buildCounterCheckInfo++;
   if (buildCounterCheckInfo < 3) {
     o.consumerInfo = buildConsumerInfo();
-    o.unusedArguments = buildUnnamed1764();
+    o.unusedArguments = buildUnnamed1786();
   }
   buildCounterCheckInfo--;
   return o;
@@ -451,7 +453,7 @@
   buildCounterCheckInfo++;
   if (buildCounterCheckInfo < 3) {
     checkConsumerInfo(o.consumerInfo);
-    checkUnnamed1764(o.unusedArguments);
+    checkUnnamed1786(o.unusedArguments);
   }
   buildCounterCheckInfo--;
 }
@@ -481,14 +483,14 @@
   buildCounterCheckRequest--;
 }
 
-buildUnnamed1765() {
+buildUnnamed1787() {
   var o = new core.List<api.CheckError>();
   o.add(buildCheckError());
   o.add(buildCheckError());
   return o;
 }
 
-checkUnnamed1765(core.List<api.CheckError> o) {
+checkUnnamed1787(core.List<api.CheckError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCheckError(o[0]);
   checkCheckError(o[1]);
@@ -499,7 +501,7 @@
   var o = new api.CheckResponse();
   buildCounterCheckResponse++;
   if (buildCounterCheckResponse < 3) {
-    o.checkErrors = buildUnnamed1765();
+    o.checkErrors = buildUnnamed1787();
     o.checkInfo = buildCheckInfo();
     o.operationId = "foo";
     o.quotaInfo = buildQuotaInfo();
@@ -512,7 +514,7 @@
 checkCheckResponse(api.CheckResponse o) {
   buildCounterCheckResponse++;
   if (buildCounterCheckResponse < 3) {
-    checkUnnamed1765(o.checkErrors);
+    checkUnnamed1787(o.checkErrors);
     checkCheckInfo(o.checkInfo);
     unittest.expect(o.operationId, unittest.equals('foo'));
     checkQuotaInfo(o.quotaInfo);
@@ -540,14 +542,14 @@
   buildCounterConsumerInfo--;
 }
 
-buildUnnamed1766() {
+buildUnnamed1788() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1766(core.List<core.String> o) {
+checkUnnamed1788(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -558,7 +560,7 @@
   var o = new api.Distribution();
   buildCounterDistribution++;
   if (buildCounterDistribution < 3) {
-    o.bucketCounts = buildUnnamed1766();
+    o.bucketCounts = buildUnnamed1788();
     o.count = "foo";
     o.explicitBuckets = buildExplicitBuckets();
     o.exponentialBuckets = buildExponentialBuckets();
@@ -575,7 +577,7 @@
 checkDistribution(api.Distribution o) {
   buildCounterDistribution++;
   if (buildCounterDistribution < 3) {
-    checkUnnamed1766(o.bucketCounts);
+    checkUnnamed1788(o.bucketCounts);
     unittest.expect(o.count, unittest.equals('foo'));
     checkExplicitBuckets(o.explicitBuckets);
     checkExponentialBuckets(o.exponentialBuckets);
@@ -609,27 +611,27 @@
   buildCounterEndReconciliationRequest--;
 }
 
-buildUnnamed1767() {
+buildUnnamed1789() {
   var o = new core.List<api.MetricValueSet>();
   o.add(buildMetricValueSet());
   o.add(buildMetricValueSet());
   return o;
 }
 
-checkUnnamed1767(core.List<api.MetricValueSet> o) {
+checkUnnamed1789(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValueSet(o[0]);
   checkMetricValueSet(o[1]);
 }
 
-buildUnnamed1768() {
+buildUnnamed1790() {
   var o = new core.List<api.QuotaError>();
   o.add(buildQuotaError());
   o.add(buildQuotaError());
   return o;
 }
 
-checkUnnamed1768(core.List<api.QuotaError> o) {
+checkUnnamed1790(core.List<api.QuotaError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuotaError(o[0]);
   checkQuotaError(o[1]);
@@ -641,8 +643,8 @@
   buildCounterEndReconciliationResponse++;
   if (buildCounterEndReconciliationResponse < 3) {
     o.operationId = "foo";
-    o.quotaMetrics = buildUnnamed1767();
-    o.reconciliationErrors = buildUnnamed1768();
+    o.quotaMetrics = buildUnnamed1789();
+    o.reconciliationErrors = buildUnnamed1790();
     o.serviceConfigId = "foo";
   }
   buildCounterEndReconciliationResponse--;
@@ -653,21 +655,21 @@
   buildCounterEndReconciliationResponse++;
   if (buildCounterEndReconciliationResponse < 3) {
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkUnnamed1767(o.quotaMetrics);
-    checkUnnamed1768(o.reconciliationErrors);
+    checkUnnamed1789(o.quotaMetrics);
+    checkUnnamed1790(o.reconciliationErrors);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
   }
   buildCounterEndReconciliationResponse--;
 }
 
-buildUnnamed1769() {
+buildUnnamed1791() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1769(core.List<core.double> o) {
+checkUnnamed1791(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));
@@ -678,7 +680,7 @@
   var o = new api.ExplicitBuckets();
   buildCounterExplicitBuckets++;
   if (buildCounterExplicitBuckets < 3) {
-    o.bounds = buildUnnamed1769();
+    o.bounds = buildUnnamed1791();
   }
   buildCounterExplicitBuckets--;
   return o;
@@ -687,7 +689,7 @@
 checkExplicitBuckets(api.ExplicitBuckets o) {
   buildCounterExplicitBuckets++;
   if (buildCounterExplicitBuckets < 3) {
-    checkUnnamed1769(o.bounds);
+    checkUnnamed1791(o.bounds);
   }
   buildCounterExplicitBuckets--;
 }
@@ -738,20 +740,20 @@
   buildCounterLinearBuckets--;
 }
 
-buildUnnamed1770() {
+buildUnnamed1792() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1770(core.Map<core.String, core.String> o) {
+checkUnnamed1792(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'));
 }
 
-buildUnnamed1771() {
+buildUnnamed1793() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -766,7 +768,7 @@
   return o;
 }
 
-checkUnnamed1771(core.Map<core.String, core.Object> o) {
+checkUnnamed1793(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted11 = (o["x"]) as core.Map;
   unittest.expect(casted11, unittest.hasLength(3));
@@ -780,7 +782,7 @@
   unittest.expect(casted12["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1772() {
+buildUnnamed1794() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -795,7 +797,7 @@
   return o;
 }
 
-checkUnnamed1772(core.Map<core.String, core.Object> o) {
+checkUnnamed1794(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted13 = (o["x"]) as core.Map;
   unittest.expect(casted13, unittest.hasLength(3));
@@ -815,11 +817,11 @@
   buildCounterLogEntry++;
   if (buildCounterLogEntry < 3) {
     o.insertId = "foo";
-    o.labels = buildUnnamed1770();
+    o.labels = buildUnnamed1792();
     o.name = "foo";
-    o.protoPayload = buildUnnamed1771();
+    o.protoPayload = buildUnnamed1793();
     o.severity = "foo";
-    o.structPayload = buildUnnamed1772();
+    o.structPayload = buildUnnamed1794();
     o.textPayload = "foo";
     o.timestamp = "foo";
   }
@@ -831,25 +833,25 @@
   buildCounterLogEntry++;
   if (buildCounterLogEntry < 3) {
     unittest.expect(o.insertId, unittest.equals('foo'));
-    checkUnnamed1770(o.labels);
+    checkUnnamed1792(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1771(o.protoPayload);
+    checkUnnamed1793(o.protoPayload);
     unittest.expect(o.severity, unittest.equals('foo'));
-    checkUnnamed1772(o.structPayload);
+    checkUnnamed1794(o.structPayload);
     unittest.expect(o.textPayload, unittest.equals('foo'));
     unittest.expect(o.timestamp, unittest.equals('foo'));
   }
   buildCounterLogEntry--;
 }
 
-buildUnnamed1773() {
+buildUnnamed1795() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1773(core.Map<core.String, core.String> o) {
+checkUnnamed1795(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'));
@@ -865,7 +867,7 @@
     o.doubleValue = 42.0;
     o.endTime = "foo";
     o.int64Value = "foo";
-    o.labels = buildUnnamed1773();
+    o.labels = buildUnnamed1795();
     o.moneyValue = buildMoney();
     o.startTime = "foo";
     o.stringValue = "foo";
@@ -882,7 +884,7 @@
     unittest.expect(o.doubleValue, unittest.equals(42.0));
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.int64Value, unittest.equals('foo'));
-    checkUnnamed1773(o.labels);
+    checkUnnamed1795(o.labels);
     checkMoney(o.moneyValue);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
@@ -890,14 +892,14 @@
   buildCounterMetricValue--;
 }
 
-buildUnnamed1774() {
+buildUnnamed1796() {
   var o = new core.List<api.MetricValue>();
   o.add(buildMetricValue());
   o.add(buildMetricValue());
   return o;
 }
 
-checkUnnamed1774(core.List<api.MetricValue> o) {
+checkUnnamed1796(core.List<api.MetricValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValue(o[0]);
   checkMetricValue(o[1]);
@@ -909,7 +911,7 @@
   buildCounterMetricValueSet++;
   if (buildCounterMetricValueSet < 3) {
     o.metricName = "foo";
-    o.metricValues = buildUnnamed1774();
+    o.metricValues = buildUnnamed1796();
   }
   buildCounterMetricValueSet--;
   return o;
@@ -919,7 +921,7 @@
   buildCounterMetricValueSet++;
   if (buildCounterMetricValueSet < 3) {
     unittest.expect(o.metricName, unittest.equals('foo'));
-    checkUnnamed1774(o.metricValues);
+    checkUnnamed1796(o.metricValues);
   }
   buildCounterMetricValueSet--;
 }
@@ -947,66 +949,66 @@
   buildCounterMoney--;
 }
 
-buildUnnamed1775() {
+buildUnnamed1797() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1775(core.Map<core.String, core.String> o) {
+checkUnnamed1797(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'));
 }
 
-buildUnnamed1776() {
+buildUnnamed1798() {
   var o = new core.List<api.LogEntry>();
   o.add(buildLogEntry());
   o.add(buildLogEntry());
   return o;
 }
 
-checkUnnamed1776(core.List<api.LogEntry> o) {
+checkUnnamed1798(core.List<api.LogEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogEntry(o[0]);
   checkLogEntry(o[1]);
 }
 
-buildUnnamed1777() {
+buildUnnamed1799() {
   var o = new core.List<api.MetricValueSet>();
   o.add(buildMetricValueSet());
   o.add(buildMetricValueSet());
   return o;
 }
 
-checkUnnamed1777(core.List<api.MetricValueSet> o) {
+checkUnnamed1799(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValueSet(o[0]);
   checkMetricValueSet(o[1]);
 }
 
-buildUnnamed1778() {
+buildUnnamed1800() {
   var o = new core.List<api.ResourceInfo>();
   o.add(buildResourceInfo());
   o.add(buildResourceInfo());
   return o;
 }
 
-checkUnnamed1778(core.List<api.ResourceInfo> o) {
+checkUnnamed1800(core.List<api.ResourceInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceInfo(o[0]);
   checkResourceInfo(o[1]);
 }
 
-buildUnnamed1779() {
+buildUnnamed1801() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1779(core.Map<core.String, core.String> o) {
+checkUnnamed1801(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'));
@@ -1020,16 +1022,16 @@
     o.consumerId = "foo";
     o.endTime = "foo";
     o.importance = "foo";
-    o.labels = buildUnnamed1775();
-    o.logEntries = buildUnnamed1776();
-    o.metricValueSets = buildUnnamed1777();
+    o.labels = buildUnnamed1797();
+    o.logEntries = buildUnnamed1798();
+    o.metricValueSets = buildUnnamed1799();
     o.operationId = "foo";
     o.operationName = "foo";
     o.quotaProperties = buildQuotaProperties();
     o.resourceContainer = "foo";
-    o.resources = buildUnnamed1778();
+    o.resources = buildUnnamed1800();
     o.startTime = "foo";
-    o.userLabels = buildUnnamed1779();
+    o.userLabels = buildUnnamed1801();
   }
   buildCounterOperation--;
   return o;
@@ -1041,16 +1043,16 @@
     unittest.expect(o.consumerId, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.importance, unittest.equals('foo'));
-    checkUnnamed1775(o.labels);
-    checkUnnamed1776(o.logEntries);
-    checkUnnamed1777(o.metricValueSets);
+    checkUnnamed1797(o.labels);
+    checkUnnamed1798(o.logEntries);
+    checkUnnamed1799(o.metricValueSets);
     unittest.expect(o.operationId, unittest.equals('foo'));
     unittest.expect(o.operationName, unittest.equals('foo'));
     checkQuotaProperties(o.quotaProperties);
     unittest.expect(o.resourceContainer, unittest.equals('foo'));
-    checkUnnamed1778(o.resources);
+    checkUnnamed1800(o.resources);
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkUnnamed1779(o.userLabels);
+    checkUnnamed1801(o.userLabels);
   }
   buildCounterOperation--;
 }
@@ -1078,40 +1080,40 @@
   buildCounterQuotaError--;
 }
 
-buildUnnamed1780() {
+buildUnnamed1802() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1780(core.List<core.String> o) {
+checkUnnamed1802(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1781() {
+buildUnnamed1803() {
   var o = new core.Map<core.String, core.int>();
   o["x"] = 42;
   o["y"] = 42;
   return o;
 }
 
-checkUnnamed1781(core.Map<core.String, core.int> o) {
+checkUnnamed1803(core.Map<core.String, core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals(42));
   unittest.expect(o["y"], unittest.equals(42));
 }
 
-buildUnnamed1782() {
+buildUnnamed1804() {
   var o = new core.List<api.MetricValueSet>();
   o.add(buildMetricValueSet());
   o.add(buildMetricValueSet());
   return o;
 }
 
-checkUnnamed1782(core.List<api.MetricValueSet> o) {
+checkUnnamed1804(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValueSet(o[0]);
   checkMetricValueSet(o[1]);
@@ -1122,9 +1124,9 @@
   var o = new api.QuotaInfo();
   buildCounterQuotaInfo++;
   if (buildCounterQuotaInfo < 3) {
-    o.limitExceeded = buildUnnamed1780();
-    o.quotaConsumed = buildUnnamed1781();
-    o.quotaMetrics = buildUnnamed1782();
+    o.limitExceeded = buildUnnamed1802();
+    o.quotaConsumed = buildUnnamed1803();
+    o.quotaMetrics = buildUnnamed1804();
   }
   buildCounterQuotaInfo--;
   return o;
@@ -1133,34 +1135,34 @@
 checkQuotaInfo(api.QuotaInfo o) {
   buildCounterQuotaInfo++;
   if (buildCounterQuotaInfo < 3) {
-    checkUnnamed1780(o.limitExceeded);
-    checkUnnamed1781(o.quotaConsumed);
-    checkUnnamed1782(o.quotaMetrics);
+    checkUnnamed1802(o.limitExceeded);
+    checkUnnamed1803(o.quotaConsumed);
+    checkUnnamed1804(o.quotaMetrics);
   }
   buildCounterQuotaInfo--;
 }
 
-buildUnnamed1783() {
+buildUnnamed1805() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1783(core.Map<core.String, core.String> o) {
+checkUnnamed1805(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'));
 }
 
-buildUnnamed1784() {
+buildUnnamed1806() {
   var o = new core.List<api.MetricValueSet>();
   o.add(buildMetricValueSet());
   o.add(buildMetricValueSet());
   return o;
 }
 
-checkUnnamed1784(core.List<api.MetricValueSet> o) {
+checkUnnamed1806(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValueSet(o[0]);
   checkMetricValueSet(o[1]);
@@ -1172,10 +1174,10 @@
   buildCounterQuotaOperation++;
   if (buildCounterQuotaOperation < 3) {
     o.consumerId = "foo";
-    o.labels = buildUnnamed1783();
+    o.labels = buildUnnamed1805();
     o.methodName = "foo";
     o.operationId = "foo";
-    o.quotaMetrics = buildUnnamed1784();
+    o.quotaMetrics = buildUnnamed1806();
     o.quotaMode = "foo";
   }
   buildCounterQuotaOperation--;
@@ -1186,10 +1188,10 @@
   buildCounterQuotaOperation++;
   if (buildCounterQuotaOperation < 3) {
     unittest.expect(o.consumerId, unittest.equals('foo'));
-    checkUnnamed1783(o.labels);
+    checkUnnamed1805(o.labels);
     unittest.expect(o.methodName, unittest.equals('foo'));
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkUnnamed1784(o.quotaMetrics);
+    checkUnnamed1806(o.quotaMetrics);
     unittest.expect(o.quotaMode, unittest.equals('foo'));
   }
   buildCounterQuotaOperation--;
@@ -1235,27 +1237,27 @@
   buildCounterReleaseQuotaRequest--;
 }
 
-buildUnnamed1785() {
+buildUnnamed1807() {
   var o = new core.List<api.MetricValueSet>();
   o.add(buildMetricValueSet());
   o.add(buildMetricValueSet());
   return o;
 }
 
-checkUnnamed1785(core.List<api.MetricValueSet> o) {
+checkUnnamed1807(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValueSet(o[0]);
   checkMetricValueSet(o[1]);
 }
 
-buildUnnamed1786() {
+buildUnnamed1808() {
   var o = new core.List<api.QuotaError>();
   o.add(buildQuotaError());
   o.add(buildQuotaError());
   return o;
 }
 
-checkUnnamed1786(core.List<api.QuotaError> o) {
+checkUnnamed1808(core.List<api.QuotaError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuotaError(o[0]);
   checkQuotaError(o[1]);
@@ -1267,8 +1269,8 @@
   buildCounterReleaseQuotaResponse++;
   if (buildCounterReleaseQuotaResponse < 3) {
     o.operationId = "foo";
-    o.quotaMetrics = buildUnnamed1785();
-    o.releaseErrors = buildUnnamed1786();
+    o.quotaMetrics = buildUnnamed1807();
+    o.releaseErrors = buildUnnamed1808();
     o.serviceConfigId = "foo";
   }
   buildCounterReleaseQuotaResponse--;
@@ -1279,8 +1281,8 @@
   buildCounterReleaseQuotaResponse++;
   if (buildCounterReleaseQuotaResponse < 3) {
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkUnnamed1785(o.quotaMetrics);
-    checkUnnamed1786(o.releaseErrors);
+    checkUnnamed1807(o.quotaMetrics);
+    checkUnnamed1808(o.releaseErrors);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
   }
   buildCounterReleaseQuotaResponse--;
@@ -1328,14 +1330,14 @@
   buildCounterReportInfo--;
 }
 
-buildUnnamed1787() {
+buildUnnamed1809() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1787(core.List<api.Operation> o) {
+checkUnnamed1809(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -1346,7 +1348,7 @@
   var o = new api.ReportRequest();
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    o.operations = buildUnnamed1787();
+    o.operations = buildUnnamed1809();
     o.serviceConfigId = "foo";
   }
   buildCounterReportRequest--;
@@ -1356,33 +1358,33 @@
 checkReportRequest(api.ReportRequest o) {
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    checkUnnamed1787(o.operations);
+    checkUnnamed1809(o.operations);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
   }
   buildCounterReportRequest--;
 }
 
-buildUnnamed1788() {
+buildUnnamed1810() {
   var o = new core.List<api.ReportError>();
   o.add(buildReportError());
   o.add(buildReportError());
   return o;
 }
 
-checkUnnamed1788(core.List<api.ReportError> o) {
+checkUnnamed1810(core.List<api.ReportError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportError(o[0]);
   checkReportError(o[1]);
 }
 
-buildUnnamed1789() {
+buildUnnamed1811() {
   var o = new core.List<api.ReportInfo>();
   o.add(buildReportInfo());
   o.add(buildReportInfo());
   return o;
 }
 
-checkUnnamed1789(core.List<api.ReportInfo> o) {
+checkUnnamed1811(core.List<api.ReportInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportInfo(o[0]);
   checkReportInfo(o[1]);
@@ -1393,8 +1395,8 @@
   var o = new api.ReportResponse();
   buildCounterReportResponse++;
   if (buildCounterReportResponse < 3) {
-    o.reportErrors = buildUnnamed1788();
-    o.reportInfos = buildUnnamed1789();
+    o.reportErrors = buildUnnamed1810();
+    o.reportInfos = buildUnnamed1811();
     o.serviceConfigId = "foo";
   }
   buildCounterReportResponse--;
@@ -1404,8 +1406,8 @@
 checkReportResponse(api.ReportResponse o) {
   buildCounterReportResponse++;
   if (buildCounterReportResponse < 3) {
-    checkUnnamed1788(o.reportErrors);
-    checkUnnamed1789(o.reportInfos);
+    checkUnnamed1810(o.reportErrors);
+    checkUnnamed1811(o.reportInfos);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
   }
   buildCounterReportResponse--;
@@ -1476,27 +1478,27 @@
   buildCounterStartReconciliationRequest--;
 }
 
-buildUnnamed1790() {
+buildUnnamed1812() {
   var o = new core.List<api.MetricValueSet>();
   o.add(buildMetricValueSet());
   o.add(buildMetricValueSet());
   return o;
 }
 
-checkUnnamed1790(core.List<api.MetricValueSet> o) {
+checkUnnamed1812(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValueSet(o[0]);
   checkMetricValueSet(o[1]);
 }
 
-buildUnnamed1791() {
+buildUnnamed1813() {
   var o = new core.List<api.QuotaError>();
   o.add(buildQuotaError());
   o.add(buildQuotaError());
   return o;
 }
 
-checkUnnamed1791(core.List<api.QuotaError> o) {
+checkUnnamed1813(core.List<api.QuotaError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuotaError(o[0]);
   checkQuotaError(o[1]);
@@ -1508,8 +1510,8 @@
   buildCounterStartReconciliationResponse++;
   if (buildCounterStartReconciliationResponse < 3) {
     o.operationId = "foo";
-    o.quotaMetrics = buildUnnamed1790();
-    o.reconciliationErrors = buildUnnamed1791();
+    o.quotaMetrics = buildUnnamed1812();
+    o.reconciliationErrors = buildUnnamed1813();
     o.serviceConfigId = "foo";
   }
   buildCounterStartReconciliationResponse--;
@@ -1520,14 +1522,14 @@
   buildCounterStartReconciliationResponse++;
   if (buildCounterStartReconciliationResponse < 3) {
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkUnnamed1790(o.quotaMetrics);
-    checkUnnamed1791(o.reconciliationErrors);
+    checkUnnamed1812(o.quotaMetrics);
+    checkUnnamed1813(o.reconciliationErrors);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
   }
   buildCounterStartReconciliationResponse--;
 }
 
-buildUnnamed1792() {
+buildUnnamed1814() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1542,7 +1544,7 @@
   return o;
 }
 
-checkUnnamed1792(core.Map<core.String, core.Object> o) {
+checkUnnamed1814(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted15 = (o["x"]) as core.Map;
   unittest.expect(casted15, unittest.hasLength(3));
@@ -1556,17 +1558,17 @@
   unittest.expect(casted16["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1793() {
+buildUnnamed1815() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1792());
-  o.add(buildUnnamed1792());
+  o.add(buildUnnamed1814());
+  o.add(buildUnnamed1814());
   return o;
 }
 
-checkUnnamed1793(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1815(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1792(o[0]);
-  checkUnnamed1792(o[1]);
+  checkUnnamed1814(o[0]);
+  checkUnnamed1814(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1575,7 +1577,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1793();
+    o.details = buildUnnamed1815();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1586,7 +1588,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1793(o.details);
+    checkUnnamed1815(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
diff --git a/generated/googleapis/test/servicemanagement/v1_test.dart b/generated/googleapis/test/servicemanagement/v1_test.dart
index 38f03c1..f59ba45 100644
--- a/generated/googleapis/test/servicemanagement/v1_test.dart
+++ b/generated/googleapis/test/servicemanagement/v1_test.dart
@@ -69,40 +69,40 @@
   buildCounterAdvice--;
 }
 
-buildUnnamed1187() {
+buildUnnamed1200() {
   var o = new core.List<api.Method>();
   o.add(buildMethod());
   o.add(buildMethod());
   return o;
 }
 
-checkUnnamed1187(core.List<api.Method> o) {
+checkUnnamed1200(core.List<api.Method> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMethod(o[0]);
   checkMethod(o[1]);
 }
 
-buildUnnamed1188() {
+buildUnnamed1201() {
   var o = new core.List<api.Mixin>();
   o.add(buildMixin());
   o.add(buildMixin());
   return o;
 }
 
-checkUnnamed1188(core.List<api.Mixin> o) {
+checkUnnamed1201(core.List<api.Mixin> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMixin(o[0]);
   checkMixin(o[1]);
 }
 
-buildUnnamed1189() {
+buildUnnamed1202() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1189(core.List<api.Option> o) {
+checkUnnamed1202(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -113,10 +113,10 @@
   var o = new api.Api();
   buildCounterApi++;
   if (buildCounterApi < 3) {
-    o.methods = buildUnnamed1187();
-    o.mixins = buildUnnamed1188();
+    o.methods = buildUnnamed1200();
+    o.mixins = buildUnnamed1201();
     o.name = "foo";
-    o.options = buildUnnamed1189();
+    o.options = buildUnnamed1202();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
     o.version = "foo";
@@ -128,10 +128,10 @@
 checkApi(api.Api o) {
   buildCounterApi++;
   if (buildCounterApi < 3) {
-    checkUnnamed1187(o.methods);
-    checkUnnamed1188(o.mixins);
+    checkUnnamed1200(o.methods);
+    checkUnnamed1201(o.mixins);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1189(o.options);
+    checkUnnamed1202(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
@@ -139,27 +139,27 @@
   buildCounterApi--;
 }
 
-buildUnnamed1190() {
+buildUnnamed1203() {
   var o = new core.List<api.AuditLogConfig>();
   o.add(buildAuditLogConfig());
   o.add(buildAuditLogConfig());
   return o;
 }
 
-checkUnnamed1190(core.List<api.AuditLogConfig> o) {
+checkUnnamed1203(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditLogConfig(o[0]);
   checkAuditLogConfig(o[1]);
 }
 
-buildUnnamed1191() {
+buildUnnamed1204() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1191(core.List<core.String> o) {
+checkUnnamed1204(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -170,8 +170,8 @@
   var o = new api.AuditConfig();
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed1190();
-    o.exemptedMembers = buildUnnamed1191();
+    o.auditLogConfigs = buildUnnamed1203();
+    o.exemptedMembers = buildUnnamed1204();
     o.service = "foo";
   }
   buildCounterAuditConfig--;
@@ -181,21 +181,21 @@
 checkAuditConfig(api.AuditConfig o) {
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    checkUnnamed1190(o.auditLogConfigs);
-    checkUnnamed1191(o.exemptedMembers);
+    checkUnnamed1203(o.auditLogConfigs);
+    checkUnnamed1204(o.exemptedMembers);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterAuditConfig--;
 }
 
-buildUnnamed1192() {
+buildUnnamed1205() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1192(core.List<core.String> o) {
+checkUnnamed1205(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -206,7 +206,7 @@
   var o = new api.AuditLogConfig();
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed1192();
+    o.exemptedMembers = buildUnnamed1205();
     o.logType = "foo";
   }
   buildCounterAuditLogConfig--;
@@ -216,7 +216,7 @@
 checkAuditLogConfig(api.AuditLogConfig o) {
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed1192(o.exemptedMembers);
+    checkUnnamed1205(o.exemptedMembers);
     unittest.expect(o.logType, unittest.equals('foo'));
   }
   buildCounterAuditLogConfig--;
@@ -270,27 +270,27 @@
   buildCounterAuthRequirement--;
 }
 
-buildUnnamed1193() {
+buildUnnamed1206() {
   var o = new core.List<api.AuthProvider>();
   o.add(buildAuthProvider());
   o.add(buildAuthProvider());
   return o;
 }
 
-checkUnnamed1193(core.List<api.AuthProvider> o) {
+checkUnnamed1206(core.List<api.AuthProvider> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthProvider(o[0]);
   checkAuthProvider(o[1]);
 }
 
-buildUnnamed1194() {
+buildUnnamed1207() {
   var o = new core.List<api.AuthenticationRule>();
   o.add(buildAuthenticationRule());
   o.add(buildAuthenticationRule());
   return o;
 }
 
-checkUnnamed1194(core.List<api.AuthenticationRule> o) {
+checkUnnamed1207(core.List<api.AuthenticationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthenticationRule(o[0]);
   checkAuthenticationRule(o[1]);
@@ -301,8 +301,8 @@
   var o = new api.Authentication();
   buildCounterAuthentication++;
   if (buildCounterAuthentication < 3) {
-    o.providers = buildUnnamed1193();
-    o.rules = buildUnnamed1194();
+    o.providers = buildUnnamed1206();
+    o.rules = buildUnnamed1207();
   }
   buildCounterAuthentication--;
   return o;
@@ -311,20 +311,20 @@
 checkAuthentication(api.Authentication o) {
   buildCounterAuthentication++;
   if (buildCounterAuthentication < 3) {
-    checkUnnamed1193(o.providers);
-    checkUnnamed1194(o.rules);
+    checkUnnamed1206(o.providers);
+    checkUnnamed1207(o.rules);
   }
   buildCounterAuthentication--;
 }
 
-buildUnnamed1195() {
+buildUnnamed1208() {
   var o = new core.List<api.AuthRequirement>();
   o.add(buildAuthRequirement());
   o.add(buildAuthRequirement());
   return o;
 }
 
-checkUnnamed1195(core.List<api.AuthRequirement> o) {
+checkUnnamed1208(core.List<api.AuthRequirement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthRequirement(o[0]);
   checkAuthRequirement(o[1]);
@@ -338,7 +338,7 @@
     o.allowWithoutCredential = true;
     o.customAuth = buildCustomAuthRequirements();
     o.oauth = buildOAuthRequirements();
-    o.requirements = buildUnnamed1195();
+    o.requirements = buildUnnamed1208();
     o.selector = "foo";
   }
   buildCounterAuthenticationRule--;
@@ -351,7 +351,7 @@
     unittest.expect(o.allowWithoutCredential, unittest.isTrue);
     checkCustomAuthRequirements(o.customAuth);
     checkOAuthRequirements(o.oauth);
-    checkUnnamed1195(o.requirements);
+    checkUnnamed1208(o.requirements);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterAuthenticationRule--;
@@ -376,14 +376,14 @@
   buildCounterAuthorizationConfig--;
 }
 
-buildUnnamed1196() {
+buildUnnamed1209() {
   var o = new core.List<api.BackendRule>();
   o.add(buildBackendRule());
   o.add(buildBackendRule());
   return o;
 }
 
-checkUnnamed1196(core.List<api.BackendRule> o) {
+checkUnnamed1209(core.List<api.BackendRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendRule(o[0]);
   checkBackendRule(o[1]);
@@ -394,7 +394,7 @@
   var o = new api.Backend();
   buildCounterBackend++;
   if (buildCounterBackend < 3) {
-    o.rules = buildUnnamed1196();
+    o.rules = buildUnnamed1209();
   }
   buildCounterBackend--;
   return o;
@@ -403,7 +403,7 @@
 checkBackend(api.Backend o) {
   buildCounterBackend++;
   if (buildCounterBackend < 3) {
-    checkUnnamed1196(o.rules);
+    checkUnnamed1209(o.rules);
   }
   buildCounterBackend--;
 }
@@ -433,14 +433,14 @@
   buildCounterBackendRule--;
 }
 
-buildUnnamed1197() {
+buildUnnamed1210() {
   var o = new core.List<api.BillingDestination>();
   o.add(buildBillingDestination());
   o.add(buildBillingDestination());
   return o;
 }
 
-checkUnnamed1197(core.List<api.BillingDestination> o) {
+checkUnnamed1210(core.List<api.BillingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBillingDestination(o[0]);
   checkBillingDestination(o[1]);
@@ -451,7 +451,7 @@
   var o = new api.Billing();
   buildCounterBilling++;
   if (buildCounterBilling < 3) {
-    o.consumerDestinations = buildUnnamed1197();
+    o.consumerDestinations = buildUnnamed1210();
   }
   buildCounterBilling--;
   return o;
@@ -460,19 +460,19 @@
 checkBilling(api.Billing o) {
   buildCounterBilling++;
   if (buildCounterBilling < 3) {
-    checkUnnamed1197(o.consumerDestinations);
+    checkUnnamed1210(o.consumerDestinations);
   }
   buildCounterBilling--;
 }
 
-buildUnnamed1198() {
+buildUnnamed1211() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1198(core.List<core.String> o) {
+checkUnnamed1211(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -483,7 +483,7 @@
   var o = new api.BillingDestination();
   buildCounterBillingDestination++;
   if (buildCounterBillingDestination < 3) {
-    o.metrics = buildUnnamed1198();
+    o.metrics = buildUnnamed1211();
     o.monitoredResource = "foo";
   }
   buildCounterBillingDestination--;
@@ -493,20 +493,20 @@
 checkBillingDestination(api.BillingDestination o) {
   buildCounterBillingDestination++;
   if (buildCounterBillingDestination < 3) {
-    checkUnnamed1198(o.metrics);
+    checkUnnamed1211(o.metrics);
     unittest.expect(o.monitoredResource, unittest.equals('foo'));
   }
   buildCounterBillingDestination--;
 }
 
-buildUnnamed1199() {
+buildUnnamed1212() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1199(core.List<core.String> o) {
+checkUnnamed1212(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -518,7 +518,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     o.condition = buildExpr();
-    o.members = buildUnnamed1199();
+    o.members = buildUnnamed1212();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -529,20 +529,20 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     checkExpr(o.condition);
-    checkUnnamed1199(o.members);
+    checkUnnamed1212(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
 }
 
-buildUnnamed1200() {
+buildUnnamed1213() {
   var o = new core.List<api.ConfigChange>();
   o.add(buildConfigChange());
   o.add(buildConfigChange());
   return o;
 }
 
-checkUnnamed1200(core.List<api.ConfigChange> o) {
+checkUnnamed1213(core.List<api.ConfigChange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConfigChange(o[0]);
   checkConfigChange(o[1]);
@@ -553,7 +553,7 @@
   var o = new api.ChangeReport();
   buildCounterChangeReport++;
   if (buildCounterChangeReport < 3) {
-    o.configChanges = buildUnnamed1200();
+    o.configChanges = buildUnnamed1213();
   }
   buildCounterChangeReport--;
   return o;
@@ -562,19 +562,19 @@
 checkChangeReport(api.ChangeReport o) {
   buildCounterChangeReport++;
   if (buildCounterChangeReport < 3) {
-    checkUnnamed1200(o.configChanges);
+    checkUnnamed1213(o.configChanges);
   }
   buildCounterChangeReport--;
 }
 
-buildUnnamed1201() {
+buildUnnamed1214() {
   var o = new core.List<api.Advice>();
   o.add(buildAdvice());
   o.add(buildAdvice());
   return o;
 }
 
-checkUnnamed1201(core.List<api.Advice> o) {
+checkUnnamed1214(core.List<api.Advice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdvice(o[0]);
   checkAdvice(o[1]);
@@ -585,7 +585,7 @@
   var o = new api.ConfigChange();
   buildCounterConfigChange++;
   if (buildCounterConfigChange < 3) {
-    o.advices = buildUnnamed1201();
+    o.advices = buildUnnamed1214();
     o.changeType = "foo";
     o.element = "foo";
     o.newValue = "foo";
@@ -598,7 +598,7 @@
 checkConfigChange(api.ConfigChange o) {
   buildCounterConfigChange++;
   if (buildCounterConfigChange < 3) {
-    checkUnnamed1201(o.advices);
+    checkUnnamed1214(o.advices);
     unittest.expect(o.changeType, unittest.equals('foo'));
     unittest.expect(o.element, unittest.equals('foo'));
     unittest.expect(o.newValue, unittest.equals('foo'));
@@ -649,14 +649,14 @@
   buildCounterConfigRef--;
 }
 
-buildUnnamed1202() {
+buildUnnamed1215() {
   var o = new core.List<api.ConfigFile>();
   o.add(buildConfigFile());
   o.add(buildConfigFile());
   return o;
 }
 
-checkUnnamed1202(core.List<api.ConfigFile> o) {
+checkUnnamed1215(core.List<api.ConfigFile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConfigFile(o[0]);
   checkConfigFile(o[1]);
@@ -667,7 +667,7 @@
   var o = new api.ConfigSource();
   buildCounterConfigSource++;
   if (buildCounterConfigSource < 3) {
-    o.files = buildUnnamed1202();
+    o.files = buildUnnamed1215();
     o.id = "foo";
   }
   buildCounterConfigSource--;
@@ -677,20 +677,20 @@
 checkConfigSource(api.ConfigSource o) {
   buildCounterConfigSource++;
   if (buildCounterConfigSource < 3) {
-    checkUnnamed1202(o.files);
+    checkUnnamed1215(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
   }
   buildCounterConfigSource--;
 }
 
-buildUnnamed1203() {
+buildUnnamed1216() {
   var o = new core.List<api.ContextRule>();
   o.add(buildContextRule());
   o.add(buildContextRule());
   return o;
 }
 
-checkUnnamed1203(core.List<api.ContextRule> o) {
+checkUnnamed1216(core.List<api.ContextRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContextRule(o[0]);
   checkContextRule(o[1]);
@@ -701,7 +701,7 @@
   var o = new api.Context();
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    o.rules = buildUnnamed1203();
+    o.rules = buildUnnamed1216();
   }
   buildCounterContext--;
   return o;
@@ -710,32 +710,32 @@
 checkContext(api.Context o) {
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    checkUnnamed1203(o.rules);
+    checkUnnamed1216(o.rules);
   }
   buildCounterContext--;
 }
 
-buildUnnamed1204() {
+buildUnnamed1217() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1204(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'));
 }
 
-buildUnnamed1205() {
+buildUnnamed1218() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1205(core.List<core.String> o) {
+checkUnnamed1218(core.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,8 +746,8 @@
   var o = new api.ContextRule();
   buildCounterContextRule++;
   if (buildCounterContextRule < 3) {
-    o.provided = buildUnnamed1204();
-    o.requested = buildUnnamed1205();
+    o.provided = buildUnnamed1217();
+    o.requested = buildUnnamed1218();
     o.selector = "foo";
   }
   buildCounterContextRule--;
@@ -757,8 +757,8 @@
 checkContextRule(api.ContextRule o) {
   buildCounterContextRule++;
   if (buildCounterContextRule < 3) {
-    checkUnnamed1204(o.provided);
-    checkUnnamed1205(o.requested);
+    checkUnnamed1217(o.provided);
+    checkUnnamed1218(o.requested);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterContextRule--;
@@ -802,27 +802,27 @@
   buildCounterCustomAuthRequirements--;
 }
 
-buildUnnamed1206() {
+buildUnnamed1219() {
   var o = new core.List<api.CustomErrorRule>();
   o.add(buildCustomErrorRule());
   o.add(buildCustomErrorRule());
   return o;
 }
 
-checkUnnamed1206(core.List<api.CustomErrorRule> o) {
+checkUnnamed1219(core.List<api.CustomErrorRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomErrorRule(o[0]);
   checkCustomErrorRule(o[1]);
 }
 
-buildUnnamed1207() {
+buildUnnamed1220() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1207(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'));
@@ -833,8 +833,8 @@
   var o = new api.CustomError();
   buildCounterCustomError++;
   if (buildCounterCustomError < 3) {
-    o.rules = buildUnnamed1206();
-    o.types = buildUnnamed1207();
+    o.rules = buildUnnamed1219();
+    o.types = buildUnnamed1220();
   }
   buildCounterCustomError--;
   return o;
@@ -843,8 +843,8 @@
 checkCustomError(api.CustomError o) {
   buildCounterCustomError++;
   if (buildCounterCustomError < 3) {
-    checkUnnamed1206(o.rules);
-    checkUnnamed1207(o.types);
+    checkUnnamed1219(o.rules);
+    checkUnnamed1220(o.types);
   }
   buildCounterCustomError--;
 }
@@ -948,27 +948,27 @@
   buildCounterDisableServiceRequest--;
 }
 
-buildUnnamed1208() {
+buildUnnamed1221() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1208(core.List<api.Page> o) {
+checkUnnamed1221(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
 }
 
-buildUnnamed1209() {
+buildUnnamed1222() {
   var o = new core.List<api.DocumentationRule>();
   o.add(buildDocumentationRule());
   o.add(buildDocumentationRule());
   return o;
 }
 
-checkUnnamed1209(core.List<api.DocumentationRule> o) {
+checkUnnamed1222(core.List<api.DocumentationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDocumentationRule(o[0]);
   checkDocumentationRule(o[1]);
@@ -981,8 +981,8 @@
   if (buildCounterDocumentation < 3) {
     o.documentationRootUrl = "foo";
     o.overview = "foo";
-    o.pages = buildUnnamed1208();
-    o.rules = buildUnnamed1209();
+    o.pages = buildUnnamed1221();
+    o.rules = buildUnnamed1222();
     o.summary = "foo";
   }
   buildCounterDocumentation--;
@@ -994,8 +994,8 @@
   if (buildCounterDocumentation < 3) {
     unittest.expect(o.documentationRootUrl, unittest.equals('foo'));
     unittest.expect(o.overview, unittest.equals('foo'));
-    checkUnnamed1208(o.pages);
-    checkUnnamed1209(o.rules);
+    checkUnnamed1221(o.pages);
+    checkUnnamed1222(o.rules);
     unittest.expect(o.summary, unittest.equals('foo'));
   }
   buildCounterDocumentation--;
@@ -1043,27 +1043,27 @@
   buildCounterEnableServiceRequest--;
 }
 
-buildUnnamed1210() {
+buildUnnamed1223() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1210(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'));
 }
 
-buildUnnamed1211() {
+buildUnnamed1224() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1211(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'));
@@ -1074,9 +1074,9 @@
   var o = new api.Endpoint();
   buildCounterEndpoint++;
   if (buildCounterEndpoint < 3) {
-    o.aliases = buildUnnamed1210();
+    o.aliases = buildUnnamed1223();
     o.allowCors = true;
-    o.features = buildUnnamed1211();
+    o.features = buildUnnamed1224();
     o.name = "foo";
     o.target = "foo";
   }
@@ -1087,36 +1087,36 @@
 checkEndpoint(api.Endpoint o) {
   buildCounterEndpoint++;
   if (buildCounterEndpoint < 3) {
-    checkUnnamed1210(o.aliases);
+    checkUnnamed1223(o.aliases);
     unittest.expect(o.allowCors, unittest.isTrue);
-    checkUnnamed1211(o.features);
+    checkUnnamed1224(o.features);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
   }
   buildCounterEndpoint--;
 }
 
-buildUnnamed1212() {
+buildUnnamed1225() {
   var o = new core.List<api.EnumValue>();
   o.add(buildEnumValue());
   o.add(buildEnumValue());
   return o;
 }
 
-checkUnnamed1212(core.List<api.EnumValue> o) {
+checkUnnamed1225(core.List<api.EnumValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnumValue(o[0]);
   checkEnumValue(o[1]);
 }
 
-buildUnnamed1213() {
+buildUnnamed1226() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1213(core.List<api.Option> o) {
+checkUnnamed1226(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -1127,9 +1127,9 @@
   var o = new api.Enum();
   buildCounterEnum++;
   if (buildCounterEnum < 3) {
-    o.enumvalue = buildUnnamed1212();
+    o.enumvalue = buildUnnamed1225();
     o.name = "foo";
-    o.options = buildUnnamed1213();
+    o.options = buildUnnamed1226();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
   }
@@ -1140,23 +1140,23 @@
 checkEnum(api.Enum o) {
   buildCounterEnum++;
   if (buildCounterEnum < 3) {
-    checkUnnamed1212(o.enumvalue);
+    checkUnnamed1225(o.enumvalue);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1213(o.options);
+    checkUnnamed1226(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterEnum--;
 }
 
-buildUnnamed1214() {
+buildUnnamed1227() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1214(core.List<api.Option> o) {
+checkUnnamed1227(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -1169,7 +1169,7 @@
   if (buildCounterEnumValue < 3) {
     o.name = "foo";
     o.number = 42;
-    o.options = buildUnnamed1214();
+    o.options = buildUnnamed1227();
   }
   buildCounterEnumValue--;
   return o;
@@ -1180,7 +1180,7 @@
   if (buildCounterEnumValue < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals(42));
-    checkUnnamed1214(o.options);
+    checkUnnamed1227(o.options);
   }
   buildCounterEnumValue--;
 }
@@ -1229,14 +1229,14 @@
   buildCounterExpr--;
 }
 
-buildUnnamed1215() {
+buildUnnamed1228() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1215(core.List<api.Option> o) {
+checkUnnamed1228(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -1254,7 +1254,7 @@
     o.name = "foo";
     o.number = 42;
     o.oneofIndex = 42;
-    o.options = buildUnnamed1215();
+    o.options = buildUnnamed1228();
     o.packed = true;
     o.typeUrl = "foo";
   }
@@ -1272,21 +1272,21 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals(42));
     unittest.expect(o.oneofIndex, unittest.equals(42));
-    checkUnnamed1215(o.options);
+    checkUnnamed1228(o.options);
     unittest.expect(o.packed, unittest.isTrue);
     unittest.expect(o.typeUrl, unittest.equals('foo'));
   }
   buildCounterField--;
 }
 
-buildUnnamed1216() {
+buildUnnamed1229() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1216(core.List<core.String> o) {
+checkUnnamed1229(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1301,7 +1301,7 @@
     o.deadline = "foo";
     o.flowName = "foo";
     o.operationType = 42;
-    o.resourceNames = buildUnnamed1216();
+    o.resourceNames = buildUnnamed1229();
     o.startTime = "foo";
     o.surface = "foo";
   }
@@ -1316,14 +1316,14 @@
     unittest.expect(o.deadline, unittest.equals('foo'));
     unittest.expect(o.flowName, unittest.equals('foo'));
     unittest.expect(o.operationType, unittest.equals(42));
-    checkUnnamed1216(o.resourceNames);
+    checkUnnamed1229(o.resourceNames);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.surface, unittest.equals('foo'));
   }
   buildCounterFlowOperationMetadata--;
 }
 
-buildUnnamed1217() {
+buildUnnamed1230() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1338,7 +1338,7 @@
   return o;
 }
 
-checkUnnamed1217(core.Map<core.String, core.Object> o) {
+checkUnnamed1230(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));
@@ -1352,7 +1352,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1218() {
+buildUnnamed1231() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1367,7 +1367,7 @@
   return o;
 }
 
-checkUnnamed1218(core.Map<core.String, core.Object> o) {
+checkUnnamed1231(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -1386,8 +1386,8 @@
   var o = new api.GenerateConfigReportRequest();
   buildCounterGenerateConfigReportRequest++;
   if (buildCounterGenerateConfigReportRequest < 3) {
-    o.newConfig = buildUnnamed1217();
-    o.oldConfig = buildUnnamed1218();
+    o.newConfig = buildUnnamed1230();
+    o.oldConfig = buildUnnamed1231();
   }
   buildCounterGenerateConfigReportRequest--;
   return o;
@@ -1396,33 +1396,33 @@
 checkGenerateConfigReportRequest(api.GenerateConfigReportRequest o) {
   buildCounterGenerateConfigReportRequest++;
   if (buildCounterGenerateConfigReportRequest < 3) {
-    checkUnnamed1217(o.newConfig);
-    checkUnnamed1218(o.oldConfig);
+    checkUnnamed1230(o.newConfig);
+    checkUnnamed1231(o.oldConfig);
   }
   buildCounterGenerateConfigReportRequest--;
 }
 
-buildUnnamed1219() {
+buildUnnamed1232() {
   var o = new core.List<api.ChangeReport>();
   o.add(buildChangeReport());
   o.add(buildChangeReport());
   return o;
 }
 
-checkUnnamed1219(core.List<api.ChangeReport> o) {
+checkUnnamed1232(core.List<api.ChangeReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChangeReport(o[0]);
   checkChangeReport(o[1]);
 }
 
-buildUnnamed1220() {
+buildUnnamed1233() {
   var o = new core.List<api.Diagnostic>();
   o.add(buildDiagnostic());
   o.add(buildDiagnostic());
   return o;
 }
 
-checkUnnamed1220(core.List<api.Diagnostic> o) {
+checkUnnamed1233(core.List<api.Diagnostic> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiagnostic(o[0]);
   checkDiagnostic(o[1]);
@@ -1433,8 +1433,8 @@
   var o = new api.GenerateConfigReportResponse();
   buildCounterGenerateConfigReportResponse++;
   if (buildCounterGenerateConfigReportResponse < 3) {
-    o.changeReports = buildUnnamed1219();
-    o.diagnostics = buildUnnamed1220();
+    o.changeReports = buildUnnamed1232();
+    o.diagnostics = buildUnnamed1233();
     o.id = "foo";
     o.serviceName = "foo";
   }
@@ -1445,8 +1445,8 @@
 checkGenerateConfigReportResponse(api.GenerateConfigReportResponse o) {
   buildCounterGenerateConfigReportResponse++;
   if (buildCounterGenerateConfigReportResponse < 3) {
-    checkUnnamed1219(o.changeReports);
-    checkUnnamed1220(o.diagnostics);
+    checkUnnamed1232(o.changeReports);
+    checkUnnamed1233(o.diagnostics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.serviceName, unittest.equals('foo'));
   }
@@ -1468,14 +1468,14 @@
   buildCounterGetIamPolicyRequest--;
 }
 
-buildUnnamed1221() {
+buildUnnamed1234() {
   var o = new core.List<api.HttpRule>();
   o.add(buildHttpRule());
   o.add(buildHttpRule());
   return o;
 }
 
-checkUnnamed1221(core.List<api.HttpRule> o) {
+checkUnnamed1234(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpRule(o[0]);
   checkHttpRule(o[1]);
@@ -1487,7 +1487,7 @@
   buildCounterHttp++;
   if (buildCounterHttp < 3) {
     o.fullyDecodeReservedExpansion = true;
-    o.rules = buildUnnamed1221();
+    o.rules = buildUnnamed1234();
   }
   buildCounterHttp--;
   return o;
@@ -1497,19 +1497,19 @@
   buildCounterHttp++;
   if (buildCounterHttp < 3) {
     unittest.expect(o.fullyDecodeReservedExpansion, unittest.isTrue);
-    checkUnnamed1221(o.rules);
+    checkUnnamed1234(o.rules);
   }
   buildCounterHttp--;
 }
 
-buildUnnamed1222() {
+buildUnnamed1235() {
   var o = new core.List<api.HttpRule>();
   o.add(buildHttpRule());
   o.add(buildHttpRule());
   return o;
 }
 
-checkUnnamed1222(core.List<api.HttpRule> o) {
+checkUnnamed1235(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpRule(o[0]);
   checkHttpRule(o[1]);
@@ -1520,7 +1520,7 @@
   var o = new api.HttpRule();
   buildCounterHttpRule++;
   if (buildCounterHttpRule < 3) {
-    o.additionalBindings = buildUnnamed1222();
+    o.additionalBindings = buildUnnamed1235();
     o.body = "foo";
     o.custom = buildCustomHttpPattern();
     o.delete = "foo";
@@ -1540,7 +1540,7 @@
 checkHttpRule(api.HttpRule o) {
   buildCounterHttpRule++;
   if (buildCounterHttpRule < 3) {
-    checkUnnamed1222(o.additionalBindings);
+    checkUnnamed1235(o.additionalBindings);
     unittest.expect(o.body, unittest.equals('foo'));
     checkCustomHttpPattern(o.custom);
     unittest.expect(o.delete, unittest.equals('foo'));
@@ -1579,14 +1579,14 @@
   buildCounterLabelDescriptor--;
 }
 
-buildUnnamed1223() {
+buildUnnamed1236() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1223(core.List<api.Operation> o) {
+checkUnnamed1236(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -1598,7 +1598,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed1223();
+    o.operations = buildUnnamed1236();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -1608,19 +1608,19 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1223(o.operations);
+    checkUnnamed1236(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed1224() {
+buildUnnamed1237() {
   var o = new core.List<api.Service>();
   o.add(buildService());
   o.add(buildService());
   return o;
 }
 
-checkUnnamed1224(core.List<api.Service> o) {
+checkUnnamed1237(core.List<api.Service> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkService(o[0]);
   checkService(o[1]);
@@ -1632,7 +1632,7 @@
   buildCounterListServiceConfigsResponse++;
   if (buildCounterListServiceConfigsResponse < 3) {
     o.nextPageToken = "foo";
-    o.serviceConfigs = buildUnnamed1224();
+    o.serviceConfigs = buildUnnamed1237();
   }
   buildCounterListServiceConfigsResponse--;
   return o;
@@ -1642,19 +1642,19 @@
   buildCounterListServiceConfigsResponse++;
   if (buildCounterListServiceConfigsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1224(o.serviceConfigs);
+    checkUnnamed1237(o.serviceConfigs);
   }
   buildCounterListServiceConfigsResponse--;
 }
 
-buildUnnamed1225() {
+buildUnnamed1238() {
   var o = new core.List<api.Rollout>();
   o.add(buildRollout());
   o.add(buildRollout());
   return o;
 }
 
-checkUnnamed1225(core.List<api.Rollout> o) {
+checkUnnamed1238(core.List<api.Rollout> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRollout(o[0]);
   checkRollout(o[1]);
@@ -1666,7 +1666,7 @@
   buildCounterListServiceRolloutsResponse++;
   if (buildCounterListServiceRolloutsResponse < 3) {
     o.nextPageToken = "foo";
-    o.rollouts = buildUnnamed1225();
+    o.rollouts = buildUnnamed1238();
   }
   buildCounterListServiceRolloutsResponse--;
   return o;
@@ -1676,19 +1676,19 @@
   buildCounterListServiceRolloutsResponse++;
   if (buildCounterListServiceRolloutsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1225(o.rollouts);
+    checkUnnamed1238(o.rollouts);
   }
   buildCounterListServiceRolloutsResponse--;
 }
 
-buildUnnamed1226() {
+buildUnnamed1239() {
   var o = new core.List<api.ManagedService>();
   o.add(buildManagedService());
   o.add(buildManagedService());
   return o;
 }
 
-checkUnnamed1226(core.List<api.ManagedService> o) {
+checkUnnamed1239(core.List<api.ManagedService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedService(o[0]);
   checkManagedService(o[1]);
@@ -1700,7 +1700,7 @@
   buildCounterListServicesResponse++;
   if (buildCounterListServicesResponse < 3) {
     o.nextPageToken = "foo";
-    o.services = buildUnnamed1226();
+    o.services = buildUnnamed1239();
   }
   buildCounterListServicesResponse--;
   return o;
@@ -1710,19 +1710,19 @@
   buildCounterListServicesResponse++;
   if (buildCounterListServicesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1226(o.services);
+    checkUnnamed1239(o.services);
   }
   buildCounterListServicesResponse--;
 }
 
-buildUnnamed1227() {
+buildUnnamed1240() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1227(core.List<api.LabelDescriptor> o) {
+checkUnnamed1240(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -1735,7 +1735,7 @@
   if (buildCounterLogDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1227();
+    o.labels = buildUnnamed1240();
     o.name = "foo";
   }
   buildCounterLogDescriptor--;
@@ -1747,33 +1747,33 @@
   if (buildCounterLogDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1227(o.labels);
+    checkUnnamed1240(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterLogDescriptor--;
 }
 
-buildUnnamed1228() {
+buildUnnamed1241() {
   var o = new core.List<api.LoggingDestination>();
   o.add(buildLoggingDestination());
   o.add(buildLoggingDestination());
   return o;
 }
 
-checkUnnamed1228(core.List<api.LoggingDestination> o) {
+checkUnnamed1241(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLoggingDestination(o[0]);
   checkLoggingDestination(o[1]);
 }
 
-buildUnnamed1229() {
+buildUnnamed1242() {
   var o = new core.List<api.LoggingDestination>();
   o.add(buildLoggingDestination());
   o.add(buildLoggingDestination());
   return o;
 }
 
-checkUnnamed1229(core.List<api.LoggingDestination> o) {
+checkUnnamed1242(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLoggingDestination(o[0]);
   checkLoggingDestination(o[1]);
@@ -1784,8 +1784,8 @@
   var o = new api.Logging();
   buildCounterLogging++;
   if (buildCounterLogging < 3) {
-    o.consumerDestinations = buildUnnamed1228();
-    o.producerDestinations = buildUnnamed1229();
+    o.consumerDestinations = buildUnnamed1241();
+    o.producerDestinations = buildUnnamed1242();
   }
   buildCounterLogging--;
   return o;
@@ -1794,20 +1794,20 @@
 checkLogging(api.Logging o) {
   buildCounterLogging++;
   if (buildCounterLogging < 3) {
-    checkUnnamed1228(o.consumerDestinations);
-    checkUnnamed1229(o.producerDestinations);
+    checkUnnamed1241(o.consumerDestinations);
+    checkUnnamed1242(o.producerDestinations);
   }
   buildCounterLogging--;
 }
 
-buildUnnamed1230() {
+buildUnnamed1243() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1230(core.List<core.String> o) {
+checkUnnamed1243(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1818,7 +1818,7 @@
   var o = new api.LoggingDestination();
   buildCounterLoggingDestination++;
   if (buildCounterLoggingDestination < 3) {
-    o.logs = buildUnnamed1230();
+    o.logs = buildUnnamed1243();
     o.monitoredResource = "foo";
   }
   buildCounterLoggingDestination--;
@@ -1828,7 +1828,7 @@
 checkLoggingDestination(api.LoggingDestination o) {
   buildCounterLoggingDestination++;
   if (buildCounterLoggingDestination < 3) {
-    checkUnnamed1230(o.logs);
+    checkUnnamed1243(o.logs);
     unittest.expect(o.monitoredResource, unittest.equals('foo'));
   }
   buildCounterLoggingDestination--;
@@ -1884,14 +1884,14 @@
   buildCounterMediaDownload--;
 }
 
-buildUnnamed1231() {
+buildUnnamed1244() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1231(core.List<core.String> o) {
+checkUnnamed1244(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1906,7 +1906,7 @@
     o.dropzone = "foo";
     o.enabled = true;
     o.maxSize = "foo";
-    o.mimeTypes = buildUnnamed1231();
+    o.mimeTypes = buildUnnamed1244();
     o.progressNotification = true;
     o.startNotification = true;
     o.uploadService = "foo";
@@ -1922,7 +1922,7 @@
     unittest.expect(o.dropzone, unittest.equals('foo'));
     unittest.expect(o.enabled, unittest.isTrue);
     unittest.expect(o.maxSize, unittest.equals('foo'));
-    checkUnnamed1231(o.mimeTypes);
+    checkUnnamed1244(o.mimeTypes);
     unittest.expect(o.progressNotification, unittest.isTrue);
     unittest.expect(o.startNotification, unittest.isTrue);
     unittest.expect(o.uploadService, unittest.equals('foo'));
@@ -1930,14 +1930,14 @@
   buildCounterMediaUpload--;
 }
 
-buildUnnamed1232() {
+buildUnnamed1245() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1232(core.List<api.Option> o) {
+checkUnnamed1245(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -1949,7 +1949,7 @@
   buildCounterMethod++;
   if (buildCounterMethod < 3) {
     o.name = "foo";
-    o.options = buildUnnamed1232();
+    o.options = buildUnnamed1245();
     o.requestStreaming = true;
     o.requestTypeUrl = "foo";
     o.responseStreaming = true;
@@ -1964,7 +1964,7 @@
   buildCounterMethod++;
   if (buildCounterMethod < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1232(o.options);
+    checkUnnamed1245(o.options);
     unittest.expect(o.requestStreaming, unittest.isTrue);
     unittest.expect(o.requestTypeUrl, unittest.equals('foo'));
     unittest.expect(o.responseStreaming, unittest.isTrue);
@@ -1974,14 +1974,14 @@
   buildCounterMethod--;
 }
 
-buildUnnamed1233() {
+buildUnnamed1246() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1233(core.List<api.LabelDescriptor> o) {
+checkUnnamed1246(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -1994,7 +1994,7 @@
   if (buildCounterMetricDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1233();
+    o.labels = buildUnnamed1246();
     o.metricKind = "foo";
     o.name = "foo";
     o.type = "foo";
@@ -2010,7 +2010,7 @@
   if (buildCounterMetricDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1233(o.labels);
+    checkUnnamed1246(o.labels);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -2020,14 +2020,14 @@
   buildCounterMetricDescriptor--;
 }
 
-buildUnnamed1234() {
+buildUnnamed1247() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1234(core.Map<core.String, core.String> o) {
+checkUnnamed1247(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'));
@@ -2038,7 +2038,7 @@
   var o = new api.MetricRule();
   buildCounterMetricRule++;
   if (buildCounterMetricRule < 3) {
-    o.metricCosts = buildUnnamed1234();
+    o.metricCosts = buildUnnamed1247();
     o.selector = "foo";
   }
   buildCounterMetricRule--;
@@ -2048,7 +2048,7 @@
 checkMetricRule(api.MetricRule o) {
   buildCounterMetricRule++;
   if (buildCounterMetricRule < 3) {
-    checkUnnamed1234(o.metricCosts);
+    checkUnnamed1247(o.metricCosts);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterMetricRule--;
@@ -2075,14 +2075,14 @@
   buildCounterMixin--;
 }
 
-buildUnnamed1235() {
+buildUnnamed1248() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1235(core.List<api.LabelDescriptor> o) {
+checkUnnamed1248(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -2095,7 +2095,7 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1235();
+    o.labels = buildUnnamed1248();
     o.name = "foo";
     o.type = "foo";
   }
@@ -2108,34 +2108,34 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1235(o.labels);
+    checkUnnamed1248(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterMonitoredResourceDescriptor--;
 }
 
-buildUnnamed1236() {
+buildUnnamed1249() {
   var o = new core.List<api.MonitoringDestination>();
   o.add(buildMonitoringDestination());
   o.add(buildMonitoringDestination());
   return o;
 }
 
-checkUnnamed1236(core.List<api.MonitoringDestination> o) {
+checkUnnamed1249(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoringDestination(o[0]);
   checkMonitoringDestination(o[1]);
 }
 
-buildUnnamed1237() {
+buildUnnamed1250() {
   var o = new core.List<api.MonitoringDestination>();
   o.add(buildMonitoringDestination());
   o.add(buildMonitoringDestination());
   return o;
 }
 
-checkUnnamed1237(core.List<api.MonitoringDestination> o) {
+checkUnnamed1250(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoringDestination(o[0]);
   checkMonitoringDestination(o[1]);
@@ -2146,8 +2146,8 @@
   var o = new api.Monitoring();
   buildCounterMonitoring++;
   if (buildCounterMonitoring < 3) {
-    o.consumerDestinations = buildUnnamed1236();
-    o.producerDestinations = buildUnnamed1237();
+    o.consumerDestinations = buildUnnamed1249();
+    o.producerDestinations = buildUnnamed1250();
   }
   buildCounterMonitoring--;
   return o;
@@ -2156,20 +2156,20 @@
 checkMonitoring(api.Monitoring o) {
   buildCounterMonitoring++;
   if (buildCounterMonitoring < 3) {
-    checkUnnamed1236(o.consumerDestinations);
-    checkUnnamed1237(o.producerDestinations);
+    checkUnnamed1249(o.consumerDestinations);
+    checkUnnamed1250(o.producerDestinations);
   }
   buildCounterMonitoring--;
 }
 
-buildUnnamed1238() {
+buildUnnamed1251() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1238(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'));
@@ -2180,7 +2180,7 @@
   var o = new api.MonitoringDestination();
   buildCounterMonitoringDestination++;
   if (buildCounterMonitoringDestination < 3) {
-    o.metrics = buildUnnamed1238();
+    o.metrics = buildUnnamed1251();
     o.monitoredResource = "foo";
   }
   buildCounterMonitoringDestination--;
@@ -2190,7 +2190,7 @@
 checkMonitoringDestination(api.MonitoringDestination o) {
   buildCounterMonitoringDestination++;
   if (buildCounterMonitoringDestination < 3) {
-    checkUnnamed1238(o.metrics);
+    checkUnnamed1251(o.metrics);
     unittest.expect(o.monitoredResource, unittest.equals('foo'));
   }
   buildCounterMonitoringDestination--;
@@ -2215,7 +2215,7 @@
   buildCounterOAuthRequirements--;
 }
 
-buildUnnamed1239() {
+buildUnnamed1252() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -2230,7 +2230,7 @@
   return o;
 }
 
-checkUnnamed1239(core.Map<core.String, core.Object> o) {
+checkUnnamed1252(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -2244,7 +2244,7 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1240() {
+buildUnnamed1253() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -2259,7 +2259,7 @@
   return o;
 }
 
-checkUnnamed1240(core.Map<core.String, core.Object> o) {
+checkUnnamed1253(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o["x"]) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -2280,9 +2280,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed1239();
+    o.metadata = buildUnnamed1252();
     o.name = "foo";
-    o.response = buildUnnamed1240();
+    o.response = buildUnnamed1253();
   }
   buildCounterOperation--;
   return o;
@@ -2293,34 +2293,34 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed1239(o.metadata);
+    checkUnnamed1252(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1240(o.response);
+    checkUnnamed1253(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1241() {
+buildUnnamed1254() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1241(core.List<core.String> o) {
+checkUnnamed1254(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1242() {
+buildUnnamed1255() {
   var o = new core.List<api.Step>();
   o.add(buildStep());
   o.add(buildStep());
   return o;
 }
 
-checkUnnamed1242(core.List<api.Step> o) {
+checkUnnamed1255(core.List<api.Step> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStep(o[0]);
   checkStep(o[1]);
@@ -2332,9 +2332,9 @@
   buildCounterOperationMetadata++;
   if (buildCounterOperationMetadata < 3) {
     o.progressPercentage = 42;
-    o.resourceNames = buildUnnamed1241();
+    o.resourceNames = buildUnnamed1254();
     o.startTime = "foo";
-    o.steps = buildUnnamed1242();
+    o.steps = buildUnnamed1255();
   }
   buildCounterOperationMetadata--;
   return o;
@@ -2344,14 +2344,14 @@
   buildCounterOperationMetadata++;
   if (buildCounterOperationMetadata < 3) {
     unittest.expect(o.progressPercentage, unittest.equals(42));
-    checkUnnamed1241(o.resourceNames);
+    checkUnnamed1254(o.resourceNames);
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkUnnamed1242(o.steps);
+    checkUnnamed1255(o.steps);
   }
   buildCounterOperationMetadata--;
 }
 
-buildUnnamed1243() {
+buildUnnamed1256() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -2366,7 +2366,7 @@
   return o;
 }
 
-checkUnnamed1243(core.Map<core.String, core.Object> o) {
+checkUnnamed1256(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted9 = (o["x"]) as core.Map;
   unittest.expect(casted9, unittest.hasLength(3));
@@ -2386,7 +2386,7 @@
   buildCounterOption++;
   if (buildCounterOption < 3) {
     o.name = "foo";
-    o.value = buildUnnamed1243();
+    o.value = buildUnnamed1256();
   }
   buildCounterOption--;
   return o;
@@ -2396,19 +2396,19 @@
   buildCounterOption++;
   if (buildCounterOption < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1243(o.value);
+    checkUnnamed1256(o.value);
   }
   buildCounterOption--;
 }
 
-buildUnnamed1244() {
+buildUnnamed1257() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1244(core.List<api.Page> o) {
+checkUnnamed1257(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
@@ -2421,7 +2421,7 @@
   if (buildCounterPage < 3) {
     o.content = "foo";
     o.name = "foo";
-    o.subpages = buildUnnamed1244();
+    o.subpages = buildUnnamed1257();
   }
   buildCounterPage--;
   return o;
@@ -2432,32 +2432,32 @@
   if (buildCounterPage < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1244(o.subpages);
+    checkUnnamed1257(o.subpages);
   }
   buildCounterPage--;
 }
 
-buildUnnamed1245() {
+buildUnnamed1258() {
   var o = new core.List<api.AuditConfig>();
   o.add(buildAuditConfig());
   o.add(buildAuditConfig());
   return o;
 }
 
-checkUnnamed1245(core.List<api.AuditConfig> o) {
+checkUnnamed1258(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditConfig(o[0]);
   checkAuditConfig(o[1]);
 }
 
-buildUnnamed1246() {
+buildUnnamed1259() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed1246(core.List<api.Binding> o) {
+checkUnnamed1259(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -2468,8 +2468,8 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed1245();
-    o.bindings = buildUnnamed1246();
+    o.auditConfigs = buildUnnamed1258();
+    o.bindings = buildUnnamed1259();
     o.etag = "foo";
     o.iamOwned = true;
     o.version = 42;
@@ -2481,8 +2481,8 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed1245(o.auditConfigs);
-    checkUnnamed1246(o.bindings);
+    checkUnnamed1258(o.auditConfigs);
+    checkUnnamed1259(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.iamOwned, unittest.isTrue);
     unittest.expect(o.version, unittest.equals(42));
@@ -2490,27 +2490,27 @@
   buildCounterPolicy--;
 }
 
-buildUnnamed1247() {
+buildUnnamed1260() {
   var o = new core.List<api.QuotaLimit>();
   o.add(buildQuotaLimit());
   o.add(buildQuotaLimit());
   return o;
 }
 
-checkUnnamed1247(core.List<api.QuotaLimit> o) {
+checkUnnamed1260(core.List<api.QuotaLimit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuotaLimit(o[0]);
   checkQuotaLimit(o[1]);
 }
 
-buildUnnamed1248() {
+buildUnnamed1261() {
   var o = new core.List<api.MetricRule>();
   o.add(buildMetricRule());
   o.add(buildMetricRule());
   return o;
 }
 
-checkUnnamed1248(core.List<api.MetricRule> o) {
+checkUnnamed1261(core.List<api.MetricRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricRule(o[0]);
   checkMetricRule(o[1]);
@@ -2521,8 +2521,8 @@
   var o = new api.Quota();
   buildCounterQuota++;
   if (buildCounterQuota < 3) {
-    o.limits = buildUnnamed1247();
-    o.metricRules = buildUnnamed1248();
+    o.limits = buildUnnamed1260();
+    o.metricRules = buildUnnamed1261();
   }
   buildCounterQuota--;
   return o;
@@ -2531,20 +2531,20 @@
 checkQuota(api.Quota o) {
   buildCounterQuota++;
   if (buildCounterQuota < 3) {
-    checkUnnamed1247(o.limits);
-    checkUnnamed1248(o.metricRules);
+    checkUnnamed1260(o.limits);
+    checkUnnamed1261(o.metricRules);
   }
   buildCounterQuota--;
 }
 
-buildUnnamed1249() {
+buildUnnamed1262() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1249(core.Map<core.String, core.String> o) {
+checkUnnamed1262(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'));
@@ -2564,7 +2564,7 @@
     o.metric = "foo";
     o.name = "foo";
     o.unit = "foo";
-    o.values = buildUnnamed1249();
+    o.values = buildUnnamed1262();
   }
   buildCounterQuotaLimit--;
   return o;
@@ -2582,7 +2582,7 @@
     unittest.expect(o.metric, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.unit, unittest.equals('foo'));
-    checkUnnamed1249(o.values);
+    checkUnnamed1262(o.values);
   }
   buildCounterQuotaLimit--;
 }
@@ -2618,105 +2618,105 @@
   buildCounterRollout--;
 }
 
-buildUnnamed1250() {
+buildUnnamed1263() {
   var o = new core.List<api.Api>();
   o.add(buildApi());
   o.add(buildApi());
   return o;
 }
 
-checkUnnamed1250(core.List<api.Api> o) {
+checkUnnamed1263(core.List<api.Api> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApi(o[0]);
   checkApi(o[1]);
 }
 
-buildUnnamed1251() {
+buildUnnamed1264() {
   var o = new core.List<api.Endpoint>();
   o.add(buildEndpoint());
   o.add(buildEndpoint());
   return o;
 }
 
-checkUnnamed1251(core.List<api.Endpoint> o) {
+checkUnnamed1264(core.List<api.Endpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEndpoint(o[0]);
   checkEndpoint(o[1]);
 }
 
-buildUnnamed1252() {
+buildUnnamed1265() {
   var o = new core.List<api.Enum>();
   o.add(buildEnum());
   o.add(buildEnum());
   return o;
 }
 
-checkUnnamed1252(core.List<api.Enum> o) {
+checkUnnamed1265(core.List<api.Enum> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnum(o[0]);
   checkEnum(o[1]);
 }
 
-buildUnnamed1253() {
+buildUnnamed1266() {
   var o = new core.List<api.LogDescriptor>();
   o.add(buildLogDescriptor());
   o.add(buildLogDescriptor());
   return o;
 }
 
-checkUnnamed1253(core.List<api.LogDescriptor> o) {
+checkUnnamed1266(core.List<api.LogDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogDescriptor(o[0]);
   checkLogDescriptor(o[1]);
 }
 
-buildUnnamed1254() {
+buildUnnamed1267() {
   var o = new core.List<api.MetricDescriptor>();
   o.add(buildMetricDescriptor());
   o.add(buildMetricDescriptor());
   return o;
 }
 
-checkUnnamed1254(core.List<api.MetricDescriptor> o) {
+checkUnnamed1267(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptor(o[0]);
   checkMetricDescriptor(o[1]);
 }
 
-buildUnnamed1255() {
+buildUnnamed1268() {
   var o = new core.List<api.MonitoredResourceDescriptor>();
   o.add(buildMonitoredResourceDescriptor());
   o.add(buildMonitoredResourceDescriptor());
   return o;
 }
 
-checkUnnamed1255(core.List<api.MonitoredResourceDescriptor> o) {
+checkUnnamed1268(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoredResourceDescriptor(o[0]);
   checkMonitoredResourceDescriptor(o[1]);
 }
 
-buildUnnamed1256() {
+buildUnnamed1269() {
   var o = new core.List<api.Type>();
   o.add(buildType());
   o.add(buildType());
   return o;
 }
 
-checkUnnamed1256(core.List<api.Type> o) {
+checkUnnamed1269(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o[0]);
   checkType(o[1]);
 }
 
-buildUnnamed1257() {
+buildUnnamed1270() {
   var o = new core.List<api.Type>();
   o.add(buildType());
   o.add(buildType());
   return o;
 }
 
-checkUnnamed1257(core.List<api.Type> o) {
+checkUnnamed1270(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o[0]);
   checkType(o[1]);
@@ -2727,7 +2727,7 @@
   var o = new api.Service();
   buildCounterService++;
   if (buildCounterService < 3) {
-    o.apis = buildUnnamed1250();
+    o.apis = buildUnnamed1263();
     o.authentication = buildAuthentication();
     o.backend = buildBackend();
     o.billing = buildBilling();
@@ -2736,24 +2736,24 @@
     o.control = buildControl();
     o.customError = buildCustomError();
     o.documentation = buildDocumentation();
-    o.endpoints = buildUnnamed1251();
-    o.enums = buildUnnamed1252();
+    o.endpoints = buildUnnamed1264();
+    o.enums = buildUnnamed1265();
     o.experimental = buildExperimental();
     o.http = buildHttp();
     o.id = "foo";
     o.logging = buildLogging();
-    o.logs = buildUnnamed1253();
-    o.metrics = buildUnnamed1254();
-    o.monitoredResources = buildUnnamed1255();
+    o.logs = buildUnnamed1266();
+    o.metrics = buildUnnamed1267();
+    o.monitoredResources = buildUnnamed1268();
     o.monitoring = buildMonitoring();
     o.name = "foo";
     o.producerProjectId = "foo";
     o.quota = buildQuota();
     o.sourceInfo = buildSourceInfo();
     o.systemParameters = buildSystemParameters();
-    o.systemTypes = buildUnnamed1256();
+    o.systemTypes = buildUnnamed1269();
     o.title = "foo";
-    o.types = buildUnnamed1257();
+    o.types = buildUnnamed1270();
     o.usage = buildUsage();
     o.visibility = buildVisibility();
   }
@@ -2764,7 +2764,7 @@
 checkService(api.Service o) {
   buildCounterService++;
   if (buildCounterService < 3) {
-    checkUnnamed1250(o.apis);
+    checkUnnamed1263(o.apis);
     checkAuthentication(o.authentication);
     checkBackend(o.backend);
     checkBilling(o.billing);
@@ -2773,24 +2773,24 @@
     checkControl(o.control);
     checkCustomError(o.customError);
     checkDocumentation(o.documentation);
-    checkUnnamed1251(o.endpoints);
-    checkUnnamed1252(o.enums);
+    checkUnnamed1264(o.endpoints);
+    checkUnnamed1265(o.enums);
     checkExperimental(o.experimental);
     checkHttp(o.http);
     unittest.expect(o.id, unittest.equals('foo'));
     checkLogging(o.logging);
-    checkUnnamed1253(o.logs);
-    checkUnnamed1254(o.metrics);
-    checkUnnamed1255(o.monitoredResources);
+    checkUnnamed1266(o.logs);
+    checkUnnamed1267(o.metrics);
+    checkUnnamed1268(o.monitoredResources);
     checkMonitoring(o.monitoring);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.producerProjectId, unittest.equals('foo'));
     checkQuota(o.quota);
     checkSourceInfo(o.sourceInfo);
     checkSystemParameters(o.systemParameters);
-    checkUnnamed1256(o.systemTypes);
+    checkUnnamed1269(o.systemTypes);
     unittest.expect(o.title, unittest.equals('foo'));
-    checkUnnamed1257(o.types);
+    checkUnnamed1270(o.types);
     checkUsage(o.usage);
     checkVisibility(o.visibility);
   }
@@ -2837,7 +2837,7 @@
   buildCounterSourceContext--;
 }
 
-buildUnnamed1258() {
+buildUnnamed1271() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -2852,7 +2852,7 @@
   return o;
 }
 
-checkUnnamed1258(core.Map<core.String, core.Object> o) {
+checkUnnamed1271(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted11 = (o["x"]) as core.Map;
   unittest.expect(casted11, unittest.hasLength(3));
@@ -2866,17 +2866,17 @@
   unittest.expect(casted12["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1259() {
+buildUnnamed1272() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1258());
-  o.add(buildUnnamed1258());
+  o.add(buildUnnamed1271());
+  o.add(buildUnnamed1271());
   return o;
 }
 
-checkUnnamed1259(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1272(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1258(o[0]);
-  checkUnnamed1258(o[1]);
+  checkUnnamed1271(o[0]);
+  checkUnnamed1271(o[1]);
 }
 
 core.int buildCounterSourceInfo = 0;
@@ -2884,7 +2884,7 @@
   var o = new api.SourceInfo();
   buildCounterSourceInfo++;
   if (buildCounterSourceInfo < 3) {
-    o.sourceFiles = buildUnnamed1259();
+    o.sourceFiles = buildUnnamed1272();
   }
   buildCounterSourceInfo--;
   return o;
@@ -2893,12 +2893,12 @@
 checkSourceInfo(api.SourceInfo o) {
   buildCounterSourceInfo++;
   if (buildCounterSourceInfo < 3) {
-    checkUnnamed1259(o.sourceFiles);
+    checkUnnamed1272(o.sourceFiles);
   }
   buildCounterSourceInfo--;
 }
 
-buildUnnamed1260() {
+buildUnnamed1273() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -2913,7 +2913,7 @@
   return o;
 }
 
-checkUnnamed1260(core.Map<core.String, core.Object> o) {
+checkUnnamed1273(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted13 = (o["x"]) as core.Map;
   unittest.expect(casted13, unittest.hasLength(3));
@@ -2927,17 +2927,17 @@
   unittest.expect(casted14["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1261() {
+buildUnnamed1274() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1260());
-  o.add(buildUnnamed1260());
+  o.add(buildUnnamed1273());
+  o.add(buildUnnamed1273());
   return o;
 }
 
-checkUnnamed1261(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1274(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1260(o[0]);
-  checkUnnamed1260(o[1]);
+  checkUnnamed1273(o[0]);
+  checkUnnamed1273(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -2946,7 +2946,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1261();
+    o.details = buildUnnamed1274();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -2957,7 +2957,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1261(o.details);
+    checkUnnamed1274(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -3047,14 +3047,14 @@
   buildCounterSystemParameter--;
 }
 
-buildUnnamed1262() {
+buildUnnamed1275() {
   var o = new core.List<api.SystemParameter>();
   o.add(buildSystemParameter());
   o.add(buildSystemParameter());
   return o;
 }
 
-checkUnnamed1262(core.List<api.SystemParameter> o) {
+checkUnnamed1275(core.List<api.SystemParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSystemParameter(o[0]);
   checkSystemParameter(o[1]);
@@ -3065,7 +3065,7 @@
   var o = new api.SystemParameterRule();
   buildCounterSystemParameterRule++;
   if (buildCounterSystemParameterRule < 3) {
-    o.parameters = buildUnnamed1262();
+    o.parameters = buildUnnamed1275();
     o.selector = "foo";
   }
   buildCounterSystemParameterRule--;
@@ -3075,20 +3075,20 @@
 checkSystemParameterRule(api.SystemParameterRule o) {
   buildCounterSystemParameterRule++;
   if (buildCounterSystemParameterRule < 3) {
-    checkUnnamed1262(o.parameters);
+    checkUnnamed1275(o.parameters);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterSystemParameterRule--;
 }
 
-buildUnnamed1263() {
+buildUnnamed1276() {
   var o = new core.List<api.SystemParameterRule>();
   o.add(buildSystemParameterRule());
   o.add(buildSystemParameterRule());
   return o;
 }
 
-checkUnnamed1263(core.List<api.SystemParameterRule> o) {
+checkUnnamed1276(core.List<api.SystemParameterRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSystemParameterRule(o[0]);
   checkSystemParameterRule(o[1]);
@@ -3099,7 +3099,7 @@
   var o = new api.SystemParameters();
   buildCounterSystemParameters++;
   if (buildCounterSystemParameters < 3) {
-    o.rules = buildUnnamed1263();
+    o.rules = buildUnnamed1276();
   }
   buildCounterSystemParameters--;
   return o;
@@ -3108,19 +3108,19 @@
 checkSystemParameters(api.SystemParameters o) {
   buildCounterSystemParameters++;
   if (buildCounterSystemParameters < 3) {
-    checkUnnamed1263(o.rules);
+    checkUnnamed1276(o.rules);
   }
   buildCounterSystemParameters--;
 }
 
-buildUnnamed1264() {
+buildUnnamed1277() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1264(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'));
@@ -3131,7 +3131,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed1264();
+    o.permissions = buildUnnamed1277();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -3140,19 +3140,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed1264(o.permissions);
+    checkUnnamed1277(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed1265() {
+buildUnnamed1278() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1265(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'));
@@ -3163,7 +3163,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed1265();
+    o.permissions = buildUnnamed1278();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -3172,19 +3172,19 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed1265(o.permissions);
+    checkUnnamed1278(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
 
-buildUnnamed1266() {
+buildUnnamed1279() {
   var o = new core.Map<core.String, core.double>();
   o["x"] = 42.0;
   o["y"] = 42.0;
   return o;
 }
 
-checkUnnamed1266(core.Map<core.String, core.double> o) {
+checkUnnamed1279(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));
@@ -3195,7 +3195,7 @@
   var o = new api.TrafficPercentStrategy();
   buildCounterTrafficPercentStrategy++;
   if (buildCounterTrafficPercentStrategy < 3) {
-    o.percentages = buildUnnamed1266();
+    o.percentages = buildUnnamed1279();
   }
   buildCounterTrafficPercentStrategy--;
   return o;
@@ -3204,45 +3204,45 @@
 checkTrafficPercentStrategy(api.TrafficPercentStrategy o) {
   buildCounterTrafficPercentStrategy++;
   if (buildCounterTrafficPercentStrategy < 3) {
-    checkUnnamed1266(o.percentages);
+    checkUnnamed1279(o.percentages);
   }
   buildCounterTrafficPercentStrategy--;
 }
 
-buildUnnamed1267() {
+buildUnnamed1280() {
   var o = new core.List<api.Field>();
   o.add(buildField());
   o.add(buildField());
   return o;
 }
 
-checkUnnamed1267(core.List<api.Field> o) {
+checkUnnamed1280(core.List<api.Field> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkField(o[0]);
   checkField(o[1]);
 }
 
-buildUnnamed1268() {
+buildUnnamed1281() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1268(core.List<core.String> o) {
+checkUnnamed1281(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1269() {
+buildUnnamed1282() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1269(core.List<api.Option> o) {
+checkUnnamed1282(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -3253,10 +3253,10 @@
   var o = new api.Type();
   buildCounterType++;
   if (buildCounterType < 3) {
-    o.fields = buildUnnamed1267();
+    o.fields = buildUnnamed1280();
     o.name = "foo";
-    o.oneofs = buildUnnamed1268();
-    o.options = buildUnnamed1269();
+    o.oneofs = buildUnnamed1281();
+    o.options = buildUnnamed1282();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
   }
@@ -3267,10 +3267,10 @@
 checkType(api.Type o) {
   buildCounterType++;
   if (buildCounterType < 3) {
-    checkUnnamed1267(o.fields);
+    checkUnnamed1280(o.fields);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1268(o.oneofs);
-    checkUnnamed1269(o.options);
+    checkUnnamed1281(o.oneofs);
+    checkUnnamed1282(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
@@ -3296,27 +3296,27 @@
   buildCounterUndeleteServiceResponse--;
 }
 
-buildUnnamed1270() {
+buildUnnamed1283() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1270(core.List<core.String> o) {
+checkUnnamed1283(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1271() {
+buildUnnamed1284() {
   var o = new core.List<api.UsageRule>();
   o.add(buildUsageRule());
   o.add(buildUsageRule());
   return o;
 }
 
-checkUnnamed1271(core.List<api.UsageRule> o) {
+checkUnnamed1284(core.List<api.UsageRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageRule(o[0]);
   checkUsageRule(o[1]);
@@ -3328,8 +3328,8 @@
   buildCounterUsage++;
   if (buildCounterUsage < 3) {
     o.producerNotificationChannel = "foo";
-    o.requirements = buildUnnamed1270();
-    o.rules = buildUnnamed1271();
+    o.requirements = buildUnnamed1283();
+    o.rules = buildUnnamed1284();
   }
   buildCounterUsage--;
   return o;
@@ -3339,8 +3339,8 @@
   buildCounterUsage++;
   if (buildCounterUsage < 3) {
     unittest.expect(o.producerNotificationChannel, unittest.equals('foo'));
-    checkUnnamed1270(o.requirements);
-    checkUnnamed1271(o.rules);
+    checkUnnamed1283(o.requirements);
+    checkUnnamed1284(o.rules);
   }
   buildCounterUsage--;
 }
@@ -3368,14 +3368,14 @@
   buildCounterUsageRule--;
 }
 
-buildUnnamed1272() {
+buildUnnamed1285() {
   var o = new core.List<api.VisibilityRule>();
   o.add(buildVisibilityRule());
   o.add(buildVisibilityRule());
   return o;
 }
 
-checkUnnamed1272(core.List<api.VisibilityRule> o) {
+checkUnnamed1285(core.List<api.VisibilityRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVisibilityRule(o[0]);
   checkVisibilityRule(o[1]);
@@ -3386,7 +3386,7 @@
   var o = new api.Visibility();
   buildCounterVisibility++;
   if (buildCounterVisibility < 3) {
-    o.rules = buildUnnamed1272();
+    o.rules = buildUnnamed1285();
   }
   buildCounterVisibility--;
   return o;
@@ -3395,7 +3395,7 @@
 checkVisibility(api.Visibility o) {
   buildCounterVisibility++;
   if (buildCounterVisibility < 3) {
-    checkUnnamed1272(o.rules);
+    checkUnnamed1285(o.rules);
   }
   buildCounterVisibility--;
 }
@@ -4730,10 +4730,10 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicemanagementApi(mock).services;
-      var arg_pageSize = 42;
-      var arg_producerProjectId = "foo";
       var arg_consumerId = "foo";
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
+      var arg_producerProjectId = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -4765,14 +4765,14 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["producerProjectId"].first,
-            unittest.equals(arg_producerProjectId));
         unittest.expect(
             queryMap["consumerId"].first, unittest.equals(arg_consumerId));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["producerProjectId"].first,
+            unittest.equals(arg_producerProjectId));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -4783,10 +4783,10 @@
       }), true);
       res
           .list(
-              pageSize: arg_pageSize,
-              producerProjectId: arg_producerProjectId,
               consumerId: arg_consumerId,
               pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              producerProjectId: arg_producerProjectId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListServicesResponse response) {
         checkListServicesResponse(response);
@@ -5536,9 +5536,9 @@
       api.ServicesRolloutsResourceApi res =
           new api.ServicemanagementApi(mock).services.rollouts;
       var arg_serviceName = "foo";
+      var arg_pageSize = 42;
       var arg_filter = "foo";
       var arg_pageToken = "foo";
-      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -5579,11 +5579,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -5594,9 +5594,9 @@
       }), true);
       res
           .list(arg_serviceName,
+              pageSize: arg_pageSize,
               filter: arg_filter,
               pageToken: arg_pageToken,
-              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest
               .expectAsync1(((api.ListServiceRolloutsResponse response) {
diff --git a/generated/googleapis/test/serviceuser/v1_test.dart b/generated/googleapis/test/serviceuser/v1_test.dart
index e7966de..bd42fdc 100644
--- a/generated/googleapis/test/serviceuser/v1_test.dart
+++ b/generated/googleapis/test/serviceuser/v1_test.dart
@@ -50,40 +50,40 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1847() {
+buildUnnamed1869() {
   var o = new core.List<api.Method>();
   o.add(buildMethod());
   o.add(buildMethod());
   return o;
 }
 
-checkUnnamed1847(core.List<api.Method> o) {
+checkUnnamed1869(core.List<api.Method> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMethod(o[0]);
   checkMethod(o[1]);
 }
 
-buildUnnamed1848() {
+buildUnnamed1870() {
   var o = new core.List<api.Mixin>();
   o.add(buildMixin());
   o.add(buildMixin());
   return o;
 }
 
-checkUnnamed1848(core.List<api.Mixin> o) {
+checkUnnamed1870(core.List<api.Mixin> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMixin(o[0]);
   checkMixin(o[1]);
 }
 
-buildUnnamed1849() {
+buildUnnamed1871() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1849(core.List<api.Option> o) {
+checkUnnamed1871(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -94,10 +94,10 @@
   var o = new api.Api();
   buildCounterApi++;
   if (buildCounterApi < 3) {
-    o.methods = buildUnnamed1847();
-    o.mixins = buildUnnamed1848();
+    o.methods = buildUnnamed1869();
+    o.mixins = buildUnnamed1870();
     o.name = "foo";
-    o.options = buildUnnamed1849();
+    o.options = buildUnnamed1871();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
     o.version = "foo";
@@ -109,10 +109,10 @@
 checkApi(api.Api o) {
   buildCounterApi++;
   if (buildCounterApi < 3) {
-    checkUnnamed1847(o.methods);
-    checkUnnamed1848(o.mixins);
+    checkUnnamed1869(o.methods);
+    checkUnnamed1870(o.mixins);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1849(o.options);
+    checkUnnamed1871(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
@@ -168,27 +168,27 @@
   buildCounterAuthRequirement--;
 }
 
-buildUnnamed1850() {
+buildUnnamed1872() {
   var o = new core.List<api.AuthProvider>();
   o.add(buildAuthProvider());
   o.add(buildAuthProvider());
   return o;
 }
 
-checkUnnamed1850(core.List<api.AuthProvider> o) {
+checkUnnamed1872(core.List<api.AuthProvider> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthProvider(o[0]);
   checkAuthProvider(o[1]);
 }
 
-buildUnnamed1851() {
+buildUnnamed1873() {
   var o = new core.List<api.AuthenticationRule>();
   o.add(buildAuthenticationRule());
   o.add(buildAuthenticationRule());
   return o;
 }
 
-checkUnnamed1851(core.List<api.AuthenticationRule> o) {
+checkUnnamed1873(core.List<api.AuthenticationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthenticationRule(o[0]);
   checkAuthenticationRule(o[1]);
@@ -199,8 +199,8 @@
   var o = new api.Authentication();
   buildCounterAuthentication++;
   if (buildCounterAuthentication < 3) {
-    o.providers = buildUnnamed1850();
-    o.rules = buildUnnamed1851();
+    o.providers = buildUnnamed1872();
+    o.rules = buildUnnamed1873();
   }
   buildCounterAuthentication--;
   return o;
@@ -209,20 +209,20 @@
 checkAuthentication(api.Authentication o) {
   buildCounterAuthentication++;
   if (buildCounterAuthentication < 3) {
-    checkUnnamed1850(o.providers);
-    checkUnnamed1851(o.rules);
+    checkUnnamed1872(o.providers);
+    checkUnnamed1873(o.rules);
   }
   buildCounterAuthentication--;
 }
 
-buildUnnamed1852() {
+buildUnnamed1874() {
   var o = new core.List<api.AuthRequirement>();
   o.add(buildAuthRequirement());
   o.add(buildAuthRequirement());
   return o;
 }
 
-checkUnnamed1852(core.List<api.AuthRequirement> o) {
+checkUnnamed1874(core.List<api.AuthRequirement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthRequirement(o[0]);
   checkAuthRequirement(o[1]);
@@ -236,7 +236,7 @@
     o.allowWithoutCredential = true;
     o.customAuth = buildCustomAuthRequirements();
     o.oauth = buildOAuthRequirements();
-    o.requirements = buildUnnamed1852();
+    o.requirements = buildUnnamed1874();
     o.selector = "foo";
   }
   buildCounterAuthenticationRule--;
@@ -249,7 +249,7 @@
     unittest.expect(o.allowWithoutCredential, unittest.isTrue);
     checkCustomAuthRequirements(o.customAuth);
     checkOAuthRequirements(o.oauth);
-    checkUnnamed1852(o.requirements);
+    checkUnnamed1874(o.requirements);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterAuthenticationRule--;
@@ -274,14 +274,14 @@
   buildCounterAuthorizationConfig--;
 }
 
-buildUnnamed1853() {
+buildUnnamed1875() {
   var o = new core.List<api.BackendRule>();
   o.add(buildBackendRule());
   o.add(buildBackendRule());
   return o;
 }
 
-checkUnnamed1853(core.List<api.BackendRule> o) {
+checkUnnamed1875(core.List<api.BackendRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendRule(o[0]);
   checkBackendRule(o[1]);
@@ -292,7 +292,7 @@
   var o = new api.Backend();
   buildCounterBackend++;
   if (buildCounterBackend < 3) {
-    o.rules = buildUnnamed1853();
+    o.rules = buildUnnamed1875();
   }
   buildCounterBackend--;
   return o;
@@ -301,7 +301,7 @@
 checkBackend(api.Backend o) {
   buildCounterBackend++;
   if (buildCounterBackend < 3) {
-    checkUnnamed1853(o.rules);
+    checkUnnamed1875(o.rules);
   }
   buildCounterBackend--;
 }
@@ -331,14 +331,14 @@
   buildCounterBackendRule--;
 }
 
-buildUnnamed1854() {
+buildUnnamed1876() {
   var o = new core.List<api.BillingDestination>();
   o.add(buildBillingDestination());
   o.add(buildBillingDestination());
   return o;
 }
 
-checkUnnamed1854(core.List<api.BillingDestination> o) {
+checkUnnamed1876(core.List<api.BillingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBillingDestination(o[0]);
   checkBillingDestination(o[1]);
@@ -349,7 +349,7 @@
   var o = new api.Billing();
   buildCounterBilling++;
   if (buildCounterBilling < 3) {
-    o.consumerDestinations = buildUnnamed1854();
+    o.consumerDestinations = buildUnnamed1876();
   }
   buildCounterBilling--;
   return o;
@@ -358,19 +358,19 @@
 checkBilling(api.Billing o) {
   buildCounterBilling++;
   if (buildCounterBilling < 3) {
-    checkUnnamed1854(o.consumerDestinations);
+    checkUnnamed1876(o.consumerDestinations);
   }
   buildCounterBilling--;
 }
 
-buildUnnamed1855() {
+buildUnnamed1877() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1855(core.List<core.String> o) {
+checkUnnamed1877(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -381,7 +381,7 @@
   var o = new api.BillingDestination();
   buildCounterBillingDestination++;
   if (buildCounterBillingDestination < 3) {
-    o.metrics = buildUnnamed1855();
+    o.metrics = buildUnnamed1877();
     o.monitoredResource = "foo";
   }
   buildCounterBillingDestination--;
@@ -391,20 +391,20 @@
 checkBillingDestination(api.BillingDestination o) {
   buildCounterBillingDestination++;
   if (buildCounterBillingDestination < 3) {
-    checkUnnamed1855(o.metrics);
+    checkUnnamed1877(o.metrics);
     unittest.expect(o.monitoredResource, unittest.equals('foo'));
   }
   buildCounterBillingDestination--;
 }
 
-buildUnnamed1856() {
+buildUnnamed1878() {
   var o = new core.List<api.ContextRule>();
   o.add(buildContextRule());
   o.add(buildContextRule());
   return o;
 }
 
-checkUnnamed1856(core.List<api.ContextRule> o) {
+checkUnnamed1878(core.List<api.ContextRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContextRule(o[0]);
   checkContextRule(o[1]);
@@ -415,7 +415,7 @@
   var o = new api.Context();
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    o.rules = buildUnnamed1856();
+    o.rules = buildUnnamed1878();
   }
   buildCounterContext--;
   return o;
@@ -424,32 +424,32 @@
 checkContext(api.Context o) {
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    checkUnnamed1856(o.rules);
+    checkUnnamed1878(o.rules);
   }
   buildCounterContext--;
 }
 
-buildUnnamed1857() {
+buildUnnamed1879() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1857(core.List<core.String> o) {
+checkUnnamed1879(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1858() {
+buildUnnamed1880() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1858(core.List<core.String> o) {
+checkUnnamed1880(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -460,8 +460,8 @@
   var o = new api.ContextRule();
   buildCounterContextRule++;
   if (buildCounterContextRule < 3) {
-    o.provided = buildUnnamed1857();
-    o.requested = buildUnnamed1858();
+    o.provided = buildUnnamed1879();
+    o.requested = buildUnnamed1880();
     o.selector = "foo";
   }
   buildCounterContextRule--;
@@ -471,8 +471,8 @@
 checkContextRule(api.ContextRule o) {
   buildCounterContextRule++;
   if (buildCounterContextRule < 3) {
-    checkUnnamed1857(o.provided);
-    checkUnnamed1858(o.requested);
+    checkUnnamed1879(o.provided);
+    checkUnnamed1880(o.requested);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterContextRule--;
@@ -516,27 +516,27 @@
   buildCounterCustomAuthRequirements--;
 }
 
-buildUnnamed1859() {
+buildUnnamed1881() {
   var o = new core.List<api.CustomErrorRule>();
   o.add(buildCustomErrorRule());
   o.add(buildCustomErrorRule());
   return o;
 }
 
-checkUnnamed1859(core.List<api.CustomErrorRule> o) {
+checkUnnamed1881(core.List<api.CustomErrorRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomErrorRule(o[0]);
   checkCustomErrorRule(o[1]);
 }
 
-buildUnnamed1860() {
+buildUnnamed1882() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1860(core.List<core.String> o) {
+checkUnnamed1882(core.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,8 +547,8 @@
   var o = new api.CustomError();
   buildCounterCustomError++;
   if (buildCounterCustomError < 3) {
-    o.rules = buildUnnamed1859();
-    o.types = buildUnnamed1860();
+    o.rules = buildUnnamed1881();
+    o.types = buildUnnamed1882();
   }
   buildCounterCustomError--;
   return o;
@@ -557,8 +557,8 @@
 checkCustomError(api.CustomError o) {
   buildCounterCustomError++;
   if (buildCounterCustomError < 3) {
-    checkUnnamed1859(o.rules);
-    checkUnnamed1860(o.types);
+    checkUnnamed1881(o.rules);
+    checkUnnamed1882(o.types);
   }
   buildCounterCustomError--;
 }
@@ -620,27 +620,27 @@
   buildCounterDisableServiceRequest--;
 }
 
-buildUnnamed1861() {
+buildUnnamed1883() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1861(core.List<api.Page> o) {
+checkUnnamed1883(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
 }
 
-buildUnnamed1862() {
+buildUnnamed1884() {
   var o = new core.List<api.DocumentationRule>();
   o.add(buildDocumentationRule());
   o.add(buildDocumentationRule());
   return o;
 }
 
-checkUnnamed1862(core.List<api.DocumentationRule> o) {
+checkUnnamed1884(core.List<api.DocumentationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDocumentationRule(o[0]);
   checkDocumentationRule(o[1]);
@@ -653,8 +653,8 @@
   if (buildCounterDocumentation < 3) {
     o.documentationRootUrl = "foo";
     o.overview = "foo";
-    o.pages = buildUnnamed1861();
-    o.rules = buildUnnamed1862();
+    o.pages = buildUnnamed1883();
+    o.rules = buildUnnamed1884();
     o.summary = "foo";
   }
   buildCounterDocumentation--;
@@ -666,8 +666,8 @@
   if (buildCounterDocumentation < 3) {
     unittest.expect(o.documentationRootUrl, unittest.equals('foo'));
     unittest.expect(o.overview, unittest.equals('foo'));
-    checkUnnamed1861(o.pages);
-    checkUnnamed1862(o.rules);
+    checkUnnamed1883(o.pages);
+    checkUnnamed1884(o.rules);
     unittest.expect(o.summary, unittest.equals('foo'));
   }
   buildCounterDocumentation--;
@@ -711,27 +711,27 @@
   buildCounterEnableServiceRequest--;
 }
 
-buildUnnamed1863() {
+buildUnnamed1885() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1863(core.List<core.String> o) {
+checkUnnamed1885(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1864() {
+buildUnnamed1886() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1864(core.List<core.String> o) {
+checkUnnamed1886(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -742,9 +742,9 @@
   var o = new api.Endpoint();
   buildCounterEndpoint++;
   if (buildCounterEndpoint < 3) {
-    o.aliases = buildUnnamed1863();
+    o.aliases = buildUnnamed1885();
     o.allowCors = true;
-    o.features = buildUnnamed1864();
+    o.features = buildUnnamed1886();
     o.name = "foo";
     o.target = "foo";
   }
@@ -755,36 +755,36 @@
 checkEndpoint(api.Endpoint o) {
   buildCounterEndpoint++;
   if (buildCounterEndpoint < 3) {
-    checkUnnamed1863(o.aliases);
+    checkUnnamed1885(o.aliases);
     unittest.expect(o.allowCors, unittest.isTrue);
-    checkUnnamed1864(o.features);
+    checkUnnamed1886(o.features);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
   }
   buildCounterEndpoint--;
 }
 
-buildUnnamed1865() {
+buildUnnamed1887() {
   var o = new core.List<api.EnumValue>();
   o.add(buildEnumValue());
   o.add(buildEnumValue());
   return o;
 }
 
-checkUnnamed1865(core.List<api.EnumValue> o) {
+checkUnnamed1887(core.List<api.EnumValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnumValue(o[0]);
   checkEnumValue(o[1]);
 }
 
-buildUnnamed1866() {
+buildUnnamed1888() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1866(core.List<api.Option> o) {
+checkUnnamed1888(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -795,9 +795,9 @@
   var o = new api.Enum();
   buildCounterEnum++;
   if (buildCounterEnum < 3) {
-    o.enumvalue = buildUnnamed1865();
+    o.enumvalue = buildUnnamed1887();
     o.name = "foo";
-    o.options = buildUnnamed1866();
+    o.options = buildUnnamed1888();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
   }
@@ -808,23 +808,23 @@
 checkEnum(api.Enum o) {
   buildCounterEnum++;
   if (buildCounterEnum < 3) {
-    checkUnnamed1865(o.enumvalue);
+    checkUnnamed1887(o.enumvalue);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1866(o.options);
+    checkUnnamed1888(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterEnum--;
 }
 
-buildUnnamed1867() {
+buildUnnamed1889() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1867(core.List<api.Option> o) {
+checkUnnamed1889(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -837,7 +837,7 @@
   if (buildCounterEnumValue < 3) {
     o.name = "foo";
     o.number = 42;
-    o.options = buildUnnamed1867();
+    o.options = buildUnnamed1889();
   }
   buildCounterEnumValue--;
   return o;
@@ -848,7 +848,7 @@
   if (buildCounterEnumValue < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals(42));
-    checkUnnamed1867(o.options);
+    checkUnnamed1889(o.options);
   }
   buildCounterEnumValue--;
 }
@@ -872,14 +872,14 @@
   buildCounterExperimental--;
 }
 
-buildUnnamed1868() {
+buildUnnamed1890() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1868(core.List<api.Option> o) {
+checkUnnamed1890(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -897,7 +897,7 @@
     o.name = "foo";
     o.number = 42;
     o.oneofIndex = 42;
-    o.options = buildUnnamed1868();
+    o.options = buildUnnamed1890();
     o.packed = true;
     o.typeUrl = "foo";
   }
@@ -915,21 +915,21 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals(42));
     unittest.expect(o.oneofIndex, unittest.equals(42));
-    checkUnnamed1868(o.options);
+    checkUnnamed1890(o.options);
     unittest.expect(o.packed, unittest.isTrue);
     unittest.expect(o.typeUrl, unittest.equals('foo'));
   }
   buildCounterField--;
 }
 
-buildUnnamed1869() {
+buildUnnamed1891() {
   var o = new core.List<api.HttpRule>();
   o.add(buildHttpRule());
   o.add(buildHttpRule());
   return o;
 }
 
-checkUnnamed1869(core.List<api.HttpRule> o) {
+checkUnnamed1891(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpRule(o[0]);
   checkHttpRule(o[1]);
@@ -941,7 +941,7 @@
   buildCounterHttp++;
   if (buildCounterHttp < 3) {
     o.fullyDecodeReservedExpansion = true;
-    o.rules = buildUnnamed1869();
+    o.rules = buildUnnamed1891();
   }
   buildCounterHttp--;
   return o;
@@ -951,19 +951,19 @@
   buildCounterHttp++;
   if (buildCounterHttp < 3) {
     unittest.expect(o.fullyDecodeReservedExpansion, unittest.isTrue);
-    checkUnnamed1869(o.rules);
+    checkUnnamed1891(o.rules);
   }
   buildCounterHttp--;
 }
 
-buildUnnamed1870() {
+buildUnnamed1892() {
   var o = new core.List<api.HttpRule>();
   o.add(buildHttpRule());
   o.add(buildHttpRule());
   return o;
 }
 
-checkUnnamed1870(core.List<api.HttpRule> o) {
+checkUnnamed1892(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpRule(o[0]);
   checkHttpRule(o[1]);
@@ -974,7 +974,7 @@
   var o = new api.HttpRule();
   buildCounterHttpRule++;
   if (buildCounterHttpRule < 3) {
-    o.additionalBindings = buildUnnamed1870();
+    o.additionalBindings = buildUnnamed1892();
     o.body = "foo";
     o.custom = buildCustomHttpPattern();
     o.delete = "foo";
@@ -994,7 +994,7 @@
 checkHttpRule(api.HttpRule o) {
   buildCounterHttpRule++;
   if (buildCounterHttpRule < 3) {
-    checkUnnamed1870(o.additionalBindings);
+    checkUnnamed1892(o.additionalBindings);
     unittest.expect(o.body, unittest.equals('foo'));
     checkCustomHttpPattern(o.custom);
     unittest.expect(o.delete, unittest.equals('foo'));
@@ -1033,14 +1033,14 @@
   buildCounterLabelDescriptor--;
 }
 
-buildUnnamed1871() {
+buildUnnamed1893() {
   var o = new core.List<api.PublishedService>();
   o.add(buildPublishedService());
   o.add(buildPublishedService());
   return o;
 }
 
-checkUnnamed1871(core.List<api.PublishedService> o) {
+checkUnnamed1893(core.List<api.PublishedService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPublishedService(o[0]);
   checkPublishedService(o[1]);
@@ -1052,7 +1052,7 @@
   buildCounterListEnabledServicesResponse++;
   if (buildCounterListEnabledServicesResponse < 3) {
     o.nextPageToken = "foo";
-    o.services = buildUnnamed1871();
+    o.services = buildUnnamed1893();
   }
   buildCounterListEnabledServicesResponse--;
   return o;
@@ -1062,19 +1062,19 @@
   buildCounterListEnabledServicesResponse++;
   if (buildCounterListEnabledServicesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1871(o.services);
+    checkUnnamed1893(o.services);
   }
   buildCounterListEnabledServicesResponse--;
 }
 
-buildUnnamed1872() {
+buildUnnamed1894() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1872(core.List<api.LabelDescriptor> o) {
+checkUnnamed1894(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -1087,7 +1087,7 @@
   if (buildCounterLogDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1872();
+    o.labels = buildUnnamed1894();
     o.name = "foo";
   }
   buildCounterLogDescriptor--;
@@ -1099,33 +1099,33 @@
   if (buildCounterLogDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1872(o.labels);
+    checkUnnamed1894(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterLogDescriptor--;
 }
 
-buildUnnamed1873() {
+buildUnnamed1895() {
   var o = new core.List<api.LoggingDestination>();
   o.add(buildLoggingDestination());
   o.add(buildLoggingDestination());
   return o;
 }
 
-checkUnnamed1873(core.List<api.LoggingDestination> o) {
+checkUnnamed1895(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLoggingDestination(o[0]);
   checkLoggingDestination(o[1]);
 }
 
-buildUnnamed1874() {
+buildUnnamed1896() {
   var o = new core.List<api.LoggingDestination>();
   o.add(buildLoggingDestination());
   o.add(buildLoggingDestination());
   return o;
 }
 
-checkUnnamed1874(core.List<api.LoggingDestination> o) {
+checkUnnamed1896(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLoggingDestination(o[0]);
   checkLoggingDestination(o[1]);
@@ -1136,8 +1136,8 @@
   var o = new api.Logging();
   buildCounterLogging++;
   if (buildCounterLogging < 3) {
-    o.consumerDestinations = buildUnnamed1873();
-    o.producerDestinations = buildUnnamed1874();
+    o.consumerDestinations = buildUnnamed1895();
+    o.producerDestinations = buildUnnamed1896();
   }
   buildCounterLogging--;
   return o;
@@ -1146,20 +1146,20 @@
 checkLogging(api.Logging o) {
   buildCounterLogging++;
   if (buildCounterLogging < 3) {
-    checkUnnamed1873(o.consumerDestinations);
-    checkUnnamed1874(o.producerDestinations);
+    checkUnnamed1895(o.consumerDestinations);
+    checkUnnamed1896(o.producerDestinations);
   }
   buildCounterLogging--;
 }
 
-buildUnnamed1875() {
+buildUnnamed1897() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1875(core.List<core.String> o) {
+checkUnnamed1897(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1170,7 +1170,7 @@
   var o = new api.LoggingDestination();
   buildCounterLoggingDestination++;
   if (buildCounterLoggingDestination < 3) {
-    o.logs = buildUnnamed1875();
+    o.logs = buildUnnamed1897();
     o.monitoredResource = "foo";
   }
   buildCounterLoggingDestination--;
@@ -1180,7 +1180,7 @@
 checkLoggingDestination(api.LoggingDestination o) {
   buildCounterLoggingDestination++;
   if (buildCounterLoggingDestination < 3) {
-    checkUnnamed1875(o.logs);
+    checkUnnamed1897(o.logs);
     unittest.expect(o.monitoredResource, unittest.equals('foo'));
   }
   buildCounterLoggingDestination--;
@@ -1215,14 +1215,14 @@
   buildCounterMediaDownload--;
 }
 
-buildUnnamed1876() {
+buildUnnamed1898() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1876(core.List<core.String> o) {
+checkUnnamed1898(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1237,7 +1237,7 @@
     o.dropzone = "foo";
     o.enabled = true;
     o.maxSize = "foo";
-    o.mimeTypes = buildUnnamed1876();
+    o.mimeTypes = buildUnnamed1898();
     o.progressNotification = true;
     o.startNotification = true;
     o.uploadService = "foo";
@@ -1253,7 +1253,7 @@
     unittest.expect(o.dropzone, unittest.equals('foo'));
     unittest.expect(o.enabled, unittest.isTrue);
     unittest.expect(o.maxSize, unittest.equals('foo'));
-    checkUnnamed1876(o.mimeTypes);
+    checkUnnamed1898(o.mimeTypes);
     unittest.expect(o.progressNotification, unittest.isTrue);
     unittest.expect(o.startNotification, unittest.isTrue);
     unittest.expect(o.uploadService, unittest.equals('foo'));
@@ -1261,14 +1261,14 @@
   buildCounterMediaUpload--;
 }
 
-buildUnnamed1877() {
+buildUnnamed1899() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1877(core.List<api.Option> o) {
+checkUnnamed1899(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -1280,7 +1280,7 @@
   buildCounterMethod++;
   if (buildCounterMethod < 3) {
     o.name = "foo";
-    o.options = buildUnnamed1877();
+    o.options = buildUnnamed1899();
     o.requestStreaming = true;
     o.requestTypeUrl = "foo";
     o.responseStreaming = true;
@@ -1295,7 +1295,7 @@
   buildCounterMethod++;
   if (buildCounterMethod < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1877(o.options);
+    checkUnnamed1899(o.options);
     unittest.expect(o.requestStreaming, unittest.isTrue);
     unittest.expect(o.requestTypeUrl, unittest.equals('foo'));
     unittest.expect(o.responseStreaming, unittest.isTrue);
@@ -1305,14 +1305,14 @@
   buildCounterMethod--;
 }
 
-buildUnnamed1878() {
+buildUnnamed1900() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1878(core.List<api.LabelDescriptor> o) {
+checkUnnamed1900(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -1325,7 +1325,7 @@
   if (buildCounterMetricDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1878();
+    o.labels = buildUnnamed1900();
     o.metricKind = "foo";
     o.name = "foo";
     o.type = "foo";
@@ -1341,7 +1341,7 @@
   if (buildCounterMetricDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1878(o.labels);
+    checkUnnamed1900(o.labels);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1351,14 +1351,14 @@
   buildCounterMetricDescriptor--;
 }
 
-buildUnnamed1879() {
+buildUnnamed1901() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1879(core.Map<core.String, core.String> o) {
+checkUnnamed1901(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'));
@@ -1369,7 +1369,7 @@
   var o = new api.MetricRule();
   buildCounterMetricRule++;
   if (buildCounterMetricRule < 3) {
-    o.metricCosts = buildUnnamed1879();
+    o.metricCosts = buildUnnamed1901();
     o.selector = "foo";
   }
   buildCounterMetricRule--;
@@ -1379,7 +1379,7 @@
 checkMetricRule(api.MetricRule o) {
   buildCounterMetricRule++;
   if (buildCounterMetricRule < 3) {
-    checkUnnamed1879(o.metricCosts);
+    checkUnnamed1901(o.metricCosts);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterMetricRule--;
@@ -1406,14 +1406,14 @@
   buildCounterMixin--;
 }
 
-buildUnnamed1880() {
+buildUnnamed1902() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1880(core.List<api.LabelDescriptor> o) {
+checkUnnamed1902(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -1426,7 +1426,7 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1880();
+    o.labels = buildUnnamed1902();
     o.name = "foo";
     o.type = "foo";
   }
@@ -1439,34 +1439,34 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1880(o.labels);
+    checkUnnamed1902(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterMonitoredResourceDescriptor--;
 }
 
-buildUnnamed1881() {
+buildUnnamed1903() {
   var o = new core.List<api.MonitoringDestination>();
   o.add(buildMonitoringDestination());
   o.add(buildMonitoringDestination());
   return o;
 }
 
-checkUnnamed1881(core.List<api.MonitoringDestination> o) {
+checkUnnamed1903(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoringDestination(o[0]);
   checkMonitoringDestination(o[1]);
 }
 
-buildUnnamed1882() {
+buildUnnamed1904() {
   var o = new core.List<api.MonitoringDestination>();
   o.add(buildMonitoringDestination());
   o.add(buildMonitoringDestination());
   return o;
 }
 
-checkUnnamed1882(core.List<api.MonitoringDestination> o) {
+checkUnnamed1904(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoringDestination(o[0]);
   checkMonitoringDestination(o[1]);
@@ -1477,8 +1477,8 @@
   var o = new api.Monitoring();
   buildCounterMonitoring++;
   if (buildCounterMonitoring < 3) {
-    o.consumerDestinations = buildUnnamed1881();
-    o.producerDestinations = buildUnnamed1882();
+    o.consumerDestinations = buildUnnamed1903();
+    o.producerDestinations = buildUnnamed1904();
   }
   buildCounterMonitoring--;
   return o;
@@ -1487,20 +1487,20 @@
 checkMonitoring(api.Monitoring o) {
   buildCounterMonitoring++;
   if (buildCounterMonitoring < 3) {
-    checkUnnamed1881(o.consumerDestinations);
-    checkUnnamed1882(o.producerDestinations);
+    checkUnnamed1903(o.consumerDestinations);
+    checkUnnamed1904(o.producerDestinations);
   }
   buildCounterMonitoring--;
 }
 
-buildUnnamed1883() {
+buildUnnamed1905() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1883(core.List<core.String> o) {
+checkUnnamed1905(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1511,7 +1511,7 @@
   var o = new api.MonitoringDestination();
   buildCounterMonitoringDestination++;
   if (buildCounterMonitoringDestination < 3) {
-    o.metrics = buildUnnamed1883();
+    o.metrics = buildUnnamed1905();
     o.monitoredResource = "foo";
   }
   buildCounterMonitoringDestination--;
@@ -1521,7 +1521,7 @@
 checkMonitoringDestination(api.MonitoringDestination o) {
   buildCounterMonitoringDestination++;
   if (buildCounterMonitoringDestination < 3) {
-    checkUnnamed1883(o.metrics);
+    checkUnnamed1905(o.metrics);
     unittest.expect(o.monitoredResource, unittest.equals('foo'));
   }
   buildCounterMonitoringDestination--;
@@ -1546,7 +1546,7 @@
   buildCounterOAuthRequirements--;
 }
 
-buildUnnamed1884() {
+buildUnnamed1906() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1561,7 +1561,7 @@
   return o;
 }
 
-checkUnnamed1884(core.Map<core.String, core.Object> o) {
+checkUnnamed1906(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));
@@ -1575,7 +1575,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1885() {
+buildUnnamed1907() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1590,7 +1590,7 @@
   return o;
 }
 
-checkUnnamed1885(core.Map<core.String, core.Object> o) {
+checkUnnamed1907(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -1611,9 +1611,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed1884();
+    o.metadata = buildUnnamed1906();
     o.name = "foo";
-    o.response = buildUnnamed1885();
+    o.response = buildUnnamed1907();
   }
   buildCounterOperation--;
   return o;
@@ -1624,34 +1624,34 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed1884(o.metadata);
+    checkUnnamed1906(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1885(o.response);
+    checkUnnamed1907(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1886() {
+buildUnnamed1908() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1886(core.List<core.String> o) {
+checkUnnamed1908(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1887() {
+buildUnnamed1909() {
   var o = new core.List<api.Step>();
   o.add(buildStep());
   o.add(buildStep());
   return o;
 }
 
-checkUnnamed1887(core.List<api.Step> o) {
+checkUnnamed1909(core.List<api.Step> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStep(o[0]);
   checkStep(o[1]);
@@ -1663,9 +1663,9 @@
   buildCounterOperationMetadata++;
   if (buildCounterOperationMetadata < 3) {
     o.progressPercentage = 42;
-    o.resourceNames = buildUnnamed1886();
+    o.resourceNames = buildUnnamed1908();
     o.startTime = "foo";
-    o.steps = buildUnnamed1887();
+    o.steps = buildUnnamed1909();
   }
   buildCounterOperationMetadata--;
   return o;
@@ -1675,14 +1675,14 @@
   buildCounterOperationMetadata++;
   if (buildCounterOperationMetadata < 3) {
     unittest.expect(o.progressPercentage, unittest.equals(42));
-    checkUnnamed1886(o.resourceNames);
+    checkUnnamed1908(o.resourceNames);
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkUnnamed1887(o.steps);
+    checkUnnamed1909(o.steps);
   }
   buildCounterOperationMetadata--;
 }
 
-buildUnnamed1888() {
+buildUnnamed1910() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1697,7 +1697,7 @@
   return o;
 }
 
-checkUnnamed1888(core.Map<core.String, core.Object> o) {
+checkUnnamed1910(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -1717,7 +1717,7 @@
   buildCounterOption++;
   if (buildCounterOption < 3) {
     o.name = "foo";
-    o.value = buildUnnamed1888();
+    o.value = buildUnnamed1910();
   }
   buildCounterOption--;
   return o;
@@ -1727,19 +1727,19 @@
   buildCounterOption++;
   if (buildCounterOption < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1888(o.value);
+    checkUnnamed1910(o.value);
   }
   buildCounterOption--;
 }
 
-buildUnnamed1889() {
+buildUnnamed1911() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1889(core.List<api.Page> o) {
+checkUnnamed1911(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
@@ -1752,7 +1752,7 @@
   if (buildCounterPage < 3) {
     o.content = "foo";
     o.name = "foo";
-    o.subpages = buildUnnamed1889();
+    o.subpages = buildUnnamed1911();
   }
   buildCounterPage--;
   return o;
@@ -1763,7 +1763,7 @@
   if (buildCounterPage < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1889(o.subpages);
+    checkUnnamed1911(o.subpages);
   }
   buildCounterPage--;
 }
@@ -1789,27 +1789,27 @@
   buildCounterPublishedService--;
 }
 
-buildUnnamed1890() {
+buildUnnamed1912() {
   var o = new core.List<api.QuotaLimit>();
   o.add(buildQuotaLimit());
   o.add(buildQuotaLimit());
   return o;
 }
 
-checkUnnamed1890(core.List<api.QuotaLimit> o) {
+checkUnnamed1912(core.List<api.QuotaLimit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuotaLimit(o[0]);
   checkQuotaLimit(o[1]);
 }
 
-buildUnnamed1891() {
+buildUnnamed1913() {
   var o = new core.List<api.MetricRule>();
   o.add(buildMetricRule());
   o.add(buildMetricRule());
   return o;
 }
 
-checkUnnamed1891(core.List<api.MetricRule> o) {
+checkUnnamed1913(core.List<api.MetricRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricRule(o[0]);
   checkMetricRule(o[1]);
@@ -1820,8 +1820,8 @@
   var o = new api.Quota();
   buildCounterQuota++;
   if (buildCounterQuota < 3) {
-    o.limits = buildUnnamed1890();
-    o.metricRules = buildUnnamed1891();
+    o.limits = buildUnnamed1912();
+    o.metricRules = buildUnnamed1913();
   }
   buildCounterQuota--;
   return o;
@@ -1830,20 +1830,20 @@
 checkQuota(api.Quota o) {
   buildCounterQuota++;
   if (buildCounterQuota < 3) {
-    checkUnnamed1890(o.limits);
-    checkUnnamed1891(o.metricRules);
+    checkUnnamed1912(o.limits);
+    checkUnnamed1913(o.metricRules);
   }
   buildCounterQuota--;
 }
 
-buildUnnamed1892() {
+buildUnnamed1914() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1892(core.Map<core.String, core.String> o) {
+checkUnnamed1914(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'));
@@ -1863,7 +1863,7 @@
     o.metric = "foo";
     o.name = "foo";
     o.unit = "foo";
-    o.values = buildUnnamed1892();
+    o.values = buildUnnamed1914();
   }
   buildCounterQuotaLimit--;
   return o;
@@ -1881,19 +1881,19 @@
     unittest.expect(o.metric, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.unit, unittest.equals('foo'));
-    checkUnnamed1892(o.values);
+    checkUnnamed1914(o.values);
   }
   buildCounterQuotaLimit--;
 }
 
-buildUnnamed1893() {
+buildUnnamed1915() {
   var o = new core.List<api.PublishedService>();
   o.add(buildPublishedService());
   o.add(buildPublishedService());
   return o;
 }
 
-checkUnnamed1893(core.List<api.PublishedService> o) {
+checkUnnamed1915(core.List<api.PublishedService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPublishedService(o[0]);
   checkPublishedService(o[1]);
@@ -1905,7 +1905,7 @@
   buildCounterSearchServicesResponse++;
   if (buildCounterSearchServicesResponse < 3) {
     o.nextPageToken = "foo";
-    o.services = buildUnnamed1893();
+    o.services = buildUnnamed1915();
   }
   buildCounterSearchServicesResponse--;
   return o;
@@ -1915,110 +1915,110 @@
   buildCounterSearchServicesResponse++;
   if (buildCounterSearchServicesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1893(o.services);
+    checkUnnamed1915(o.services);
   }
   buildCounterSearchServicesResponse--;
 }
 
-buildUnnamed1894() {
+buildUnnamed1916() {
   var o = new core.List<api.Api>();
   o.add(buildApi());
   o.add(buildApi());
   return o;
 }
 
-checkUnnamed1894(core.List<api.Api> o) {
+checkUnnamed1916(core.List<api.Api> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApi(o[0]);
   checkApi(o[1]);
 }
 
-buildUnnamed1895() {
+buildUnnamed1917() {
   var o = new core.List<api.Endpoint>();
   o.add(buildEndpoint());
   o.add(buildEndpoint());
   return o;
 }
 
-checkUnnamed1895(core.List<api.Endpoint> o) {
+checkUnnamed1917(core.List<api.Endpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEndpoint(o[0]);
   checkEndpoint(o[1]);
 }
 
-buildUnnamed1896() {
+buildUnnamed1918() {
   var o = new core.List<api.Enum>();
   o.add(buildEnum());
   o.add(buildEnum());
   return o;
 }
 
-checkUnnamed1896(core.List<api.Enum> o) {
+checkUnnamed1918(core.List<api.Enum> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnum(o[0]);
   checkEnum(o[1]);
 }
 
-buildUnnamed1897() {
+buildUnnamed1919() {
   var o = new core.List<api.LogDescriptor>();
   o.add(buildLogDescriptor());
   o.add(buildLogDescriptor());
   return o;
 }
 
-checkUnnamed1897(core.List<api.LogDescriptor> o) {
+checkUnnamed1919(core.List<api.LogDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogDescriptor(o[0]);
   checkLogDescriptor(o[1]);
 }
 
-buildUnnamed1898() {
+buildUnnamed1920() {
   var o = new core.List<api.MetricDescriptor>();
   o.add(buildMetricDescriptor());
   o.add(buildMetricDescriptor());
   return o;
 }
 
-checkUnnamed1898(core.List<api.MetricDescriptor> o) {
+checkUnnamed1920(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptor(o[0]);
   checkMetricDescriptor(o[1]);
 }
 
-buildUnnamed1899() {
+buildUnnamed1921() {
   var o = new core.List<api.MonitoredResourceDescriptor>();
   o.add(buildMonitoredResourceDescriptor());
   o.add(buildMonitoredResourceDescriptor());
   return o;
 }
 
-checkUnnamed1899(core.List<api.MonitoredResourceDescriptor> o) {
+checkUnnamed1921(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoredResourceDescriptor(o[0]);
   checkMonitoredResourceDescriptor(o[1]);
 }
 
-buildUnnamed1900() {
+buildUnnamed1922() {
   var o = new core.List<api.Type>();
   o.add(buildType());
   o.add(buildType());
   return o;
 }
 
-checkUnnamed1900(core.List<api.Type> o) {
+checkUnnamed1922(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o[0]);
   checkType(o[1]);
 }
 
-buildUnnamed1901() {
+buildUnnamed1923() {
   var o = new core.List<api.Type>();
   o.add(buildType());
   o.add(buildType());
   return o;
 }
 
-checkUnnamed1901(core.List<api.Type> o) {
+checkUnnamed1923(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o[0]);
   checkType(o[1]);
@@ -2029,7 +2029,7 @@
   var o = new api.Service();
   buildCounterService++;
   if (buildCounterService < 3) {
-    o.apis = buildUnnamed1894();
+    o.apis = buildUnnamed1916();
     o.authentication = buildAuthentication();
     o.backend = buildBackend();
     o.billing = buildBilling();
@@ -2038,24 +2038,24 @@
     o.control = buildControl();
     o.customError = buildCustomError();
     o.documentation = buildDocumentation();
-    o.endpoints = buildUnnamed1895();
-    o.enums = buildUnnamed1896();
+    o.endpoints = buildUnnamed1917();
+    o.enums = buildUnnamed1918();
     o.experimental = buildExperimental();
     o.http = buildHttp();
     o.id = "foo";
     o.logging = buildLogging();
-    o.logs = buildUnnamed1897();
-    o.metrics = buildUnnamed1898();
-    o.monitoredResources = buildUnnamed1899();
+    o.logs = buildUnnamed1919();
+    o.metrics = buildUnnamed1920();
+    o.monitoredResources = buildUnnamed1921();
     o.monitoring = buildMonitoring();
     o.name = "foo";
     o.producerProjectId = "foo";
     o.quota = buildQuota();
     o.sourceInfo = buildSourceInfo();
     o.systemParameters = buildSystemParameters();
-    o.systemTypes = buildUnnamed1900();
+    o.systemTypes = buildUnnamed1922();
     o.title = "foo";
-    o.types = buildUnnamed1901();
+    o.types = buildUnnamed1923();
     o.usage = buildUsage();
     o.visibility = buildVisibility();
   }
@@ -2066,7 +2066,7 @@
 checkService(api.Service o) {
   buildCounterService++;
   if (buildCounterService < 3) {
-    checkUnnamed1894(o.apis);
+    checkUnnamed1916(o.apis);
     checkAuthentication(o.authentication);
     checkBackend(o.backend);
     checkBilling(o.billing);
@@ -2075,24 +2075,24 @@
     checkControl(o.control);
     checkCustomError(o.customError);
     checkDocumentation(o.documentation);
-    checkUnnamed1895(o.endpoints);
-    checkUnnamed1896(o.enums);
+    checkUnnamed1917(o.endpoints);
+    checkUnnamed1918(o.enums);
     checkExperimental(o.experimental);
     checkHttp(o.http);
     unittest.expect(o.id, unittest.equals('foo'));
     checkLogging(o.logging);
-    checkUnnamed1897(o.logs);
-    checkUnnamed1898(o.metrics);
-    checkUnnamed1899(o.monitoredResources);
+    checkUnnamed1919(o.logs);
+    checkUnnamed1920(o.metrics);
+    checkUnnamed1921(o.monitoredResources);
     checkMonitoring(o.monitoring);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.producerProjectId, unittest.equals('foo'));
     checkQuota(o.quota);
     checkSourceInfo(o.sourceInfo);
     checkSystemParameters(o.systemParameters);
-    checkUnnamed1900(o.systemTypes);
+    checkUnnamed1922(o.systemTypes);
     unittest.expect(o.title, unittest.equals('foo'));
-    checkUnnamed1901(o.types);
+    checkUnnamed1923(o.types);
     checkUsage(o.usage);
     checkVisibility(o.visibility);
   }
@@ -2118,7 +2118,7 @@
   buildCounterSourceContext--;
 }
 
-buildUnnamed1902() {
+buildUnnamed1924() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -2133,7 +2133,7 @@
   return o;
 }
 
-checkUnnamed1902(core.Map<core.String, core.Object> o) {
+checkUnnamed1924(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o["x"]) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -2147,17 +2147,17 @@
   unittest.expect(casted8["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1903() {
+buildUnnamed1925() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1902());
-  o.add(buildUnnamed1902());
+  o.add(buildUnnamed1924());
+  o.add(buildUnnamed1924());
   return o;
 }
 
-checkUnnamed1903(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1925(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1902(o[0]);
-  checkUnnamed1902(o[1]);
+  checkUnnamed1924(o[0]);
+  checkUnnamed1924(o[1]);
 }
 
 core.int buildCounterSourceInfo = 0;
@@ -2165,7 +2165,7 @@
   var o = new api.SourceInfo();
   buildCounterSourceInfo++;
   if (buildCounterSourceInfo < 3) {
-    o.sourceFiles = buildUnnamed1903();
+    o.sourceFiles = buildUnnamed1925();
   }
   buildCounterSourceInfo--;
   return o;
@@ -2174,12 +2174,12 @@
 checkSourceInfo(api.SourceInfo o) {
   buildCounterSourceInfo++;
   if (buildCounterSourceInfo < 3) {
-    checkUnnamed1903(o.sourceFiles);
+    checkUnnamed1925(o.sourceFiles);
   }
   buildCounterSourceInfo--;
 }
 
-buildUnnamed1904() {
+buildUnnamed1926() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -2194,7 +2194,7 @@
   return o;
 }
 
-checkUnnamed1904(core.Map<core.String, core.Object> o) {
+checkUnnamed1926(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted9 = (o["x"]) as core.Map;
   unittest.expect(casted9, unittest.hasLength(3));
@@ -2208,17 +2208,17 @@
   unittest.expect(casted10["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1905() {
+buildUnnamed1927() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1904());
-  o.add(buildUnnamed1904());
+  o.add(buildUnnamed1926());
+  o.add(buildUnnamed1926());
   return o;
 }
 
-checkUnnamed1905(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1927(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1904(o[0]);
-  checkUnnamed1904(o[1]);
+  checkUnnamed1926(o[0]);
+  checkUnnamed1926(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -2227,7 +2227,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1905();
+    o.details = buildUnnamed1927();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -2238,7 +2238,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1905(o.details);
+    checkUnnamed1927(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -2288,14 +2288,14 @@
   buildCounterSystemParameter--;
 }
 
-buildUnnamed1906() {
+buildUnnamed1928() {
   var o = new core.List<api.SystemParameter>();
   o.add(buildSystemParameter());
   o.add(buildSystemParameter());
   return o;
 }
 
-checkUnnamed1906(core.List<api.SystemParameter> o) {
+checkUnnamed1928(core.List<api.SystemParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSystemParameter(o[0]);
   checkSystemParameter(o[1]);
@@ -2306,7 +2306,7 @@
   var o = new api.SystemParameterRule();
   buildCounterSystemParameterRule++;
   if (buildCounterSystemParameterRule < 3) {
-    o.parameters = buildUnnamed1906();
+    o.parameters = buildUnnamed1928();
     o.selector = "foo";
   }
   buildCounterSystemParameterRule--;
@@ -2316,20 +2316,20 @@
 checkSystemParameterRule(api.SystemParameterRule o) {
   buildCounterSystemParameterRule++;
   if (buildCounterSystemParameterRule < 3) {
-    checkUnnamed1906(o.parameters);
+    checkUnnamed1928(o.parameters);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterSystemParameterRule--;
 }
 
-buildUnnamed1907() {
+buildUnnamed1929() {
   var o = new core.List<api.SystemParameterRule>();
   o.add(buildSystemParameterRule());
   o.add(buildSystemParameterRule());
   return o;
 }
 
-checkUnnamed1907(core.List<api.SystemParameterRule> o) {
+checkUnnamed1929(core.List<api.SystemParameterRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSystemParameterRule(o[0]);
   checkSystemParameterRule(o[1]);
@@ -2340,7 +2340,7 @@
   var o = new api.SystemParameters();
   buildCounterSystemParameters++;
   if (buildCounterSystemParameters < 3) {
-    o.rules = buildUnnamed1907();
+    o.rules = buildUnnamed1929();
   }
   buildCounterSystemParameters--;
   return o;
@@ -2349,45 +2349,45 @@
 checkSystemParameters(api.SystemParameters o) {
   buildCounterSystemParameters++;
   if (buildCounterSystemParameters < 3) {
-    checkUnnamed1907(o.rules);
+    checkUnnamed1929(o.rules);
   }
   buildCounterSystemParameters--;
 }
 
-buildUnnamed1908() {
+buildUnnamed1930() {
   var o = new core.List<api.Field>();
   o.add(buildField());
   o.add(buildField());
   return o;
 }
 
-checkUnnamed1908(core.List<api.Field> o) {
+checkUnnamed1930(core.List<api.Field> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkField(o[0]);
   checkField(o[1]);
 }
 
-buildUnnamed1909() {
+buildUnnamed1931() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1909(core.List<core.String> o) {
+checkUnnamed1931(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1910() {
+buildUnnamed1932() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1910(core.List<api.Option> o) {
+checkUnnamed1932(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -2398,10 +2398,10 @@
   var o = new api.Type();
   buildCounterType++;
   if (buildCounterType < 3) {
-    o.fields = buildUnnamed1908();
+    o.fields = buildUnnamed1930();
     o.name = "foo";
-    o.oneofs = buildUnnamed1909();
-    o.options = buildUnnamed1910();
+    o.oneofs = buildUnnamed1931();
+    o.options = buildUnnamed1932();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
   }
@@ -2412,37 +2412,37 @@
 checkType(api.Type o) {
   buildCounterType++;
   if (buildCounterType < 3) {
-    checkUnnamed1908(o.fields);
+    checkUnnamed1930(o.fields);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1909(o.oneofs);
-    checkUnnamed1910(o.options);
+    checkUnnamed1931(o.oneofs);
+    checkUnnamed1932(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterType--;
 }
 
-buildUnnamed1911() {
+buildUnnamed1933() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1911(core.List<core.String> o) {
+checkUnnamed1933(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1912() {
+buildUnnamed1934() {
   var o = new core.List<api.UsageRule>();
   o.add(buildUsageRule());
   o.add(buildUsageRule());
   return o;
 }
 
-checkUnnamed1912(core.List<api.UsageRule> o) {
+checkUnnamed1934(core.List<api.UsageRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageRule(o[0]);
   checkUsageRule(o[1]);
@@ -2454,8 +2454,8 @@
   buildCounterUsage++;
   if (buildCounterUsage < 3) {
     o.producerNotificationChannel = "foo";
-    o.requirements = buildUnnamed1911();
-    o.rules = buildUnnamed1912();
+    o.requirements = buildUnnamed1933();
+    o.rules = buildUnnamed1934();
   }
   buildCounterUsage--;
   return o;
@@ -2465,8 +2465,8 @@
   buildCounterUsage++;
   if (buildCounterUsage < 3) {
     unittest.expect(o.producerNotificationChannel, unittest.equals('foo'));
-    checkUnnamed1911(o.requirements);
-    checkUnnamed1912(o.rules);
+    checkUnnamed1933(o.requirements);
+    checkUnnamed1934(o.rules);
   }
   buildCounterUsage--;
 }
@@ -2494,14 +2494,14 @@
   buildCounterUsageRule--;
 }
 
-buildUnnamed1913() {
+buildUnnamed1935() {
   var o = new core.List<api.VisibilityRule>();
   o.add(buildVisibilityRule());
   o.add(buildVisibilityRule());
   return o;
 }
 
-checkUnnamed1913(core.List<api.VisibilityRule> o) {
+checkUnnamed1935(core.List<api.VisibilityRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVisibilityRule(o[0]);
   checkVisibilityRule(o[1]);
@@ -2512,7 +2512,7 @@
   var o = new api.Visibility();
   buildCounterVisibility++;
   if (buildCounterVisibility < 3) {
-    o.rules = buildUnnamed1913();
+    o.rules = buildUnnamed1935();
   }
   buildCounterVisibility--;
   return o;
@@ -2521,7 +2521,7 @@
 checkVisibility(api.Visibility o) {
   buildCounterVisibility++;
   if (buildCounterVisibility < 3) {
-    checkUnnamed1913(o.rules);
+    checkUnnamed1935(o.rules);
   }
   buildCounterVisibility--;
 }
@@ -3240,8 +3240,8 @@
     unittest.test("method--search", () {
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServiceuserApi(mock).services;
-      var arg_pageSize = 42;
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3273,10 +3273,10 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3287,8 +3287,8 @@
       }), true);
       res
           .search(
-              pageSize: arg_pageSize,
               pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.SearchServicesResponse response) {
         checkSearchServicesResponse(response);
diff --git a/generated/googleapis/test/sheets/v4_test.dart b/generated/googleapis/test/sheets/v4_test.dart
index 8f59d14..aa4049c 100644
--- a/generated/googleapis/test/sheets/v4_test.dart
+++ b/generated/googleapis/test/sheets/v4_test.dart
@@ -299,14 +299,14 @@
   buildCounterAddSheetResponse--;
 }
 
-buildUnnamed436() {
+buildUnnamed433() {
   var o = new core.List<api.RowData>();
   o.add(buildRowData());
   o.add(buildRowData());
   return o;
 }
 
-checkUnnamed436(core.List<api.RowData> o) {
+checkUnnamed433(core.List<api.RowData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRowData(o[0]);
   checkRowData(o[1]);
@@ -318,7 +318,7 @@
   buildCounterAppendCellsRequest++;
   if (buildCounterAppendCellsRequest < 3) {
     o.fields = "foo";
-    o.rows = buildUnnamed436();
+    o.rows = buildUnnamed433();
     o.sheetId = 42;
   }
   buildCounterAppendCellsRequest--;
@@ -329,7 +329,7 @@
   buildCounterAppendCellsRequest++;
   if (buildCounterAppendCellsRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkUnnamed436(o.rows);
+    checkUnnamed433(o.rows);
     unittest.expect(o.sheetId, unittest.equals(42));
   }
   buildCounterAppendCellsRequest--;
@@ -524,6 +524,7 @@
   var o = new api.BasicChartSeries();
   buildCounterBasicChartSeries++;
   if (buildCounterBasicChartSeries < 3) {
+    o.lineStyle = buildLineStyle();
     o.series = buildChartData();
     o.targetAxis = "foo";
     o.type = "foo";
@@ -535,6 +536,7 @@
 checkBasicChartSeries(api.BasicChartSeries o) {
   buildCounterBasicChartSeries++;
   if (buildCounterBasicChartSeries < 3) {
+    checkLineStyle(o.lineStyle);
     checkChartData(o.series);
     unittest.expect(o.targetAxis, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -542,40 +544,40 @@
   buildCounterBasicChartSeries--;
 }
 
-buildUnnamed437() {
+buildUnnamed434() {
   var o = new core.List<api.BasicChartAxis>();
   o.add(buildBasicChartAxis());
   o.add(buildBasicChartAxis());
   return o;
 }
 
-checkUnnamed437(core.List<api.BasicChartAxis> o) {
+checkUnnamed434(core.List<api.BasicChartAxis> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBasicChartAxis(o[0]);
   checkBasicChartAxis(o[1]);
 }
 
-buildUnnamed438() {
+buildUnnamed435() {
   var o = new core.List<api.BasicChartDomain>();
   o.add(buildBasicChartDomain());
   o.add(buildBasicChartDomain());
   return o;
 }
 
-checkUnnamed438(core.List<api.BasicChartDomain> o) {
+checkUnnamed435(core.List<api.BasicChartDomain> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBasicChartDomain(o[0]);
   checkBasicChartDomain(o[1]);
 }
 
-buildUnnamed439() {
+buildUnnamed436() {
   var o = new core.List<api.BasicChartSeries>();
   o.add(buildBasicChartSeries());
   o.add(buildBasicChartSeries());
   return o;
 }
 
-checkUnnamed439(core.List<api.BasicChartSeries> o) {
+checkUnnamed436(core.List<api.BasicChartSeries> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBasicChartSeries(o[0]);
   checkBasicChartSeries(o[1]);
@@ -586,15 +588,15 @@
   var o = new api.BasicChartSpec();
   buildCounterBasicChartSpec++;
   if (buildCounterBasicChartSpec < 3) {
-    o.axis = buildUnnamed437();
+    o.axis = buildUnnamed434();
     o.chartType = "foo";
     o.compareMode = "foo";
-    o.domains = buildUnnamed438();
+    o.domains = buildUnnamed435();
     o.headerCount = 42;
     o.interpolateNulls = true;
     o.legendPosition = "foo";
     o.lineSmoothing = true;
-    o.series = buildUnnamed439();
+    o.series = buildUnnamed436();
     o.stackedType = "foo";
     o.threeDimensional = true;
   }
@@ -605,42 +607,42 @@
 checkBasicChartSpec(api.BasicChartSpec o) {
   buildCounterBasicChartSpec++;
   if (buildCounterBasicChartSpec < 3) {
-    checkUnnamed437(o.axis);
+    checkUnnamed434(o.axis);
     unittest.expect(o.chartType, unittest.equals('foo'));
     unittest.expect(o.compareMode, unittest.equals('foo'));
-    checkUnnamed438(o.domains);
+    checkUnnamed435(o.domains);
     unittest.expect(o.headerCount, unittest.equals(42));
     unittest.expect(o.interpolateNulls, unittest.isTrue);
     unittest.expect(o.legendPosition, unittest.equals('foo'));
     unittest.expect(o.lineSmoothing, unittest.isTrue);
-    checkUnnamed439(o.series);
+    checkUnnamed436(o.series);
     unittest.expect(o.stackedType, unittest.equals('foo'));
     unittest.expect(o.threeDimensional, unittest.isTrue);
   }
   buildCounterBasicChartSpec--;
 }
 
-buildUnnamed440() {
+buildUnnamed437() {
   var o = new core.Map<core.String, api.FilterCriteria>();
   o["x"] = buildFilterCriteria();
   o["y"] = buildFilterCriteria();
   return o;
 }
 
-checkUnnamed440(core.Map<core.String, api.FilterCriteria> o) {
+checkUnnamed437(core.Map<core.String, api.FilterCriteria> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilterCriteria(o["x"]);
   checkFilterCriteria(o["y"]);
 }
 
-buildUnnamed441() {
+buildUnnamed438() {
   var o = new core.List<api.SortSpec>();
   o.add(buildSortSpec());
   o.add(buildSortSpec());
   return o;
 }
 
-checkUnnamed441(core.List<api.SortSpec> o) {
+checkUnnamed438(core.List<api.SortSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortSpec(o[0]);
   checkSortSpec(o[1]);
@@ -651,9 +653,9 @@
   var o = new api.BasicFilter();
   buildCounterBasicFilter++;
   if (buildCounterBasicFilter < 3) {
-    o.criteria = buildUnnamed440();
+    o.criteria = buildUnnamed437();
     o.range = buildGridRange();
-    o.sortSpecs = buildUnnamed441();
+    o.sortSpecs = buildUnnamed438();
   }
   buildCounterBasicFilter--;
   return o;
@@ -662,21 +664,21 @@
 checkBasicFilter(api.BasicFilter o) {
   buildCounterBasicFilter++;
   if (buildCounterBasicFilter < 3) {
-    checkUnnamed440(o.criteria);
+    checkUnnamed437(o.criteria);
     checkGridRange(o.range);
-    checkUnnamed441(o.sortSpecs);
+    checkUnnamed438(o.sortSpecs);
   }
   buildCounterBasicFilter--;
 }
 
-buildUnnamed442() {
+buildUnnamed439() {
   var o = new core.List<api.DataFilter>();
   o.add(buildDataFilter());
   o.add(buildDataFilter());
   return o;
 }
 
-checkUnnamed442(core.List<api.DataFilter> o) {
+checkUnnamed439(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataFilter(o[0]);
   checkDataFilter(o[1]);
@@ -687,7 +689,7 @@
   var o = new api.BatchClearValuesByDataFilterRequest();
   buildCounterBatchClearValuesByDataFilterRequest++;
   if (buildCounterBatchClearValuesByDataFilterRequest < 3) {
-    o.dataFilters = buildUnnamed442();
+    o.dataFilters = buildUnnamed439();
   }
   buildCounterBatchClearValuesByDataFilterRequest--;
   return o;
@@ -697,19 +699,19 @@
     api.BatchClearValuesByDataFilterRequest o) {
   buildCounterBatchClearValuesByDataFilterRequest++;
   if (buildCounterBatchClearValuesByDataFilterRequest < 3) {
-    checkUnnamed442(o.dataFilters);
+    checkUnnamed439(o.dataFilters);
   }
   buildCounterBatchClearValuesByDataFilterRequest--;
 }
 
-buildUnnamed443() {
+buildUnnamed440() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed443(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'));
@@ -720,7 +722,7 @@
   var o = new api.BatchClearValuesByDataFilterResponse();
   buildCounterBatchClearValuesByDataFilterResponse++;
   if (buildCounterBatchClearValuesByDataFilterResponse < 3) {
-    o.clearedRanges = buildUnnamed443();
+    o.clearedRanges = buildUnnamed440();
     o.spreadsheetId = "foo";
   }
   buildCounterBatchClearValuesByDataFilterResponse--;
@@ -731,20 +733,20 @@
     api.BatchClearValuesByDataFilterResponse o) {
   buildCounterBatchClearValuesByDataFilterResponse++;
   if (buildCounterBatchClearValuesByDataFilterResponse < 3) {
-    checkUnnamed443(o.clearedRanges);
+    checkUnnamed440(o.clearedRanges);
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
   }
   buildCounterBatchClearValuesByDataFilterResponse--;
 }
 
-buildUnnamed444() {
+buildUnnamed441() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed444(core.List<core.String> o) {
+checkUnnamed441(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -755,7 +757,7 @@
   var o = new api.BatchClearValuesRequest();
   buildCounterBatchClearValuesRequest++;
   if (buildCounterBatchClearValuesRequest < 3) {
-    o.ranges = buildUnnamed444();
+    o.ranges = buildUnnamed441();
   }
   buildCounterBatchClearValuesRequest--;
   return o;
@@ -764,19 +766,19 @@
 checkBatchClearValuesRequest(api.BatchClearValuesRequest o) {
   buildCounterBatchClearValuesRequest++;
   if (buildCounterBatchClearValuesRequest < 3) {
-    checkUnnamed444(o.ranges);
+    checkUnnamed441(o.ranges);
   }
   buildCounterBatchClearValuesRequest--;
 }
 
-buildUnnamed445() {
+buildUnnamed442() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed445(core.List<core.String> o) {
+checkUnnamed442(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -787,7 +789,7 @@
   var o = new api.BatchClearValuesResponse();
   buildCounterBatchClearValuesResponse++;
   if (buildCounterBatchClearValuesResponse < 3) {
-    o.clearedRanges = buildUnnamed445();
+    o.clearedRanges = buildUnnamed442();
     o.spreadsheetId = "foo";
   }
   buildCounterBatchClearValuesResponse--;
@@ -797,20 +799,20 @@
 checkBatchClearValuesResponse(api.BatchClearValuesResponse o) {
   buildCounterBatchClearValuesResponse++;
   if (buildCounterBatchClearValuesResponse < 3) {
-    checkUnnamed445(o.clearedRanges);
+    checkUnnamed442(o.clearedRanges);
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
   }
   buildCounterBatchClearValuesResponse--;
 }
 
-buildUnnamed446() {
+buildUnnamed443() {
   var o = new core.List<api.DataFilter>();
   o.add(buildDataFilter());
   o.add(buildDataFilter());
   return o;
 }
 
-checkUnnamed446(core.List<api.DataFilter> o) {
+checkUnnamed443(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataFilter(o[0]);
   checkDataFilter(o[1]);
@@ -821,7 +823,7 @@
   var o = new api.BatchGetValuesByDataFilterRequest();
   buildCounterBatchGetValuesByDataFilterRequest++;
   if (buildCounterBatchGetValuesByDataFilterRequest < 3) {
-    o.dataFilters = buildUnnamed446();
+    o.dataFilters = buildUnnamed443();
     o.dateTimeRenderOption = "foo";
     o.majorDimension = "foo";
     o.valueRenderOption = "foo";
@@ -834,7 +836,7 @@
     api.BatchGetValuesByDataFilterRequest o) {
   buildCounterBatchGetValuesByDataFilterRequest++;
   if (buildCounterBatchGetValuesByDataFilterRequest < 3) {
-    checkUnnamed446(o.dataFilters);
+    checkUnnamed443(o.dataFilters);
     unittest.expect(o.dateTimeRenderOption, unittest.equals('foo'));
     unittest.expect(o.majorDimension, unittest.equals('foo'));
     unittest.expect(o.valueRenderOption, unittest.equals('foo'));
@@ -842,14 +844,14 @@
   buildCounterBatchGetValuesByDataFilterRequest--;
 }
 
-buildUnnamed447() {
+buildUnnamed444() {
   var o = new core.List<api.MatchedValueRange>();
   o.add(buildMatchedValueRange());
   o.add(buildMatchedValueRange());
   return o;
 }
 
-checkUnnamed447(core.List<api.MatchedValueRange> o) {
+checkUnnamed444(core.List<api.MatchedValueRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMatchedValueRange(o[0]);
   checkMatchedValueRange(o[1]);
@@ -861,7 +863,7 @@
   buildCounterBatchGetValuesByDataFilterResponse++;
   if (buildCounterBatchGetValuesByDataFilterResponse < 3) {
     o.spreadsheetId = "foo";
-    o.valueRanges = buildUnnamed447();
+    o.valueRanges = buildUnnamed444();
   }
   buildCounterBatchGetValuesByDataFilterResponse--;
   return o;
@@ -872,19 +874,19 @@
   buildCounterBatchGetValuesByDataFilterResponse++;
   if (buildCounterBatchGetValuesByDataFilterResponse < 3) {
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
-    checkUnnamed447(o.valueRanges);
+    checkUnnamed444(o.valueRanges);
   }
   buildCounterBatchGetValuesByDataFilterResponse--;
 }
 
-buildUnnamed448() {
+buildUnnamed445() {
   var o = new core.List<api.ValueRange>();
   o.add(buildValueRange());
   o.add(buildValueRange());
   return o;
 }
 
-checkUnnamed448(core.List<api.ValueRange> o) {
+checkUnnamed445(core.List<api.ValueRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValueRange(o[0]);
   checkValueRange(o[1]);
@@ -896,7 +898,7 @@
   buildCounterBatchGetValuesResponse++;
   if (buildCounterBatchGetValuesResponse < 3) {
     o.spreadsheetId = "foo";
-    o.valueRanges = buildUnnamed448();
+    o.valueRanges = buildUnnamed445();
   }
   buildCounterBatchGetValuesResponse--;
   return o;
@@ -906,32 +908,32 @@
   buildCounterBatchGetValuesResponse++;
   if (buildCounterBatchGetValuesResponse < 3) {
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
-    checkUnnamed448(o.valueRanges);
+    checkUnnamed445(o.valueRanges);
   }
   buildCounterBatchGetValuesResponse--;
 }
 
-buildUnnamed449() {
+buildUnnamed446() {
   var o = new core.List<api.Request>();
   o.add(buildRequest());
   o.add(buildRequest());
   return o;
 }
 
-checkUnnamed449(core.List<api.Request> o) {
+checkUnnamed446(core.List<api.Request> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRequest(o[0]);
   checkRequest(o[1]);
 }
 
-buildUnnamed450() {
+buildUnnamed447() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed450(core.List<core.String> o) {
+checkUnnamed447(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -943,9 +945,9 @@
   buildCounterBatchUpdateSpreadsheetRequest++;
   if (buildCounterBatchUpdateSpreadsheetRequest < 3) {
     o.includeSpreadsheetInResponse = true;
-    o.requests = buildUnnamed449();
+    o.requests = buildUnnamed446();
     o.responseIncludeGridData = true;
-    o.responseRanges = buildUnnamed450();
+    o.responseRanges = buildUnnamed447();
   }
   buildCounterBatchUpdateSpreadsheetRequest--;
   return o;
@@ -955,21 +957,21 @@
   buildCounterBatchUpdateSpreadsheetRequest++;
   if (buildCounterBatchUpdateSpreadsheetRequest < 3) {
     unittest.expect(o.includeSpreadsheetInResponse, unittest.isTrue);
-    checkUnnamed449(o.requests);
+    checkUnnamed446(o.requests);
     unittest.expect(o.responseIncludeGridData, unittest.isTrue);
-    checkUnnamed450(o.responseRanges);
+    checkUnnamed447(o.responseRanges);
   }
   buildCounterBatchUpdateSpreadsheetRequest--;
 }
 
-buildUnnamed451() {
+buildUnnamed448() {
   var o = new core.List<api.Response>();
   o.add(buildResponse());
   o.add(buildResponse());
   return o;
 }
 
-checkUnnamed451(core.List<api.Response> o) {
+checkUnnamed448(core.List<api.Response> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResponse(o[0]);
   checkResponse(o[1]);
@@ -980,7 +982,7 @@
   var o = new api.BatchUpdateSpreadsheetResponse();
   buildCounterBatchUpdateSpreadsheetResponse++;
   if (buildCounterBatchUpdateSpreadsheetResponse < 3) {
-    o.replies = buildUnnamed451();
+    o.replies = buildUnnamed448();
     o.spreadsheetId = "foo";
     o.updatedSpreadsheet = buildSpreadsheet();
   }
@@ -991,21 +993,21 @@
 checkBatchUpdateSpreadsheetResponse(api.BatchUpdateSpreadsheetResponse o) {
   buildCounterBatchUpdateSpreadsheetResponse++;
   if (buildCounterBatchUpdateSpreadsheetResponse < 3) {
-    checkUnnamed451(o.replies);
+    checkUnnamed448(o.replies);
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
     checkSpreadsheet(o.updatedSpreadsheet);
   }
   buildCounterBatchUpdateSpreadsheetResponse--;
 }
 
-buildUnnamed452() {
+buildUnnamed449() {
   var o = new core.List<api.DataFilterValueRange>();
   o.add(buildDataFilterValueRange());
   o.add(buildDataFilterValueRange());
   return o;
 }
 
-checkUnnamed452(core.List<api.DataFilterValueRange> o) {
+checkUnnamed449(core.List<api.DataFilterValueRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataFilterValueRange(o[0]);
   checkDataFilterValueRange(o[1]);
@@ -1016,7 +1018,7 @@
   var o = new api.BatchUpdateValuesByDataFilterRequest();
   buildCounterBatchUpdateValuesByDataFilterRequest++;
   if (buildCounterBatchUpdateValuesByDataFilterRequest < 3) {
-    o.data = buildUnnamed452();
+    o.data = buildUnnamed449();
     o.includeValuesInResponse = true;
     o.responseDateTimeRenderOption = "foo";
     o.responseValueRenderOption = "foo";
@@ -1030,7 +1032,7 @@
     api.BatchUpdateValuesByDataFilterRequest o) {
   buildCounterBatchUpdateValuesByDataFilterRequest++;
   if (buildCounterBatchUpdateValuesByDataFilterRequest < 3) {
-    checkUnnamed452(o.data);
+    checkUnnamed449(o.data);
     unittest.expect(o.includeValuesInResponse, unittest.isTrue);
     unittest.expect(o.responseDateTimeRenderOption, unittest.equals('foo'));
     unittest.expect(o.responseValueRenderOption, unittest.equals('foo'));
@@ -1039,14 +1041,14 @@
   buildCounterBatchUpdateValuesByDataFilterRequest--;
 }
 
-buildUnnamed453() {
+buildUnnamed450() {
   var o = new core.List<api.UpdateValuesByDataFilterResponse>();
   o.add(buildUpdateValuesByDataFilterResponse());
   o.add(buildUpdateValuesByDataFilterResponse());
   return o;
 }
 
-checkUnnamed453(core.List<api.UpdateValuesByDataFilterResponse> o) {
+checkUnnamed450(core.List<api.UpdateValuesByDataFilterResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUpdateValuesByDataFilterResponse(o[0]);
   checkUpdateValuesByDataFilterResponse(o[1]);
@@ -1057,7 +1059,7 @@
   var o = new api.BatchUpdateValuesByDataFilterResponse();
   buildCounterBatchUpdateValuesByDataFilterResponse++;
   if (buildCounterBatchUpdateValuesByDataFilterResponse < 3) {
-    o.responses = buildUnnamed453();
+    o.responses = buildUnnamed450();
     o.spreadsheetId = "foo";
     o.totalUpdatedCells = 42;
     o.totalUpdatedColumns = 42;
@@ -1072,7 +1074,7 @@
     api.BatchUpdateValuesByDataFilterResponse o) {
   buildCounterBatchUpdateValuesByDataFilterResponse++;
   if (buildCounterBatchUpdateValuesByDataFilterResponse < 3) {
-    checkUnnamed453(o.responses);
+    checkUnnamed450(o.responses);
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
     unittest.expect(o.totalUpdatedCells, unittest.equals(42));
     unittest.expect(o.totalUpdatedColumns, unittest.equals(42));
@@ -1082,14 +1084,14 @@
   buildCounterBatchUpdateValuesByDataFilterResponse--;
 }
 
-buildUnnamed454() {
+buildUnnamed451() {
   var o = new core.List<api.ValueRange>();
   o.add(buildValueRange());
   o.add(buildValueRange());
   return o;
 }
 
-checkUnnamed454(core.List<api.ValueRange> o) {
+checkUnnamed451(core.List<api.ValueRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValueRange(o[0]);
   checkValueRange(o[1]);
@@ -1100,7 +1102,7 @@
   var o = new api.BatchUpdateValuesRequest();
   buildCounterBatchUpdateValuesRequest++;
   if (buildCounterBatchUpdateValuesRequest < 3) {
-    o.data = buildUnnamed454();
+    o.data = buildUnnamed451();
     o.includeValuesInResponse = true;
     o.responseDateTimeRenderOption = "foo";
     o.responseValueRenderOption = "foo";
@@ -1113,7 +1115,7 @@
 checkBatchUpdateValuesRequest(api.BatchUpdateValuesRequest o) {
   buildCounterBatchUpdateValuesRequest++;
   if (buildCounterBatchUpdateValuesRequest < 3) {
-    checkUnnamed454(o.data);
+    checkUnnamed451(o.data);
     unittest.expect(o.includeValuesInResponse, unittest.isTrue);
     unittest.expect(o.responseDateTimeRenderOption, unittest.equals('foo'));
     unittest.expect(o.responseValueRenderOption, unittest.equals('foo'));
@@ -1122,14 +1124,14 @@
   buildCounterBatchUpdateValuesRequest--;
 }
 
-buildUnnamed455() {
+buildUnnamed452() {
   var o = new core.List<api.UpdateValuesResponse>();
   o.add(buildUpdateValuesResponse());
   o.add(buildUpdateValuesResponse());
   return o;
 }
 
-checkUnnamed455(core.List<api.UpdateValuesResponse> o) {
+checkUnnamed452(core.List<api.UpdateValuesResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUpdateValuesResponse(o[0]);
   checkUpdateValuesResponse(o[1]);
@@ -1140,7 +1142,7 @@
   var o = new api.BatchUpdateValuesResponse();
   buildCounterBatchUpdateValuesResponse++;
   if (buildCounterBatchUpdateValuesResponse < 3) {
-    o.responses = buildUnnamed455();
+    o.responses = buildUnnamed452();
     o.spreadsheetId = "foo";
     o.totalUpdatedCells = 42;
     o.totalUpdatedColumns = 42;
@@ -1154,7 +1156,7 @@
 checkBatchUpdateValuesResponse(api.BatchUpdateValuesResponse o) {
   buildCounterBatchUpdateValuesResponse++;
   if (buildCounterBatchUpdateValuesResponse < 3) {
-    checkUnnamed455(o.responses);
+    checkUnnamed452(o.responses);
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
     unittest.expect(o.totalUpdatedCells, unittest.equals(42));
     unittest.expect(o.totalUpdatedColumns, unittest.equals(42));
@@ -1164,14 +1166,14 @@
   buildCounterBatchUpdateValuesResponse--;
 }
 
-buildUnnamed456() {
+buildUnnamed453() {
   var o = new core.List<api.ConditionValue>();
   o.add(buildConditionValue());
   o.add(buildConditionValue());
   return o;
 }
 
-checkUnnamed456(core.List<api.ConditionValue> o) {
+checkUnnamed453(core.List<api.ConditionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConditionValue(o[0]);
   checkConditionValue(o[1]);
@@ -1183,7 +1185,7 @@
   buildCounterBooleanCondition++;
   if (buildCounterBooleanCondition < 3) {
     o.type = "foo";
-    o.values = buildUnnamed456();
+    o.values = buildUnnamed453();
   }
   buildCounterBooleanCondition--;
   return o;
@@ -1193,7 +1195,7 @@
   buildCounterBooleanCondition++;
   if (buildCounterBooleanCondition < 3) {
     unittest.expect(o.type, unittest.equals('foo'));
-    checkUnnamed456(o.values);
+    checkUnnamed453(o.values);
   }
   buildCounterBooleanCondition--;
 }
@@ -1306,14 +1308,14 @@
   buildCounterBubbleChartSpec--;
 }
 
-buildUnnamed457() {
+buildUnnamed454() {
   var o = new core.List<api.CandlestickData>();
   o.add(buildCandlestickData());
   o.add(buildCandlestickData());
   return o;
 }
 
-checkUnnamed457(core.List<api.CandlestickData> o) {
+checkUnnamed454(core.List<api.CandlestickData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCandlestickData(o[0]);
   checkCandlestickData(o[1]);
@@ -1324,7 +1326,7 @@
   var o = new api.CandlestickChartSpec();
   buildCounterCandlestickChartSpec++;
   if (buildCounterCandlestickChartSpec < 3) {
-    o.data = buildUnnamed457();
+    o.data = buildUnnamed454();
     o.domain = buildCandlestickDomain();
   }
   buildCounterCandlestickChartSpec--;
@@ -1334,7 +1336,7 @@
 checkCandlestickChartSpec(api.CandlestickChartSpec o) {
   buildCounterCandlestickChartSpec++;
   if (buildCounterCandlestickChartSpec < 3) {
-    checkUnnamed457(o.data);
+    checkUnnamed454(o.data);
     checkCandlestickDomain(o.domain);
   }
   buildCounterCandlestickChartSpec--;
@@ -1405,14 +1407,14 @@
   buildCounterCandlestickSeries--;
 }
 
-buildUnnamed458() {
+buildUnnamed455() {
   var o = new core.List<api.TextFormatRun>();
   o.add(buildTextFormatRun());
   o.add(buildTextFormatRun());
   return o;
 }
 
-checkUnnamed458(core.List<api.TextFormatRun> o) {
+checkUnnamed455(core.List<api.TextFormatRun> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTextFormatRun(o[0]);
   checkTextFormatRun(o[1]);
@@ -1430,7 +1432,7 @@
     o.hyperlink = "foo";
     o.note = "foo";
     o.pivotTable = buildPivotTable();
-    o.textFormatRuns = buildUnnamed458();
+    o.textFormatRuns = buildUnnamed455();
     o.userEnteredFormat = buildCellFormat();
     o.userEnteredValue = buildExtendedValue();
   }
@@ -1448,7 +1450,7 @@
     unittest.expect(o.hyperlink, unittest.equals('foo'));
     unittest.expect(o.note, unittest.equals('foo'));
     checkPivotTable(o.pivotTable);
-    checkUnnamed458(o.textFormatRuns);
+    checkUnnamed455(o.textFormatRuns);
     checkCellFormat(o.userEnteredFormat);
     checkExtendedValue(o.userEnteredValue);
   }
@@ -1513,14 +1515,14 @@
   buildCounterChartData--;
 }
 
-buildUnnamed459() {
+buildUnnamed456() {
   var o = new core.List<api.GridRange>();
   o.add(buildGridRange());
   o.add(buildGridRange());
   return o;
 }
 
-checkUnnamed459(core.List<api.GridRange> o) {
+checkUnnamed456(core.List<api.GridRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGridRange(o[0]);
   checkGridRange(o[1]);
@@ -1531,7 +1533,7 @@
   var o = new api.ChartSourceRange();
   buildCounterChartSourceRange++;
   if (buildCounterChartSourceRange < 3) {
-    o.sources = buildUnnamed459();
+    o.sources = buildUnnamed456();
   }
   buildCounterChartSourceRange--;
   return o;
@@ -1540,7 +1542,7 @@
 checkChartSourceRange(api.ChartSourceRange o) {
   buildCounterChartSourceRange++;
   if (buildCounterChartSourceRange < 3) {
-    checkUnnamed459(o.sources);
+    checkUnnamed456(o.sources);
   }
   buildCounterChartSourceRange--;
 }
@@ -1567,6 +1569,7 @@
     o.title = "foo";
     o.titleTextFormat = buildTextFormat();
     o.titleTextPosition = buildTextPosition();
+    o.waterfallChart = buildWaterfallChartSpec();
   }
   buildCounterChartSpec--;
   return o;
@@ -1592,6 +1595,7 @@
     unittest.expect(o.title, unittest.equals('foo'));
     checkTextFormat(o.titleTextFormat);
     checkTextPosition(o.titleTextPosition);
+    checkWaterfallChartSpec(o.waterfallChart);
   }
   buildCounterChartSpec--;
 }
@@ -1697,14 +1701,14 @@
   buildCounterConditionValue--;
 }
 
-buildUnnamed460() {
+buildUnnamed457() {
   var o = new core.List<api.GridRange>();
   o.add(buildGridRange());
   o.add(buildGridRange());
   return o;
 }
 
-checkUnnamed460(core.List<api.GridRange> o) {
+checkUnnamed457(core.List<api.GridRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGridRange(o[0]);
   checkGridRange(o[1]);
@@ -1717,7 +1721,7 @@
   if (buildCounterConditionalFormatRule < 3) {
     o.booleanRule = buildBooleanRule();
     o.gradientRule = buildGradientRule();
-    o.ranges = buildUnnamed460();
+    o.ranges = buildUnnamed457();
   }
   buildCounterConditionalFormatRule--;
   return o;
@@ -1728,7 +1732,7 @@
   if (buildCounterConditionalFormatRule < 3) {
     checkBooleanRule(o.booleanRule);
     checkGradientRule(o.gradientRule);
-    checkUnnamed460(o.ranges);
+    checkUnnamed457(o.ranges);
   }
   buildCounterConditionalFormatRule--;
 }
@@ -1862,7 +1866,7 @@
   buildCounterDataFilter--;
 }
 
-buildUnnamed461() {
+buildUnnamed458() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -1877,7 +1881,7 @@
   return o;
 }
 
-checkUnnamed461(core.List<core.Object> o) {
+checkUnnamed458(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map;
   unittest.expect(casted1, unittest.hasLength(3));
@@ -1891,17 +1895,17 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed462() {
+buildUnnamed459() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed461());
-  o.add(buildUnnamed461());
+  o.add(buildUnnamed458());
+  o.add(buildUnnamed458());
   return o;
 }
 
-checkUnnamed462(core.List<core.List<core.Object>> o) {
+checkUnnamed459(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed461(o[0]);
-  checkUnnamed461(o[1]);
+  checkUnnamed458(o[0]);
+  checkUnnamed458(o[1]);
 }
 
 core.int buildCounterDataFilterValueRange = 0;
@@ -1911,7 +1915,7 @@
   if (buildCounterDataFilterValueRange < 3) {
     o.dataFilter = buildDataFilter();
     o.majorDimension = "foo";
-    o.values = buildUnnamed462();
+    o.values = buildUnnamed459();
   }
   buildCounterDataFilterValueRange--;
   return o;
@@ -1922,7 +1926,7 @@
   if (buildCounterDataFilterValueRange < 3) {
     checkDataFilter(o.dataFilter);
     unittest.expect(o.majorDimension, unittest.equals('foo'));
-    checkUnnamed462(o.values);
+    checkUnnamed459(o.values);
   }
   buildCounterDataFilterValueRange--;
 }
@@ -2032,14 +2036,14 @@
   buildCounterDeleteDeveloperMetadataRequest--;
 }
 
-buildUnnamed463() {
+buildUnnamed460() {
   var o = new core.List<api.DeveloperMetadata>();
   o.add(buildDeveloperMetadata());
   o.add(buildDeveloperMetadata());
   return o;
 }
 
-checkUnnamed463(core.List<api.DeveloperMetadata> o) {
+checkUnnamed460(core.List<api.DeveloperMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeveloperMetadata(o[0]);
   checkDeveloperMetadata(o[1]);
@@ -2050,7 +2054,7 @@
   var o = new api.DeleteDeveloperMetadataResponse();
   buildCounterDeleteDeveloperMetadataResponse++;
   if (buildCounterDeleteDeveloperMetadataResponse < 3) {
-    o.deletedDeveloperMetadata = buildUnnamed463();
+    o.deletedDeveloperMetadata = buildUnnamed460();
   }
   buildCounterDeleteDeveloperMetadataResponse--;
   return o;
@@ -2059,7 +2063,7 @@
 checkDeleteDeveloperMetadataResponse(api.DeleteDeveloperMetadataResponse o) {
   buildCounterDeleteDeveloperMetadataResponse++;
   if (buildCounterDeleteDeveloperMetadataResponse < 3) {
-    checkUnnamed463(o.deletedDeveloperMetadata);
+    checkUnnamed460(o.deletedDeveloperMetadata);
   }
   buildCounterDeleteDeveloperMetadataResponse--;
 }
@@ -2282,14 +2286,14 @@
   buildCounterDeveloperMetadataLookup--;
 }
 
-buildUnnamed464() {
+buildUnnamed461() {
   var o = new core.List<api.DeveloperMetadata>();
   o.add(buildDeveloperMetadata());
   o.add(buildDeveloperMetadata());
   return o;
 }
 
-checkUnnamed464(core.List<api.DeveloperMetadata> o) {
+checkUnnamed461(core.List<api.DeveloperMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeveloperMetadata(o[0]);
   checkDeveloperMetadata(o[1]);
@@ -2300,7 +2304,7 @@
   var o = new api.DimensionProperties();
   buildCounterDimensionProperties++;
   if (buildCounterDimensionProperties < 3) {
-    o.developerMetadata = buildUnnamed464();
+    o.developerMetadata = buildUnnamed461();
     o.hiddenByFilter = true;
     o.hiddenByUser = true;
     o.pixelSize = 42;
@@ -2312,7 +2316,7 @@
 checkDimensionProperties(api.DimensionProperties o) {
   buildCounterDimensionProperties++;
   if (buildCounterDimensionProperties < 3) {
-    checkUnnamed464(o.developerMetadata);
+    checkUnnamed461(o.developerMetadata);
     unittest.expect(o.hiddenByFilter, unittest.isTrue);
     unittest.expect(o.hiddenByUser, unittest.isTrue);
     unittest.expect(o.pixelSize, unittest.equals(42));
@@ -2427,27 +2431,27 @@
   buildCounterDuplicateSheetResponse--;
 }
 
-buildUnnamed465() {
+buildUnnamed462() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed465(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'));
 }
 
-buildUnnamed466() {
+buildUnnamed463() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed466(core.List<core.String> o) {
+checkUnnamed463(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2459,8 +2463,8 @@
   buildCounterEditors++;
   if (buildCounterEditors < 3) {
     o.domainUsersCanEdit = true;
-    o.groups = buildUnnamed465();
-    o.users = buildUnnamed466();
+    o.groups = buildUnnamed462();
+    o.users = buildUnnamed463();
   }
   buildCounterEditors--;
   return o;
@@ -2470,8 +2474,8 @@
   buildCounterEditors++;
   if (buildCounterEditors < 3) {
     unittest.expect(o.domainUsersCanEdit, unittest.isTrue);
-    checkUnnamed465(o.groups);
-    checkUnnamed466(o.users);
+    checkUnnamed462(o.groups);
+    checkUnnamed463(o.users);
   }
   buildCounterEditors--;
 }
@@ -2570,14 +2574,14 @@
   buildCounterExtendedValue--;
 }
 
-buildUnnamed467() {
+buildUnnamed464() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed467(core.List<core.String> o) {
+checkUnnamed464(core.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 +2593,7 @@
   buildCounterFilterCriteria++;
   if (buildCounterFilterCriteria < 3) {
     o.condition = buildBooleanCondition();
-    o.hiddenValues = buildUnnamed467();
+    o.hiddenValues = buildUnnamed464();
   }
   buildCounterFilterCriteria--;
   return o;
@@ -2599,32 +2603,32 @@
   buildCounterFilterCriteria++;
   if (buildCounterFilterCriteria < 3) {
     checkBooleanCondition(o.condition);
-    checkUnnamed467(o.hiddenValues);
+    checkUnnamed464(o.hiddenValues);
   }
   buildCounterFilterCriteria--;
 }
 
-buildUnnamed468() {
+buildUnnamed465() {
   var o = new core.Map<core.String, api.FilterCriteria>();
   o["x"] = buildFilterCriteria();
   o["y"] = buildFilterCriteria();
   return o;
 }
 
-checkUnnamed468(core.Map<core.String, api.FilterCriteria> o) {
+checkUnnamed465(core.Map<core.String, api.FilterCriteria> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilterCriteria(o["x"]);
   checkFilterCriteria(o["y"]);
 }
 
-buildUnnamed469() {
+buildUnnamed466() {
   var o = new core.List<api.SortSpec>();
   o.add(buildSortSpec());
   o.add(buildSortSpec());
   return o;
 }
 
-checkUnnamed469(core.List<api.SortSpec> o) {
+checkUnnamed466(core.List<api.SortSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortSpec(o[0]);
   checkSortSpec(o[1]);
@@ -2635,11 +2639,11 @@
   var o = new api.FilterView();
   buildCounterFilterView++;
   if (buildCounterFilterView < 3) {
-    o.criteria = buildUnnamed468();
+    o.criteria = buildUnnamed465();
     o.filterViewId = 42;
     o.namedRangeId = "foo";
     o.range = buildGridRange();
-    o.sortSpecs = buildUnnamed469();
+    o.sortSpecs = buildUnnamed466();
     o.title = "foo";
   }
   buildCounterFilterView--;
@@ -2649,11 +2653,11 @@
 checkFilterView(api.FilterView o) {
   buildCounterFilterView++;
   if (buildCounterFilterView < 3) {
-    checkUnnamed468(o.criteria);
+    checkUnnamed465(o.criteria);
     unittest.expect(o.filterViewId, unittest.equals(42));
     unittest.expect(o.namedRangeId, unittest.equals('foo'));
     checkGridRange(o.range);
-    checkUnnamed469(o.sortSpecs);
+    checkUnnamed466(o.sortSpecs);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterFilterView--;
@@ -2721,14 +2725,14 @@
   buildCounterFindReplaceResponse--;
 }
 
-buildUnnamed470() {
+buildUnnamed467() {
   var o = new core.List<api.DataFilter>();
   o.add(buildDataFilter());
   o.add(buildDataFilter());
   return o;
 }
 
-checkUnnamed470(core.List<api.DataFilter> o) {
+checkUnnamed467(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataFilter(o[0]);
   checkDataFilter(o[1]);
@@ -2739,7 +2743,7 @@
   var o = new api.GetSpreadsheetByDataFilterRequest();
   buildCounterGetSpreadsheetByDataFilterRequest++;
   if (buildCounterGetSpreadsheetByDataFilterRequest < 3) {
-    o.dataFilters = buildUnnamed470();
+    o.dataFilters = buildUnnamed467();
     o.includeGridData = true;
   }
   buildCounterGetSpreadsheetByDataFilterRequest--;
@@ -2750,7 +2754,7 @@
     api.GetSpreadsheetByDataFilterRequest o) {
   buildCounterGetSpreadsheetByDataFilterRequest++;
   if (buildCounterGetSpreadsheetByDataFilterRequest < 3) {
-    checkUnnamed470(o.dataFilters);
+    checkUnnamed467(o.dataFilters);
     unittest.expect(o.includeGridData, unittest.isTrue);
   }
   buildCounterGetSpreadsheetByDataFilterRequest--;
@@ -2802,40 +2806,40 @@
   buildCounterGridCoordinate--;
 }
 
-buildUnnamed471() {
+buildUnnamed468() {
   var o = new core.List<api.DimensionProperties>();
   o.add(buildDimensionProperties());
   o.add(buildDimensionProperties());
   return o;
 }
 
-checkUnnamed471(core.List<api.DimensionProperties> o) {
+checkUnnamed468(core.List<api.DimensionProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionProperties(o[0]);
   checkDimensionProperties(o[1]);
 }
 
-buildUnnamed472() {
+buildUnnamed469() {
   var o = new core.List<api.RowData>();
   o.add(buildRowData());
   o.add(buildRowData());
   return o;
 }
 
-checkUnnamed472(core.List<api.RowData> o) {
+checkUnnamed469(core.List<api.RowData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRowData(o[0]);
   checkRowData(o[1]);
 }
 
-buildUnnamed473() {
+buildUnnamed470() {
   var o = new core.List<api.DimensionProperties>();
   o.add(buildDimensionProperties());
   o.add(buildDimensionProperties());
   return o;
 }
 
-checkUnnamed473(core.List<api.DimensionProperties> o) {
+checkUnnamed470(core.List<api.DimensionProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionProperties(o[0]);
   checkDimensionProperties(o[1]);
@@ -2846,9 +2850,9 @@
   var o = new api.GridData();
   buildCounterGridData++;
   if (buildCounterGridData < 3) {
-    o.columnMetadata = buildUnnamed471();
-    o.rowData = buildUnnamed472();
-    o.rowMetadata = buildUnnamed473();
+    o.columnMetadata = buildUnnamed468();
+    o.rowData = buildUnnamed469();
+    o.rowMetadata = buildUnnamed470();
     o.startColumn = 42;
     o.startRow = 42;
   }
@@ -2859,9 +2863,9 @@
 checkGridData(api.GridData o) {
   buildCounterGridData++;
   if (buildCounterGridData < 3) {
-    checkUnnamed471(o.columnMetadata);
-    checkUnnamed472(o.rowData);
-    checkUnnamed473(o.rowMetadata);
+    checkUnnamed468(o.columnMetadata);
+    checkUnnamed469(o.rowData);
+    checkUnnamed470(o.rowMetadata);
     unittest.expect(o.startColumn, unittest.equals(42));
     unittest.expect(o.startRow, unittest.equals(42));
   }
@@ -2922,14 +2926,14 @@
   buildCounterGridRange--;
 }
 
-buildUnnamed474() {
+buildUnnamed471() {
   var o = new core.List<api.HistogramSeries>();
   o.add(buildHistogramSeries());
   o.add(buildHistogramSeries());
   return o;
 }
 
-checkUnnamed474(core.List<api.HistogramSeries> o) {
+checkUnnamed471(core.List<api.HistogramSeries> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHistogramSeries(o[0]);
   checkHistogramSeries(o[1]);
@@ -2943,7 +2947,7 @@
     o.bucketSize = 42.0;
     o.legendPosition = "foo";
     o.outlierPercentile = 42.0;
-    o.series = buildUnnamed474();
+    o.series = buildUnnamed471();
     o.showItemDividers = true;
   }
   buildCounterHistogramChartSpec--;
@@ -2956,7 +2960,7 @@
     unittest.expect(o.bucketSize, unittest.equals(42.0));
     unittest.expect(o.legendPosition, unittest.equals('foo'));
     unittest.expect(o.outlierPercentile, unittest.equals(42.0));
-    checkUnnamed474(o.series);
+    checkUnnamed471(o.series);
     unittest.expect(o.showItemDividers, unittest.isTrue);
   }
   buildCounterHistogramChartSpec--;
@@ -3069,14 +3073,35 @@
   buildCounterIterativeCalculationSettings--;
 }
 
-buildUnnamed475() {
+core.int buildCounterLineStyle = 0;
+buildLineStyle() {
+  var o = new api.LineStyle();
+  buildCounterLineStyle++;
+  if (buildCounterLineStyle < 3) {
+    o.type = "foo";
+    o.width = 42;
+  }
+  buildCounterLineStyle--;
+  return o;
+}
+
+checkLineStyle(api.LineStyle o) {
+  buildCounterLineStyle++;
+  if (buildCounterLineStyle < 3) {
+    unittest.expect(o.type, unittest.equals('foo'));
+    unittest.expect(o.width, unittest.equals(42));
+  }
+  buildCounterLineStyle--;
+}
+
+buildUnnamed472() {
   var o = new core.List<api.DataFilter>();
   o.add(buildDataFilter());
   o.add(buildDataFilter());
   return o;
 }
 
-checkUnnamed475(core.List<api.DataFilter> o) {
+checkUnnamed472(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataFilter(o[0]);
   checkDataFilter(o[1]);
@@ -3087,7 +3112,7 @@
   var o = new api.MatchedDeveloperMetadata();
   buildCounterMatchedDeveloperMetadata++;
   if (buildCounterMatchedDeveloperMetadata < 3) {
-    o.dataFilters = buildUnnamed475();
+    o.dataFilters = buildUnnamed472();
     o.developerMetadata = buildDeveloperMetadata();
   }
   buildCounterMatchedDeveloperMetadata--;
@@ -3097,20 +3122,20 @@
 checkMatchedDeveloperMetadata(api.MatchedDeveloperMetadata o) {
   buildCounterMatchedDeveloperMetadata++;
   if (buildCounterMatchedDeveloperMetadata < 3) {
-    checkUnnamed475(o.dataFilters);
+    checkUnnamed472(o.dataFilters);
     checkDeveloperMetadata(o.developerMetadata);
   }
   buildCounterMatchedDeveloperMetadata--;
 }
 
-buildUnnamed476() {
+buildUnnamed473() {
   var o = new core.List<api.DataFilter>();
   o.add(buildDataFilter());
   o.add(buildDataFilter());
   return o;
 }
 
-checkUnnamed476(core.List<api.DataFilter> o) {
+checkUnnamed473(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataFilter(o[0]);
   checkDataFilter(o[1]);
@@ -3121,7 +3146,7 @@
   var o = new api.MatchedValueRange();
   buildCounterMatchedValueRange++;
   if (buildCounterMatchedValueRange < 3) {
-    o.dataFilters = buildUnnamed476();
+    o.dataFilters = buildUnnamed473();
     o.valueRange = buildValueRange();
   }
   buildCounterMatchedValueRange--;
@@ -3131,7 +3156,7 @@
 checkMatchedValueRange(api.MatchedValueRange o) {
   buildCounterMatchedValueRange++;
   if (buildCounterMatchedValueRange < 3) {
-    checkUnnamed476(o.dataFilters);
+    checkUnnamed473(o.dataFilters);
     checkValueRange(o.valueRange);
   }
   buildCounterMatchedValueRange--;
@@ -3358,14 +3383,14 @@
   buildCounterPieChartSpec--;
 }
 
-buildUnnamed477() {
+buildUnnamed474() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed477(core.List<core.String> o) {
+checkUnnamed474(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3376,7 +3401,7 @@
   var o = new api.PivotFilterCriteria();
   buildCounterPivotFilterCriteria++;
   if (buildCounterPivotFilterCriteria < 3) {
-    o.visibleValues = buildUnnamed477();
+    o.visibleValues = buildUnnamed474();
   }
   buildCounterPivotFilterCriteria--;
   return o;
@@ -3385,19 +3410,19 @@
 checkPivotFilterCriteria(api.PivotFilterCriteria o) {
   buildCounterPivotFilterCriteria++;
   if (buildCounterPivotFilterCriteria < 3) {
-    checkUnnamed477(o.visibleValues);
+    checkUnnamed474(o.visibleValues);
   }
   buildCounterPivotFilterCriteria--;
 }
 
-buildUnnamed478() {
+buildUnnamed475() {
   var o = new core.List<api.PivotGroupValueMetadata>();
   o.add(buildPivotGroupValueMetadata());
   o.add(buildPivotGroupValueMetadata());
   return o;
 }
 
-checkUnnamed478(core.List<api.PivotGroupValueMetadata> o) {
+checkUnnamed475(core.List<api.PivotGroupValueMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPivotGroupValueMetadata(o[0]);
   checkPivotGroupValueMetadata(o[1]);
@@ -3412,7 +3437,7 @@
     o.sortOrder = "foo";
     o.sourceColumnOffset = 42;
     o.valueBucket = buildPivotGroupSortValueBucket();
-    o.valueMetadata = buildUnnamed478();
+    o.valueMetadata = buildUnnamed475();
   }
   buildCounterPivotGroup--;
   return o;
@@ -3425,19 +3450,19 @@
     unittest.expect(o.sortOrder, unittest.equals('foo'));
     unittest.expect(o.sourceColumnOffset, unittest.equals(42));
     checkPivotGroupSortValueBucket(o.valueBucket);
-    checkUnnamed478(o.valueMetadata);
+    checkUnnamed475(o.valueMetadata);
   }
   buildCounterPivotGroup--;
 }
 
-buildUnnamed479() {
+buildUnnamed476() {
   var o = new core.List<api.ExtendedValue>();
   o.add(buildExtendedValue());
   o.add(buildExtendedValue());
   return o;
 }
 
-checkUnnamed479(core.List<api.ExtendedValue> o) {
+checkUnnamed476(core.List<api.ExtendedValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExtendedValue(o[0]);
   checkExtendedValue(o[1]);
@@ -3448,7 +3473,7 @@
   var o = new api.PivotGroupSortValueBucket();
   buildCounterPivotGroupSortValueBucket++;
   if (buildCounterPivotGroupSortValueBucket < 3) {
-    o.buckets = buildUnnamed479();
+    o.buckets = buildUnnamed476();
     o.valuesIndex = 42;
   }
   buildCounterPivotGroupSortValueBucket--;
@@ -3458,7 +3483,7 @@
 checkPivotGroupSortValueBucket(api.PivotGroupSortValueBucket o) {
   buildCounterPivotGroupSortValueBucket++;
   if (buildCounterPivotGroupSortValueBucket < 3) {
-    checkUnnamed479(o.buckets);
+    checkUnnamed476(o.buckets);
     unittest.expect(o.valuesIndex, unittest.equals(42));
   }
   buildCounterPivotGroupSortValueBucket--;
@@ -3485,53 +3510,53 @@
   buildCounterPivotGroupValueMetadata--;
 }
 
-buildUnnamed480() {
+buildUnnamed477() {
   var o = new core.List<api.PivotGroup>();
   o.add(buildPivotGroup());
   o.add(buildPivotGroup());
   return o;
 }
 
-checkUnnamed480(core.List<api.PivotGroup> o) {
+checkUnnamed477(core.List<api.PivotGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPivotGroup(o[0]);
   checkPivotGroup(o[1]);
 }
 
-buildUnnamed481() {
+buildUnnamed478() {
   var o = new core.Map<core.String, api.PivotFilterCriteria>();
   o["x"] = buildPivotFilterCriteria();
   o["y"] = buildPivotFilterCriteria();
   return o;
 }
 
-checkUnnamed481(core.Map<core.String, api.PivotFilterCriteria> o) {
+checkUnnamed478(core.Map<core.String, api.PivotFilterCriteria> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPivotFilterCriteria(o["x"]);
   checkPivotFilterCriteria(o["y"]);
 }
 
-buildUnnamed482() {
+buildUnnamed479() {
   var o = new core.List<api.PivotGroup>();
   o.add(buildPivotGroup());
   o.add(buildPivotGroup());
   return o;
 }
 
-checkUnnamed482(core.List<api.PivotGroup> o) {
+checkUnnamed479(core.List<api.PivotGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPivotGroup(o[0]);
   checkPivotGroup(o[1]);
 }
 
-buildUnnamed483() {
+buildUnnamed480() {
   var o = new core.List<api.PivotValue>();
   o.add(buildPivotValue());
   o.add(buildPivotValue());
   return o;
 }
 
-checkUnnamed483(core.List<api.PivotValue> o) {
+checkUnnamed480(core.List<api.PivotValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPivotValue(o[0]);
   checkPivotValue(o[1]);
@@ -3542,12 +3567,12 @@
   var o = new api.PivotTable();
   buildCounterPivotTable++;
   if (buildCounterPivotTable < 3) {
-    o.columns = buildUnnamed480();
-    o.criteria = buildUnnamed481();
-    o.rows = buildUnnamed482();
+    o.columns = buildUnnamed477();
+    o.criteria = buildUnnamed478();
+    o.rows = buildUnnamed479();
     o.source = buildGridRange();
     o.valueLayout = "foo";
-    o.values = buildUnnamed483();
+    o.values = buildUnnamed480();
   }
   buildCounterPivotTable--;
   return o;
@@ -3556,12 +3581,12 @@
 checkPivotTable(api.PivotTable o) {
   buildCounterPivotTable++;
   if (buildCounterPivotTable < 3) {
-    checkUnnamed480(o.columns);
-    checkUnnamed481(o.criteria);
-    checkUnnamed482(o.rows);
+    checkUnnamed477(o.columns);
+    checkUnnamed478(o.criteria);
+    checkUnnamed479(o.rows);
     checkGridRange(o.source);
     unittest.expect(o.valueLayout, unittest.equals('foo'));
-    checkUnnamed483(o.values);
+    checkUnnamed480(o.values);
   }
   buildCounterPivotTable--;
 }
@@ -3591,14 +3616,14 @@
   buildCounterPivotValue--;
 }
 
-buildUnnamed484() {
+buildUnnamed481() {
   var o = new core.List<api.GridRange>();
   o.add(buildGridRange());
   o.add(buildGridRange());
   return o;
 }
 
-checkUnnamed484(core.List<api.GridRange> o) {
+checkUnnamed481(core.List<api.GridRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGridRange(o[0]);
   checkGridRange(o[1]);
@@ -3615,7 +3640,7 @@
     o.protectedRangeId = 42;
     o.range = buildGridRange();
     o.requestingUserCanEdit = true;
-    o.unprotectedRanges = buildUnnamed484();
+    o.unprotectedRanges = buildUnnamed481();
     o.warningOnly = true;
   }
   buildCounterProtectedRange--;
@@ -3631,7 +3656,7 @@
     unittest.expect(o.protectedRangeId, unittest.equals(42));
     checkGridRange(o.range);
     unittest.expect(o.requestingUserCanEdit, unittest.isTrue);
-    checkUnnamed484(o.unprotectedRanges);
+    checkUnnamed481(o.unprotectedRanges);
     unittest.expect(o.warningOnly, unittest.isTrue);
   }
   buildCounterProtectedRange--;
@@ -3850,14 +3875,14 @@
   buildCounterResponse--;
 }
 
-buildUnnamed485() {
+buildUnnamed482() {
   var o = new core.List<api.CellData>();
   o.add(buildCellData());
   o.add(buildCellData());
   return o;
 }
 
-checkUnnamed485(core.List<api.CellData> o) {
+checkUnnamed482(core.List<api.CellData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCellData(o[0]);
   checkCellData(o[1]);
@@ -3868,7 +3893,7 @@
   var o = new api.RowData();
   buildCounterRowData++;
   if (buildCounterRowData < 3) {
-    o.values = buildUnnamed485();
+    o.values = buildUnnamed482();
   }
   buildCounterRowData--;
   return o;
@@ -3877,19 +3902,19 @@
 checkRowData(api.RowData o) {
   buildCounterRowData++;
   if (buildCounterRowData < 3) {
-    checkUnnamed485(o.values);
+    checkUnnamed482(o.values);
   }
   buildCounterRowData--;
 }
 
-buildUnnamed486() {
+buildUnnamed483() {
   var o = new core.List<api.DataFilter>();
   o.add(buildDataFilter());
   o.add(buildDataFilter());
   return o;
 }
 
-checkUnnamed486(core.List<api.DataFilter> o) {
+checkUnnamed483(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataFilter(o[0]);
   checkDataFilter(o[1]);
@@ -3900,7 +3925,7 @@
   var o = new api.SearchDeveloperMetadataRequest();
   buildCounterSearchDeveloperMetadataRequest++;
   if (buildCounterSearchDeveloperMetadataRequest < 3) {
-    o.dataFilters = buildUnnamed486();
+    o.dataFilters = buildUnnamed483();
   }
   buildCounterSearchDeveloperMetadataRequest--;
   return o;
@@ -3909,19 +3934,19 @@
 checkSearchDeveloperMetadataRequest(api.SearchDeveloperMetadataRequest o) {
   buildCounterSearchDeveloperMetadataRequest++;
   if (buildCounterSearchDeveloperMetadataRequest < 3) {
-    checkUnnamed486(o.dataFilters);
+    checkUnnamed483(o.dataFilters);
   }
   buildCounterSearchDeveloperMetadataRequest--;
 }
 
-buildUnnamed487() {
+buildUnnamed484() {
   var o = new core.List<api.MatchedDeveloperMetadata>();
   o.add(buildMatchedDeveloperMetadata());
   o.add(buildMatchedDeveloperMetadata());
   return o;
 }
 
-checkUnnamed487(core.List<api.MatchedDeveloperMetadata> o) {
+checkUnnamed484(core.List<api.MatchedDeveloperMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMatchedDeveloperMetadata(o[0]);
   checkMatchedDeveloperMetadata(o[1]);
@@ -3932,7 +3957,7 @@
   var o = new api.SearchDeveloperMetadataResponse();
   buildCounterSearchDeveloperMetadataResponse++;
   if (buildCounterSearchDeveloperMetadataResponse < 3) {
-    o.matchedDeveloperMetadata = buildUnnamed487();
+    o.matchedDeveloperMetadata = buildUnnamed484();
   }
   buildCounterSearchDeveloperMetadataResponse--;
   return o;
@@ -3941,7 +3966,7 @@
 checkSearchDeveloperMetadataResponse(api.SearchDeveloperMetadataResponse o) {
   buildCounterSearchDeveloperMetadataResponse++;
   if (buildCounterSearchDeveloperMetadataResponse < 3) {
-    checkUnnamed487(o.matchedDeveloperMetadata);
+    checkUnnamed484(o.matchedDeveloperMetadata);
   }
   buildCounterSearchDeveloperMetadataResponse--;
 }
@@ -3986,105 +4011,105 @@
   buildCounterSetDataValidationRequest--;
 }
 
-buildUnnamed488() {
+buildUnnamed485() {
   var o = new core.List<api.BandedRange>();
   o.add(buildBandedRange());
   o.add(buildBandedRange());
   return o;
 }
 
-checkUnnamed488(core.List<api.BandedRange> o) {
+checkUnnamed485(core.List<api.BandedRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBandedRange(o[0]);
   checkBandedRange(o[1]);
 }
 
-buildUnnamed489() {
+buildUnnamed486() {
   var o = new core.List<api.EmbeddedChart>();
   o.add(buildEmbeddedChart());
   o.add(buildEmbeddedChart());
   return o;
 }
 
-checkUnnamed489(core.List<api.EmbeddedChart> o) {
+checkUnnamed486(core.List<api.EmbeddedChart> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEmbeddedChart(o[0]);
   checkEmbeddedChart(o[1]);
 }
 
-buildUnnamed490() {
+buildUnnamed487() {
   var o = new core.List<api.ConditionalFormatRule>();
   o.add(buildConditionalFormatRule());
   o.add(buildConditionalFormatRule());
   return o;
 }
 
-checkUnnamed490(core.List<api.ConditionalFormatRule> o) {
+checkUnnamed487(core.List<api.ConditionalFormatRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConditionalFormatRule(o[0]);
   checkConditionalFormatRule(o[1]);
 }
 
-buildUnnamed491() {
+buildUnnamed488() {
   var o = new core.List<api.GridData>();
   o.add(buildGridData());
   o.add(buildGridData());
   return o;
 }
 
-checkUnnamed491(core.List<api.GridData> o) {
+checkUnnamed488(core.List<api.GridData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGridData(o[0]);
   checkGridData(o[1]);
 }
 
-buildUnnamed492() {
+buildUnnamed489() {
   var o = new core.List<api.DeveloperMetadata>();
   o.add(buildDeveloperMetadata());
   o.add(buildDeveloperMetadata());
   return o;
 }
 
-checkUnnamed492(core.List<api.DeveloperMetadata> o) {
+checkUnnamed489(core.List<api.DeveloperMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeveloperMetadata(o[0]);
   checkDeveloperMetadata(o[1]);
 }
 
-buildUnnamed493() {
+buildUnnamed490() {
   var o = new core.List<api.FilterView>();
   o.add(buildFilterView());
   o.add(buildFilterView());
   return o;
 }
 
-checkUnnamed493(core.List<api.FilterView> o) {
+checkUnnamed490(core.List<api.FilterView> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilterView(o[0]);
   checkFilterView(o[1]);
 }
 
-buildUnnamed494() {
+buildUnnamed491() {
   var o = new core.List<api.GridRange>();
   o.add(buildGridRange());
   o.add(buildGridRange());
   return o;
 }
 
-checkUnnamed494(core.List<api.GridRange> o) {
+checkUnnamed491(core.List<api.GridRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGridRange(o[0]);
   checkGridRange(o[1]);
 }
 
-buildUnnamed495() {
+buildUnnamed492() {
   var o = new core.List<api.ProtectedRange>();
   o.add(buildProtectedRange());
   o.add(buildProtectedRange());
   return o;
 }
 
-checkUnnamed495(core.List<api.ProtectedRange> o) {
+checkUnnamed492(core.List<api.ProtectedRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProtectedRange(o[0]);
   checkProtectedRange(o[1]);
@@ -4095,16 +4120,16 @@
   var o = new api.Sheet();
   buildCounterSheet++;
   if (buildCounterSheet < 3) {
-    o.bandedRanges = buildUnnamed488();
+    o.bandedRanges = buildUnnamed485();
     o.basicFilter = buildBasicFilter();
-    o.charts = buildUnnamed489();
-    o.conditionalFormats = buildUnnamed490();
-    o.data = buildUnnamed491();
-    o.developerMetadata = buildUnnamed492();
-    o.filterViews = buildUnnamed493();
-    o.merges = buildUnnamed494();
+    o.charts = buildUnnamed486();
+    o.conditionalFormats = buildUnnamed487();
+    o.data = buildUnnamed488();
+    o.developerMetadata = buildUnnamed489();
+    o.filterViews = buildUnnamed490();
+    o.merges = buildUnnamed491();
     o.properties = buildSheetProperties();
-    o.protectedRanges = buildUnnamed495();
+    o.protectedRanges = buildUnnamed492();
   }
   buildCounterSheet--;
   return o;
@@ -4113,16 +4138,16 @@
 checkSheet(api.Sheet o) {
   buildCounterSheet++;
   if (buildCounterSheet < 3) {
-    checkUnnamed488(o.bandedRanges);
+    checkUnnamed485(o.bandedRanges);
     checkBasicFilter(o.basicFilter);
-    checkUnnamed489(o.charts);
-    checkUnnamed490(o.conditionalFormats);
-    checkUnnamed491(o.data);
-    checkUnnamed492(o.developerMetadata);
-    checkUnnamed493(o.filterViews);
-    checkUnnamed494(o.merges);
+    checkUnnamed486(o.charts);
+    checkUnnamed487(o.conditionalFormats);
+    checkUnnamed488(o.data);
+    checkUnnamed489(o.developerMetadata);
+    checkUnnamed490(o.filterViews);
+    checkUnnamed491(o.merges);
     checkSheetProperties(o.properties);
-    checkUnnamed495(o.protectedRanges);
+    checkUnnamed492(o.protectedRanges);
   }
   buildCounterSheet--;
 }
@@ -4160,14 +4185,14 @@
   buildCounterSheetProperties--;
 }
 
-buildUnnamed496() {
+buildUnnamed493() {
   var o = new core.List<api.SortSpec>();
   o.add(buildSortSpec());
   o.add(buildSortSpec());
   return o;
 }
 
-checkUnnamed496(core.List<api.SortSpec> o) {
+checkUnnamed493(core.List<api.SortSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortSpec(o[0]);
   checkSortSpec(o[1]);
@@ -4179,7 +4204,7 @@
   buildCounterSortRangeRequest++;
   if (buildCounterSortRangeRequest < 3) {
     o.range = buildGridRange();
-    o.sortSpecs = buildUnnamed496();
+    o.sortSpecs = buildUnnamed493();
   }
   buildCounterSortRangeRequest--;
   return o;
@@ -4189,7 +4214,7 @@
   buildCounterSortRangeRequest++;
   if (buildCounterSortRangeRequest < 3) {
     checkGridRange(o.range);
-    checkUnnamed496(o.sortSpecs);
+    checkUnnamed493(o.sortSpecs);
   }
   buildCounterSortRangeRequest--;
 }
@@ -4238,40 +4263,40 @@
   buildCounterSourceAndDestination--;
 }
 
-buildUnnamed497() {
+buildUnnamed494() {
   var o = new core.List<api.DeveloperMetadata>();
   o.add(buildDeveloperMetadata());
   o.add(buildDeveloperMetadata());
   return o;
 }
 
-checkUnnamed497(core.List<api.DeveloperMetadata> o) {
+checkUnnamed494(core.List<api.DeveloperMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeveloperMetadata(o[0]);
   checkDeveloperMetadata(o[1]);
 }
 
-buildUnnamed498() {
+buildUnnamed495() {
   var o = new core.List<api.NamedRange>();
   o.add(buildNamedRange());
   o.add(buildNamedRange());
   return o;
 }
 
-checkUnnamed498(core.List<api.NamedRange> o) {
+checkUnnamed495(core.List<api.NamedRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNamedRange(o[0]);
   checkNamedRange(o[1]);
 }
 
-buildUnnamed499() {
+buildUnnamed496() {
   var o = new core.List<api.Sheet>();
   o.add(buildSheet());
   o.add(buildSheet());
   return o;
 }
 
-checkUnnamed499(core.List<api.Sheet> o) {
+checkUnnamed496(core.List<api.Sheet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSheet(o[0]);
   checkSheet(o[1]);
@@ -4282,10 +4307,10 @@
   var o = new api.Spreadsheet();
   buildCounterSpreadsheet++;
   if (buildCounterSpreadsheet < 3) {
-    o.developerMetadata = buildUnnamed497();
-    o.namedRanges = buildUnnamed498();
+    o.developerMetadata = buildUnnamed494();
+    o.namedRanges = buildUnnamed495();
     o.properties = buildSpreadsheetProperties();
-    o.sheets = buildUnnamed499();
+    o.sheets = buildUnnamed496();
     o.spreadsheetId = "foo";
     o.spreadsheetUrl = "foo";
   }
@@ -4296,10 +4321,10 @@
 checkSpreadsheet(api.Spreadsheet o) {
   buildCounterSpreadsheet++;
   if (buildCounterSpreadsheet < 3) {
-    checkUnnamed497(o.developerMetadata);
-    checkUnnamed498(o.namedRanges);
+    checkUnnamed494(o.developerMetadata);
+    checkUnnamed495(o.namedRanges);
     checkSpreadsheetProperties(o.properties);
-    checkUnnamed499(o.sheets);
+    checkUnnamed496(o.sheets);
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
     unittest.expect(o.spreadsheetUrl, unittest.equals('foo'));
   }
@@ -4521,14 +4546,14 @@
   buildCounterUpdateBordersRequest--;
 }
 
-buildUnnamed500() {
+buildUnnamed497() {
   var o = new core.List<api.RowData>();
   o.add(buildRowData());
   o.add(buildRowData());
   return o;
 }
 
-checkUnnamed500(core.List<api.RowData> o) {
+checkUnnamed497(core.List<api.RowData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRowData(o[0]);
   checkRowData(o[1]);
@@ -4541,7 +4566,7 @@
   if (buildCounterUpdateCellsRequest < 3) {
     o.fields = "foo";
     o.range = buildGridRange();
-    o.rows = buildUnnamed500();
+    o.rows = buildUnnamed497();
     o.start = buildGridCoordinate();
   }
   buildCounterUpdateCellsRequest--;
@@ -4553,7 +4578,7 @@
   if (buildCounterUpdateCellsRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
     checkGridRange(o.range);
-    checkUnnamed500(o.rows);
+    checkUnnamed497(o.rows);
     checkGridCoordinate(o.start);
   }
   buildCounterUpdateCellsRequest--;
@@ -4632,14 +4657,14 @@
   buildCounterUpdateConditionalFormatRuleResponse--;
 }
 
-buildUnnamed501() {
+buildUnnamed498() {
   var o = new core.List<api.DataFilter>();
   o.add(buildDataFilter());
   o.add(buildDataFilter());
   return o;
 }
 
-checkUnnamed501(core.List<api.DataFilter> o) {
+checkUnnamed498(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataFilter(o[0]);
   checkDataFilter(o[1]);
@@ -4650,7 +4675,7 @@
   var o = new api.UpdateDeveloperMetadataRequest();
   buildCounterUpdateDeveloperMetadataRequest++;
   if (buildCounterUpdateDeveloperMetadataRequest < 3) {
-    o.dataFilters = buildUnnamed501();
+    o.dataFilters = buildUnnamed498();
     o.developerMetadata = buildDeveloperMetadata();
     o.fields = "foo";
   }
@@ -4661,21 +4686,21 @@
 checkUpdateDeveloperMetadataRequest(api.UpdateDeveloperMetadataRequest o) {
   buildCounterUpdateDeveloperMetadataRequest++;
   if (buildCounterUpdateDeveloperMetadataRequest < 3) {
-    checkUnnamed501(o.dataFilters);
+    checkUnnamed498(o.dataFilters);
     checkDeveloperMetadata(o.developerMetadata);
     unittest.expect(o.fields, unittest.equals('foo'));
   }
   buildCounterUpdateDeveloperMetadataRequest--;
 }
 
-buildUnnamed502() {
+buildUnnamed499() {
   var o = new core.List<api.DeveloperMetadata>();
   o.add(buildDeveloperMetadata());
   o.add(buildDeveloperMetadata());
   return o;
 }
 
-checkUnnamed502(core.List<api.DeveloperMetadata> o) {
+checkUnnamed499(core.List<api.DeveloperMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeveloperMetadata(o[0]);
   checkDeveloperMetadata(o[1]);
@@ -4686,7 +4711,7 @@
   var o = new api.UpdateDeveloperMetadataResponse();
   buildCounterUpdateDeveloperMetadataResponse++;
   if (buildCounterUpdateDeveloperMetadataResponse < 3) {
-    o.developerMetadata = buildUnnamed502();
+    o.developerMetadata = buildUnnamed499();
   }
   buildCounterUpdateDeveloperMetadataResponse--;
   return o;
@@ -4695,7 +4720,7 @@
 checkUpdateDeveloperMetadataResponse(api.UpdateDeveloperMetadataResponse o) {
   buildCounterUpdateDeveloperMetadataResponse++;
   if (buildCounterUpdateDeveloperMetadataResponse < 3) {
-    checkUnnamed502(o.developerMetadata);
+    checkUnnamed499(o.developerMetadata);
   }
   buildCounterUpdateDeveloperMetadataResponse--;
 }
@@ -4931,7 +4956,7 @@
   buildCounterUpdateValuesResponse--;
 }
 
-buildUnnamed503() {
+buildUnnamed500() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -4946,7 +4971,7 @@
   return o;
 }
 
-checkUnnamed503(core.List<core.Object> o) {
+checkUnnamed500(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o[0]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -4960,17 +4985,17 @@
   unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed504() {
+buildUnnamed501() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed503());
-  o.add(buildUnnamed503());
+  o.add(buildUnnamed500());
+  o.add(buildUnnamed500());
   return o;
 }
 
-checkUnnamed504(core.List<core.List<core.Object>> o) {
+checkUnnamed501(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed503(o[0]);
-  checkUnnamed503(o[1]);
+  checkUnnamed500(o[0]);
+  checkUnnamed500(o[1]);
 }
 
 core.int buildCounterValueRange = 0;
@@ -4980,7 +5005,7 @@
   if (buildCounterValueRange < 3) {
     o.majorDimension = "foo";
     o.range = "foo";
-    o.values = buildUnnamed504();
+    o.values = buildUnnamed501();
   }
   buildCounterValueRange--;
   return o;
@@ -4991,32 +5016,143 @@
   if (buildCounterValueRange < 3) {
     unittest.expect(o.majorDimension, unittest.equals('foo'));
     unittest.expect(o.range, unittest.equals('foo'));
-    checkUnnamed504(o.values);
+    checkUnnamed501(o.values);
   }
   buildCounterValueRange--;
 }
 
-buildUnnamed505() {
+core.int buildCounterWaterfallChartColumnStyle = 0;
+buildWaterfallChartColumnStyle() {
+  var o = new api.WaterfallChartColumnStyle();
+  buildCounterWaterfallChartColumnStyle++;
+  if (buildCounterWaterfallChartColumnStyle < 3) {
+    o.color = buildColor();
+    o.label = "foo";
+  }
+  buildCounterWaterfallChartColumnStyle--;
+  return o;
+}
+
+checkWaterfallChartColumnStyle(api.WaterfallChartColumnStyle o) {
+  buildCounterWaterfallChartColumnStyle++;
+  if (buildCounterWaterfallChartColumnStyle < 3) {
+    checkColor(o.color);
+    unittest.expect(o.label, unittest.equals('foo'));
+  }
+  buildCounterWaterfallChartColumnStyle--;
+}
+
+core.int buildCounterWaterfallChartDomain = 0;
+buildWaterfallChartDomain() {
+  var o = new api.WaterfallChartDomain();
+  buildCounterWaterfallChartDomain++;
+  if (buildCounterWaterfallChartDomain < 3) {
+    o.data = buildChartData();
+    o.reversed = true;
+  }
+  buildCounterWaterfallChartDomain--;
+  return o;
+}
+
+checkWaterfallChartDomain(api.WaterfallChartDomain o) {
+  buildCounterWaterfallChartDomain++;
+  if (buildCounterWaterfallChartDomain < 3) {
+    checkChartData(o.data);
+    unittest.expect(o.reversed, unittest.isTrue);
+  }
+  buildCounterWaterfallChartDomain--;
+}
+
+core.int buildCounterWaterfallChartSeries = 0;
+buildWaterfallChartSeries() {
+  var o = new api.WaterfallChartSeries();
+  buildCounterWaterfallChartSeries++;
+  if (buildCounterWaterfallChartSeries < 3) {
+    o.data = buildChartData();
+    o.hideTrailingSubtotal = true;
+    o.negativeColumnsStyle = buildWaterfallChartColumnStyle();
+    o.positiveColumnsStyle = buildWaterfallChartColumnStyle();
+    o.subtotalColumnsStyle = buildWaterfallChartColumnStyle();
+  }
+  buildCounterWaterfallChartSeries--;
+  return o;
+}
+
+checkWaterfallChartSeries(api.WaterfallChartSeries o) {
+  buildCounterWaterfallChartSeries++;
+  if (buildCounterWaterfallChartSeries < 3) {
+    checkChartData(o.data);
+    unittest.expect(o.hideTrailingSubtotal, unittest.isTrue);
+    checkWaterfallChartColumnStyle(o.negativeColumnsStyle);
+    checkWaterfallChartColumnStyle(o.positiveColumnsStyle);
+    checkWaterfallChartColumnStyle(o.subtotalColumnsStyle);
+  }
+  buildCounterWaterfallChartSeries--;
+}
+
+buildUnnamed502() {
+  var o = new core.List<api.WaterfallChartSeries>();
+  o.add(buildWaterfallChartSeries());
+  o.add(buildWaterfallChartSeries());
+  return o;
+}
+
+checkUnnamed502(core.List<api.WaterfallChartSeries> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkWaterfallChartSeries(o[0]);
+  checkWaterfallChartSeries(o[1]);
+}
+
+core.int buildCounterWaterfallChartSpec = 0;
+buildWaterfallChartSpec() {
+  var o = new api.WaterfallChartSpec();
+  buildCounterWaterfallChartSpec++;
+  if (buildCounterWaterfallChartSpec < 3) {
+    o.connectorLineStyle = buildLineStyle();
+    o.domain = buildWaterfallChartDomain();
+    o.firstValueIsTotal = true;
+    o.hideConnectorLines = true;
+    o.series = buildUnnamed502();
+    o.stackedType = "foo";
+  }
+  buildCounterWaterfallChartSpec--;
+  return o;
+}
+
+checkWaterfallChartSpec(api.WaterfallChartSpec o) {
+  buildCounterWaterfallChartSpec++;
+  if (buildCounterWaterfallChartSpec < 3) {
+    checkLineStyle(o.connectorLineStyle);
+    checkWaterfallChartDomain(o.domain);
+    unittest.expect(o.firstValueIsTotal, unittest.isTrue);
+    unittest.expect(o.hideConnectorLines, unittest.isTrue);
+    checkUnnamed502(o.series);
+    unittest.expect(o.stackedType, unittest.equals('foo'));
+  }
+  buildCounterWaterfallChartSpec--;
+}
+
+buildUnnamed503() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed505(core.List<core.String> o) {
+checkUnnamed503(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed506() {
+buildUnnamed504() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed506(core.List<core.String> o) {
+checkUnnamed504(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5891,6 +6027,14 @@
     });
   });
 
+  unittest.group("obj-schema-LineStyle", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildLineStyle();
+      var od = new api.LineStyle.fromJson(o.toJson());
+      checkLineStyle(od);
+    });
+  });
+
   unittest.group("obj-schema-MatchedDeveloperMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildMatchedDeveloperMetadata();
@@ -6364,6 +6508,38 @@
     });
   });
 
+  unittest.group("obj-schema-WaterfallChartColumnStyle", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildWaterfallChartColumnStyle();
+      var od = new api.WaterfallChartColumnStyle.fromJson(o.toJson());
+      checkWaterfallChartColumnStyle(od);
+    });
+  });
+
+  unittest.group("obj-schema-WaterfallChartDomain", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildWaterfallChartDomain();
+      var od = new api.WaterfallChartDomain.fromJson(o.toJson());
+      checkWaterfallChartDomain(od);
+    });
+  });
+
+  unittest.group("obj-schema-WaterfallChartSeries", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildWaterfallChartSeries();
+      var od = new api.WaterfallChartSeries.fromJson(o.toJson());
+      checkWaterfallChartSeries(od);
+    });
+  });
+
+  unittest.group("obj-schema-WaterfallChartSpec", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildWaterfallChartSpec();
+      var od = new api.WaterfallChartSpec.fromJson(o.toJson());
+      checkWaterfallChartSpec(od);
+    });
+  });
+
   unittest.group("resource-SpreadsheetsResourceApi", () {
     unittest.test("method--batchUpdate", () {
       var mock = new HttpServerMock();
@@ -6486,7 +6662,7 @@
       var mock = new HttpServerMock();
       api.SpreadsheetsResourceApi res = new api.SheetsApi(mock).spreadsheets;
       var arg_spreadsheetId = "foo";
-      var arg_ranges = buildUnnamed505();
+      var arg_ranges = buildUnnamed503();
       var arg_includeGridData = true;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6822,11 +6998,11 @@
       var arg_request = buildValueRange();
       var arg_spreadsheetId = "foo";
       var arg_range = "foo";
+      var arg_includeValuesInResponse = true;
+      var arg_responseValueRenderOption = "foo";
       var arg_insertDataOption = "foo";
       var arg_valueInputOption = "foo";
       var arg_responseDateTimeRenderOption = "foo";
-      var arg_includeValuesInResponse = true;
-      var arg_responseValueRenderOption = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.ValueRange.fromJson(json);
@@ -6879,16 +7055,16 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["includeValuesInResponse"].first,
+            unittest.equals("$arg_includeValuesInResponse"));
+        unittest.expect(queryMap["responseValueRenderOption"].first,
+            unittest.equals(arg_responseValueRenderOption));
         unittest.expect(queryMap["insertDataOption"].first,
             unittest.equals(arg_insertDataOption));
         unittest.expect(queryMap["valueInputOption"].first,
             unittest.equals(arg_valueInputOption));
         unittest.expect(queryMap["responseDateTimeRenderOption"].first,
             unittest.equals(arg_responseDateTimeRenderOption));
-        unittest.expect(queryMap["includeValuesInResponse"].first,
-            unittest.equals("$arg_includeValuesInResponse"));
-        unittest.expect(queryMap["responseValueRenderOption"].first,
-            unittest.equals(arg_responseValueRenderOption));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -6899,11 +7075,11 @@
       }), true);
       res
           .append(arg_request, arg_spreadsheetId, arg_range,
+              includeValuesInResponse: arg_includeValuesInResponse,
+              responseValueRenderOption: arg_responseValueRenderOption,
               insertDataOption: arg_insertDataOption,
               valueInputOption: arg_valueInputOption,
               responseDateTimeRenderOption: arg_responseDateTimeRenderOption,
-              includeValuesInResponse: arg_includeValuesInResponse,
-              responseValueRenderOption: arg_responseValueRenderOption,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.AppendValuesResponse response) {
         checkAppendValuesResponse(response);
@@ -7046,7 +7222,7 @@
       api.SpreadsheetsValuesResourceApi res =
           new api.SheetsApi(mock).spreadsheets.values;
       var arg_spreadsheetId = "foo";
-      var arg_ranges = buildUnnamed506();
+      var arg_ranges = buildUnnamed504();
       var arg_majorDimension = "foo";
       var arg_valueRenderOption = "foo";
       var arg_dateTimeRenderOption = "foo";
@@ -7475,10 +7651,10 @@
       var arg_request = buildValueRange();
       var arg_spreadsheetId = "foo";
       var arg_range = "foo";
+      var arg_includeValuesInResponse = true;
       var arg_responseValueRenderOption = "foo";
       var arg_valueInputOption = "foo";
       var arg_responseDateTimeRenderOption = "foo";
-      var arg_includeValuesInResponse = true;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.ValueRange.fromJson(json);
@@ -7525,14 +7701,14 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["includeValuesInResponse"].first,
+            unittest.equals("$arg_includeValuesInResponse"));
         unittest.expect(queryMap["responseValueRenderOption"].first,
             unittest.equals(arg_responseValueRenderOption));
         unittest.expect(queryMap["valueInputOption"].first,
             unittest.equals(arg_valueInputOption));
         unittest.expect(queryMap["responseDateTimeRenderOption"].first,
             unittest.equals(arg_responseDateTimeRenderOption));
-        unittest.expect(queryMap["includeValuesInResponse"].first,
-            unittest.equals("$arg_includeValuesInResponse"));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -7543,10 +7719,10 @@
       }), true);
       res
           .update(arg_request, arg_spreadsheetId, arg_range,
+              includeValuesInResponse: arg_includeValuesInResponse,
               responseValueRenderOption: arg_responseValueRenderOption,
               valueInputOption: arg_valueInputOption,
               responseDateTimeRenderOption: arg_responseDateTimeRenderOption,
-              includeValuesInResponse: arg_includeValuesInResponse,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.UpdateValuesResponse response) {
         checkUpdateValuesResponse(response);
diff --git a/generated/googleapis/test/siteverification/v1_test.dart b/generated/googleapis/test/siteverification/v1_test.dart
index ff85f2e..a79d960 100644
--- a/generated/googleapis/test/siteverification/v1_test.dart
+++ b/generated/googleapis/test/siteverification/v1_test.dart
@@ -116,14 +116,14 @@
   buildCounterSiteVerificationWebResourceGettokenResponse--;
 }
 
-buildUnnamed149() {
+buildUnnamed143() {
   var o = new core.List<api.SiteVerificationWebResourceResource>();
   o.add(buildSiteVerificationWebResourceResource());
   o.add(buildSiteVerificationWebResourceResource());
   return o;
 }
 
-checkUnnamed149(core.List<api.SiteVerificationWebResourceResource> o) {
+checkUnnamed143(core.List<api.SiteVerificationWebResourceResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSiteVerificationWebResourceResource(o[0]);
   checkSiteVerificationWebResourceResource(o[1]);
@@ -134,7 +134,7 @@
   var o = new api.SiteVerificationWebResourceListResponse();
   buildCounterSiteVerificationWebResourceListResponse++;
   if (buildCounterSiteVerificationWebResourceListResponse < 3) {
-    o.items = buildUnnamed149();
+    o.items = buildUnnamed143();
   }
   buildCounterSiteVerificationWebResourceListResponse--;
   return o;
@@ -144,19 +144,19 @@
     api.SiteVerificationWebResourceListResponse o) {
   buildCounterSiteVerificationWebResourceListResponse++;
   if (buildCounterSiteVerificationWebResourceListResponse < 3) {
-    checkUnnamed149(o.items);
+    checkUnnamed143(o.items);
   }
   buildCounterSiteVerificationWebResourceListResponse--;
 }
 
-buildUnnamed150() {
+buildUnnamed144() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed150(core.List<core.String> o) {
+checkUnnamed144(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -190,7 +190,7 @@
   buildCounterSiteVerificationWebResourceResource++;
   if (buildCounterSiteVerificationWebResourceResource < 3) {
     o.id = "foo";
-    o.owners = buildUnnamed150();
+    o.owners = buildUnnamed144();
     o.site = buildSiteVerificationWebResourceResourceSite();
   }
   buildCounterSiteVerificationWebResourceResource--;
@@ -202,7 +202,7 @@
   buildCounterSiteVerificationWebResourceResource++;
   if (buildCounterSiteVerificationWebResourceResource < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed150(o.owners);
+    checkUnnamed144(o.owners);
     checkSiteVerificationWebResourceResourceSite(o.site);
   }
   buildCounterSiteVerificationWebResourceResource--;
diff --git a/generated/googleapis/test/slides/v1_test.dart b/generated/googleapis/test/slides/v1_test.dart
index b58e0a3..f7381c6 100644
--- a/generated/googleapis/test/slides/v1_test.dart
+++ b/generated/googleapis/test/slides/v1_test.dart
@@ -104,14 +104,14 @@
   buildCounterAutoText--;
 }
 
-buildUnnamed1794() {
+buildUnnamed1816() {
   var o = new core.List<api.Request>();
   o.add(buildRequest());
   o.add(buildRequest());
   return o;
 }
 
-checkUnnamed1794(core.List<api.Request> o) {
+checkUnnamed1816(core.List<api.Request> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRequest(o[0]);
   checkRequest(o[1]);
@@ -122,7 +122,7 @@
   var o = new api.BatchUpdatePresentationRequest();
   buildCounterBatchUpdatePresentationRequest++;
   if (buildCounterBatchUpdatePresentationRequest < 3) {
-    o.requests = buildUnnamed1794();
+    o.requests = buildUnnamed1816();
     o.writeControl = buildWriteControl();
   }
   buildCounterBatchUpdatePresentationRequest--;
@@ -132,20 +132,20 @@
 checkBatchUpdatePresentationRequest(api.BatchUpdatePresentationRequest o) {
   buildCounterBatchUpdatePresentationRequest++;
   if (buildCounterBatchUpdatePresentationRequest < 3) {
-    checkUnnamed1794(o.requests);
+    checkUnnamed1816(o.requests);
     checkWriteControl(o.writeControl);
   }
   buildCounterBatchUpdatePresentationRequest--;
 }
 
-buildUnnamed1795() {
+buildUnnamed1817() {
   var o = new core.List<api.Response>();
   o.add(buildResponse());
   o.add(buildResponse());
   return o;
 }
 
-checkUnnamed1795(core.List<api.Response> o) {
+checkUnnamed1817(core.List<api.Response> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResponse(o[0]);
   checkResponse(o[1]);
@@ -157,7 +157,7 @@
   buildCounterBatchUpdatePresentationResponse++;
   if (buildCounterBatchUpdatePresentationResponse < 3) {
     o.presentationId = "foo";
-    o.replies = buildUnnamed1795();
+    o.replies = buildUnnamed1817();
   }
   buildCounterBatchUpdatePresentationResponse--;
   return o;
@@ -167,7 +167,7 @@
   buildCounterBatchUpdatePresentationResponse++;
   if (buildCounterBatchUpdatePresentationResponse < 3) {
     unittest.expect(o.presentationId, unittest.equals('foo'));
-    checkUnnamed1795(o.replies);
+    checkUnnamed1817(o.replies);
   }
   buildCounterBatchUpdatePresentationResponse--;
 }
@@ -197,14 +197,14 @@
   buildCounterBullet--;
 }
 
-buildUnnamed1796() {
+buildUnnamed1818() {
   var o = new core.List<api.ThemeColorPair>();
   o.add(buildThemeColorPair());
   o.add(buildThemeColorPair());
   return o;
 }
 
-checkUnnamed1796(core.List<api.ThemeColorPair> o) {
+checkUnnamed1818(core.List<api.ThemeColorPair> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThemeColorPair(o[0]);
   checkThemeColorPair(o[1]);
@@ -215,7 +215,7 @@
   var o = new api.ColorScheme();
   buildCounterColorScheme++;
   if (buildCounterColorScheme < 3) {
-    o.colors = buildUnnamed1796();
+    o.colors = buildUnnamed1818();
   }
   buildCounterColorScheme--;
   return o;
@@ -224,7 +224,7 @@
 checkColorScheme(api.ColorScheme o) {
   buildCounterColorScheme++;
   if (buildCounterColorScheme < 3) {
-    checkUnnamed1796(o.colors);
+    checkUnnamed1818(o.colors);
   }
   buildCounterColorScheme--;
 }
@@ -449,14 +449,14 @@
   buildCounterCreateSheetsChartResponse--;
 }
 
-buildUnnamed1797() {
+buildUnnamed1819() {
   var o = new core.List<api.LayoutPlaceholderIdMapping>();
   o.add(buildLayoutPlaceholderIdMapping());
   o.add(buildLayoutPlaceholderIdMapping());
   return o;
 }
 
-checkUnnamed1797(core.List<api.LayoutPlaceholderIdMapping> o) {
+checkUnnamed1819(core.List<api.LayoutPlaceholderIdMapping> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLayoutPlaceholderIdMapping(o[0]);
   checkLayoutPlaceholderIdMapping(o[1]);
@@ -469,7 +469,7 @@
   if (buildCounterCreateSlideRequest < 3) {
     o.insertionIndex = 42;
     o.objectId = "foo";
-    o.placeholderIdMappings = buildUnnamed1797();
+    o.placeholderIdMappings = buildUnnamed1819();
     o.slideLayoutReference = buildLayoutReference();
   }
   buildCounterCreateSlideRequest--;
@@ -481,7 +481,7 @@
   if (buildCounterCreateSlideRequest < 3) {
     unittest.expect(o.insertionIndex, unittest.equals(42));
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkUnnamed1797(o.placeholderIdMappings);
+    checkUnnamed1819(o.placeholderIdMappings);
     checkLayoutReference(o.slideLayoutReference);
   }
   buildCounterCreateSlideRequest--;
@@ -749,14 +749,14 @@
   buildCounterDimension--;
 }
 
-buildUnnamed1798() {
+buildUnnamed1820() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1798(core.Map<core.String, core.String> o) {
+checkUnnamed1820(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'));
@@ -768,7 +768,7 @@
   buildCounterDuplicateObjectRequest++;
   if (buildCounterDuplicateObjectRequest < 3) {
     o.objectId = "foo";
-    o.objectIds = buildUnnamed1798();
+    o.objectIds = buildUnnamed1820();
   }
   buildCounterDuplicateObjectRequest--;
   return o;
@@ -778,7 +778,7 @@
   buildCounterDuplicateObjectRequest++;
   if (buildCounterDuplicateObjectRequest < 3) {
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkUnnamed1798(o.objectIds);
+    checkUnnamed1820(o.objectIds);
   }
   buildCounterDuplicateObjectRequest--;
 }
@@ -802,14 +802,14 @@
   buildCounterDuplicateObjectResponse--;
 }
 
-buildUnnamed1799() {
+buildUnnamed1821() {
   var o = new core.List<api.PageElement>();
   o.add(buildPageElement());
   o.add(buildPageElement());
   return o;
 }
 
-checkUnnamed1799(core.List<api.PageElement> o) {
+checkUnnamed1821(core.List<api.PageElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPageElement(o[0]);
   checkPageElement(o[1]);
@@ -820,7 +820,7 @@
   var o = new api.Group();
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
-    o.children = buildUnnamed1799();
+    o.children = buildUnnamed1821();
   }
   buildCounterGroup--;
   return o;
@@ -829,19 +829,19 @@
 checkGroup(api.Group o) {
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
-    checkUnnamed1799(o.children);
+    checkUnnamed1821(o.children);
   }
   buildCounterGroup--;
 }
 
-buildUnnamed1800() {
+buildUnnamed1822() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1800(core.List<core.String> o) {
+checkUnnamed1822(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -852,7 +852,7 @@
   var o = new api.GroupObjectsRequest();
   buildCounterGroupObjectsRequest++;
   if (buildCounterGroupObjectsRequest < 3) {
-    o.childrenObjectIds = buildUnnamed1800();
+    o.childrenObjectIds = buildUnnamed1822();
     o.groupObjectId = "foo";
   }
   buildCounterGroupObjectsRequest--;
@@ -862,7 +862,7 @@
 checkGroupObjectsRequest(api.GroupObjectsRequest o) {
   buildCounterGroupObjectsRequest++;
   if (buildCounterGroupObjectsRequest < 3) {
-    checkUnnamed1800(o.childrenObjectIds);
+    checkUnnamed1822(o.childrenObjectIds);
     unittest.expect(o.groupObjectId, unittest.equals('foo'));
   }
   buildCounterGroupObjectsRequest--;
@@ -1177,14 +1177,14 @@
   buildCounterLink--;
 }
 
-buildUnnamed1801() {
+buildUnnamed1823() {
   var o = new core.Map<core.String, api.NestingLevel>();
   o["x"] = buildNestingLevel();
   o["y"] = buildNestingLevel();
   return o;
 }
 
-checkUnnamed1801(core.Map<core.String, api.NestingLevel> o) {
+checkUnnamed1823(core.Map<core.String, api.NestingLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNestingLevel(o["x"]);
   checkNestingLevel(o["y"]);
@@ -1196,7 +1196,7 @@
   buildCounterList++;
   if (buildCounterList < 3) {
     o.listId = "foo";
-    o.nestingLevel = buildUnnamed1801();
+    o.nestingLevel = buildUnnamed1823();
   }
   buildCounterList--;
   return o;
@@ -1206,7 +1206,7 @@
   buildCounterList++;
   if (buildCounterList < 3) {
     unittest.expect(o.listId, unittest.equals('foo'));
-    checkUnnamed1801(o.nestingLevel);
+    checkUnnamed1823(o.nestingLevel);
   }
   buildCounterList--;
 }
@@ -1373,14 +1373,14 @@
   buildCounterOutlineFill--;
 }
 
-buildUnnamed1802() {
+buildUnnamed1824() {
   var o = new core.List<api.PageElement>();
   o.add(buildPageElement());
   o.add(buildPageElement());
   return o;
 }
 
-checkUnnamed1802(core.List<api.PageElement> o) {
+checkUnnamed1824(core.List<api.PageElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPageElement(o[0]);
   checkPageElement(o[1]);
@@ -1395,7 +1395,7 @@
     o.masterProperties = buildMasterProperties();
     o.notesProperties = buildNotesProperties();
     o.objectId = "foo";
-    o.pageElements = buildUnnamed1802();
+    o.pageElements = buildUnnamed1824();
     o.pageProperties = buildPageProperties();
     o.pageType = "foo";
     o.revisionId = "foo";
@@ -1412,7 +1412,7 @@
     checkMasterProperties(o.masterProperties);
     checkNotesProperties(o.notesProperties);
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkUnnamed1802(o.pageElements);
+    checkUnnamed1824(o.pageElements);
     checkPageProperties(o.pageProperties);
     unittest.expect(o.pageType, unittest.equals('foo'));
     unittest.expect(o.revisionId, unittest.equals('foo'));
@@ -1610,40 +1610,40 @@
   buildCounterPlaceholder--;
 }
 
-buildUnnamed1803() {
+buildUnnamed1825() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1803(core.List<api.Page> o) {
+checkUnnamed1825(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
 }
 
-buildUnnamed1804() {
+buildUnnamed1826() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1804(core.List<api.Page> o) {
+checkUnnamed1826(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
 }
 
-buildUnnamed1805() {
+buildUnnamed1827() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1805(core.List<api.Page> o) {
+checkUnnamed1827(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
@@ -1654,14 +1654,14 @@
   var o = new api.Presentation();
   buildCounterPresentation++;
   if (buildCounterPresentation < 3) {
-    o.layouts = buildUnnamed1803();
+    o.layouts = buildUnnamed1825();
     o.locale = "foo";
-    o.masters = buildUnnamed1804();
+    o.masters = buildUnnamed1826();
     o.notesMaster = buildPage();
     o.pageSize = buildSize();
     o.presentationId = "foo";
     o.revisionId = "foo";
-    o.slides = buildUnnamed1805();
+    o.slides = buildUnnamed1827();
     o.title = "foo";
   }
   buildCounterPresentation--;
@@ -1671,14 +1671,14 @@
 checkPresentation(api.Presentation o) {
   buildCounterPresentation++;
   if (buildCounterPresentation < 3) {
-    checkUnnamed1803(o.layouts);
+    checkUnnamed1825(o.layouts);
     unittest.expect(o.locale, unittest.equals('foo'));
-    checkUnnamed1804(o.masters);
+    checkUnnamed1826(o.masters);
     checkPage(o.notesMaster);
     checkSize(o.pageSize);
     unittest.expect(o.presentationId, unittest.equals('foo'));
     unittest.expect(o.revisionId, unittest.equals('foo'));
-    checkUnnamed1805(o.slides);
+    checkUnnamed1827(o.slides);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterPresentation--;
@@ -1707,14 +1707,14 @@
   buildCounterRange--;
 }
 
-buildUnnamed1806() {
+buildUnnamed1828() {
   var o = new core.List<api.ColorStop>();
   o.add(buildColorStop());
   o.add(buildColorStop());
   return o;
 }
 
-checkUnnamed1806(core.List<api.ColorStop> o) {
+checkUnnamed1828(core.List<api.ColorStop> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorStop(o[0]);
   checkColorStop(o[1]);
@@ -1726,7 +1726,7 @@
   buildCounterRecolor++;
   if (buildCounterRecolor < 3) {
     o.name = "foo";
-    o.recolorStops = buildUnnamed1806();
+    o.recolorStops = buildUnnamed1828();
   }
   buildCounterRecolor--;
   return o;
@@ -1736,7 +1736,7 @@
   buildCounterRecolor++;
   if (buildCounterRecolor < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1806(o.recolorStops);
+    checkUnnamed1828(o.recolorStops);
   }
   buildCounterRecolor--;
 }
@@ -1760,14 +1760,14 @@
   buildCounterRefreshSheetsChartRequest--;
 }
 
-buildUnnamed1807() {
+buildUnnamed1829() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1807(core.List<core.String> o) {
+checkUnnamed1829(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1780,7 +1780,7 @@
   if (buildCounterReplaceAllShapesWithImageRequest < 3) {
     o.containsText = buildSubstringMatchCriteria();
     o.imageUrl = "foo";
-    o.pageObjectIds = buildUnnamed1807();
+    o.pageObjectIds = buildUnnamed1829();
     o.replaceMethod = "foo";
   }
   buildCounterReplaceAllShapesWithImageRequest--;
@@ -1792,7 +1792,7 @@
   if (buildCounterReplaceAllShapesWithImageRequest < 3) {
     checkSubstringMatchCriteria(o.containsText);
     unittest.expect(o.imageUrl, unittest.equals('foo'));
-    checkUnnamed1807(o.pageObjectIds);
+    checkUnnamed1829(o.pageObjectIds);
     unittest.expect(o.replaceMethod, unittest.equals('foo'));
   }
   buildCounterReplaceAllShapesWithImageRequest--;
@@ -1818,14 +1818,14 @@
   buildCounterReplaceAllShapesWithImageResponse--;
 }
 
-buildUnnamed1808() {
+buildUnnamed1830() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1808(core.List<core.String> o) {
+checkUnnamed1830(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1839,7 +1839,7 @@
     o.chartId = 42;
     o.containsText = buildSubstringMatchCriteria();
     o.linkingMode = "foo";
-    o.pageObjectIds = buildUnnamed1808();
+    o.pageObjectIds = buildUnnamed1830();
     o.spreadsheetId = "foo";
   }
   buildCounterReplaceAllShapesWithSheetsChartRequest--;
@@ -1853,7 +1853,7 @@
     unittest.expect(o.chartId, unittest.equals(42));
     checkSubstringMatchCriteria(o.containsText);
     unittest.expect(o.linkingMode, unittest.equals('foo'));
-    checkUnnamed1808(o.pageObjectIds);
+    checkUnnamed1830(o.pageObjectIds);
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
   }
   buildCounterReplaceAllShapesWithSheetsChartRequest--;
@@ -1879,14 +1879,14 @@
   buildCounterReplaceAllShapesWithSheetsChartResponse--;
 }
 
-buildUnnamed1809() {
+buildUnnamed1831() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1809(core.List<core.String> o) {
+checkUnnamed1831(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1898,7 +1898,7 @@
   buildCounterReplaceAllTextRequest++;
   if (buildCounterReplaceAllTextRequest < 3) {
     o.containsText = buildSubstringMatchCriteria();
-    o.pageObjectIds = buildUnnamed1809();
+    o.pageObjectIds = buildUnnamed1831();
     o.replaceText = "foo";
   }
   buildCounterReplaceAllTextRequest--;
@@ -1909,7 +1909,7 @@
   buildCounterReplaceAllTextRequest++;
   if (buildCounterReplaceAllTextRequest < 3) {
     checkSubstringMatchCriteria(o.containsText);
-    checkUnnamed1809(o.pageObjectIds);
+    checkUnnamed1831(o.pageObjectIds);
     unittest.expect(o.replaceText, unittest.equals('foo'));
   }
   buildCounterReplaceAllTextRequest--;
@@ -2352,53 +2352,53 @@
   buildCounterSubstringMatchCriteria--;
 }
 
-buildUnnamed1810() {
+buildUnnamed1832() {
   var o = new core.List<api.TableBorderRow>();
   o.add(buildTableBorderRow());
   o.add(buildTableBorderRow());
   return o;
 }
 
-checkUnnamed1810(core.List<api.TableBorderRow> o) {
+checkUnnamed1832(core.List<api.TableBorderRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableBorderRow(o[0]);
   checkTableBorderRow(o[1]);
 }
 
-buildUnnamed1811() {
+buildUnnamed1833() {
   var o = new core.List<api.TableColumnProperties>();
   o.add(buildTableColumnProperties());
   o.add(buildTableColumnProperties());
   return o;
 }
 
-checkUnnamed1811(core.List<api.TableColumnProperties> o) {
+checkUnnamed1833(core.List<api.TableColumnProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableColumnProperties(o[0]);
   checkTableColumnProperties(o[1]);
 }
 
-buildUnnamed1812() {
+buildUnnamed1834() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed1812(core.List<api.TableRow> o) {
+checkUnnamed1834(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
 }
 
-buildUnnamed1813() {
+buildUnnamed1835() {
   var o = new core.List<api.TableBorderRow>();
   o.add(buildTableBorderRow());
   o.add(buildTableBorderRow());
   return o;
 }
 
-checkUnnamed1813(core.List<api.TableBorderRow> o) {
+checkUnnamed1835(core.List<api.TableBorderRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableBorderRow(o[0]);
   checkTableBorderRow(o[1]);
@@ -2410,11 +2410,11 @@
   buildCounterTable++;
   if (buildCounterTable < 3) {
     o.columns = 42;
-    o.horizontalBorderRows = buildUnnamed1810();
+    o.horizontalBorderRows = buildUnnamed1832();
     o.rows = 42;
-    o.tableColumns = buildUnnamed1811();
-    o.tableRows = buildUnnamed1812();
-    o.verticalBorderRows = buildUnnamed1813();
+    o.tableColumns = buildUnnamed1833();
+    o.tableRows = buildUnnamed1834();
+    o.verticalBorderRows = buildUnnamed1835();
   }
   buildCounterTable--;
   return o;
@@ -2424,11 +2424,11 @@
   buildCounterTable++;
   if (buildCounterTable < 3) {
     unittest.expect(o.columns, unittest.equals(42));
-    checkUnnamed1810(o.horizontalBorderRows);
+    checkUnnamed1832(o.horizontalBorderRows);
     unittest.expect(o.rows, unittest.equals(42));
-    checkUnnamed1811(o.tableColumns);
-    checkUnnamed1812(o.tableRows);
-    checkUnnamed1813(o.verticalBorderRows);
+    checkUnnamed1833(o.tableColumns);
+    checkUnnamed1834(o.tableRows);
+    checkUnnamed1835(o.verticalBorderRows);
   }
   buildCounterTable--;
 }
@@ -2496,14 +2496,14 @@
   buildCounterTableBorderProperties--;
 }
 
-buildUnnamed1814() {
+buildUnnamed1836() {
   var o = new core.List<api.TableBorderCell>();
   o.add(buildTableBorderCell());
   o.add(buildTableBorderCell());
   return o;
 }
 
-checkUnnamed1814(core.List<api.TableBorderCell> o) {
+checkUnnamed1836(core.List<api.TableBorderCell> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableBorderCell(o[0]);
   checkTableBorderCell(o[1]);
@@ -2514,7 +2514,7 @@
   var o = new api.TableBorderRow();
   buildCounterTableBorderRow++;
   if (buildCounterTableBorderRow < 3) {
-    o.tableBorderCells = buildUnnamed1814();
+    o.tableBorderCells = buildUnnamed1836();
   }
   buildCounterTableBorderRow--;
   return o;
@@ -2523,7 +2523,7 @@
 checkTableBorderRow(api.TableBorderRow o) {
   buildCounterTableBorderRow++;
   if (buildCounterTableBorderRow < 3) {
-    checkUnnamed1814(o.tableBorderCells);
+    checkUnnamed1836(o.tableBorderCells);
   }
   buildCounterTableBorderRow--;
 }
@@ -2660,14 +2660,14 @@
   buildCounterTableRange--;
 }
 
-buildUnnamed1815() {
+buildUnnamed1837() {
   var o = new core.List<api.TableCell>();
   o.add(buildTableCell());
   o.add(buildTableCell());
   return o;
 }
 
-checkUnnamed1815(core.List<api.TableCell> o) {
+checkUnnamed1837(core.List<api.TableCell> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableCell(o[0]);
   checkTableCell(o[1]);
@@ -2679,7 +2679,7 @@
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
     o.rowHeight = buildDimension();
-    o.tableCells = buildUnnamed1815();
+    o.tableCells = buildUnnamed1837();
     o.tableRowProperties = buildTableRowProperties();
   }
   buildCounterTableRow--;
@@ -2690,7 +2690,7 @@
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
     checkDimension(o.rowHeight);
-    checkUnnamed1815(o.tableCells);
+    checkUnnamed1837(o.tableCells);
     checkTableRowProperties(o.tableRowProperties);
   }
   buildCounterTableRow--;
@@ -2715,27 +2715,27 @@
   buildCounterTableRowProperties--;
 }
 
-buildUnnamed1816() {
+buildUnnamed1838() {
   var o = new core.Map<core.String, api.List>();
   o["x"] = buildList();
   o["y"] = buildList();
   return o;
 }
 
-checkUnnamed1816(core.Map<core.String, api.List> o) {
+checkUnnamed1838(core.Map<core.String, api.List> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkList(o["x"]);
   checkList(o["y"]);
 }
 
-buildUnnamed1817() {
+buildUnnamed1839() {
   var o = new core.List<api.TextElement>();
   o.add(buildTextElement());
   o.add(buildTextElement());
   return o;
 }
 
-checkUnnamed1817(core.List<api.TextElement> o) {
+checkUnnamed1839(core.List<api.TextElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTextElement(o[0]);
   checkTextElement(o[1]);
@@ -2746,8 +2746,8 @@
   var o = new api.TextContent();
   buildCounterTextContent++;
   if (buildCounterTextContent < 3) {
-    o.lists = buildUnnamed1816();
-    o.textElements = buildUnnamed1817();
+    o.lists = buildUnnamed1838();
+    o.textElements = buildUnnamed1839();
   }
   buildCounterTextContent--;
   return o;
@@ -2756,8 +2756,8 @@
 checkTextContent(api.TextContent o) {
   buildCounterTextContent++;
   if (buildCounterTextContent < 3) {
-    checkUnnamed1816(o.lists);
-    checkUnnamed1817(o.textElements);
+    checkUnnamed1838(o.lists);
+    checkUnnamed1839(o.textElements);
   }
   buildCounterTextContent--;
 }
@@ -2895,14 +2895,14 @@
   buildCounterThumbnail--;
 }
 
-buildUnnamed1818() {
+buildUnnamed1840() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1818(core.List<core.String> o) {
+checkUnnamed1840(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2913,7 +2913,7 @@
   var o = new api.UngroupObjectsRequest();
   buildCounterUngroupObjectsRequest++;
   if (buildCounterUngroupObjectsRequest < 3) {
-    o.objectIds = buildUnnamed1818();
+    o.objectIds = buildUnnamed1840();
   }
   buildCounterUngroupObjectsRequest--;
   return o;
@@ -2922,7 +2922,7 @@
 checkUngroupObjectsRequest(api.UngroupObjectsRequest o) {
   buildCounterUngroupObjectsRequest++;
   if (buildCounterUngroupObjectsRequest < 3) {
-    checkUnnamed1818(o.objectIds);
+    checkUnnamed1840(o.objectIds);
   }
   buildCounterUngroupObjectsRequest--;
 }
@@ -3091,14 +3091,14 @@
   buildCounterUpdateShapePropertiesRequest--;
 }
 
-buildUnnamed1819() {
+buildUnnamed1841() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1819(core.List<core.String> o) {
+checkUnnamed1841(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3110,7 +3110,7 @@
   buildCounterUpdateSlidesPositionRequest++;
   if (buildCounterUpdateSlidesPositionRequest < 3) {
     o.insertionIndex = 42;
-    o.slideObjectIds = buildUnnamed1819();
+    o.slideObjectIds = buildUnnamed1841();
   }
   buildCounterUpdateSlidesPositionRequest--;
   return o;
@@ -3120,7 +3120,7 @@
   buildCounterUpdateSlidesPositionRequest++;
   if (buildCounterUpdateSlidesPositionRequest < 3) {
     unittest.expect(o.insertionIndex, unittest.equals(42));
-    checkUnnamed1819(o.slideObjectIds);
+    checkUnnamed1841(o.slideObjectIds);
   }
   buildCounterUpdateSlidesPositionRequest--;
 }
@@ -3178,14 +3178,14 @@
   buildCounterUpdateTableCellPropertiesRequest--;
 }
 
-buildUnnamed1820() {
+buildUnnamed1842() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1820(core.List<core.int> o) {
+checkUnnamed1842(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));
@@ -3196,7 +3196,7 @@
   var o = new api.UpdateTableColumnPropertiesRequest();
   buildCounterUpdateTableColumnPropertiesRequest++;
   if (buildCounterUpdateTableColumnPropertiesRequest < 3) {
-    o.columnIndices = buildUnnamed1820();
+    o.columnIndices = buildUnnamed1842();
     o.fields = "foo";
     o.objectId = "foo";
     o.tableColumnProperties = buildTableColumnProperties();
@@ -3209,7 +3209,7 @@
     api.UpdateTableColumnPropertiesRequest o) {
   buildCounterUpdateTableColumnPropertiesRequest++;
   if (buildCounterUpdateTableColumnPropertiesRequest < 3) {
-    checkUnnamed1820(o.columnIndices);
+    checkUnnamed1842(o.columnIndices);
     unittest.expect(o.fields, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
     checkTableColumnProperties(o.tableColumnProperties);
@@ -3217,14 +3217,14 @@
   buildCounterUpdateTableColumnPropertiesRequest--;
 }
 
-buildUnnamed1821() {
+buildUnnamed1843() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1821(core.List<core.int> o) {
+checkUnnamed1843(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));
@@ -3237,7 +3237,7 @@
   if (buildCounterUpdateTableRowPropertiesRequest < 3) {
     o.fields = "foo";
     o.objectId = "foo";
-    o.rowIndices = buildUnnamed1821();
+    o.rowIndices = buildUnnamed1843();
     o.tableRowProperties = buildTableRowProperties();
   }
   buildCounterUpdateTableRowPropertiesRequest--;
@@ -3249,7 +3249,7 @@
   if (buildCounterUpdateTableRowPropertiesRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkUnnamed1821(o.rowIndices);
+    checkUnnamed1843(o.rowIndices);
     checkTableRowProperties(o.tableRowProperties);
   }
   buildCounterUpdateTableRowPropertiesRequest--;
diff --git a/generated/googleapis/test/sourcerepo/v1_test.dart b/generated/googleapis/test/sourcerepo/v1_test.dart
index ff3b251..964033d 100644
--- a/generated/googleapis/test/sourcerepo/v1_test.dart
+++ b/generated/googleapis/test/sourcerepo/v1_test.dart
@@ -50,19 +50,89 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed533() {
+buildUnnamed531() {
   var o = new core.List<api.AuditLogConfig>();
   o.add(buildAuditLogConfig());
   o.add(buildAuditLogConfig());
   return o;
 }
 
-checkUnnamed533(core.List<api.AuditLogConfig> o) {
+checkUnnamed531(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditLogConfig(o[0]);
   checkAuditLogConfig(o[1]);
 }
 
+buildUnnamed532() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+core.int buildCounterAuditConfig = 0;
+buildAuditConfig() {
+  var o = new api.AuditConfig();
+  buildCounterAuditConfig++;
+  if (buildCounterAuditConfig < 3) {
+    o.auditLogConfigs = buildUnnamed531();
+    o.exemptedMembers = buildUnnamed532();
+    o.service = "foo";
+  }
+  buildCounterAuditConfig--;
+  return o;
+}
+
+checkAuditConfig(api.AuditConfig o) {
+  buildCounterAuditConfig++;
+  if (buildCounterAuditConfig < 3) {
+    checkUnnamed531(o.auditLogConfigs);
+    checkUnnamed532(o.exemptedMembers);
+    unittest.expect(o.service, unittest.equals('foo'));
+  }
+  buildCounterAuditConfig--;
+}
+
+buildUnnamed533() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed533(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterAuditLogConfig = 0;
+buildAuditLogConfig() {
+  var o = new api.AuditLogConfig();
+  buildCounterAuditLogConfig++;
+  if (buildCounterAuditLogConfig < 3) {
+    o.exemptedMembers = buildUnnamed533();
+    o.logType = "foo";
+  }
+  buildCounterAuditLogConfig--;
+  return o;
+}
+
+checkAuditLogConfig(api.AuditLogConfig o) {
+  buildCounterAuditLogConfig++;
+  if (buildCounterAuditLogConfig < 3) {
+    checkUnnamed533(o.exemptedMembers);
+    unittest.expect(o.logType, unittest.equals('foo'));
+  }
+  buildCounterAuditLogConfig--;
+}
+
 buildUnnamed534() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -76,83 +146,13 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterAuditConfig = 0;
-buildAuditConfig() {
-  var o = new api.AuditConfig();
-  buildCounterAuditConfig++;
-  if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed533();
-    o.exemptedMembers = buildUnnamed534();
-    o.service = "foo";
-  }
-  buildCounterAuditConfig--;
-  return o;
-}
-
-checkAuditConfig(api.AuditConfig o) {
-  buildCounterAuditConfig++;
-  if (buildCounterAuditConfig < 3) {
-    checkUnnamed533(o.auditLogConfigs);
-    checkUnnamed534(o.exemptedMembers);
-    unittest.expect(o.service, unittest.equals('foo'));
-  }
-  buildCounterAuditConfig--;
-}
-
-buildUnnamed535() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed535(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterAuditLogConfig = 0;
-buildAuditLogConfig() {
-  var o = new api.AuditLogConfig();
-  buildCounterAuditLogConfig++;
-  if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed535();
-    o.logType = "foo";
-  }
-  buildCounterAuditLogConfig--;
-  return o;
-}
-
-checkAuditLogConfig(api.AuditLogConfig o) {
-  buildCounterAuditLogConfig++;
-  if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed535(o.exemptedMembers);
-    unittest.expect(o.logType, unittest.equals('foo'));
-  }
-  buildCounterAuditLogConfig--;
-}
-
-buildUnnamed536() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed536(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterBinding = 0;
 buildBinding() {
   var o = new api.Binding();
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     o.condition = buildExpr();
-    o.members = buildUnnamed536();
+    o.members = buildUnnamed534();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -163,7 +163,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     checkExpr(o.condition);
-    checkUnnamed536(o.members);
+    checkUnnamed534(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
@@ -209,14 +209,14 @@
   buildCounterExpr--;
 }
 
-buildUnnamed537() {
+buildUnnamed535() {
   var o = new core.List<api.Repo>();
   o.add(buildRepo());
   o.add(buildRepo());
   return o;
 }
 
-checkUnnamed537(core.List<api.Repo> o) {
+checkUnnamed535(core.List<api.Repo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRepo(o[0]);
   checkRepo(o[1]);
@@ -228,7 +228,7 @@
   buildCounterListReposResponse++;
   if (buildCounterListReposResponse < 3) {
     o.nextPageToken = "foo";
-    o.repos = buildUnnamed537();
+    o.repos = buildUnnamed535();
   }
   buildCounterListReposResponse--;
   return o;
@@ -238,7 +238,7 @@
   buildCounterListReposResponse++;
   if (buildCounterListReposResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed537(o.repos);
+    checkUnnamed535(o.repos);
   }
   buildCounterListReposResponse--;
 }
@@ -266,27 +266,27 @@
   buildCounterMirrorConfig--;
 }
 
-buildUnnamed538() {
+buildUnnamed536() {
   var o = new core.List<api.AuditConfig>();
   o.add(buildAuditConfig());
   o.add(buildAuditConfig());
   return o;
 }
 
-checkUnnamed538(core.List<api.AuditConfig> o) {
+checkUnnamed536(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditConfig(o[0]);
   checkAuditConfig(o[1]);
 }
 
-buildUnnamed539() {
+buildUnnamed537() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed539(core.List<api.Binding> o) {
+checkUnnamed537(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -297,8 +297,8 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed538();
-    o.bindings = buildUnnamed539();
+    o.auditConfigs = buildUnnamed536();
+    o.bindings = buildUnnamed537();
     o.etag = "foo";
     o.iamOwned = true;
     o.version = 42;
@@ -310,8 +310,8 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed538(o.auditConfigs);
-    checkUnnamed539(o.bindings);
+    checkUnnamed536(o.auditConfigs);
+    checkUnnamed537(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.iamOwned, unittest.isTrue);
     unittest.expect(o.version, unittest.equals(42));
@@ -365,14 +365,14 @@
   buildCounterSetIamPolicyRequest--;
 }
 
-buildUnnamed540() {
+buildUnnamed538() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed540(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'));
@@ -383,7 +383,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed540();
+    o.permissions = buildUnnamed538();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -392,19 +392,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed540(o.permissions);
+    checkUnnamed538(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed541() {
+buildUnnamed539() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed541(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'));
@@ -415,7 +415,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed541();
+    o.permissions = buildUnnamed539();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -424,7 +424,7 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed541(o.permissions);
+    checkUnnamed539(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
diff --git a/generated/googleapis/test/spanner/v1_test.dart b/generated/googleapis/test/spanner/v1_test.dart
index 61739bc..c2378d3 100644
--- a/generated/googleapis/test/spanner/v1_test.dart
+++ b/generated/googleapis/test/spanner/v1_test.dart
@@ -69,14 +69,14 @@
   buildCounterBeginTransactionRequest--;
 }
 
-buildUnnamed2178() {
+buildUnnamed2200() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2178(core.List<core.String> o) {
+checkUnnamed2200(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -87,7 +87,7 @@
   var o = new api.Binding();
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    o.members = buildUnnamed2178();
+    o.members = buildUnnamed2200();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -97,7 +97,7 @@
 checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkUnnamed2178(o.members);
+    checkUnnamed2200(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
@@ -126,14 +126,14 @@
   buildCounterChildLink--;
 }
 
-buildUnnamed2179() {
+buildUnnamed2201() {
   var o = new core.List<api.Mutation>();
   o.add(buildMutation());
   o.add(buildMutation());
   return o;
 }
 
-checkUnnamed2179(core.List<api.Mutation> o) {
+checkUnnamed2201(core.List<api.Mutation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMutation(o[0]);
   checkMutation(o[1]);
@@ -144,7 +144,7 @@
   var o = new api.CommitRequest();
   buildCounterCommitRequest++;
   if (buildCounterCommitRequest < 3) {
-    o.mutations = buildUnnamed2179();
+    o.mutations = buildUnnamed2201();
     o.singleUseTransaction = buildTransactionOptions();
     o.transactionId = "foo";
   }
@@ -155,7 +155,7 @@
 checkCommitRequest(api.CommitRequest o) {
   buildCounterCommitRequest++;
   if (buildCounterCommitRequest < 3) {
-    checkUnnamed2179(o.mutations);
+    checkUnnamed2201(o.mutations);
     checkTransactionOptions(o.singleUseTransaction);
     unittest.expect(o.transactionId, unittest.equals('foo'));
   }
@@ -200,14 +200,14 @@
   buildCounterCreateDatabaseMetadata--;
 }
 
-buildUnnamed2180() {
+buildUnnamed2202() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2180(core.List<core.String> o) {
+checkUnnamed2202(core.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,7 +219,7 @@
   buildCounterCreateDatabaseRequest++;
   if (buildCounterCreateDatabaseRequest < 3) {
     o.createStatement = "foo";
-    o.extraStatements = buildUnnamed2180();
+    o.extraStatements = buildUnnamed2202();
   }
   buildCounterCreateDatabaseRequest--;
   return o;
@@ -229,7 +229,7 @@
   buildCounterCreateDatabaseRequest++;
   if (buildCounterCreateDatabaseRequest < 3) {
     unittest.expect(o.createStatement, unittest.equals('foo'));
-    checkUnnamed2180(o.extraStatements);
+    checkUnnamed2202(o.extraStatements);
   }
   buildCounterCreateDatabaseRequest--;
 }
@@ -356,20 +356,20 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed2181() {
+buildUnnamed2203() {
   var o = new core.Map<core.String, api.Type>();
   o["x"] = buildType();
   o["y"] = buildType();
   return o;
 }
 
-checkUnnamed2181(core.Map<core.String, api.Type> o) {
+checkUnnamed2203(core.Map<core.String, api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o["x"]);
   checkType(o["y"]);
 }
 
-buildUnnamed2182() {
+buildUnnamed2204() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -384,7 +384,7 @@
   return o;
 }
 
-checkUnnamed2182(core.Map<core.String, core.Object> o) {
+checkUnnamed2204(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));
@@ -403,8 +403,8 @@
   var o = new api.ExecuteSqlRequest();
   buildCounterExecuteSqlRequest++;
   if (buildCounterExecuteSqlRequest < 3) {
-    o.paramTypes = buildUnnamed2181();
-    o.params = buildUnnamed2182();
+    o.paramTypes = buildUnnamed2203();
+    o.params = buildUnnamed2204();
     o.queryMode = "foo";
     o.resumeToken = "foo";
     o.sql = "foo";
@@ -417,8 +417,8 @@
 checkExecuteSqlRequest(api.ExecuteSqlRequest o) {
   buildCounterExecuteSqlRequest++;
   if (buildCounterExecuteSqlRequest < 3) {
-    checkUnnamed2181(o.paramTypes);
-    checkUnnamed2182(o.params);
+    checkUnnamed2203(o.paramTypes);
+    checkUnnamed2204(o.params);
     unittest.expect(o.queryMode, unittest.equals('foo'));
     unittest.expect(o.resumeToken, unittest.equals('foo'));
     unittest.expect(o.sql, unittest.equals('foo'));
@@ -448,14 +448,14 @@
   buildCounterField--;
 }
 
-buildUnnamed2183() {
+buildUnnamed2205() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2183(core.List<core.String> o) {
+checkUnnamed2205(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -466,7 +466,7 @@
   var o = new api.GetDatabaseDdlResponse();
   buildCounterGetDatabaseDdlResponse++;
   if (buildCounterGetDatabaseDdlResponse < 3) {
-    o.statements = buildUnnamed2183();
+    o.statements = buildUnnamed2205();
   }
   buildCounterGetDatabaseDdlResponse--;
   return o;
@@ -475,7 +475,7 @@
 checkGetDatabaseDdlResponse(api.GetDatabaseDdlResponse o) {
   buildCounterGetDatabaseDdlResponse++;
   if (buildCounterGetDatabaseDdlResponse < 3) {
-    checkUnnamed2183(o.statements);
+    checkUnnamed2205(o.statements);
   }
   buildCounterGetDatabaseDdlResponse--;
 }
@@ -495,14 +495,14 @@
   buildCounterGetIamPolicyRequest--;
 }
 
-buildUnnamed2184() {
+buildUnnamed2206() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2184(core.Map<core.String, core.String> o) {
+checkUnnamed2206(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'));
@@ -515,7 +515,7 @@
   if (buildCounterInstance < 3) {
     o.config = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed2184();
+    o.labels = buildUnnamed2206();
     o.name = "foo";
     o.nodeCount = 42;
     o.state = "foo";
@@ -529,7 +529,7 @@
   if (buildCounterInstance < 3) {
     unittest.expect(o.config, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed2184(o.labels);
+    checkUnnamed2206(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nodeCount, unittest.equals(42));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -558,7 +558,7 @@
   buildCounterInstanceConfig--;
 }
 
-buildUnnamed2185() {
+buildUnnamed2207() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -573,7 +573,7 @@
   return o;
 }
 
-checkUnnamed2185(core.List<core.Object> o) {
+checkUnnamed2207(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o[0]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -587,7 +587,7 @@
   unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2186() {
+buildUnnamed2208() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -602,7 +602,7 @@
   return o;
 }
 
-checkUnnamed2186(core.List<core.Object> o) {
+checkUnnamed2208(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o[0]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -616,7 +616,7 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2187() {
+buildUnnamed2209() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -631,7 +631,7 @@
   return o;
 }
 
-checkUnnamed2187(core.List<core.Object> o) {
+checkUnnamed2209(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o[0]) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -645,7 +645,7 @@
   unittest.expect(casted8["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2188() {
+buildUnnamed2210() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -660,7 +660,7 @@
   return o;
 }
 
-checkUnnamed2188(core.List<core.Object> o) {
+checkUnnamed2210(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted9 = (o[0]) as core.Map;
   unittest.expect(casted9, unittest.hasLength(3));
@@ -679,10 +679,10 @@
   var o = new api.KeyRange();
   buildCounterKeyRange++;
   if (buildCounterKeyRange < 3) {
-    o.endClosed = buildUnnamed2185();
-    o.endOpen = buildUnnamed2186();
-    o.startClosed = buildUnnamed2187();
-    o.startOpen = buildUnnamed2188();
+    o.endClosed = buildUnnamed2207();
+    o.endOpen = buildUnnamed2208();
+    o.startClosed = buildUnnamed2209();
+    o.startOpen = buildUnnamed2210();
   }
   buildCounterKeyRange--;
   return o;
@@ -691,15 +691,15 @@
 checkKeyRange(api.KeyRange o) {
   buildCounterKeyRange++;
   if (buildCounterKeyRange < 3) {
-    checkUnnamed2185(o.endClosed);
-    checkUnnamed2186(o.endOpen);
-    checkUnnamed2187(o.startClosed);
-    checkUnnamed2188(o.startOpen);
+    checkUnnamed2207(o.endClosed);
+    checkUnnamed2208(o.endOpen);
+    checkUnnamed2209(o.startClosed);
+    checkUnnamed2210(o.startOpen);
   }
   buildCounterKeyRange--;
 }
 
-buildUnnamed2189() {
+buildUnnamed2211() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -714,7 +714,7 @@
   return o;
 }
 
-checkUnnamed2189(core.List<core.Object> o) {
+checkUnnamed2211(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted11 = (o[0]) as core.Map;
   unittest.expect(casted11, unittest.hasLength(3));
@@ -728,27 +728,27 @@
   unittest.expect(casted12["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2190() {
+buildUnnamed2212() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed2189());
-  o.add(buildUnnamed2189());
+  o.add(buildUnnamed2211());
+  o.add(buildUnnamed2211());
   return o;
 }
 
-checkUnnamed2190(core.List<core.List<core.Object>> o) {
+checkUnnamed2212(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2189(o[0]);
-  checkUnnamed2189(o[1]);
+  checkUnnamed2211(o[0]);
+  checkUnnamed2211(o[1]);
 }
 
-buildUnnamed2191() {
+buildUnnamed2213() {
   var o = new core.List<api.KeyRange>();
   o.add(buildKeyRange());
   o.add(buildKeyRange());
   return o;
 }
 
-checkUnnamed2191(core.List<api.KeyRange> o) {
+checkUnnamed2213(core.List<api.KeyRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKeyRange(o[0]);
   checkKeyRange(o[1]);
@@ -760,8 +760,8 @@
   buildCounterKeySet++;
   if (buildCounterKeySet < 3) {
     o.all = true;
-    o.keys = buildUnnamed2190();
-    o.ranges = buildUnnamed2191();
+    o.keys = buildUnnamed2212();
+    o.ranges = buildUnnamed2213();
   }
   buildCounterKeySet--;
   return o;
@@ -771,20 +771,20 @@
   buildCounterKeySet++;
   if (buildCounterKeySet < 3) {
     unittest.expect(o.all, unittest.isTrue);
-    checkUnnamed2190(o.keys);
-    checkUnnamed2191(o.ranges);
+    checkUnnamed2212(o.keys);
+    checkUnnamed2213(o.ranges);
   }
   buildCounterKeySet--;
 }
 
-buildUnnamed2192() {
+buildUnnamed2214() {
   var o = new core.List<api.Database>();
   o.add(buildDatabase());
   o.add(buildDatabase());
   return o;
 }
 
-checkUnnamed2192(core.List<api.Database> o) {
+checkUnnamed2214(core.List<api.Database> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatabase(o[0]);
   checkDatabase(o[1]);
@@ -795,7 +795,7 @@
   var o = new api.ListDatabasesResponse();
   buildCounterListDatabasesResponse++;
   if (buildCounterListDatabasesResponse < 3) {
-    o.databases = buildUnnamed2192();
+    o.databases = buildUnnamed2214();
     o.nextPageToken = "foo";
   }
   buildCounterListDatabasesResponse--;
@@ -805,20 +805,20 @@
 checkListDatabasesResponse(api.ListDatabasesResponse o) {
   buildCounterListDatabasesResponse++;
   if (buildCounterListDatabasesResponse < 3) {
-    checkUnnamed2192(o.databases);
+    checkUnnamed2214(o.databases);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDatabasesResponse--;
 }
 
-buildUnnamed2193() {
+buildUnnamed2215() {
   var o = new core.List<api.InstanceConfig>();
   o.add(buildInstanceConfig());
   o.add(buildInstanceConfig());
   return o;
 }
 
-checkUnnamed2193(core.List<api.InstanceConfig> o) {
+checkUnnamed2215(core.List<api.InstanceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceConfig(o[0]);
   checkInstanceConfig(o[1]);
@@ -829,7 +829,7 @@
   var o = new api.ListInstanceConfigsResponse();
   buildCounterListInstanceConfigsResponse++;
   if (buildCounterListInstanceConfigsResponse < 3) {
-    o.instanceConfigs = buildUnnamed2193();
+    o.instanceConfigs = buildUnnamed2215();
     o.nextPageToken = "foo";
   }
   buildCounterListInstanceConfigsResponse--;
@@ -839,20 +839,20 @@
 checkListInstanceConfigsResponse(api.ListInstanceConfigsResponse o) {
   buildCounterListInstanceConfigsResponse++;
   if (buildCounterListInstanceConfigsResponse < 3) {
-    checkUnnamed2193(o.instanceConfigs);
+    checkUnnamed2215(o.instanceConfigs);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListInstanceConfigsResponse--;
 }
 
-buildUnnamed2194() {
+buildUnnamed2216() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed2194(core.List<api.Instance> o) {
+checkUnnamed2216(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -863,7 +863,7 @@
   var o = new api.ListInstancesResponse();
   buildCounterListInstancesResponse++;
   if (buildCounterListInstancesResponse < 3) {
-    o.instances = buildUnnamed2194();
+    o.instances = buildUnnamed2216();
     o.nextPageToken = "foo";
   }
   buildCounterListInstancesResponse--;
@@ -873,20 +873,20 @@
 checkListInstancesResponse(api.ListInstancesResponse o) {
   buildCounterListInstancesResponse++;
   if (buildCounterListInstancesResponse < 3) {
-    checkUnnamed2194(o.instances);
+    checkUnnamed2216(o.instances);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListInstancesResponse--;
 }
 
-buildUnnamed2195() {
+buildUnnamed2217() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed2195(core.List<api.Operation> o) {
+checkUnnamed2217(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -898,7 +898,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed2195();
+    o.operations = buildUnnamed2217();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -908,19 +908,19 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2195(o.operations);
+    checkUnnamed2217(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed2196() {
+buildUnnamed2218() {
   var o = new core.List<api.Session>();
   o.add(buildSession());
   o.add(buildSession());
   return o;
 }
 
-checkUnnamed2196(core.List<api.Session> o) {
+checkUnnamed2218(core.List<api.Session> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSession(o[0]);
   checkSession(o[1]);
@@ -932,7 +932,7 @@
   buildCounterListSessionsResponse++;
   if (buildCounterListSessionsResponse < 3) {
     o.nextPageToken = "foo";
-    o.sessions = buildUnnamed2196();
+    o.sessions = buildUnnamed2218();
   }
   buildCounterListSessionsResponse--;
   return o;
@@ -942,7 +942,7 @@
   buildCounterListSessionsResponse++;
   if (buildCounterListSessionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2196(o.sessions);
+    checkUnnamed2218(o.sessions);
   }
   buildCounterListSessionsResponse--;
 }
@@ -974,7 +974,7 @@
   buildCounterMutation--;
 }
 
-buildUnnamed2197() {
+buildUnnamed2219() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -989,7 +989,7 @@
   return o;
 }
 
-checkUnnamed2197(core.Map<core.String, core.Object> o) {
+checkUnnamed2219(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted13 = (o["x"]) as core.Map;
   unittest.expect(casted13, unittest.hasLength(3));
@@ -1003,7 +1003,7 @@
   unittest.expect(casted14["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2198() {
+buildUnnamed2220() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1018,7 +1018,7 @@
   return o;
 }
 
-checkUnnamed2198(core.Map<core.String, core.Object> o) {
+checkUnnamed2220(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted15 = (o["x"]) as core.Map;
   unittest.expect(casted15, unittest.hasLength(3));
@@ -1039,9 +1039,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed2197();
+    o.metadata = buildUnnamed2219();
     o.name = "foo";
-    o.response = buildUnnamed2198();
+    o.response = buildUnnamed2220();
   }
   buildCounterOperation--;
   return o;
@@ -1052,14 +1052,14 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed2197(o.metadata);
+    checkUnnamed2219(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2198(o.response);
+    checkUnnamed2220(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed2199() {
+buildUnnamed2221() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -1074,7 +1074,7 @@
   return o;
 }
 
-checkUnnamed2199(core.List<core.Object> o) {
+checkUnnamed2221(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted17 = (o[0]) as core.Map;
   unittest.expect(casted17, unittest.hasLength(3));
@@ -1097,7 +1097,7 @@
     o.metadata = buildResultSetMetadata();
     o.resumeToken = "foo";
     o.stats = buildResultSetStats();
-    o.values = buildUnnamed2199();
+    o.values = buildUnnamed2221();
   }
   buildCounterPartialResultSet--;
   return o;
@@ -1110,25 +1110,25 @@
     checkResultSetMetadata(o.metadata);
     unittest.expect(o.resumeToken, unittest.equals('foo'));
     checkResultSetStats(o.stats);
-    checkUnnamed2199(o.values);
+    checkUnnamed2221(o.values);
   }
   buildCounterPartialResultSet--;
 }
 
-buildUnnamed2200() {
+buildUnnamed2222() {
   var o = new core.List<api.ChildLink>();
   o.add(buildChildLink());
   o.add(buildChildLink());
   return o;
 }
 
-checkUnnamed2200(core.List<api.ChildLink> o) {
+checkUnnamed2222(core.List<api.ChildLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChildLink(o[0]);
   checkChildLink(o[1]);
 }
 
-buildUnnamed2201() {
+buildUnnamed2223() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1143,7 +1143,7 @@
   return o;
 }
 
-checkUnnamed2201(core.Map<core.String, core.Object> o) {
+checkUnnamed2223(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted19 = (o["x"]) as core.Map;
   unittest.expect(casted19, unittest.hasLength(3));
@@ -1157,7 +1157,7 @@
   unittest.expect(casted20["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2202() {
+buildUnnamed2224() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1172,7 +1172,7 @@
   return o;
 }
 
-checkUnnamed2202(core.Map<core.String, core.Object> o) {
+checkUnnamed2224(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted21 = (o["x"]) as core.Map;
   unittest.expect(casted21, unittest.hasLength(3));
@@ -1191,12 +1191,12 @@
   var o = new api.PlanNode();
   buildCounterPlanNode++;
   if (buildCounterPlanNode < 3) {
-    o.childLinks = buildUnnamed2200();
+    o.childLinks = buildUnnamed2222();
     o.displayName = "foo";
-    o.executionStats = buildUnnamed2201();
+    o.executionStats = buildUnnamed2223();
     o.index = 42;
     o.kind = "foo";
-    o.metadata = buildUnnamed2202();
+    o.metadata = buildUnnamed2224();
     o.shortRepresentation = buildShortRepresentation();
   }
   buildCounterPlanNode--;
@@ -1206,25 +1206,25 @@
 checkPlanNode(api.PlanNode o) {
   buildCounterPlanNode++;
   if (buildCounterPlanNode < 3) {
-    checkUnnamed2200(o.childLinks);
+    checkUnnamed2222(o.childLinks);
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed2201(o.executionStats);
+    checkUnnamed2223(o.executionStats);
     unittest.expect(o.index, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2202(o.metadata);
+    checkUnnamed2224(o.metadata);
     checkShortRepresentation(o.shortRepresentation);
   }
   buildCounterPlanNode--;
 }
 
-buildUnnamed2203() {
+buildUnnamed2225() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed2203(core.List<api.Binding> o) {
+checkUnnamed2225(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -1235,7 +1235,7 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.bindings = buildUnnamed2203();
+    o.bindings = buildUnnamed2225();
     o.etag = "foo";
     o.version = 42;
   }
@@ -1246,21 +1246,21 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed2203(o.bindings);
+    checkUnnamed2225(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterPolicy--;
 }
 
-buildUnnamed2204() {
+buildUnnamed2226() {
   var o = new core.List<api.PlanNode>();
   o.add(buildPlanNode());
   o.add(buildPlanNode());
   return o;
 }
 
-checkUnnamed2204(core.List<api.PlanNode> o) {
+checkUnnamed2226(core.List<api.PlanNode> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlanNode(o[0]);
   checkPlanNode(o[1]);
@@ -1271,7 +1271,7 @@
   var o = new api.QueryPlan();
   buildCounterQueryPlan++;
   if (buildCounterQueryPlan < 3) {
-    o.planNodes = buildUnnamed2204();
+    o.planNodes = buildUnnamed2226();
   }
   buildCounterQueryPlan--;
   return o;
@@ -1280,7 +1280,7 @@
 checkQueryPlan(api.QueryPlan o) {
   buildCounterQueryPlan++;
   if (buildCounterQueryPlan < 3) {
-    checkUnnamed2204(o.planNodes);
+    checkUnnamed2226(o.planNodes);
   }
   buildCounterQueryPlan--;
 }
@@ -1314,14 +1314,14 @@
   buildCounterReadOnly--;
 }
 
-buildUnnamed2205() {
+buildUnnamed2227() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2205(core.List<core.String> o) {
+checkUnnamed2227(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1332,7 +1332,7 @@
   var o = new api.ReadRequest();
   buildCounterReadRequest++;
   if (buildCounterReadRequest < 3) {
-    o.columns = buildUnnamed2205();
+    o.columns = buildUnnamed2227();
     o.index = "foo";
     o.keySet = buildKeySet();
     o.limit = "foo";
@@ -1347,7 +1347,7 @@
 checkReadRequest(api.ReadRequest o) {
   buildCounterReadRequest++;
   if (buildCounterReadRequest < 3) {
-    checkUnnamed2205(o.columns);
+    checkUnnamed2227(o.columns);
     unittest.expect(o.index, unittest.equals('foo'));
     checkKeySet(o.keySet);
     unittest.expect(o.limit, unittest.equals('foo'));
@@ -1373,7 +1373,7 @@
   buildCounterReadWrite--;
 }
 
-buildUnnamed2206() {
+buildUnnamed2228() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -1388,7 +1388,7 @@
   return o;
 }
 
-checkUnnamed2206(core.List<core.Object> o) {
+checkUnnamed2228(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted23 = (o[0]) as core.Map;
   unittest.expect(casted23, unittest.hasLength(3));
@@ -1402,17 +1402,17 @@
   unittest.expect(casted24["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2207() {
+buildUnnamed2229() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed2206());
-  o.add(buildUnnamed2206());
+  o.add(buildUnnamed2228());
+  o.add(buildUnnamed2228());
   return o;
 }
 
-checkUnnamed2207(core.List<core.List<core.Object>> o) {
+checkUnnamed2229(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2206(o[0]);
-  checkUnnamed2206(o[1]);
+  checkUnnamed2228(o[0]);
+  checkUnnamed2228(o[1]);
 }
 
 core.int buildCounterResultSet = 0;
@@ -1421,7 +1421,7 @@
   buildCounterResultSet++;
   if (buildCounterResultSet < 3) {
     o.metadata = buildResultSetMetadata();
-    o.rows = buildUnnamed2207();
+    o.rows = buildUnnamed2229();
     o.stats = buildResultSetStats();
   }
   buildCounterResultSet--;
@@ -1432,7 +1432,7 @@
   buildCounterResultSet++;
   if (buildCounterResultSet < 3) {
     checkResultSetMetadata(o.metadata);
-    checkUnnamed2207(o.rows);
+    checkUnnamed2229(o.rows);
     checkResultSetStats(o.stats);
   }
   buildCounterResultSet--;
@@ -1459,7 +1459,7 @@
   buildCounterResultSetMetadata--;
 }
 
-buildUnnamed2208() {
+buildUnnamed2230() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1474,7 +1474,7 @@
   return o;
 }
 
-checkUnnamed2208(core.Map<core.String, core.Object> o) {
+checkUnnamed2230(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted25 = (o["x"]) as core.Map;
   unittest.expect(casted25, unittest.hasLength(3));
@@ -1494,7 +1494,7 @@
   buildCounterResultSetStats++;
   if (buildCounterResultSetStats < 3) {
     o.queryPlan = buildQueryPlan();
-    o.queryStats = buildUnnamed2208();
+    o.queryStats = buildUnnamed2230();
   }
   buildCounterResultSetStats--;
   return o;
@@ -1504,7 +1504,7 @@
   buildCounterResultSetStats++;
   if (buildCounterResultSetStats < 3) {
     checkQueryPlan(o.queryPlan);
-    checkUnnamed2208(o.queryStats);
+    checkUnnamed2230(o.queryStats);
   }
   buildCounterResultSetStats--;
 }
@@ -1528,14 +1528,14 @@
   buildCounterRollbackRequest--;
 }
 
-buildUnnamed2209() {
+buildUnnamed2231() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2209(core.Map<core.String, core.String> o) {
+checkUnnamed2231(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'));
@@ -1548,7 +1548,7 @@
   if (buildCounterSession < 3) {
     o.approximateLastUseTime = "foo";
     o.createTime = "foo";
-    o.labels = buildUnnamed2209();
+    o.labels = buildUnnamed2231();
     o.name = "foo";
   }
   buildCounterSession--;
@@ -1560,7 +1560,7 @@
   if (buildCounterSession < 3) {
     unittest.expect(o.approximateLastUseTime, unittest.equals('foo'));
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkUnnamed2209(o.labels);
+    checkUnnamed2231(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterSession--;
@@ -1585,14 +1585,14 @@
   buildCounterSetIamPolicyRequest--;
 }
 
-buildUnnamed2210() {
+buildUnnamed2232() {
   var o = new core.Map<core.String, core.int>();
   o["x"] = 42;
   o["y"] = 42;
   return o;
 }
 
-checkUnnamed2210(core.Map<core.String, core.int> o) {
+checkUnnamed2232(core.Map<core.String, core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals(42));
   unittest.expect(o["y"], unittest.equals(42));
@@ -1604,7 +1604,7 @@
   buildCounterShortRepresentation++;
   if (buildCounterShortRepresentation < 3) {
     o.description = "foo";
-    o.subqueries = buildUnnamed2210();
+    o.subqueries = buildUnnamed2232();
   }
   buildCounterShortRepresentation--;
   return o;
@@ -1614,12 +1614,12 @@
   buildCounterShortRepresentation++;
   if (buildCounterShortRepresentation < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2210(o.subqueries);
+    checkUnnamed2232(o.subqueries);
   }
   buildCounterShortRepresentation--;
 }
 
-buildUnnamed2211() {
+buildUnnamed2233() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1634,7 +1634,7 @@
   return o;
 }
 
-checkUnnamed2211(core.Map<core.String, core.Object> o) {
+checkUnnamed2233(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted27 = (o["x"]) as core.Map;
   unittest.expect(casted27, unittest.hasLength(3));
@@ -1648,17 +1648,17 @@
   unittest.expect(casted28["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2212() {
+buildUnnamed2234() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed2211());
-  o.add(buildUnnamed2211());
+  o.add(buildUnnamed2233());
+  o.add(buildUnnamed2233());
   return o;
 }
 
-checkUnnamed2212(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed2234(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2211(o[0]);
-  checkUnnamed2211(o[1]);
+  checkUnnamed2233(o[0]);
+  checkUnnamed2233(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1667,7 +1667,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed2212();
+    o.details = buildUnnamed2234();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1678,20 +1678,20 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed2212(o.details);
+    checkUnnamed2234(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-buildUnnamed2213() {
+buildUnnamed2235() {
   var o = new core.List<api.Field>();
   o.add(buildField());
   o.add(buildField());
   return o;
 }
 
-checkUnnamed2213(core.List<api.Field> o) {
+checkUnnamed2235(core.List<api.Field> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkField(o[0]);
   checkField(o[1]);
@@ -1702,7 +1702,7 @@
   var o = new api.StructType();
   buildCounterStructType++;
   if (buildCounterStructType < 3) {
-    o.fields = buildUnnamed2213();
+    o.fields = buildUnnamed2235();
   }
   buildCounterStructType--;
   return o;
@@ -1711,19 +1711,19 @@
 checkStructType(api.StructType o) {
   buildCounterStructType++;
   if (buildCounterStructType < 3) {
-    checkUnnamed2213(o.fields);
+    checkUnnamed2235(o.fields);
   }
   buildCounterStructType--;
 }
 
-buildUnnamed2214() {
+buildUnnamed2236() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2214(core.List<core.String> o) {
+checkUnnamed2236(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1734,7 +1734,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed2214();
+    o.permissions = buildUnnamed2236();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -1743,19 +1743,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed2214(o.permissions);
+    checkUnnamed2236(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed2215() {
+buildUnnamed2237() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2215(core.List<core.String> o) {
+checkUnnamed2237(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1766,7 +1766,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed2215();
+    o.permissions = buildUnnamed2237();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -1775,7 +1775,7 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed2215(o.permissions);
+    checkUnnamed2237(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
@@ -1868,27 +1868,27 @@
   buildCounterType--;
 }
 
-buildUnnamed2216() {
+buildUnnamed2238() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2216(core.List<core.String> o) {
+checkUnnamed2238(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2217() {
+buildUnnamed2239() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2217(core.List<core.String> o) {
+checkUnnamed2239(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1899,9 +1899,9 @@
   var o = new api.UpdateDatabaseDdlMetadata();
   buildCounterUpdateDatabaseDdlMetadata++;
   if (buildCounterUpdateDatabaseDdlMetadata < 3) {
-    o.commitTimestamps = buildUnnamed2216();
+    o.commitTimestamps = buildUnnamed2238();
     o.database = "foo";
-    o.statements = buildUnnamed2217();
+    o.statements = buildUnnamed2239();
   }
   buildCounterUpdateDatabaseDdlMetadata--;
   return o;
@@ -1910,21 +1910,21 @@
 checkUpdateDatabaseDdlMetadata(api.UpdateDatabaseDdlMetadata o) {
   buildCounterUpdateDatabaseDdlMetadata++;
   if (buildCounterUpdateDatabaseDdlMetadata < 3) {
-    checkUnnamed2216(o.commitTimestamps);
+    checkUnnamed2238(o.commitTimestamps);
     unittest.expect(o.database, unittest.equals('foo'));
-    checkUnnamed2217(o.statements);
+    checkUnnamed2239(o.statements);
   }
   buildCounterUpdateDatabaseDdlMetadata--;
 }
 
-buildUnnamed2218() {
+buildUnnamed2240() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2218(core.List<core.String> o) {
+checkUnnamed2240(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1936,7 +1936,7 @@
   buildCounterUpdateDatabaseDdlRequest++;
   if (buildCounterUpdateDatabaseDdlRequest < 3) {
     o.operationId = "foo";
-    o.statements = buildUnnamed2218();
+    o.statements = buildUnnamed2240();
   }
   buildCounterUpdateDatabaseDdlRequest--;
   return o;
@@ -1946,7 +1946,7 @@
   buildCounterUpdateDatabaseDdlRequest++;
   if (buildCounterUpdateDatabaseDdlRequest < 3) {
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkUnnamed2218(o.statements);
+    checkUnnamed2240(o.statements);
   }
   buildCounterUpdateDatabaseDdlRequest--;
 }
@@ -1997,20 +1997,20 @@
   buildCounterUpdateInstanceRequest--;
 }
 
-buildUnnamed2219() {
+buildUnnamed2241() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2219(core.List<core.String> o) {
+checkUnnamed2241(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2220() {
+buildUnnamed2242() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -2025,7 +2025,7 @@
   return o;
 }
 
-checkUnnamed2220(core.List<core.Object> o) {
+checkUnnamed2242(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted29 = (o[0]) as core.Map;
   unittest.expect(casted29, unittest.hasLength(3));
@@ -2039,17 +2039,17 @@
   unittest.expect(casted30["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2221() {
+buildUnnamed2243() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed2220());
-  o.add(buildUnnamed2220());
+  o.add(buildUnnamed2242());
+  o.add(buildUnnamed2242());
   return o;
 }
 
-checkUnnamed2221(core.List<core.List<core.Object>> o) {
+checkUnnamed2243(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2220(o[0]);
-  checkUnnamed2220(o[1]);
+  checkUnnamed2242(o[0]);
+  checkUnnamed2242(o[1]);
 }
 
 core.int buildCounterWrite = 0;
@@ -2057,9 +2057,9 @@
   var o = new api.Write();
   buildCounterWrite++;
   if (buildCounterWrite < 3) {
-    o.columns = buildUnnamed2219();
+    o.columns = buildUnnamed2241();
     o.table = "foo";
-    o.values = buildUnnamed2221();
+    o.values = buildUnnamed2243();
   }
   buildCounterWrite--;
   return o;
@@ -2068,9 +2068,9 @@
 checkWrite(api.Write o) {
   buildCounterWrite++;
   if (buildCounterWrite < 3) {
-    checkUnnamed2219(o.columns);
+    checkUnnamed2241(o.columns);
     unittest.expect(o.table, unittest.equals('foo'));
-    checkUnnamed2221(o.values);
+    checkUnnamed2243(o.values);
   }
   buildCounterWrite--;
 }
@@ -2854,9 +2854,9 @@
       api.ProjectsInstancesResourceApi res =
           new api.SpannerApi(mock).projects.instances;
       var arg_parent = "foo";
+      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_filter = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2889,11 +2889,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -2904,9 +2904,9 @@
       }), true);
       res
           .list(arg_parent,
+              filter: arg_filter,
               pageToken: arg_pageToken,
               pageSize: arg_pageSize,
-              filter: arg_filter,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListInstancesResponse response) {
         checkListInstancesResponse(response);
@@ -3746,9 +3746,9 @@
       api.ProjectsInstancesDatabasesOperationsResourceApi res =
           new api.SpannerApi(mock).projects.instances.databases.operations;
       var arg_name = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_filter = "foo";
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3781,11 +3781,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -3796,9 +3796,9 @@
       }), true);
       res
           .list(arg_name,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
               filter: arg_filter,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
@@ -4196,9 +4196,9 @@
       api.ProjectsInstancesDatabasesSessionsResourceApi res =
           new api.SpannerApi(mock).projects.instances.databases.sessions;
       var arg_database = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_filter = "foo";
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -4231,11 +4231,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -4246,9 +4246,9 @@
       }), true);
       res
           .list(arg_database,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
               filter: arg_filter,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListSessionsResponse response) {
         checkListSessionsResponse(response);
diff --git a/generated/googleapis/test/speech/v1_test.dart b/generated/googleapis/test/speech/v1_test.dart
index 0562d10..a160b73 100644
--- a/generated/googleapis/test/speech/v1_test.dart
+++ b/generated/googleapis/test/speech/v1_test.dart
@@ -80,14 +80,14 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed3174() {
+buildUnnamed3202() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed3174(core.List<api.Operation> o) {
+checkUnnamed3202(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -99,7 +99,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed3174();
+    o.operations = buildUnnamed3202();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -109,7 +109,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3174(o.operations);
+    checkUnnamed3202(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
@@ -135,7 +135,7 @@
   buildCounterLongRunningRecognizeRequest--;
 }
 
-buildUnnamed3175() {
+buildUnnamed3203() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -150,7 +150,7 @@
   return o;
 }
 
-checkUnnamed3175(core.Map<core.String, core.Object> o) {
+checkUnnamed3203(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));
@@ -164,7 +164,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3176() {
+buildUnnamed3204() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -179,7 +179,7 @@
   return o;
 }
 
-checkUnnamed3176(core.Map<core.String, core.Object> o) {
+checkUnnamed3204(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -200,9 +200,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed3175();
+    o.metadata = buildUnnamed3203();
     o.name = "foo";
-    o.response = buildUnnamed3176();
+    o.response = buildUnnamed3204();
   }
   buildCounterOperation--;
   return o;
@@ -213,9 +213,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed3175(o.metadata);
+    checkUnnamed3203(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3176(o.response);
+    checkUnnamed3204(o.response);
   }
   buildCounterOperation--;
 }
@@ -241,14 +241,14 @@
   buildCounterRecognitionAudio--;
 }
 
-buildUnnamed3177() {
+buildUnnamed3205() {
   var o = new core.List<api.SpeechContext>();
   o.add(buildSpeechContext());
   o.add(buildSpeechContext());
   return o;
 }
 
-checkUnnamed3177(core.List<api.SpeechContext> o) {
+checkUnnamed3205(core.List<api.SpeechContext> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSpeechContext(o[0]);
   checkSpeechContext(o[1]);
@@ -265,7 +265,7 @@
     o.maxAlternatives = 42;
     o.profanityFilter = true;
     o.sampleRateHertz = 42;
-    o.speechContexts = buildUnnamed3177();
+    o.speechContexts = buildUnnamed3205();
   }
   buildCounterRecognitionConfig--;
   return o;
@@ -280,7 +280,7 @@
     unittest.expect(o.maxAlternatives, unittest.equals(42));
     unittest.expect(o.profanityFilter, unittest.isTrue);
     unittest.expect(o.sampleRateHertz, unittest.equals(42));
-    checkUnnamed3177(o.speechContexts);
+    checkUnnamed3205(o.speechContexts);
   }
   buildCounterRecognitionConfig--;
 }
@@ -306,14 +306,14 @@
   buildCounterRecognizeRequest--;
 }
 
-buildUnnamed3178() {
+buildUnnamed3206() {
   var o = new core.List<api.SpeechRecognitionResult>();
   o.add(buildSpeechRecognitionResult());
   o.add(buildSpeechRecognitionResult());
   return o;
 }
 
-checkUnnamed3178(core.List<api.SpeechRecognitionResult> o) {
+checkUnnamed3206(core.List<api.SpeechRecognitionResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSpeechRecognitionResult(o[0]);
   checkSpeechRecognitionResult(o[1]);
@@ -324,7 +324,7 @@
   var o = new api.RecognizeResponse();
   buildCounterRecognizeResponse++;
   if (buildCounterRecognizeResponse < 3) {
-    o.results = buildUnnamed3178();
+    o.results = buildUnnamed3206();
   }
   buildCounterRecognizeResponse--;
   return o;
@@ -333,19 +333,19 @@
 checkRecognizeResponse(api.RecognizeResponse o) {
   buildCounterRecognizeResponse++;
   if (buildCounterRecognizeResponse < 3) {
-    checkUnnamed3178(o.results);
+    checkUnnamed3206(o.results);
   }
   buildCounterRecognizeResponse--;
 }
 
-buildUnnamed3179() {
+buildUnnamed3207() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3179(core.List<core.String> o) {
+checkUnnamed3207(core.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,7 +356,7 @@
   var o = new api.SpeechContext();
   buildCounterSpeechContext++;
   if (buildCounterSpeechContext < 3) {
-    o.phrases = buildUnnamed3179();
+    o.phrases = buildUnnamed3207();
   }
   buildCounterSpeechContext--;
   return o;
@@ -365,19 +365,19 @@
 checkSpeechContext(api.SpeechContext o) {
   buildCounterSpeechContext++;
   if (buildCounterSpeechContext < 3) {
-    checkUnnamed3179(o.phrases);
+    checkUnnamed3207(o.phrases);
   }
   buildCounterSpeechContext--;
 }
 
-buildUnnamed3180() {
+buildUnnamed3208() {
   var o = new core.List<api.WordInfo>();
   o.add(buildWordInfo());
   o.add(buildWordInfo());
   return o;
 }
 
-checkUnnamed3180(core.List<api.WordInfo> o) {
+checkUnnamed3208(core.List<api.WordInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWordInfo(o[0]);
   checkWordInfo(o[1]);
@@ -390,7 +390,7 @@
   if (buildCounterSpeechRecognitionAlternative < 3) {
     o.confidence = 42.0;
     o.transcript = "foo";
-    o.words = buildUnnamed3180();
+    o.words = buildUnnamed3208();
   }
   buildCounterSpeechRecognitionAlternative--;
   return o;
@@ -401,19 +401,19 @@
   if (buildCounterSpeechRecognitionAlternative < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.transcript, unittest.equals('foo'));
-    checkUnnamed3180(o.words);
+    checkUnnamed3208(o.words);
   }
   buildCounterSpeechRecognitionAlternative--;
 }
 
-buildUnnamed3181() {
+buildUnnamed3209() {
   var o = new core.List<api.SpeechRecognitionAlternative>();
   o.add(buildSpeechRecognitionAlternative());
   o.add(buildSpeechRecognitionAlternative());
   return o;
 }
 
-checkUnnamed3181(core.List<api.SpeechRecognitionAlternative> o) {
+checkUnnamed3209(core.List<api.SpeechRecognitionAlternative> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSpeechRecognitionAlternative(o[0]);
   checkSpeechRecognitionAlternative(o[1]);
@@ -424,7 +424,7 @@
   var o = new api.SpeechRecognitionResult();
   buildCounterSpeechRecognitionResult++;
   if (buildCounterSpeechRecognitionResult < 3) {
-    o.alternatives = buildUnnamed3181();
+    o.alternatives = buildUnnamed3209();
     o.channelTag = 42;
   }
   buildCounterSpeechRecognitionResult--;
@@ -434,13 +434,13 @@
 checkSpeechRecognitionResult(api.SpeechRecognitionResult o) {
   buildCounterSpeechRecognitionResult++;
   if (buildCounterSpeechRecognitionResult < 3) {
-    checkUnnamed3181(o.alternatives);
+    checkUnnamed3209(o.alternatives);
     unittest.expect(o.channelTag, unittest.equals(42));
   }
   buildCounterSpeechRecognitionResult--;
 }
 
-buildUnnamed3182() {
+buildUnnamed3210() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -455,7 +455,7 @@
   return o;
 }
 
-checkUnnamed3182(core.Map<core.String, core.Object> o) {
+checkUnnamed3210(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -469,17 +469,17 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3183() {
+buildUnnamed3211() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed3182());
-  o.add(buildUnnamed3182());
+  o.add(buildUnnamed3210());
+  o.add(buildUnnamed3210());
   return o;
 }
 
-checkUnnamed3183(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed3211(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3182(o[0]);
-  checkUnnamed3182(o[1]);
+  checkUnnamed3210(o[0]);
+  checkUnnamed3210(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -488,7 +488,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed3183();
+    o.details = buildUnnamed3211();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -499,7 +499,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed3183(o.details);
+    checkUnnamed3211(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -802,10 +802,10 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.SpeechApi(mock).operations;
-      var arg_pageSize = 42;
-      var arg_filter = "foo";
       var arg_name = "foo";
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
+      var arg_filter = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -837,12 +837,12 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(queryMap["name"].first, unittest.equals(arg_name));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -853,10 +853,10 @@
       }), true);
       res
           .list(
-              pageSize: arg_pageSize,
-              filter: arg_filter,
               name: arg_name,
               pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              filter: arg_filter,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
diff --git a/generated/googleapis/test/storage/v1_test.dart b/generated/googleapis/test/storage/v1_test.dart
index 80d1afd..c0ce5a0 100644
--- a/generated/googleapis/test/storage/v1_test.dart
+++ b/generated/googleapis/test/storage/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed891() {
+buildUnnamed900() {
   var o = new core.List<api.BucketAccessControl>();
   o.add(buildBucketAccessControl());
   o.add(buildBucketAccessControl());
   return o;
 }
 
-checkUnnamed891(core.List<api.BucketAccessControl> o) {
+checkUnnamed900(core.List<api.BucketAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketAccessControl(o[0]);
   checkBucketAccessControl(o[1]);
@@ -82,40 +82,40 @@
   buildCounterBucketBilling--;
 }
 
-buildUnnamed892() {
+buildUnnamed901() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed892(core.List<core.String> o) {
+checkUnnamed901(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed893() {
+buildUnnamed902() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed893(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'));
 }
 
-buildUnnamed894() {
+buildUnnamed903() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed894(core.List<core.String> o) {
+checkUnnamed903(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -127,9 +127,9 @@
   buildCounterBucketCors++;
   if (buildCounterBucketCors < 3) {
     o.maxAgeSeconds = 42;
-    o.method = buildUnnamed892();
-    o.origin = buildUnnamed893();
-    o.responseHeader = buildUnnamed894();
+    o.method = buildUnnamed901();
+    o.origin = buildUnnamed902();
+    o.responseHeader = buildUnnamed903();
   }
   buildCounterBucketCors--;
   return o;
@@ -139,34 +139,34 @@
   buildCounterBucketCors++;
   if (buildCounterBucketCors < 3) {
     unittest.expect(o.maxAgeSeconds, unittest.equals(42));
-    checkUnnamed892(o.method);
-    checkUnnamed893(o.origin);
-    checkUnnamed894(o.responseHeader);
+    checkUnnamed901(o.method);
+    checkUnnamed902(o.origin);
+    checkUnnamed903(o.responseHeader);
   }
   buildCounterBucketCors--;
 }
 
-buildUnnamed895() {
+buildUnnamed904() {
   var o = new core.List<api.BucketCors>();
   o.add(buildBucketCors());
   o.add(buildBucketCors());
   return o;
 }
 
-checkUnnamed895(core.List<api.BucketCors> o) {
+checkUnnamed904(core.List<api.BucketCors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketCors(o[0]);
   checkBucketCors(o[1]);
 }
 
-buildUnnamed896() {
+buildUnnamed905() {
   var o = new core.List<api.ObjectAccessControl>();
   o.add(buildObjectAccessControl());
   o.add(buildObjectAccessControl());
   return o;
 }
 
-checkUnnamed896(core.List<api.ObjectAccessControl> o) {
+checkUnnamed905(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObjectAccessControl(o[0]);
   checkObjectAccessControl(o[1]);
@@ -191,14 +191,14 @@
   buildCounterBucketEncryption--;
 }
 
-buildUnnamed897() {
+buildUnnamed906() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed897(core.Map<core.String, core.String> o) {
+checkUnnamed906(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'));
@@ -225,14 +225,14 @@
   buildCounterBucketLifecycleRuleAction--;
 }
 
-buildUnnamed898() {
+buildUnnamed907() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed898(core.List<core.String> o) {
+checkUnnamed907(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -246,7 +246,7 @@
     o.age = 42;
     o.createdBefore = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.isLive = true;
-    o.matchesStorageClass = buildUnnamed898();
+    o.matchesStorageClass = buildUnnamed907();
     o.numNewerVersions = 42;
   }
   buildCounterBucketLifecycleRuleCondition--;
@@ -260,7 +260,7 @@
     unittest.expect(o.createdBefore,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.isLive, unittest.isTrue);
-    checkUnnamed898(o.matchesStorageClass);
+    checkUnnamed907(o.matchesStorageClass);
     unittest.expect(o.numNewerVersions, unittest.equals(42));
   }
   buildCounterBucketLifecycleRuleCondition--;
@@ -287,14 +287,14 @@
   buildCounterBucketLifecycleRule--;
 }
 
-buildUnnamed899() {
+buildUnnamed908() {
   var o = new core.List<api.BucketLifecycleRule>();
   o.add(buildBucketLifecycleRule());
   o.add(buildBucketLifecycleRule());
   return o;
 }
 
-checkUnnamed899(core.List<api.BucketLifecycleRule> o) {
+checkUnnamed908(core.List<api.BucketLifecycleRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketLifecycleRule(o[0]);
   checkBucketLifecycleRule(o[1]);
@@ -305,7 +305,7 @@
   var o = new api.BucketLifecycle();
   buildCounterBucketLifecycle++;
   if (buildCounterBucketLifecycle < 3) {
-    o.rule = buildUnnamed899();
+    o.rule = buildUnnamed908();
   }
   buildCounterBucketLifecycle--;
   return o;
@@ -314,7 +314,7 @@
 checkBucketLifecycle(api.BucketLifecycle o) {
   buildCounterBucketLifecycle++;
   if (buildCounterBucketLifecycle < 3) {
-    checkUnnamed899(o.rule);
+    checkUnnamed908(o.rule);
   }
   buildCounterBucketLifecycle--;
 }
@@ -361,6 +361,30 @@
   buildCounterBucketOwner--;
 }
 
+core.int buildCounterBucketRetentionPolicy = 0;
+buildBucketRetentionPolicy() {
+  var o = new api.BucketRetentionPolicy();
+  buildCounterBucketRetentionPolicy++;
+  if (buildCounterBucketRetentionPolicy < 3) {
+    o.effectiveTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.isLocked = true;
+    o.retentionPeriod = "foo";
+  }
+  buildCounterBucketRetentionPolicy--;
+  return o;
+}
+
+checkBucketRetentionPolicy(api.BucketRetentionPolicy o) {
+  buildCounterBucketRetentionPolicy++;
+  if (buildCounterBucketRetentionPolicy < 3) {
+    unittest.expect(o.effectiveTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.isLocked, unittest.isTrue);
+    unittest.expect(o.retentionPeriod, unittest.equals('foo'));
+  }
+  buildCounterBucketRetentionPolicy--;
+}
+
 core.int buildCounterBucketVersioning = 0;
 buildBucketVersioning() {
   var o = new api.BucketVersioning();
@@ -406,15 +430,16 @@
   var o = new api.Bucket();
   buildCounterBucket++;
   if (buildCounterBucket < 3) {
-    o.acl = buildUnnamed891();
+    o.acl = buildUnnamed900();
     o.billing = buildBucketBilling();
-    o.cors = buildUnnamed895();
-    o.defaultObjectAcl = buildUnnamed896();
+    o.cors = buildUnnamed904();
+    o.defaultEventBasedHold = true;
+    o.defaultObjectAcl = buildUnnamed905();
     o.encryption = buildBucketEncryption();
     o.etag = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed897();
+    o.labels = buildUnnamed906();
     o.lifecycle = buildBucketLifecycle();
     o.location = "foo";
     o.logging = buildBucketLogging();
@@ -422,6 +447,7 @@
     o.name = "foo";
     o.owner = buildBucketOwner();
     o.projectNumber = "foo";
+    o.retentionPolicy = buildBucketRetentionPolicy();
     o.selfLink = "foo";
     o.storageClass = "foo";
     o.timeCreated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -436,15 +462,16 @@
 checkBucket(api.Bucket o) {
   buildCounterBucket++;
   if (buildCounterBucket < 3) {
-    checkUnnamed891(o.acl);
+    checkUnnamed900(o.acl);
     checkBucketBilling(o.billing);
-    checkUnnamed895(o.cors);
-    checkUnnamed896(o.defaultObjectAcl);
+    checkUnnamed904(o.cors);
+    unittest.expect(o.defaultEventBasedHold, unittest.isTrue);
+    checkUnnamed905(o.defaultObjectAcl);
     checkBucketEncryption(o.encryption);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed897(o.labels);
+    checkUnnamed906(o.labels);
     checkBucketLifecycle(o.lifecycle);
     unittest.expect(o.location, unittest.equals('foo'));
     checkBucketLogging(o.logging);
@@ -452,6 +479,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     checkBucketOwner(o.owner);
     unittest.expect(o.projectNumber, unittest.equals('foo'));
+    checkBucketRetentionPolicy(o.retentionPolicy);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.storageClass, unittest.equals('foo'));
     unittest.expect(o.timeCreated,
@@ -524,14 +552,14 @@
   buildCounterBucketAccessControl--;
 }
 
-buildUnnamed900() {
+buildUnnamed909() {
   var o = new core.List<api.BucketAccessControl>();
   o.add(buildBucketAccessControl());
   o.add(buildBucketAccessControl());
   return o;
 }
 
-checkUnnamed900(core.List<api.BucketAccessControl> o) {
+checkUnnamed909(core.List<api.BucketAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketAccessControl(o[0]);
   checkBucketAccessControl(o[1]);
@@ -542,7 +570,7 @@
   var o = new api.BucketAccessControls();
   buildCounterBucketAccessControls++;
   if (buildCounterBucketAccessControls < 3) {
-    o.items = buildUnnamed900();
+    o.items = buildUnnamed909();
     o.kind = "foo";
   }
   buildCounterBucketAccessControls--;
@@ -552,20 +580,20 @@
 checkBucketAccessControls(api.BucketAccessControls o) {
   buildCounterBucketAccessControls++;
   if (buildCounterBucketAccessControls < 3) {
-    checkUnnamed900(o.items);
+    checkUnnamed909(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBucketAccessControls--;
 }
 
-buildUnnamed901() {
+buildUnnamed910() {
   var o = new core.List<api.Bucket>();
   o.add(buildBucket());
   o.add(buildBucket());
   return o;
 }
 
-checkUnnamed901(core.List<api.Bucket> o) {
+checkUnnamed910(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucket(o[0]);
   checkBucket(o[1]);
@@ -576,7 +604,7 @@
   var o = new api.Buckets();
   buildCounterBuckets++;
   if (buildCounterBuckets < 3) {
-    o.items = buildUnnamed901();
+    o.items = buildUnnamed910();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -587,21 +615,21 @@
 checkBuckets(api.Buckets o) {
   buildCounterBuckets++;
   if (buildCounterBuckets < 3) {
-    checkUnnamed901(o.items);
+    checkUnnamed910(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterBuckets--;
 }
 
-buildUnnamed902() {
+buildUnnamed911() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed902(core.Map<core.String, core.String> o) {
+checkUnnamed911(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'));
@@ -616,7 +644,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed902();
+    o.params = buildUnnamed911();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -634,7 +662,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed902(o.params);
+    checkUnnamed911(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -688,14 +716,14 @@
   buildCounterComposeRequestSourceObjects--;
 }
 
-buildUnnamed903() {
+buildUnnamed912() {
   var o = new core.List<api.ComposeRequestSourceObjects>();
   o.add(buildComposeRequestSourceObjects());
   o.add(buildComposeRequestSourceObjects());
   return o;
 }
 
-checkUnnamed903(core.List<api.ComposeRequestSourceObjects> o) {
+checkUnnamed912(core.List<api.ComposeRequestSourceObjects> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComposeRequestSourceObjects(o[0]);
   checkComposeRequestSourceObjects(o[1]);
@@ -708,7 +736,7 @@
   if (buildCounterComposeRequest < 3) {
     o.destination = buildObject();
     o.kind = "foo";
-    o.sourceObjects = buildUnnamed903();
+    o.sourceObjects = buildUnnamed912();
   }
   buildCounterComposeRequest--;
   return o;
@@ -719,32 +747,32 @@
   if (buildCounterComposeRequest < 3) {
     checkObject(o.destination);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed903(o.sourceObjects);
+    checkUnnamed912(o.sourceObjects);
   }
   buildCounterComposeRequest--;
 }
 
-buildUnnamed904() {
+buildUnnamed913() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed904(core.Map<core.String, core.String> o) {
+checkUnnamed913(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'));
 }
 
-buildUnnamed905() {
+buildUnnamed914() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed905(core.List<core.String> o) {
+checkUnnamed914(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -755,9 +783,9 @@
   var o = new api.Notification();
   buildCounterNotification++;
   if (buildCounterNotification < 3) {
-    o.customAttributes = buildUnnamed904();
+    o.customAttributes = buildUnnamed913();
     o.etag = "foo";
-    o.eventTypes = buildUnnamed905();
+    o.eventTypes = buildUnnamed914();
     o.id = "foo";
     o.kind = "foo";
     o.objectNamePrefix = "foo";
@@ -772,9 +800,9 @@
 checkNotification(api.Notification o) {
   buildCounterNotification++;
   if (buildCounterNotification < 3) {
-    checkUnnamed904(o.customAttributes);
+    checkUnnamed913(o.customAttributes);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed905(o.eventTypes);
+    checkUnnamed914(o.eventTypes);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.objectNamePrefix, unittest.equals('foo'));
@@ -785,14 +813,14 @@
   buildCounterNotification--;
 }
 
-buildUnnamed906() {
+buildUnnamed915() {
   var o = new core.List<api.Notification>();
   o.add(buildNotification());
   o.add(buildNotification());
   return o;
 }
 
-checkUnnamed906(core.List<api.Notification> o) {
+checkUnnamed915(core.List<api.Notification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNotification(o[0]);
   checkNotification(o[1]);
@@ -803,7 +831,7 @@
   var o = new api.Notifications();
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
-    o.items = buildUnnamed906();
+    o.items = buildUnnamed915();
     o.kind = "foo";
   }
   buildCounterNotifications--;
@@ -813,20 +841,20 @@
 checkNotifications(api.Notifications o) {
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
-    checkUnnamed906(o.items);
+    checkUnnamed915(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterNotifications--;
 }
 
-buildUnnamed907() {
+buildUnnamed916() {
   var o = new core.List<api.ObjectAccessControl>();
   o.add(buildObjectAccessControl());
   o.add(buildObjectAccessControl());
   return o;
 }
 
-checkUnnamed907(core.List<api.ObjectAccessControl> o) {
+checkUnnamed916(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObjectAccessControl(o[0]);
   checkObjectAccessControl(o[1]);
@@ -853,14 +881,14 @@
   buildCounterObjectCustomerEncryption--;
 }
 
-buildUnnamed908() {
+buildUnnamed917() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed908(core.Map<core.String, core.String> o) {
+checkUnnamed917(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'));
@@ -892,7 +920,7 @@
   var o = new api.Object();
   buildCounterObject++;
   if (buildCounterObject < 3) {
-    o.acl = buildUnnamed907();
+    o.acl = buildUnnamed916();
     o.bucket = "foo";
     o.cacheControl = "foo";
     o.componentCount = 42;
@@ -903,19 +931,22 @@
     o.crc32c = "foo";
     o.customerEncryption = buildObjectCustomerEncryption();
     o.etag = "foo";
+    o.eventBasedHold = true;
     o.generation = "foo";
     o.id = "foo";
     o.kind = "foo";
     o.kmsKeyName = "foo";
     o.md5Hash = "foo";
     o.mediaLink = "foo";
-    o.metadata = buildUnnamed908();
+    o.metadata = buildUnnamed917();
     o.metageneration = "foo";
     o.name = "foo";
     o.owner = buildObjectOwner();
+    o.retentionExpirationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.selfLink = "foo";
     o.size = "foo";
     o.storageClass = "foo";
+    o.temporaryHold = true;
     o.timeCreated = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeDeleted = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeStorageClassUpdated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -928,7 +959,7 @@
 checkObject(api.Object o) {
   buildCounterObject++;
   if (buildCounterObject < 3) {
-    checkUnnamed907(o.acl);
+    checkUnnamed916(o.acl);
     unittest.expect(o.bucket, unittest.equals('foo'));
     unittest.expect(o.cacheControl, unittest.equals('foo'));
     unittest.expect(o.componentCount, unittest.equals(42));
@@ -939,19 +970,23 @@
     unittest.expect(o.crc32c, unittest.equals('foo'));
     checkObjectCustomerEncryption(o.customerEncryption);
     unittest.expect(o.etag, unittest.equals('foo'));
+    unittest.expect(o.eventBasedHold, unittest.isTrue);
     unittest.expect(o.generation, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.kmsKeyName, unittest.equals('foo'));
     unittest.expect(o.md5Hash, unittest.equals('foo'));
     unittest.expect(o.mediaLink, unittest.equals('foo'));
-    checkUnnamed908(o.metadata);
+    checkUnnamed917(o.metadata);
     unittest.expect(o.metageneration, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkObjectOwner(o.owner);
+    unittest.expect(o.retentionExpirationTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.size, unittest.equals('foo'));
     unittest.expect(o.storageClass, unittest.equals('foo'));
+    unittest.expect(o.temporaryHold, unittest.isTrue);
     unittest.expect(o.timeCreated,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.timeDeleted,
@@ -1028,14 +1063,14 @@
   buildCounterObjectAccessControl--;
 }
 
-buildUnnamed909() {
+buildUnnamed918() {
   var o = new core.List<api.ObjectAccessControl>();
   o.add(buildObjectAccessControl());
   o.add(buildObjectAccessControl());
   return o;
 }
 
-checkUnnamed909(core.List<api.ObjectAccessControl> o) {
+checkUnnamed918(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObjectAccessControl(o[0]);
   checkObjectAccessControl(o[1]);
@@ -1046,7 +1081,7 @@
   var o = new api.ObjectAccessControls();
   buildCounterObjectAccessControls++;
   if (buildCounterObjectAccessControls < 3) {
-    o.items = buildUnnamed909();
+    o.items = buildUnnamed918();
     o.kind = "foo";
   }
   buildCounterObjectAccessControls--;
@@ -1056,33 +1091,33 @@
 checkObjectAccessControls(api.ObjectAccessControls o) {
   buildCounterObjectAccessControls++;
   if (buildCounterObjectAccessControls < 3) {
-    checkUnnamed909(o.items);
+    checkUnnamed918(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterObjectAccessControls--;
 }
 
-buildUnnamed910() {
+buildUnnamed919() {
   var o = new core.List<api.Object>();
   o.add(buildObject());
   o.add(buildObject());
   return o;
 }
 
-checkUnnamed910(core.List<api.Object> o) {
+checkUnnamed919(core.List<api.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObject(o[0]);
   checkObject(o[1]);
 }
 
-buildUnnamed911() {
+buildUnnamed920() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed911(core.List<core.String> o) {
+checkUnnamed920(core.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,10 +1128,10 @@
   var o = new api.Objects();
   buildCounterObjects++;
   if (buildCounterObjects < 3) {
-    o.items = buildUnnamed910();
+    o.items = buildUnnamed919();
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.prefixes = buildUnnamed911();
+    o.prefixes = buildUnnamed920();
   }
   buildCounterObjects--;
   return o;
@@ -1105,22 +1140,22 @@
 checkObjects(api.Objects o) {
   buildCounterObjects++;
   if (buildCounterObjects < 3) {
-    checkUnnamed910(o.items);
+    checkUnnamed919(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed911(o.prefixes);
+    checkUnnamed920(o.prefixes);
   }
   buildCounterObjects--;
 }
 
-buildUnnamed912() {
+buildUnnamed921() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed912(core.List<core.String> o) {
+checkUnnamed921(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1136,7 +1171,7 @@
       'bool': true,
       'string': 'foo'
     };
-    o.members = buildUnnamed912();
+    o.members = buildUnnamed921();
     o.role = "foo";
   }
   buildCounterPolicyBindings--;
@@ -1151,20 +1186,20 @@
     unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
     unittest.expect(casted1["bool"], unittest.equals(true));
     unittest.expect(casted1["string"], unittest.equals('foo'));
-    checkUnnamed912(o.members);
+    checkUnnamed921(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterPolicyBindings--;
 }
 
-buildUnnamed913() {
+buildUnnamed922() {
   var o = new core.List<api.PolicyBindings>();
   o.add(buildPolicyBindings());
   o.add(buildPolicyBindings());
   return o;
 }
 
-checkUnnamed913(core.List<api.PolicyBindings> o) {
+checkUnnamed922(core.List<api.PolicyBindings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPolicyBindings(o[0]);
   checkPolicyBindings(o[1]);
@@ -1175,7 +1210,7 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.bindings = buildUnnamed913();
+    o.bindings = buildUnnamed922();
     o.etag = "foo";
     o.kind = "foo";
     o.resourceId = "foo";
@@ -1187,7 +1222,7 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed913(o.bindings);
+    checkUnnamed922(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.resourceId, unittest.equals('foo'));
@@ -1245,14 +1280,14 @@
   buildCounterServiceAccount--;
 }
 
-buildUnnamed914() {
+buildUnnamed923() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed914(core.List<core.String> o) {
+checkUnnamed923(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1264,7 +1299,7 @@
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
     o.kind = "foo";
-    o.permissions = buildUnnamed914();
+    o.permissions = buildUnnamed923();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -1274,32 +1309,32 @@
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed914(o.permissions);
+    checkUnnamed923(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
 
-buildUnnamed915() {
+buildUnnamed924() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed915(core.List<core.String> o) {
+checkUnnamed924(core.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() {
+buildUnnamed925() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed916(core.List<core.String> o) {
+checkUnnamed925(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1378,6 +1413,14 @@
     });
   });
 
+  unittest.group("obj-schema-BucketRetentionPolicy", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildBucketRetentionPolicy();
+      var od = new api.BucketRetentionPolicy.fromJson(o.toJson());
+      checkBucketRetentionPolicy(od);
+    });
+  });
+
   unittest.group("obj-schema-BucketVersioning", () {
     unittest.test("to-json--from-json", () {
       var o = buildBucketVersioning();
@@ -2367,6 +2410,75 @@
       })));
     });
 
+    unittest.test("method--lockRetentionPolicy", () {
+      var mock = new HttpServerMock();
+      api.BucketsResourceApi res = new api.StorageApi(mock).buckets;
+      var arg_bucket = "foo";
+      var arg_ifMetagenerationMatch = "foo";
+      var arg_userProject = "foo";
+      var arg_$fields = "foo";
+      mock.register(unittest.expectAsync2((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 + 11),
+            unittest.equals("storage/v1/"));
+        pathOffset += 11;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
+        pathOffset += 2;
+        index = path.indexOf("/lockRetentionPolicy", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_bucket"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/lockRetentionPolicy"));
+        pathOffset += 20;
+
+        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]));
+          }
+        }
+        unittest.expect(queryMap["ifMetagenerationMatch"].first,
+            unittest.equals(arg_ifMetagenerationMatch));
+        unittest.expect(
+            queryMap["userProject"].first, unittest.equals(arg_userProject));
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildBucket());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .lockRetentionPolicy(arg_bucket, arg_ifMetagenerationMatch,
+              userProject: arg_userProject, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((api.Bucket response) {
+        checkBucket(response);
+      })));
+    });
+
     unittest.test("method--patch", () {
       var mock = new HttpServerMock();
       api.BucketsResourceApi res = new api.StorageApi(mock).buckets;
@@ -2526,7 +2638,7 @@
       var mock = new HttpServerMock();
       api.BucketsResourceApi res = new api.StorageApi(mock).buckets;
       var arg_bucket = "foo";
-      var arg_permissions = buildUnnamed915();
+      var arg_permissions = buildUnnamed924();
       var arg_userProject = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5020,7 +5132,7 @@
       api.ObjectsResourceApi res = new api.StorageApi(mock).objects;
       var arg_bucket = "foo";
       var arg_object = "foo";
-      var arg_permissions = buildUnnamed916();
+      var arg_permissions = buildUnnamed925();
       var arg_generation = "foo";
       var arg_userProject = "foo";
       var arg_$fields = "foo";
diff --git a/generated/googleapis/test/storagetransfer/v1_test.dart b/generated/googleapis/test/storagetransfer/v1_test.dart
index f93fe1d..7cfb354 100644
--- a/generated/googleapis/test/storagetransfer/v1_test.dart
+++ b/generated/googleapis/test/storagetransfer/v1_test.dart
@@ -130,14 +130,14 @@
   buildCounterEmpty--;
 }
 
-buildUnnamed1450() {
+buildUnnamed1466() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1450(core.List<core.String> o) {
+checkUnnamed1466(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -148,7 +148,7 @@
   var o = new api.ErrorLogEntry();
   buildCounterErrorLogEntry++;
   if (buildCounterErrorLogEntry < 3) {
-    o.errorDetails = buildUnnamed1450();
+    o.errorDetails = buildUnnamed1466();
     o.url = "foo";
   }
   buildCounterErrorLogEntry--;
@@ -158,20 +158,20 @@
 checkErrorLogEntry(api.ErrorLogEntry o) {
   buildCounterErrorLogEntry++;
   if (buildCounterErrorLogEntry < 3) {
-    checkUnnamed1450(o.errorDetails);
+    checkUnnamed1466(o.errorDetails);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterErrorLogEntry--;
 }
 
-buildUnnamed1451() {
+buildUnnamed1467() {
   var o = new core.List<api.ErrorLogEntry>();
   o.add(buildErrorLogEntry());
   o.add(buildErrorLogEntry());
   return o;
 }
 
-checkUnnamed1451(core.List<api.ErrorLogEntry> o) {
+checkUnnamed1467(core.List<api.ErrorLogEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorLogEntry(o[0]);
   checkErrorLogEntry(o[1]);
@@ -184,7 +184,7 @@
   if (buildCounterErrorSummary < 3) {
     o.errorCode = "foo";
     o.errorCount = "foo";
-    o.errorLogEntries = buildUnnamed1451();
+    o.errorLogEntries = buildUnnamed1467();
   }
   buildCounterErrorSummary--;
   return o;
@@ -195,7 +195,7 @@
   if (buildCounterErrorSummary < 3) {
     unittest.expect(o.errorCode, unittest.equals('foo'));
     unittest.expect(o.errorCount, unittest.equals('foo'));
-    checkUnnamed1451(o.errorLogEntries);
+    checkUnnamed1467(o.errorLogEntries);
   }
   buildCounterErrorSummary--;
 }
@@ -257,14 +257,14 @@
   buildCounterHttpData--;
 }
 
-buildUnnamed1452() {
+buildUnnamed1468() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1452(core.List<api.Operation> o) {
+checkUnnamed1468(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -276,7 +276,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed1452();
+    o.operations = buildUnnamed1468();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -286,19 +286,19 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1452(o.operations);
+    checkUnnamed1468(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed1453() {
+buildUnnamed1469() {
   var o = new core.List<api.TransferJob>();
   o.add(buildTransferJob());
   o.add(buildTransferJob());
   return o;
 }
 
-checkUnnamed1453(core.List<api.TransferJob> o) {
+checkUnnamed1469(core.List<api.TransferJob> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTransferJob(o[0]);
   checkTransferJob(o[1]);
@@ -310,7 +310,7 @@
   buildCounterListTransferJobsResponse++;
   if (buildCounterListTransferJobsResponse < 3) {
     o.nextPageToken = "foo";
-    o.transferJobs = buildUnnamed1453();
+    o.transferJobs = buildUnnamed1469();
   }
   buildCounterListTransferJobsResponse--;
   return o;
@@ -320,32 +320,32 @@
   buildCounterListTransferJobsResponse++;
   if (buildCounterListTransferJobsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1453(o.transferJobs);
+    checkUnnamed1469(o.transferJobs);
   }
   buildCounterListTransferJobsResponse--;
 }
 
-buildUnnamed1454() {
+buildUnnamed1470() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1454(core.List<core.String> o) {
+checkUnnamed1470(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1455() {
+buildUnnamed1471() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1455(core.List<core.String> o) {
+checkUnnamed1471(core.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,8 +356,8 @@
   var o = new api.ObjectConditions();
   buildCounterObjectConditions++;
   if (buildCounterObjectConditions < 3) {
-    o.excludePrefixes = buildUnnamed1454();
-    o.includePrefixes = buildUnnamed1455();
+    o.excludePrefixes = buildUnnamed1470();
+    o.includePrefixes = buildUnnamed1471();
     o.maxTimeElapsedSinceLastModification = "foo";
     o.minTimeElapsedSinceLastModification = "foo";
   }
@@ -368,8 +368,8 @@
 checkObjectConditions(api.ObjectConditions o) {
   buildCounterObjectConditions++;
   if (buildCounterObjectConditions < 3) {
-    checkUnnamed1454(o.excludePrefixes);
-    checkUnnamed1455(o.includePrefixes);
+    checkUnnamed1470(o.excludePrefixes);
+    checkUnnamed1471(o.includePrefixes);
     unittest.expect(
         o.maxTimeElapsedSinceLastModification, unittest.equals('foo'));
     unittest.expect(
@@ -378,7 +378,7 @@
   buildCounterObjectConditions--;
 }
 
-buildUnnamed1456() {
+buildUnnamed1472() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -393,7 +393,7 @@
   return o;
 }
 
-checkUnnamed1456(core.Map<core.String, core.Object> o) {
+checkUnnamed1472(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));
@@ -407,7 +407,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1457() {
+buildUnnamed1473() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -422,7 +422,7 @@
   return o;
 }
 
-checkUnnamed1457(core.Map<core.String, core.Object> o) {
+checkUnnamed1473(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -443,9 +443,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed1456();
+    o.metadata = buildUnnamed1472();
     o.name = "foo";
-    o.response = buildUnnamed1457();
+    o.response = buildUnnamed1473();
   }
   buildCounterOperation--;
   return o;
@@ -456,9 +456,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed1456(o.metadata);
+    checkUnnamed1472(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1457(o.response);
+    checkUnnamed1473(o.response);
   }
   buildCounterOperation--;
 }
@@ -516,7 +516,7 @@
   buildCounterSchedule--;
 }
 
-buildUnnamed1458() {
+buildUnnamed1474() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -531,7 +531,7 @@
   return o;
 }
 
-checkUnnamed1458(core.Map<core.String, core.Object> o) {
+checkUnnamed1474(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -545,17 +545,17 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1459() {
+buildUnnamed1475() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1458());
-  o.add(buildUnnamed1458());
+  o.add(buildUnnamed1474());
+  o.add(buildUnnamed1474());
   return o;
 }
 
-checkUnnamed1459(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1475(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1458(o[0]);
-  checkUnnamed1458(o[1]);
+  checkUnnamed1474(o[0]);
+  checkUnnamed1474(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -564,7 +564,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1459();
+    o.details = buildUnnamed1475();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -575,7 +575,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1459(o.details);
+    checkUnnamed1475(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -690,14 +690,14 @@
   buildCounterTransferJob--;
 }
 
-buildUnnamed1460() {
+buildUnnamed1476() {
   var o = new core.List<api.ErrorSummary>();
   o.add(buildErrorSummary());
   o.add(buildErrorSummary());
   return o;
 }
 
-checkUnnamed1460(core.List<api.ErrorSummary> o) {
+checkUnnamed1476(core.List<api.ErrorSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorSummary(o[0]);
   checkErrorSummary(o[1]);
@@ -710,7 +710,7 @@
   if (buildCounterTransferOperation < 3) {
     o.counters = buildTransferCounters();
     o.endTime = "foo";
-    o.errorBreakdowns = buildUnnamed1460();
+    o.errorBreakdowns = buildUnnamed1476();
     o.name = "foo";
     o.projectId = "foo";
     o.startTime = "foo";
@@ -727,7 +727,7 @@
   if (buildCounterTransferOperation < 3) {
     checkTransferCounters(o.counters);
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkUnnamed1460(o.errorBreakdowns);
+    checkUnnamed1476(o.errorBreakdowns);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
@@ -1176,9 +1176,9 @@
       var mock = new HttpServerMock();
       api.TransferJobsResourceApi res =
           new api.StoragetransferApi(mock).transferJobs;
-      var arg_pageSize = 42;
       var arg_filter = "foo";
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1210,11 +1210,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1225,9 +1225,9 @@
       }), true);
       res
           .list(
-              pageSize: arg_pageSize,
               filter: arg_filter,
               pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListTransferJobsResponse response) {
         checkListTransferJobsResponse(response);
@@ -1453,9 +1453,9 @@
       api.TransferOperationsResourceApi res =
           new api.StoragetransferApi(mock).transferOperations;
       var arg_name = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_filter = "foo";
+      var arg_pageToken = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1488,11 +1488,11 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(
-            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(core.int.parse(queryMap["pageSize"].first),
             unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -1503,9 +1503,9 @@
       }), true);
       res
           .list(arg_name,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
               filter: arg_filter,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
diff --git a/generated/googleapis/test/streetviewpublish/v1_test.dart b/generated/googleapis/test/streetviewpublish/v1_test.dart
index 306e7c0..ae2f549 100644
--- a/generated/googleapis/test/streetviewpublish/v1_test.dart
+++ b/generated/googleapis/test/streetviewpublish/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed3585() {
+buildUnnamed3614() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3585(core.List<core.String> o) {
+checkUnnamed3614(core.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.BatchDeletePhotosRequest();
   buildCounterBatchDeletePhotosRequest++;
   if (buildCounterBatchDeletePhotosRequest < 3) {
-    o.photoIds = buildUnnamed3585();
+    o.photoIds = buildUnnamed3614();
   }
   buildCounterBatchDeletePhotosRequest--;
   return o;
@@ -77,19 +77,19 @@
 checkBatchDeletePhotosRequest(api.BatchDeletePhotosRequest o) {
   buildCounterBatchDeletePhotosRequest++;
   if (buildCounterBatchDeletePhotosRequest < 3) {
-    checkUnnamed3585(o.photoIds);
+    checkUnnamed3614(o.photoIds);
   }
   buildCounterBatchDeletePhotosRequest--;
 }
 
-buildUnnamed3586() {
+buildUnnamed3615() {
   var o = new core.List<api.Status>();
   o.add(buildStatus());
   o.add(buildStatus());
   return o;
 }
 
-checkUnnamed3586(core.List<api.Status> o) {
+checkUnnamed3615(core.List<api.Status> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStatus(o[0]);
   checkStatus(o[1]);
@@ -100,7 +100,7 @@
   var o = new api.BatchDeletePhotosResponse();
   buildCounterBatchDeletePhotosResponse++;
   if (buildCounterBatchDeletePhotosResponse < 3) {
-    o.status = buildUnnamed3586();
+    o.status = buildUnnamed3615();
   }
   buildCounterBatchDeletePhotosResponse--;
   return o;
@@ -109,19 +109,19 @@
 checkBatchDeletePhotosResponse(api.BatchDeletePhotosResponse o) {
   buildCounterBatchDeletePhotosResponse++;
   if (buildCounterBatchDeletePhotosResponse < 3) {
-    checkUnnamed3586(o.status);
+    checkUnnamed3615(o.status);
   }
   buildCounterBatchDeletePhotosResponse--;
 }
 
-buildUnnamed3587() {
+buildUnnamed3616() {
   var o = new core.List<api.PhotoResponse>();
   o.add(buildPhotoResponse());
   o.add(buildPhotoResponse());
   return o;
 }
 
-checkUnnamed3587(core.List<api.PhotoResponse> o) {
+checkUnnamed3616(core.List<api.PhotoResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPhotoResponse(o[0]);
   checkPhotoResponse(o[1]);
@@ -132,7 +132,7 @@
   var o = new api.BatchGetPhotosResponse();
   buildCounterBatchGetPhotosResponse++;
   if (buildCounterBatchGetPhotosResponse < 3) {
-    o.results = buildUnnamed3587();
+    o.results = buildUnnamed3616();
   }
   buildCounterBatchGetPhotosResponse--;
   return o;
@@ -141,19 +141,19 @@
 checkBatchGetPhotosResponse(api.BatchGetPhotosResponse o) {
   buildCounterBatchGetPhotosResponse++;
   if (buildCounterBatchGetPhotosResponse < 3) {
-    checkUnnamed3587(o.results);
+    checkUnnamed3616(o.results);
   }
   buildCounterBatchGetPhotosResponse--;
 }
 
-buildUnnamed3588() {
+buildUnnamed3617() {
   var o = new core.List<api.UpdatePhotoRequest>();
   o.add(buildUpdatePhotoRequest());
   o.add(buildUpdatePhotoRequest());
   return o;
 }
 
-checkUnnamed3588(core.List<api.UpdatePhotoRequest> o) {
+checkUnnamed3617(core.List<api.UpdatePhotoRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUpdatePhotoRequest(o[0]);
   checkUpdatePhotoRequest(o[1]);
@@ -164,7 +164,7 @@
   var o = new api.BatchUpdatePhotosRequest();
   buildCounterBatchUpdatePhotosRequest++;
   if (buildCounterBatchUpdatePhotosRequest < 3) {
-    o.updatePhotoRequests = buildUnnamed3588();
+    o.updatePhotoRequests = buildUnnamed3617();
   }
   buildCounterBatchUpdatePhotosRequest--;
   return o;
@@ -173,19 +173,19 @@
 checkBatchUpdatePhotosRequest(api.BatchUpdatePhotosRequest o) {
   buildCounterBatchUpdatePhotosRequest++;
   if (buildCounterBatchUpdatePhotosRequest < 3) {
-    checkUnnamed3588(o.updatePhotoRequests);
+    checkUnnamed3617(o.updatePhotoRequests);
   }
   buildCounterBatchUpdatePhotosRequest--;
 }
 
-buildUnnamed3589() {
+buildUnnamed3618() {
   var o = new core.List<api.PhotoResponse>();
   o.add(buildPhotoResponse());
   o.add(buildPhotoResponse());
   return o;
 }
 
-checkUnnamed3589(core.List<api.PhotoResponse> o) {
+checkUnnamed3618(core.List<api.PhotoResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPhotoResponse(o[0]);
   checkPhotoResponse(o[1]);
@@ -196,7 +196,7 @@
   var o = new api.BatchUpdatePhotosResponse();
   buildCounterBatchUpdatePhotosResponse++;
   if (buildCounterBatchUpdatePhotosResponse < 3) {
-    o.results = buildUnnamed3589();
+    o.results = buildUnnamed3618();
   }
   buildCounterBatchUpdatePhotosResponse--;
   return o;
@@ -205,7 +205,7 @@
 checkBatchUpdatePhotosResponse(api.BatchUpdatePhotosResponse o) {
   buildCounterBatchUpdatePhotosResponse++;
   if (buildCounterBatchUpdatePhotosResponse < 3) {
-    checkUnnamed3589(o.results);
+    checkUnnamed3618(o.results);
   }
   buildCounterBatchUpdatePhotosResponse--;
 }
@@ -286,14 +286,14 @@
   buildCounterLevel--;
 }
 
-buildUnnamed3590() {
+buildUnnamed3619() {
   var o = new core.List<api.Photo>();
   o.add(buildPhoto());
   o.add(buildPhoto());
   return o;
 }
 
-checkUnnamed3590(core.List<api.Photo> o) {
+checkUnnamed3619(core.List<api.Photo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPhoto(o[0]);
   checkPhoto(o[1]);
@@ -305,7 +305,7 @@
   buildCounterListPhotosResponse++;
   if (buildCounterListPhotosResponse < 3) {
     o.nextPageToken = "foo";
-    o.photos = buildUnnamed3590();
+    o.photos = buildUnnamed3619();
   }
   buildCounterListPhotosResponse--;
   return o;
@@ -315,12 +315,12 @@
   buildCounterListPhotosResponse++;
   if (buildCounterListPhotosResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3590(o.photos);
+    checkUnnamed3619(o.photos);
   }
   buildCounterListPhotosResponse--;
 }
 
-buildUnnamed3591() {
+buildUnnamed3620() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -335,7 +335,7 @@
   return o;
 }
 
-checkUnnamed3591(core.Map<core.String, core.Object> o) {
+checkUnnamed3620(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));
@@ -349,7 +349,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3592() {
+buildUnnamed3621() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -364,7 +364,7 @@
   return o;
 }
 
-checkUnnamed3592(core.Map<core.String, core.Object> o) {
+checkUnnamed3621(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o["x"]) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -385,9 +385,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed3591();
+    o.metadata = buildUnnamed3620();
     o.name = "foo";
-    o.response = buildUnnamed3592();
+    o.response = buildUnnamed3621();
   }
   buildCounterOperation--;
   return o;
@@ -398,34 +398,34 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed3591(o.metadata);
+    checkUnnamed3620(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3592(o.response);
+    checkUnnamed3621(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed3593() {
+buildUnnamed3622() {
   var o = new core.List<api.Connection>();
   o.add(buildConnection());
   o.add(buildConnection());
   return o;
 }
 
-checkUnnamed3593(core.List<api.Connection> o) {
+checkUnnamed3622(core.List<api.Connection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConnection(o[0]);
   checkConnection(o[1]);
 }
 
-buildUnnamed3594() {
+buildUnnamed3623() {
   var o = new core.List<api.Place>();
   o.add(buildPlace());
   o.add(buildPlace());
   return o;
 }
 
-checkUnnamed3594(core.List<api.Place> o) {
+checkUnnamed3623(core.List<api.Place> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlace(o[0]);
   checkPlace(o[1]);
@@ -437,10 +437,10 @@
   buildCounterPhoto++;
   if (buildCounterPhoto < 3) {
     o.captureTime = "foo";
-    o.connections = buildUnnamed3593();
+    o.connections = buildUnnamed3622();
     o.downloadUrl = "foo";
     o.photoId = buildPhotoId();
-    o.places = buildUnnamed3594();
+    o.places = buildUnnamed3623();
     o.pose = buildPose();
     o.shareLink = "foo";
     o.thumbnailUrl = "foo";
@@ -455,10 +455,10 @@
   buildCounterPhoto++;
   if (buildCounterPhoto < 3) {
     unittest.expect(o.captureTime, unittest.equals('foo'));
-    checkUnnamed3593(o.connections);
+    checkUnnamed3622(o.connections);
     unittest.expect(o.downloadUrl, unittest.equals('foo'));
     checkPhotoId(o.photoId);
-    checkUnnamed3594(o.places);
+    checkUnnamed3623(o.places);
     checkPose(o.pose);
     unittest.expect(o.shareLink, unittest.equals('foo'));
     unittest.expect(o.thumbnailUrl, unittest.equals('foo'));
@@ -556,7 +556,7 @@
   buildCounterPose--;
 }
 
-buildUnnamed3595() {
+buildUnnamed3624() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -571,7 +571,7 @@
   return o;
 }
 
-checkUnnamed3595(core.Map<core.String, core.Object> o) {
+checkUnnamed3624(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o["x"]) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -585,17 +585,17 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed3596() {
+buildUnnamed3625() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed3595());
-  o.add(buildUnnamed3595());
+  o.add(buildUnnamed3624());
+  o.add(buildUnnamed3624());
   return o;
 }
 
-checkUnnamed3596(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed3625(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed3595(o[0]);
-  checkUnnamed3595(o[1]);
+  checkUnnamed3624(o[0]);
+  checkUnnamed3624(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -604,7 +604,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed3596();
+    o.details = buildUnnamed3625();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -615,7 +615,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed3596(o.details);
+    checkUnnamed3625(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -661,14 +661,14 @@
   buildCounterUploadRef--;
 }
 
-buildUnnamed3597() {
+buildUnnamed3626() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3597(core.List<core.String> o) {
+checkUnnamed3626(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1161,7 +1161,7 @@
       var mock = new HttpServerMock();
       api.PhotosResourceApi res = new api.StreetviewpublishApi(mock).photos;
       var arg_view = "foo";
-      var arg_photoIds = buildUnnamed3597();
+      var arg_photoIds = buildUnnamed3626();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/surveys/v2_test.dart b/generated/googleapis/test/surveys/v2_test.dart
index 889cf07..b3bdea5 100644
--- a/generated/googleapis/test/surveys/v2_test.dart
+++ b/generated/googleapis/test/surveys/v2_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed2298() {
+buildUnnamed2323() {
   var o = new core.List<api.FieldMask>();
   o.add(buildFieldMask());
   o.add(buildFieldMask());
   return o;
 }
 
-checkUnnamed2298(core.List<api.FieldMask> o) {
+checkUnnamed2323(core.List<api.FieldMask> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFieldMask(o[0]);
   checkFieldMask(o[1]);
@@ -68,7 +68,7 @@
   var o = new api.FieldMask();
   buildCounterFieldMask++;
   if (buildCounterFieldMask < 3) {
-    o.fields = buildUnnamed2298();
+    o.fields = buildUnnamed2323();
     o.id = 42;
   }
   buildCounterFieldMask--;
@@ -78,20 +78,20 @@
 checkFieldMask(api.FieldMask o) {
   buildCounterFieldMask++;
   if (buildCounterFieldMask < 3) {
-    checkUnnamed2298(o.fields);
+    checkUnnamed2323(o.fields);
     unittest.expect(o.id, unittest.equals(42));
   }
   buildCounterFieldMask--;
 }
 
-buildUnnamed2299() {
+buildUnnamed2324() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2299(core.List<core.String> o) {
+checkUnnamed2324(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -107,7 +107,7 @@
     o.language = "foo";
     o.mobileAppPanelId = "foo";
     o.name = "foo";
-    o.owners = buildUnnamed2299();
+    o.owners = buildUnnamed2324();
   }
   buildCounterMobileAppPanel--;
   return o;
@@ -121,19 +121,19 @@
     unittest.expect(o.language, unittest.equals('foo'));
     unittest.expect(o.mobileAppPanelId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2299(o.owners);
+    checkUnnamed2324(o.owners);
   }
   buildCounterMobileAppPanel--;
 }
 
-buildUnnamed2300() {
+buildUnnamed2325() {
   var o = new core.List<api.MobileAppPanel>();
   o.add(buildMobileAppPanel());
   o.add(buildMobileAppPanel());
   return o;
 }
 
-checkUnnamed2300(core.List<api.MobileAppPanel> o) {
+checkUnnamed2325(core.List<api.MobileAppPanel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileAppPanel(o[0]);
   checkMobileAppPanel(o[1]);
@@ -146,7 +146,7 @@
   if (buildCounterMobileAppPanelsListResponse < 3) {
     o.pageInfo = buildPageInfo();
     o.requestId = "foo";
-    o.resources = buildUnnamed2300();
+    o.resources = buildUnnamed2325();
     o.tokenPagination = buildTokenPagination();
   }
   buildCounterMobileAppPanelsListResponse--;
@@ -158,7 +158,7 @@
   if (buildCounterMobileAppPanelsListResponse < 3) {
     checkPageInfo(o.pageInfo);
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed2300(o.resources);
+    checkUnnamed2325(o.resources);
     checkTokenPagination(o.tokenPagination);
   }
   buildCounterMobileAppPanelsListResponse--;
@@ -206,14 +206,14 @@
   buildCounterResultsGetRequest--;
 }
 
-buildUnnamed2301() {
+buildUnnamed2326() {
   var o = new core.List<api.FieldMask>();
   o.add(buildFieldMask());
   o.add(buildFieldMask());
   return o;
 }
 
-checkUnnamed2301(core.List<api.FieldMask> o) {
+checkUnnamed2326(core.List<api.FieldMask> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFieldMask(o[0]);
   checkFieldMask(o[1]);
@@ -224,7 +224,7 @@
   var o = new api.ResultsMask();
   buildCounterResultsMask++;
   if (buildCounterResultsMask < 3) {
-    o.fields = buildUnnamed2301();
+    o.fields = buildUnnamed2326();
     o.projection = "foo";
   }
   buildCounterResultsMask--;
@@ -234,33 +234,33 @@
 checkResultsMask(api.ResultsMask o) {
   buildCounterResultsMask++;
   if (buildCounterResultsMask < 3) {
-    checkUnnamed2301(o.fields);
+    checkUnnamed2326(o.fields);
     unittest.expect(o.projection, unittest.equals('foo'));
   }
   buildCounterResultsMask--;
 }
 
-buildUnnamed2302() {
+buildUnnamed2327() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2302(core.List<core.String> o) {
+checkUnnamed2327(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2303() {
+buildUnnamed2328() {
   var o = new core.List<api.SurveyQuestion>();
   o.add(buildSurveyQuestion());
   o.add(buildSurveyQuestion());
   return o;
 }
 
-checkUnnamed2303(core.List<api.SurveyQuestion> o) {
+checkUnnamed2328(core.List<api.SurveyQuestion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSurveyQuestion(o[0]);
   checkSurveyQuestion(o[1]);
@@ -275,8 +275,8 @@
     o.cost = buildSurveyCost();
     o.customerData = "foo";
     o.description = "foo";
-    o.owners = buildUnnamed2302();
-    o.questions = buildUnnamed2303();
+    o.owners = buildUnnamed2327();
+    o.questions = buildUnnamed2328();
     o.rejectionReason = buildSurveyRejection();
     o.state = "foo";
     o.surveyUrlId = "foo";
@@ -294,8 +294,8 @@
     checkSurveyCost(o.cost);
     unittest.expect(o.customerData, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2302(o.owners);
-    checkUnnamed2303(o.questions);
+    checkUnnamed2327(o.owners);
+    checkUnnamed2328(o.questions);
     checkSurveyRejection(o.rejectionReason);
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.surveyUrlId, unittest.equals('foo'));
@@ -305,27 +305,27 @@
   buildCounterSurvey--;
 }
 
-buildUnnamed2304() {
+buildUnnamed2329() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2304(core.List<core.String> o) {
+checkUnnamed2329(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2305() {
+buildUnnamed2330() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2305(core.List<core.String> o) {
+checkUnnamed2330(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -336,11 +336,11 @@
   var o = new api.SurveyAudience();
   buildCounterSurveyAudience++;
   if (buildCounterSurveyAudience < 3) {
-    o.ages = buildUnnamed2304();
+    o.ages = buildUnnamed2329();
     o.country = "foo";
     o.countrySubdivision = "foo";
     o.gender = "foo";
-    o.languages = buildUnnamed2305();
+    o.languages = buildUnnamed2330();
     o.mobileAppPanelId = "foo";
     o.populationSource = "foo";
   }
@@ -351,11 +351,11 @@
 checkSurveyAudience(api.SurveyAudience o) {
   buildCounterSurveyAudience++;
   if (buildCounterSurveyAudience < 3) {
-    checkUnnamed2304(o.ages);
+    checkUnnamed2329(o.ages);
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.countrySubdivision, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
-    checkUnnamed2305(o.languages);
+    checkUnnamed2330(o.languages);
     unittest.expect(o.mobileAppPanelId, unittest.equals('foo'));
     unittest.expect(o.populationSource, unittest.equals('foo'));
   }
@@ -387,53 +387,53 @@
   buildCounterSurveyCost--;
 }
 
-buildUnnamed2306() {
+buildUnnamed2331() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2306(core.List<core.String> o) {
+checkUnnamed2331(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2307() {
+buildUnnamed2332() {
   var o = new core.List<api.SurveyQuestionImage>();
   o.add(buildSurveyQuestionImage());
   o.add(buildSurveyQuestionImage());
   return o;
 }
 
-checkUnnamed2307(core.List<api.SurveyQuestionImage> o) {
+checkUnnamed2332(core.List<api.SurveyQuestionImage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSurveyQuestionImage(o[0]);
   checkSurveyQuestionImage(o[1]);
 }
 
-buildUnnamed2308() {
+buildUnnamed2333() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2308(core.List<core.String> o) {
+checkUnnamed2333(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2309() {
+buildUnnamed2334() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2309(core.List<core.String> o) {
+checkUnnamed2334(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -445,20 +445,20 @@
   buildCounterSurveyQuestion++;
   if (buildCounterSurveyQuestion < 3) {
     o.answerOrder = "foo";
-    o.answers = buildUnnamed2306();
+    o.answers = buildUnnamed2331();
     o.hasOther = true;
     o.highValueLabel = "foo";
-    o.images = buildUnnamed2307();
+    o.images = buildUnnamed2332();
     o.lastAnswerPositionPinned = true;
     o.lowValueLabel = "foo";
     o.mustPickSuggestion = true;
     o.numStars = "foo";
     o.openTextPlaceholder = "foo";
-    o.openTextSuggestions = buildUnnamed2308();
+    o.openTextSuggestions = buildUnnamed2333();
     o.question = "foo";
     o.sentimentText = "foo";
     o.singleLineResponse = true;
-    o.thresholdAnswers = buildUnnamed2309();
+    o.thresholdAnswers = buildUnnamed2334();
     o.type = "foo";
     o.unitOfMeasurementLabel = "foo";
     o.videoId = "foo";
@@ -471,20 +471,20 @@
   buildCounterSurveyQuestion++;
   if (buildCounterSurveyQuestion < 3) {
     unittest.expect(o.answerOrder, unittest.equals('foo'));
-    checkUnnamed2306(o.answers);
+    checkUnnamed2331(o.answers);
     unittest.expect(o.hasOther, unittest.isTrue);
     unittest.expect(o.highValueLabel, unittest.equals('foo'));
-    checkUnnamed2307(o.images);
+    checkUnnamed2332(o.images);
     unittest.expect(o.lastAnswerPositionPinned, unittest.isTrue);
     unittest.expect(o.lowValueLabel, unittest.equals('foo'));
     unittest.expect(o.mustPickSuggestion, unittest.isTrue);
     unittest.expect(o.numStars, unittest.equals('foo'));
     unittest.expect(o.openTextPlaceholder, unittest.equals('foo'));
-    checkUnnamed2308(o.openTextSuggestions);
+    checkUnnamed2333(o.openTextSuggestions);
     unittest.expect(o.question, unittest.equals('foo'));
     unittest.expect(o.sentimentText, unittest.equals('foo'));
     unittest.expect(o.singleLineResponse, unittest.isTrue);
-    checkUnnamed2309(o.thresholdAnswers);
+    checkUnnamed2334(o.thresholdAnswers);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.unitOfMeasurementLabel, unittest.equals('foo'));
     unittest.expect(o.videoId, unittest.equals('foo'));
@@ -576,14 +576,14 @@
   buildCounterSurveysDeleteResponse--;
 }
 
-buildUnnamed2310() {
+buildUnnamed2335() {
   var o = new core.List<api.Survey>();
   o.add(buildSurvey());
   o.add(buildSurvey());
   return o;
 }
 
-checkUnnamed2310(core.List<api.Survey> o) {
+checkUnnamed2335(core.List<api.Survey> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSurvey(o[0]);
   checkSurvey(o[1]);
@@ -596,7 +596,7 @@
   if (buildCounterSurveysListResponse < 3) {
     o.pageInfo = buildPageInfo();
     o.requestId = "foo";
-    o.resources = buildUnnamed2310();
+    o.resources = buildUnnamed2335();
     o.tokenPagination = buildTokenPagination();
   }
   buildCounterSurveysListResponse--;
@@ -608,7 +608,7 @@
   if (buildCounterSurveysListResponse < 3) {
     checkPageInfo(o.pageInfo);
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed2310(o.resources);
+    checkUnnamed2335(o.resources);
     checkTokenPagination(o.tokenPagination);
   }
   buildCounterSurveysListResponse--;
diff --git a/generated/googleapis/test/tagmanager/v1_test.dart b/generated/googleapis/test/tagmanager/v1_test.dart
index 78ffce7..e4fb43b 100644
--- a/generated/googleapis/test/tagmanager/v1_test.dart
+++ b/generated/googleapis/test/tagmanager/v1_test.dart
@@ -75,14 +75,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed1702() {
+buildUnnamed1724() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1702(core.List<core.String> o) {
+checkUnnamed1724(core.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,7 +93,7 @@
   var o = new api.AccountAccess();
   buildCounterAccountAccess++;
   if (buildCounterAccountAccess < 3) {
-    o.permission = buildUnnamed1702();
+    o.permission = buildUnnamed1724();
   }
   buildCounterAccountAccess--;
   return o;
@@ -102,19 +102,19 @@
 checkAccountAccess(api.AccountAccess o) {
   buildCounterAccountAccess++;
   if (buildCounterAccountAccess < 3) {
-    checkUnnamed1702(o.permission);
+    checkUnnamed1724(o.permission);
   }
   buildCounterAccountAccess--;
 }
 
-buildUnnamed1703() {
+buildUnnamed1725() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed1703(core.List<api.Parameter> o) {
+checkUnnamed1725(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -125,7 +125,7 @@
   var o = new api.Condition();
   buildCounterCondition++;
   if (buildCounterCondition < 3) {
-    o.parameter = buildUnnamed1703();
+    o.parameter = buildUnnamed1725();
     o.type = "foo";
   }
   buildCounterCondition--;
@@ -135,46 +135,46 @@
 checkCondition(api.Condition o) {
   buildCounterCondition++;
   if (buildCounterCondition < 3) {
-    checkUnnamed1703(o.parameter);
+    checkUnnamed1725(o.parameter);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterCondition--;
 }
 
-buildUnnamed1704() {
+buildUnnamed1726() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1704(core.List<core.String> o) {
+checkUnnamed1726(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1705() {
+buildUnnamed1727() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1705(core.List<core.String> o) {
+checkUnnamed1727(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1706() {
+buildUnnamed1728() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1706(core.List<core.String> o) {
+checkUnnamed1728(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -187,15 +187,15 @@
   if (buildCounterContainer < 3) {
     o.accountId = "foo";
     o.containerId = "foo";
-    o.domainName = buildUnnamed1704();
-    o.enabledBuiltInVariable = buildUnnamed1705();
+    o.domainName = buildUnnamed1726();
+    o.enabledBuiltInVariable = buildUnnamed1727();
     o.fingerprint = "foo";
     o.name = "foo";
     o.notes = "foo";
     o.publicId = "foo";
     o.timeZoneCountryId = "foo";
     o.timeZoneId = "foo";
-    o.usageContext = buildUnnamed1706();
+    o.usageContext = buildUnnamed1728();
   }
   buildCounterContainer--;
   return o;
@@ -206,27 +206,27 @@
   if (buildCounterContainer < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkUnnamed1704(o.domainName);
-    checkUnnamed1705(o.enabledBuiltInVariable);
+    checkUnnamed1726(o.domainName);
+    checkUnnamed1727(o.enabledBuiltInVariable);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.publicId, unittest.equals('foo'));
     unittest.expect(o.timeZoneCountryId, unittest.equals('foo'));
     unittest.expect(o.timeZoneId, unittest.equals('foo'));
-    checkUnnamed1706(o.usageContext);
+    checkUnnamed1728(o.usageContext);
   }
   buildCounterContainer--;
 }
 
-buildUnnamed1707() {
+buildUnnamed1729() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1707(core.List<core.String> o) {
+checkUnnamed1729(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -238,7 +238,7 @@
   buildCounterContainerAccess++;
   if (buildCounterContainerAccess < 3) {
     o.containerId = "foo";
-    o.permission = buildUnnamed1707();
+    o.permission = buildUnnamed1729();
   }
   buildCounterContainerAccess--;
   return o;
@@ -248,84 +248,84 @@
   buildCounterContainerAccess++;
   if (buildCounterContainerAccess < 3) {
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkUnnamed1707(o.permission);
+    checkUnnamed1729(o.permission);
   }
   buildCounterContainerAccess--;
 }
 
-buildUnnamed1708() {
+buildUnnamed1730() {
   var o = new core.List<api.Folder>();
   o.add(buildFolder());
   o.add(buildFolder());
   return o;
 }
 
-checkUnnamed1708(core.List<api.Folder> o) {
+checkUnnamed1730(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFolder(o[0]);
   checkFolder(o[1]);
 }
 
-buildUnnamed1709() {
+buildUnnamed1731() {
   var o = new core.List<api.Macro>();
   o.add(buildMacro());
   o.add(buildMacro());
   return o;
 }
 
-checkUnnamed1709(core.List<api.Macro> o) {
+checkUnnamed1731(core.List<api.Macro> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMacro(o[0]);
   checkMacro(o[1]);
 }
 
-buildUnnamed1710() {
+buildUnnamed1732() {
   var o = new core.List<api.Rule>();
   o.add(buildRule());
   o.add(buildRule());
   return o;
 }
 
-checkUnnamed1710(core.List<api.Rule> o) {
+checkUnnamed1732(core.List<api.Rule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRule(o[0]);
   checkRule(o[1]);
 }
 
-buildUnnamed1711() {
+buildUnnamed1733() {
   var o = new core.List<api.Tag>();
   o.add(buildTag());
   o.add(buildTag());
   return o;
 }
 
-checkUnnamed1711(core.List<api.Tag> o) {
+checkUnnamed1733(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTag(o[0]);
   checkTag(o[1]);
 }
 
-buildUnnamed1712() {
+buildUnnamed1734() {
   var o = new core.List<api.Trigger>();
   o.add(buildTrigger());
   o.add(buildTrigger());
   return o;
 }
 
-checkUnnamed1712(core.List<api.Trigger> o) {
+checkUnnamed1734(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrigger(o[0]);
   checkTrigger(o[1]);
 }
 
-buildUnnamed1713() {
+buildUnnamed1735() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed1713(core.List<api.Variable> o) {
+checkUnnamed1735(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
@@ -342,14 +342,14 @@
     o.containerVersionId = "foo";
     o.deleted = true;
     o.fingerprint = "foo";
-    o.folder = buildUnnamed1708();
-    o.macro = buildUnnamed1709();
+    o.folder = buildUnnamed1730();
+    o.macro = buildUnnamed1731();
     o.name = "foo";
     o.notes = "foo";
-    o.rule = buildUnnamed1710();
-    o.tag = buildUnnamed1711();
-    o.trigger = buildUnnamed1712();
-    o.variable = buildUnnamed1713();
+    o.rule = buildUnnamed1732();
+    o.tag = buildUnnamed1733();
+    o.trigger = buildUnnamed1734();
+    o.variable = buildUnnamed1735();
   }
   buildCounterContainerVersion--;
   return o;
@@ -364,14 +364,14 @@
     unittest.expect(o.containerVersionId, unittest.equals('foo'));
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed1708(o.folder);
-    checkUnnamed1709(o.macro);
+    checkUnnamed1730(o.folder);
+    checkUnnamed1731(o.macro);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkUnnamed1710(o.rule);
-    checkUnnamed1711(o.tag);
-    checkUnnamed1712(o.trigger);
-    checkUnnamed1713(o.variable);
+    checkUnnamed1732(o.rule);
+    checkUnnamed1733(o.tag);
+    checkUnnamed1734(o.trigger);
+    checkUnnamed1735(o.variable);
   }
   buildCounterContainerVersion--;
 }
@@ -526,40 +526,40 @@
   buildCounterFolder--;
 }
 
-buildUnnamed1714() {
+buildUnnamed1736() {
   var o = new core.List<api.Tag>();
   o.add(buildTag());
   o.add(buildTag());
   return o;
 }
 
-checkUnnamed1714(core.List<api.Tag> o) {
+checkUnnamed1736(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTag(o[0]);
   checkTag(o[1]);
 }
 
-buildUnnamed1715() {
+buildUnnamed1737() {
   var o = new core.List<api.Trigger>();
   o.add(buildTrigger());
   o.add(buildTrigger());
   return o;
 }
 
-checkUnnamed1715(core.List<api.Trigger> o) {
+checkUnnamed1737(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrigger(o[0]);
   checkTrigger(o[1]);
 }
 
-buildUnnamed1716() {
+buildUnnamed1738() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed1716(core.List<api.Variable> o) {
+checkUnnamed1738(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
@@ -570,9 +570,9 @@
   var o = new api.FolderEntities();
   buildCounterFolderEntities++;
   if (buildCounterFolderEntities < 3) {
-    o.tag = buildUnnamed1714();
-    o.trigger = buildUnnamed1715();
-    o.variable = buildUnnamed1716();
+    o.tag = buildUnnamed1736();
+    o.trigger = buildUnnamed1737();
+    o.variable = buildUnnamed1738();
   }
   buildCounterFolderEntities--;
   return o;
@@ -581,21 +581,21 @@
 checkFolderEntities(api.FolderEntities o) {
   buildCounterFolderEntities++;
   if (buildCounterFolderEntities < 3) {
-    checkUnnamed1714(o.tag);
-    checkUnnamed1715(o.trigger);
-    checkUnnamed1716(o.variable);
+    checkUnnamed1736(o.tag);
+    checkUnnamed1737(o.trigger);
+    checkUnnamed1738(o.variable);
   }
   buildCounterFolderEntities--;
 }
 
-buildUnnamed1717() {
+buildUnnamed1739() {
   var o = new core.List<api.UserAccess>();
   o.add(buildUserAccess());
   o.add(buildUserAccess());
   return o;
 }
 
-checkUnnamed1717(core.List<api.UserAccess> o) {
+checkUnnamed1739(core.List<api.UserAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserAccess(o[0]);
   checkUserAccess(o[1]);
@@ -606,7 +606,7 @@
   var o = new api.ListAccountUsersResponse();
   buildCounterListAccountUsersResponse++;
   if (buildCounterListAccountUsersResponse < 3) {
-    o.userAccess = buildUnnamed1717();
+    o.userAccess = buildUnnamed1739();
   }
   buildCounterListAccountUsersResponse--;
   return o;
@@ -615,19 +615,19 @@
 checkListAccountUsersResponse(api.ListAccountUsersResponse o) {
   buildCounterListAccountUsersResponse++;
   if (buildCounterListAccountUsersResponse < 3) {
-    checkUnnamed1717(o.userAccess);
+    checkUnnamed1739(o.userAccess);
   }
   buildCounterListAccountUsersResponse--;
 }
 
-buildUnnamed1718() {
+buildUnnamed1740() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed1718(core.List<api.Account> o) {
+checkUnnamed1740(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -638,7 +638,7 @@
   var o = new api.ListAccountsResponse();
   buildCounterListAccountsResponse++;
   if (buildCounterListAccountsResponse < 3) {
-    o.accounts = buildUnnamed1718();
+    o.accounts = buildUnnamed1740();
   }
   buildCounterListAccountsResponse--;
   return o;
@@ -647,32 +647,32 @@
 checkListAccountsResponse(api.ListAccountsResponse o) {
   buildCounterListAccountsResponse++;
   if (buildCounterListAccountsResponse < 3) {
-    checkUnnamed1718(o.accounts);
+    checkUnnamed1740(o.accounts);
   }
   buildCounterListAccountsResponse--;
 }
 
-buildUnnamed1719() {
+buildUnnamed1741() {
   var o = new core.List<api.ContainerVersion>();
   o.add(buildContainerVersion());
   o.add(buildContainerVersion());
   return o;
 }
 
-checkUnnamed1719(core.List<api.ContainerVersion> o) {
+checkUnnamed1741(core.List<api.ContainerVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContainerVersion(o[0]);
   checkContainerVersion(o[1]);
 }
 
-buildUnnamed1720() {
+buildUnnamed1742() {
   var o = new core.List<api.ContainerVersionHeader>();
   o.add(buildContainerVersionHeader());
   o.add(buildContainerVersionHeader());
   return o;
 }
 
-checkUnnamed1720(core.List<api.ContainerVersionHeader> o) {
+checkUnnamed1742(core.List<api.ContainerVersionHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContainerVersionHeader(o[0]);
   checkContainerVersionHeader(o[1]);
@@ -683,8 +683,8 @@
   var o = new api.ListContainerVersionsResponse();
   buildCounterListContainerVersionsResponse++;
   if (buildCounterListContainerVersionsResponse < 3) {
-    o.containerVersion = buildUnnamed1719();
-    o.containerVersionHeader = buildUnnamed1720();
+    o.containerVersion = buildUnnamed1741();
+    o.containerVersionHeader = buildUnnamed1742();
   }
   buildCounterListContainerVersionsResponse--;
   return o;
@@ -693,20 +693,20 @@
 checkListContainerVersionsResponse(api.ListContainerVersionsResponse o) {
   buildCounterListContainerVersionsResponse++;
   if (buildCounterListContainerVersionsResponse < 3) {
-    checkUnnamed1719(o.containerVersion);
-    checkUnnamed1720(o.containerVersionHeader);
+    checkUnnamed1741(o.containerVersion);
+    checkUnnamed1742(o.containerVersionHeader);
   }
   buildCounterListContainerVersionsResponse--;
 }
 
-buildUnnamed1721() {
+buildUnnamed1743() {
   var o = new core.List<api.Container>();
   o.add(buildContainer());
   o.add(buildContainer());
   return o;
 }
 
-checkUnnamed1721(core.List<api.Container> o) {
+checkUnnamed1743(core.List<api.Container> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContainer(o[0]);
   checkContainer(o[1]);
@@ -717,7 +717,7 @@
   var o = new api.ListContainersResponse();
   buildCounterListContainersResponse++;
   if (buildCounterListContainersResponse < 3) {
-    o.containers = buildUnnamed1721();
+    o.containers = buildUnnamed1743();
   }
   buildCounterListContainersResponse--;
   return o;
@@ -726,19 +726,19 @@
 checkListContainersResponse(api.ListContainersResponse o) {
   buildCounterListContainersResponse++;
   if (buildCounterListContainersResponse < 3) {
-    checkUnnamed1721(o.containers);
+    checkUnnamed1743(o.containers);
   }
   buildCounterListContainersResponse--;
 }
 
-buildUnnamed1722() {
+buildUnnamed1744() {
   var o = new core.List<api.Environment>();
   o.add(buildEnvironment());
   o.add(buildEnvironment());
   return o;
 }
 
-checkUnnamed1722(core.List<api.Environment> o) {
+checkUnnamed1744(core.List<api.Environment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnvironment(o[0]);
   checkEnvironment(o[1]);
@@ -749,7 +749,7 @@
   var o = new api.ListEnvironmentsResponse();
   buildCounterListEnvironmentsResponse++;
   if (buildCounterListEnvironmentsResponse < 3) {
-    o.environments = buildUnnamed1722();
+    o.environments = buildUnnamed1744();
   }
   buildCounterListEnvironmentsResponse--;
   return o;
@@ -758,19 +758,19 @@
 checkListEnvironmentsResponse(api.ListEnvironmentsResponse o) {
   buildCounterListEnvironmentsResponse++;
   if (buildCounterListEnvironmentsResponse < 3) {
-    checkUnnamed1722(o.environments);
+    checkUnnamed1744(o.environments);
   }
   buildCounterListEnvironmentsResponse--;
 }
 
-buildUnnamed1723() {
+buildUnnamed1745() {
   var o = new core.List<api.Folder>();
   o.add(buildFolder());
   o.add(buildFolder());
   return o;
 }
 
-checkUnnamed1723(core.List<api.Folder> o) {
+checkUnnamed1745(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFolder(o[0]);
   checkFolder(o[1]);
@@ -781,7 +781,7 @@
   var o = new api.ListFoldersResponse();
   buildCounterListFoldersResponse++;
   if (buildCounterListFoldersResponse < 3) {
-    o.folders = buildUnnamed1723();
+    o.folders = buildUnnamed1745();
   }
   buildCounterListFoldersResponse--;
   return o;
@@ -790,19 +790,19 @@
 checkListFoldersResponse(api.ListFoldersResponse o) {
   buildCounterListFoldersResponse++;
   if (buildCounterListFoldersResponse < 3) {
-    checkUnnamed1723(o.folders);
+    checkUnnamed1745(o.folders);
   }
   buildCounterListFoldersResponse--;
 }
 
-buildUnnamed1724() {
+buildUnnamed1746() {
   var o = new core.List<api.Tag>();
   o.add(buildTag());
   o.add(buildTag());
   return o;
 }
 
-checkUnnamed1724(core.List<api.Tag> o) {
+checkUnnamed1746(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTag(o[0]);
   checkTag(o[1]);
@@ -813,7 +813,7 @@
   var o = new api.ListTagsResponse();
   buildCounterListTagsResponse++;
   if (buildCounterListTagsResponse < 3) {
-    o.tags = buildUnnamed1724();
+    o.tags = buildUnnamed1746();
   }
   buildCounterListTagsResponse--;
   return o;
@@ -822,19 +822,19 @@
 checkListTagsResponse(api.ListTagsResponse o) {
   buildCounterListTagsResponse++;
   if (buildCounterListTagsResponse < 3) {
-    checkUnnamed1724(o.tags);
+    checkUnnamed1746(o.tags);
   }
   buildCounterListTagsResponse--;
 }
 
-buildUnnamed1725() {
+buildUnnamed1747() {
   var o = new core.List<api.Trigger>();
   o.add(buildTrigger());
   o.add(buildTrigger());
   return o;
 }
 
-checkUnnamed1725(core.List<api.Trigger> o) {
+checkUnnamed1747(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrigger(o[0]);
   checkTrigger(o[1]);
@@ -845,7 +845,7 @@
   var o = new api.ListTriggersResponse();
   buildCounterListTriggersResponse++;
   if (buildCounterListTriggersResponse < 3) {
-    o.triggers = buildUnnamed1725();
+    o.triggers = buildUnnamed1747();
   }
   buildCounterListTriggersResponse--;
   return o;
@@ -854,19 +854,19 @@
 checkListTriggersResponse(api.ListTriggersResponse o) {
   buildCounterListTriggersResponse++;
   if (buildCounterListTriggersResponse < 3) {
-    checkUnnamed1725(o.triggers);
+    checkUnnamed1747(o.triggers);
   }
   buildCounterListTriggersResponse--;
 }
 
-buildUnnamed1726() {
+buildUnnamed1748() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed1726(core.List<api.Variable> o) {
+checkUnnamed1748(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
@@ -877,7 +877,7 @@
   var o = new api.ListVariablesResponse();
   buildCounterListVariablesResponse++;
   if (buildCounterListVariablesResponse < 3) {
-    o.variables = buildUnnamed1726();
+    o.variables = buildUnnamed1748();
   }
   buildCounterListVariablesResponse--;
   return o;
@@ -886,45 +886,45 @@
 checkListVariablesResponse(api.ListVariablesResponse o) {
   buildCounterListVariablesResponse++;
   if (buildCounterListVariablesResponse < 3) {
-    checkUnnamed1726(o.variables);
+    checkUnnamed1748(o.variables);
   }
   buildCounterListVariablesResponse--;
 }
 
-buildUnnamed1727() {
+buildUnnamed1749() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1727(core.List<core.String> o) {
+checkUnnamed1749(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1728() {
+buildUnnamed1750() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1728(core.List<core.String> o) {
+checkUnnamed1750(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1729() {
+buildUnnamed1751() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed1729(core.List<api.Parameter> o) {
+checkUnnamed1751(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -937,13 +937,13 @@
   if (buildCounterMacro < 3) {
     o.accountId = "foo";
     o.containerId = "foo";
-    o.disablingRuleId = buildUnnamed1727();
-    o.enablingRuleId = buildUnnamed1728();
+    o.disablingRuleId = buildUnnamed1749();
+    o.enablingRuleId = buildUnnamed1750();
     o.fingerprint = "foo";
     o.macroId = "foo";
     o.name = "foo";
     o.notes = "foo";
-    o.parameter = buildUnnamed1729();
+    o.parameter = buildUnnamed1751();
     o.parentFolderId = "foo";
     o.scheduleEndMs = "foo";
     o.scheduleStartMs = "foo";
@@ -958,13 +958,13 @@
   if (buildCounterMacro < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkUnnamed1727(o.disablingRuleId);
-    checkUnnamed1728(o.enablingRuleId);
+    checkUnnamed1749(o.disablingRuleId);
+    checkUnnamed1750(o.enablingRuleId);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.macroId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkUnnamed1729(o.parameter);
+    checkUnnamed1751(o.parameter);
     unittest.expect(o.parentFolderId, unittest.equals('foo'));
     unittest.expect(o.scheduleEndMs, unittest.equals('foo'));
     unittest.expect(o.scheduleStartMs, unittest.equals('foo'));
@@ -973,27 +973,27 @@
   buildCounterMacro--;
 }
 
-buildUnnamed1730() {
+buildUnnamed1752() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed1730(core.List<api.Parameter> o) {
+checkUnnamed1752(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
 }
 
-buildUnnamed1731() {
+buildUnnamed1753() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed1731(core.List<api.Parameter> o) {
+checkUnnamed1753(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -1005,8 +1005,8 @@
   buildCounterParameter++;
   if (buildCounterParameter < 3) {
     o.key = "foo";
-    o.list = buildUnnamed1730();
-    o.map = buildUnnamed1731();
+    o.list = buildUnnamed1752();
+    o.map = buildUnnamed1753();
     o.type = "foo";
     o.value = "foo";
   }
@@ -1018,8 +1018,8 @@
   buildCounterParameter++;
   if (buildCounterParameter < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkUnnamed1730(o.list);
-    checkUnnamed1731(o.map);
+    checkUnnamed1752(o.list);
+    checkUnnamed1753(o.map);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
@@ -1047,14 +1047,14 @@
   buildCounterPublishContainerVersionResponse--;
 }
 
-buildUnnamed1732() {
+buildUnnamed1754() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed1732(core.List<api.Condition> o) {
+checkUnnamed1754(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
@@ -1066,7 +1066,7 @@
   buildCounterRule++;
   if (buildCounterRule < 3) {
     o.accountId = "foo";
-    o.condition = buildUnnamed1732();
+    o.condition = buildUnnamed1754();
     o.containerId = "foo";
     o.fingerprint = "foo";
     o.name = "foo";
@@ -1081,7 +1081,7 @@
   buildCounterRule++;
   if (buildCounterRule < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed1732(o.condition);
+    checkUnnamed1754(o.condition);
     unittest.expect(o.containerId, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1112,92 +1112,92 @@
   buildCounterSetupTag--;
 }
 
-buildUnnamed1733() {
+buildUnnamed1755() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1733(core.List<core.String> o) {
+checkUnnamed1755(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1734() {
+buildUnnamed1756() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1734(core.List<core.String> o) {
+checkUnnamed1756(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1735() {
+buildUnnamed1757() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1735(core.List<core.String> o) {
+checkUnnamed1757(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1736() {
+buildUnnamed1758() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1736(core.List<core.String> o) {
+checkUnnamed1758(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1737() {
+buildUnnamed1759() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed1737(core.List<api.Parameter> o) {
+checkUnnamed1759(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
 }
 
-buildUnnamed1738() {
+buildUnnamed1760() {
   var o = new core.List<api.SetupTag>();
   o.add(buildSetupTag());
   o.add(buildSetupTag());
   return o;
 }
 
-checkUnnamed1738(core.List<api.SetupTag> o) {
+checkUnnamed1760(core.List<api.SetupTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSetupTag(o[0]);
   checkSetupTag(o[1]);
 }
 
-buildUnnamed1739() {
+buildUnnamed1761() {
   var o = new core.List<api.TeardownTag>();
   o.add(buildTeardownTag());
   o.add(buildTeardownTag());
   return o;
 }
 
-checkUnnamed1739(core.List<api.TeardownTag> o) {
+checkUnnamed1761(core.List<api.TeardownTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTeardownTag(o[0]);
   checkTeardownTag(o[1]);
@@ -1209,25 +1209,25 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     o.accountId = "foo";
-    o.blockingRuleId = buildUnnamed1733();
-    o.blockingTriggerId = buildUnnamed1734();
+    o.blockingRuleId = buildUnnamed1755();
+    o.blockingTriggerId = buildUnnamed1756();
     o.containerId = "foo";
     o.fingerprint = "foo";
-    o.firingRuleId = buildUnnamed1735();
-    o.firingTriggerId = buildUnnamed1736();
+    o.firingRuleId = buildUnnamed1757();
+    o.firingTriggerId = buildUnnamed1758();
     o.liveOnly = true;
     o.name = "foo";
     o.notes = "foo";
-    o.parameter = buildUnnamed1737();
+    o.parameter = buildUnnamed1759();
     o.parentFolderId = "foo";
     o.paused = true;
     o.priority = buildParameter();
     o.scheduleEndMs = "foo";
     o.scheduleStartMs = "foo";
-    o.setupTag = buildUnnamed1738();
+    o.setupTag = buildUnnamed1760();
     o.tagFiringOption = "foo";
     o.tagId = "foo";
-    o.teardownTag = buildUnnamed1739();
+    o.teardownTag = buildUnnamed1761();
     o.type = "foo";
   }
   buildCounterTag--;
@@ -1238,25 +1238,25 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed1733(o.blockingRuleId);
-    checkUnnamed1734(o.blockingTriggerId);
+    checkUnnamed1755(o.blockingRuleId);
+    checkUnnamed1756(o.blockingTriggerId);
     unittest.expect(o.containerId, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed1735(o.firingRuleId);
-    checkUnnamed1736(o.firingTriggerId);
+    checkUnnamed1757(o.firingRuleId);
+    checkUnnamed1758(o.firingTriggerId);
     unittest.expect(o.liveOnly, unittest.isTrue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkUnnamed1737(o.parameter);
+    checkUnnamed1759(o.parameter);
     unittest.expect(o.parentFolderId, unittest.equals('foo'));
     unittest.expect(o.paused, unittest.isTrue);
     checkParameter(o.priority);
     unittest.expect(o.scheduleEndMs, unittest.equals('foo'));
     unittest.expect(o.scheduleStartMs, unittest.equals('foo'));
-    checkUnnamed1738(o.setupTag);
+    checkUnnamed1760(o.setupTag);
     unittest.expect(o.tagFiringOption, unittest.equals('foo'));
     unittest.expect(o.tagId, unittest.equals('foo'));
-    checkUnnamed1739(o.teardownTag);
+    checkUnnamed1761(o.teardownTag);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterTag--;
@@ -1283,53 +1283,53 @@
   buildCounterTeardownTag--;
 }
 
-buildUnnamed1740() {
+buildUnnamed1762() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed1740(core.List<api.Condition> o) {
+checkUnnamed1762(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
 }
 
-buildUnnamed1741() {
+buildUnnamed1763() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed1741(core.List<api.Condition> o) {
+checkUnnamed1763(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
 }
 
-buildUnnamed1742() {
+buildUnnamed1764() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed1742(core.List<api.Condition> o) {
+checkUnnamed1764(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
 }
 
-buildUnnamed1743() {
+buildUnnamed1765() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed1743(core.List<api.Parameter> o) {
+checkUnnamed1765(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -1341,13 +1341,13 @@
   buildCounterTrigger++;
   if (buildCounterTrigger < 3) {
     o.accountId = "foo";
-    o.autoEventFilter = buildUnnamed1740();
+    o.autoEventFilter = buildUnnamed1762();
     o.checkValidation = buildParameter();
     o.containerId = "foo";
     o.continuousTimeMinMilliseconds = buildParameter();
-    o.customEventFilter = buildUnnamed1741();
+    o.customEventFilter = buildUnnamed1763();
     o.eventName = buildParameter();
-    o.filter = buildUnnamed1742();
+    o.filter = buildUnnamed1764();
     o.fingerprint = "foo";
     o.horizontalScrollPercentageList = buildParameter();
     o.interval = buildParameter();
@@ -1355,7 +1355,7 @@
     o.limit = buildParameter();
     o.maxTimerLengthSeconds = buildParameter();
     o.name = "foo";
-    o.parameter = buildUnnamed1743();
+    o.parameter = buildUnnamed1765();
     o.parentFolderId = "foo";
     o.selector = buildParameter();
     o.totalTimeMinMilliseconds = buildParameter();
@@ -1377,13 +1377,13 @@
   buildCounterTrigger++;
   if (buildCounterTrigger < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed1740(o.autoEventFilter);
+    checkUnnamed1762(o.autoEventFilter);
     checkParameter(o.checkValidation);
     unittest.expect(o.containerId, unittest.equals('foo'));
     checkParameter(o.continuousTimeMinMilliseconds);
-    checkUnnamed1741(o.customEventFilter);
+    checkUnnamed1763(o.customEventFilter);
     checkParameter(o.eventName);
-    checkUnnamed1742(o.filter);
+    checkUnnamed1764(o.filter);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     checkParameter(o.horizontalScrollPercentageList);
     checkParameter(o.interval);
@@ -1391,7 +1391,7 @@
     checkParameter(o.limit);
     checkParameter(o.maxTimerLengthSeconds);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1743(o.parameter);
+    checkUnnamed1765(o.parameter);
     unittest.expect(o.parentFolderId, unittest.equals('foo'));
     checkParameter(o.selector);
     checkParameter(o.totalTimeMinMilliseconds);
@@ -1408,14 +1408,14 @@
   buildCounterTrigger--;
 }
 
-buildUnnamed1744() {
+buildUnnamed1766() {
   var o = new core.List<api.ContainerAccess>();
   o.add(buildContainerAccess());
   o.add(buildContainerAccess());
   return o;
 }
 
-checkUnnamed1744(core.List<api.ContainerAccess> o) {
+checkUnnamed1766(core.List<api.ContainerAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContainerAccess(o[0]);
   checkContainerAccess(o[1]);
@@ -1428,7 +1428,7 @@
   if (buildCounterUserAccess < 3) {
     o.accountAccess = buildAccountAccess();
     o.accountId = "foo";
-    o.containerAccess = buildUnnamed1744();
+    o.containerAccess = buildUnnamed1766();
     o.emailAddress = "foo";
     o.permissionId = "foo";
   }
@@ -1441,47 +1441,47 @@
   if (buildCounterUserAccess < 3) {
     checkAccountAccess(o.accountAccess);
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed1744(o.containerAccess);
+    checkUnnamed1766(o.containerAccess);
     unittest.expect(o.emailAddress, unittest.equals('foo'));
     unittest.expect(o.permissionId, unittest.equals('foo'));
   }
   buildCounterUserAccess--;
 }
 
-buildUnnamed1745() {
+buildUnnamed1767() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1745(core.List<core.String> o) {
+checkUnnamed1767(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1746() {
+buildUnnamed1768() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1746(core.List<core.String> o) {
+checkUnnamed1768(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1747() {
+buildUnnamed1769() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed1747(core.List<api.Parameter> o) {
+checkUnnamed1769(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -1494,12 +1494,12 @@
   if (buildCounterVariable < 3) {
     o.accountId = "foo";
     o.containerId = "foo";
-    o.disablingTriggerId = buildUnnamed1745();
-    o.enablingTriggerId = buildUnnamed1746();
+    o.disablingTriggerId = buildUnnamed1767();
+    o.enablingTriggerId = buildUnnamed1768();
     o.fingerprint = "foo";
     o.name = "foo";
     o.notes = "foo";
-    o.parameter = buildUnnamed1747();
+    o.parameter = buildUnnamed1769();
     o.parentFolderId = "foo";
     o.scheduleEndMs = "foo";
     o.scheduleStartMs = "foo";
@@ -1515,12 +1515,12 @@
   if (buildCounterVariable < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkUnnamed1745(o.disablingTriggerId);
-    checkUnnamed1746(o.enablingTriggerId);
+    checkUnnamed1767(o.disablingTriggerId);
+    checkUnnamed1768(o.enablingTriggerId);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkUnnamed1747(o.parameter);
+    checkUnnamed1769(o.parameter);
     unittest.expect(o.parentFolderId, unittest.equals('foo'));
     unittest.expect(o.scheduleEndMs, unittest.equals('foo'));
     unittest.expect(o.scheduleStartMs, unittest.equals('foo'));
@@ -1530,40 +1530,40 @@
   buildCounterVariable--;
 }
 
-buildUnnamed1748() {
+buildUnnamed1770() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1748(core.List<core.String> o) {
+checkUnnamed1770(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1749() {
+buildUnnamed1771() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1749(core.List<core.String> o) {
+checkUnnamed1771(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1750() {
+buildUnnamed1772() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1750(core.List<core.String> o) {
+checkUnnamed1772(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3297,9 +3297,9 @@
       var arg_accountId = "foo";
       var arg_containerId = "foo";
       var arg_folderId = "foo";
-      var arg_tagId = buildUnnamed1748();
-      var arg_triggerId = buildUnnamed1749();
-      var arg_variableId = buildUnnamed1750();
+      var arg_tagId = buildUnnamed1770();
+      var arg_triggerId = buildUnnamed1771();
+      var arg_variableId = buildUnnamed1772();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.Folder.fromJson(json);
diff --git a/generated/googleapis/test/tagmanager/v2_test.dart b/generated/googleapis/test/tagmanager/v2_test.dart
index 2a94f23..b55e7c0 100644
--- a/generated/googleapis/test/tagmanager/v2_test.dart
+++ b/generated/googleapis/test/tagmanager/v2_test.dart
@@ -127,14 +127,14 @@
   buildCounterBuiltInVariable--;
 }
 
-buildUnnamed1377() {
+buildUnnamed1393() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed1377(core.List<api.Parameter> o) {
+checkUnnamed1393(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -145,7 +145,7 @@
   var o = new api.Condition();
   buildCounterCondition++;
   if (buildCounterCondition < 3) {
-    o.parameter = buildUnnamed1377();
+    o.parameter = buildUnnamed1393();
     o.type = "foo";
   }
   buildCounterCondition--;
@@ -155,33 +155,33 @@
 checkCondition(api.Condition o) {
   buildCounterCondition++;
   if (buildCounterCondition < 3) {
-    checkUnnamed1377(o.parameter);
+    checkUnnamed1393(o.parameter);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterCondition--;
 }
 
-buildUnnamed1378() {
+buildUnnamed1394() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1378(core.List<core.String> o) {
+checkUnnamed1394(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1379() {
+buildUnnamed1395() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1379(core.List<core.String> o) {
+checkUnnamed1395(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -194,14 +194,14 @@
   if (buildCounterContainer < 3) {
     o.accountId = "foo";
     o.containerId = "foo";
-    o.domainName = buildUnnamed1378();
+    o.domainName = buildUnnamed1394();
     o.fingerprint = "foo";
     o.name = "foo";
     o.notes = "foo";
     o.path = "foo";
     o.publicId = "foo";
     o.tagManagerUrl = "foo";
-    o.usageContext = buildUnnamed1379();
+    o.usageContext = buildUnnamed1395();
   }
   buildCounterContainer--;
   return o;
@@ -212,14 +212,14 @@
   if (buildCounterContainer < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkUnnamed1378(o.domainName);
+    checkUnnamed1394(o.domainName);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.path, unittest.equals('foo'));
     unittest.expect(o.publicId, unittest.equals('foo'));
     unittest.expect(o.tagManagerUrl, unittest.equals('foo'));
-    checkUnnamed1379(o.usageContext);
+    checkUnnamed1395(o.usageContext);
   }
   buildCounterContainer--;
 }
@@ -245,79 +245,79 @@
   buildCounterContainerAccess--;
 }
 
-buildUnnamed1380() {
+buildUnnamed1396() {
   var o = new core.List<api.BuiltInVariable>();
   o.add(buildBuiltInVariable());
   o.add(buildBuiltInVariable());
   return o;
 }
 
-checkUnnamed1380(core.List<api.BuiltInVariable> o) {
+checkUnnamed1396(core.List<api.BuiltInVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBuiltInVariable(o[0]);
   checkBuiltInVariable(o[1]);
 }
 
-buildUnnamed1381() {
+buildUnnamed1397() {
   var o = new core.List<api.Folder>();
   o.add(buildFolder());
   o.add(buildFolder());
   return o;
 }
 
-checkUnnamed1381(core.List<api.Folder> o) {
+checkUnnamed1397(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFolder(o[0]);
   checkFolder(o[1]);
 }
 
-buildUnnamed1382() {
+buildUnnamed1398() {
   var o = new core.List<api.Tag>();
   o.add(buildTag());
   o.add(buildTag());
   return o;
 }
 
-checkUnnamed1382(core.List<api.Tag> o) {
+checkUnnamed1398(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTag(o[0]);
   checkTag(o[1]);
 }
 
-buildUnnamed1383() {
+buildUnnamed1399() {
   var o = new core.List<api.Trigger>();
   o.add(buildTrigger());
   o.add(buildTrigger());
   return o;
 }
 
-checkUnnamed1383(core.List<api.Trigger> o) {
+checkUnnamed1399(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrigger(o[0]);
   checkTrigger(o[1]);
 }
 
-buildUnnamed1384() {
+buildUnnamed1400() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed1384(core.List<api.Variable> o) {
+checkUnnamed1400(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
 }
 
-buildUnnamed1385() {
+buildUnnamed1401() {
   var o = new core.List<api.Zone>();
   o.add(buildZone());
   o.add(buildZone());
   return o;
 }
 
-checkUnnamed1385(core.List<api.Zone> o) {
+checkUnnamed1401(core.List<api.Zone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZone(o[0]);
   checkZone(o[1]);
@@ -329,21 +329,21 @@
   buildCounterContainerVersion++;
   if (buildCounterContainerVersion < 3) {
     o.accountId = "foo";
-    o.builtInVariable = buildUnnamed1380();
+    o.builtInVariable = buildUnnamed1396();
     o.container = buildContainer();
     o.containerId = "foo";
     o.containerVersionId = "foo";
     o.deleted = true;
     o.description = "foo";
     o.fingerprint = "foo";
-    o.folder = buildUnnamed1381();
+    o.folder = buildUnnamed1397();
     o.name = "foo";
     o.path = "foo";
-    o.tag = buildUnnamed1382();
+    o.tag = buildUnnamed1398();
     o.tagManagerUrl = "foo";
-    o.trigger = buildUnnamed1383();
-    o.variable = buildUnnamed1384();
-    o.zone = buildUnnamed1385();
+    o.trigger = buildUnnamed1399();
+    o.variable = buildUnnamed1400();
+    o.zone = buildUnnamed1401();
   }
   buildCounterContainerVersion--;
   return o;
@@ -353,21 +353,21 @@
   buildCounterContainerVersion++;
   if (buildCounterContainerVersion < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed1380(o.builtInVariable);
+    checkUnnamed1396(o.builtInVariable);
     checkContainer(o.container);
     unittest.expect(o.containerId, unittest.equals('foo'));
     unittest.expect(o.containerVersionId, unittest.equals('foo'));
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed1381(o.folder);
+    checkUnnamed1397(o.folder);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.path, unittest.equals('foo'));
-    checkUnnamed1382(o.tag);
+    checkUnnamed1398(o.tag);
     unittest.expect(o.tagManagerUrl, unittest.equals('foo'));
-    checkUnnamed1383(o.trigger);
-    checkUnnamed1384(o.variable);
-    checkUnnamed1385(o.zone);
+    checkUnnamed1399(o.trigger);
+    checkUnnamed1400(o.variable);
+    checkUnnamed1401(o.zone);
   }
   buildCounterContainerVersion--;
 }
@@ -413,14 +413,14 @@
   buildCounterContainerVersionHeader--;
 }
 
-buildUnnamed1386() {
+buildUnnamed1402() {
   var o = new core.List<api.BuiltInVariable>();
   o.add(buildBuiltInVariable());
   o.add(buildBuiltInVariable());
   return o;
 }
 
-checkUnnamed1386(core.List<api.BuiltInVariable> o) {
+checkUnnamed1402(core.List<api.BuiltInVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBuiltInVariable(o[0]);
   checkBuiltInVariable(o[1]);
@@ -431,7 +431,7 @@
   var o = new api.CreateBuiltInVariableResponse();
   buildCounterCreateBuiltInVariableResponse++;
   if (buildCounterCreateBuiltInVariableResponse < 3) {
-    o.builtInVariable = buildUnnamed1386();
+    o.builtInVariable = buildUnnamed1402();
   }
   buildCounterCreateBuiltInVariableResponse--;
   return o;
@@ -440,7 +440,7 @@
 checkCreateBuiltInVariableResponse(api.CreateBuiltInVariableResponse o) {
   buildCounterCreateBuiltInVariableResponse++;
   if (buildCounterCreateBuiltInVariableResponse < 3) {
-    checkUnnamed1386(o.builtInVariable);
+    checkUnnamed1402(o.builtInVariable);
   }
   buildCounterCreateBuiltInVariableResponse--;
 }
@@ -492,14 +492,14 @@
   buildCounterCreateContainerVersionResponse--;
 }
 
-buildUnnamed1387() {
+buildUnnamed1403() {
   var o = new core.List<api.WorkspaceProposalUser>();
   o.add(buildWorkspaceProposalUser());
   o.add(buildWorkspaceProposalUser());
   return o;
 }
 
-checkUnnamed1387(core.List<api.WorkspaceProposalUser> o) {
+checkUnnamed1403(core.List<api.WorkspaceProposalUser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWorkspaceProposalUser(o[0]);
   checkWorkspaceProposalUser(o[1]);
@@ -511,7 +511,7 @@
   buildCounterCreateWorkspaceProposalRequest++;
   if (buildCounterCreateWorkspaceProposalRequest < 3) {
     o.initialComment = buildWorkspaceProposalHistoryComment();
-    o.reviewers = buildUnnamed1387();
+    o.reviewers = buildUnnamed1403();
   }
   buildCounterCreateWorkspaceProposalRequest--;
   return o;
@@ -521,7 +521,7 @@
   buildCounterCreateWorkspaceProposalRequest++;
   if (buildCounterCreateWorkspaceProposalRequest < 3) {
     checkWorkspaceProposalHistoryComment(o.initialComment);
-    checkUnnamed1387(o.reviewers);
+    checkUnnamed1403(o.reviewers);
   }
   buildCounterCreateWorkspaceProposalRequest--;
 }
@@ -635,40 +635,40 @@
   buildCounterFolder--;
 }
 
-buildUnnamed1388() {
+buildUnnamed1404() {
   var o = new core.List<api.Tag>();
   o.add(buildTag());
   o.add(buildTag());
   return o;
 }
 
-checkUnnamed1388(core.List<api.Tag> o) {
+checkUnnamed1404(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTag(o[0]);
   checkTag(o[1]);
 }
 
-buildUnnamed1389() {
+buildUnnamed1405() {
   var o = new core.List<api.Trigger>();
   o.add(buildTrigger());
   o.add(buildTrigger());
   return o;
 }
 
-checkUnnamed1389(core.List<api.Trigger> o) {
+checkUnnamed1405(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrigger(o[0]);
   checkTrigger(o[1]);
 }
 
-buildUnnamed1390() {
+buildUnnamed1406() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed1390(core.List<api.Variable> o) {
+checkUnnamed1406(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
@@ -680,9 +680,9 @@
   buildCounterFolderEntities++;
   if (buildCounterFolderEntities < 3) {
     o.nextPageToken = "foo";
-    o.tag = buildUnnamed1388();
-    o.trigger = buildUnnamed1389();
-    o.variable = buildUnnamed1390();
+    o.tag = buildUnnamed1404();
+    o.trigger = buildUnnamed1405();
+    o.variable = buildUnnamed1406();
   }
   buildCounterFolderEntities--;
   return o;
@@ -692,34 +692,34 @@
   buildCounterFolderEntities++;
   if (buildCounterFolderEntities < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1388(o.tag);
-    checkUnnamed1389(o.trigger);
-    checkUnnamed1390(o.variable);
+    checkUnnamed1404(o.tag);
+    checkUnnamed1405(o.trigger);
+    checkUnnamed1406(o.variable);
   }
   buildCounterFolderEntities--;
 }
 
-buildUnnamed1391() {
+buildUnnamed1407() {
   var o = new core.List<api.MergeConflict>();
   o.add(buildMergeConflict());
   o.add(buildMergeConflict());
   return o;
 }
 
-checkUnnamed1391(core.List<api.MergeConflict> o) {
+checkUnnamed1407(core.List<api.MergeConflict> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMergeConflict(o[0]);
   checkMergeConflict(o[1]);
 }
 
-buildUnnamed1392() {
+buildUnnamed1408() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1392(core.List<api.Entity> o) {
+checkUnnamed1408(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
@@ -730,8 +730,8 @@
   var o = new api.GetWorkspaceStatusResponse();
   buildCounterGetWorkspaceStatusResponse++;
   if (buildCounterGetWorkspaceStatusResponse < 3) {
-    o.mergeConflict = buildUnnamed1391();
-    o.workspaceChange = buildUnnamed1392();
+    o.mergeConflict = buildUnnamed1407();
+    o.workspaceChange = buildUnnamed1408();
   }
   buildCounterGetWorkspaceStatusResponse--;
   return o;
@@ -740,20 +740,20 @@
 checkGetWorkspaceStatusResponse(api.GetWorkspaceStatusResponse o) {
   buildCounterGetWorkspaceStatusResponse++;
   if (buildCounterGetWorkspaceStatusResponse < 3) {
-    checkUnnamed1391(o.mergeConflict);
-    checkUnnamed1392(o.workspaceChange);
+    checkUnnamed1407(o.mergeConflict);
+    checkUnnamed1408(o.workspaceChange);
   }
   buildCounterGetWorkspaceStatusResponse--;
 }
 
-buildUnnamed1393() {
+buildUnnamed1409() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed1393(core.List<api.Account> o) {
+checkUnnamed1409(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -764,7 +764,7 @@
   var o = new api.ListAccountsResponse();
   buildCounterListAccountsResponse++;
   if (buildCounterListAccountsResponse < 3) {
-    o.account = buildUnnamed1393();
+    o.account = buildUnnamed1409();
     o.nextPageToken = "foo";
   }
   buildCounterListAccountsResponse--;
@@ -774,20 +774,20 @@
 checkListAccountsResponse(api.ListAccountsResponse o) {
   buildCounterListAccountsResponse++;
   if (buildCounterListAccountsResponse < 3) {
-    checkUnnamed1393(o.account);
+    checkUnnamed1409(o.account);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListAccountsResponse--;
 }
 
-buildUnnamed1394() {
+buildUnnamed1410() {
   var o = new core.List<api.ContainerVersionHeader>();
   o.add(buildContainerVersionHeader());
   o.add(buildContainerVersionHeader());
   return o;
 }
 
-checkUnnamed1394(core.List<api.ContainerVersionHeader> o) {
+checkUnnamed1410(core.List<api.ContainerVersionHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContainerVersionHeader(o[0]);
   checkContainerVersionHeader(o[1]);
@@ -798,7 +798,7 @@
   var o = new api.ListContainerVersionsResponse();
   buildCounterListContainerVersionsResponse++;
   if (buildCounterListContainerVersionsResponse < 3) {
-    o.containerVersionHeader = buildUnnamed1394();
+    o.containerVersionHeader = buildUnnamed1410();
     o.nextPageToken = "foo";
   }
   buildCounterListContainerVersionsResponse--;
@@ -808,20 +808,20 @@
 checkListContainerVersionsResponse(api.ListContainerVersionsResponse o) {
   buildCounterListContainerVersionsResponse++;
   if (buildCounterListContainerVersionsResponse < 3) {
-    checkUnnamed1394(o.containerVersionHeader);
+    checkUnnamed1410(o.containerVersionHeader);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListContainerVersionsResponse--;
 }
 
-buildUnnamed1395() {
+buildUnnamed1411() {
   var o = new core.List<api.Container>();
   o.add(buildContainer());
   o.add(buildContainer());
   return o;
 }
 
-checkUnnamed1395(core.List<api.Container> o) {
+checkUnnamed1411(core.List<api.Container> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContainer(o[0]);
   checkContainer(o[1]);
@@ -832,7 +832,7 @@
   var o = new api.ListContainersResponse();
   buildCounterListContainersResponse++;
   if (buildCounterListContainersResponse < 3) {
-    o.container = buildUnnamed1395();
+    o.container = buildUnnamed1411();
     o.nextPageToken = "foo";
   }
   buildCounterListContainersResponse--;
@@ -842,20 +842,20 @@
 checkListContainersResponse(api.ListContainersResponse o) {
   buildCounterListContainersResponse++;
   if (buildCounterListContainersResponse < 3) {
-    checkUnnamed1395(o.container);
+    checkUnnamed1411(o.container);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListContainersResponse--;
 }
 
-buildUnnamed1396() {
+buildUnnamed1412() {
   var o = new core.List<api.BuiltInVariable>();
   o.add(buildBuiltInVariable());
   o.add(buildBuiltInVariable());
   return o;
 }
 
-checkUnnamed1396(core.List<api.BuiltInVariable> o) {
+checkUnnamed1412(core.List<api.BuiltInVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBuiltInVariable(o[0]);
   checkBuiltInVariable(o[1]);
@@ -866,7 +866,7 @@
   var o = new api.ListEnabledBuiltInVariablesResponse();
   buildCounterListEnabledBuiltInVariablesResponse++;
   if (buildCounterListEnabledBuiltInVariablesResponse < 3) {
-    o.builtInVariable = buildUnnamed1396();
+    o.builtInVariable = buildUnnamed1412();
     o.nextPageToken = "foo";
   }
   buildCounterListEnabledBuiltInVariablesResponse--;
@@ -877,20 +877,20 @@
     api.ListEnabledBuiltInVariablesResponse o) {
   buildCounterListEnabledBuiltInVariablesResponse++;
   if (buildCounterListEnabledBuiltInVariablesResponse < 3) {
-    checkUnnamed1396(o.builtInVariable);
+    checkUnnamed1412(o.builtInVariable);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListEnabledBuiltInVariablesResponse--;
 }
 
-buildUnnamed1397() {
+buildUnnamed1413() {
   var o = new core.List<api.Environment>();
   o.add(buildEnvironment());
   o.add(buildEnvironment());
   return o;
 }
 
-checkUnnamed1397(core.List<api.Environment> o) {
+checkUnnamed1413(core.List<api.Environment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnvironment(o[0]);
   checkEnvironment(o[1]);
@@ -901,7 +901,7 @@
   var o = new api.ListEnvironmentsResponse();
   buildCounterListEnvironmentsResponse++;
   if (buildCounterListEnvironmentsResponse < 3) {
-    o.environment = buildUnnamed1397();
+    o.environment = buildUnnamed1413();
     o.nextPageToken = "foo";
   }
   buildCounterListEnvironmentsResponse--;
@@ -911,20 +911,20 @@
 checkListEnvironmentsResponse(api.ListEnvironmentsResponse o) {
   buildCounterListEnvironmentsResponse++;
   if (buildCounterListEnvironmentsResponse < 3) {
-    checkUnnamed1397(o.environment);
+    checkUnnamed1413(o.environment);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListEnvironmentsResponse--;
 }
 
-buildUnnamed1398() {
+buildUnnamed1414() {
   var o = new core.List<api.Folder>();
   o.add(buildFolder());
   o.add(buildFolder());
   return o;
 }
 
-checkUnnamed1398(core.List<api.Folder> o) {
+checkUnnamed1414(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFolder(o[0]);
   checkFolder(o[1]);
@@ -935,7 +935,7 @@
   var o = new api.ListFoldersResponse();
   buildCounterListFoldersResponse++;
   if (buildCounterListFoldersResponse < 3) {
-    o.folder = buildUnnamed1398();
+    o.folder = buildUnnamed1414();
     o.nextPageToken = "foo";
   }
   buildCounterListFoldersResponse--;
@@ -945,20 +945,20 @@
 checkListFoldersResponse(api.ListFoldersResponse o) {
   buildCounterListFoldersResponse++;
   if (buildCounterListFoldersResponse < 3) {
-    checkUnnamed1398(o.folder);
+    checkUnnamed1414(o.folder);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListFoldersResponse--;
 }
 
-buildUnnamed1399() {
+buildUnnamed1415() {
   var o = new core.List<api.Tag>();
   o.add(buildTag());
   o.add(buildTag());
   return o;
 }
 
-checkUnnamed1399(core.List<api.Tag> o) {
+checkUnnamed1415(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTag(o[0]);
   checkTag(o[1]);
@@ -970,7 +970,7 @@
   buildCounterListTagsResponse++;
   if (buildCounterListTagsResponse < 3) {
     o.nextPageToken = "foo";
-    o.tag = buildUnnamed1399();
+    o.tag = buildUnnamed1415();
   }
   buildCounterListTagsResponse--;
   return o;
@@ -980,19 +980,19 @@
   buildCounterListTagsResponse++;
   if (buildCounterListTagsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1399(o.tag);
+    checkUnnamed1415(o.tag);
   }
   buildCounterListTagsResponse--;
 }
 
-buildUnnamed1400() {
+buildUnnamed1416() {
   var o = new core.List<api.Trigger>();
   o.add(buildTrigger());
   o.add(buildTrigger());
   return o;
 }
 
-checkUnnamed1400(core.List<api.Trigger> o) {
+checkUnnamed1416(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrigger(o[0]);
   checkTrigger(o[1]);
@@ -1004,7 +1004,7 @@
   buildCounterListTriggersResponse++;
   if (buildCounterListTriggersResponse < 3) {
     o.nextPageToken = "foo";
-    o.trigger = buildUnnamed1400();
+    o.trigger = buildUnnamed1416();
   }
   buildCounterListTriggersResponse--;
   return o;
@@ -1014,19 +1014,19 @@
   buildCounterListTriggersResponse++;
   if (buildCounterListTriggersResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1400(o.trigger);
+    checkUnnamed1416(o.trigger);
   }
   buildCounterListTriggersResponse--;
 }
 
-buildUnnamed1401() {
+buildUnnamed1417() {
   var o = new core.List<api.UserPermission>();
   o.add(buildUserPermission());
   o.add(buildUserPermission());
   return o;
 }
 
-checkUnnamed1401(core.List<api.UserPermission> o) {
+checkUnnamed1417(core.List<api.UserPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserPermission(o[0]);
   checkUserPermission(o[1]);
@@ -1038,7 +1038,7 @@
   buildCounterListUserPermissionsResponse++;
   if (buildCounterListUserPermissionsResponse < 3) {
     o.nextPageToken = "foo";
-    o.userPermission = buildUnnamed1401();
+    o.userPermission = buildUnnamed1417();
   }
   buildCounterListUserPermissionsResponse--;
   return o;
@@ -1048,19 +1048,19 @@
   buildCounterListUserPermissionsResponse++;
   if (buildCounterListUserPermissionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1401(o.userPermission);
+    checkUnnamed1417(o.userPermission);
   }
   buildCounterListUserPermissionsResponse--;
 }
 
-buildUnnamed1402() {
+buildUnnamed1418() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed1402(core.List<api.Variable> o) {
+checkUnnamed1418(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
@@ -1072,7 +1072,7 @@
   buildCounterListVariablesResponse++;
   if (buildCounterListVariablesResponse < 3) {
     o.nextPageToken = "foo";
-    o.variable = buildUnnamed1402();
+    o.variable = buildUnnamed1418();
   }
   buildCounterListVariablesResponse--;
   return o;
@@ -1082,19 +1082,19 @@
   buildCounterListVariablesResponse++;
   if (buildCounterListVariablesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1402(o.variable);
+    checkUnnamed1418(o.variable);
   }
   buildCounterListVariablesResponse--;
 }
 
-buildUnnamed1403() {
+buildUnnamed1419() {
   var o = new core.List<api.Workspace>();
   o.add(buildWorkspace());
   o.add(buildWorkspace());
   return o;
 }
 
-checkUnnamed1403(core.List<api.Workspace> o) {
+checkUnnamed1419(core.List<api.Workspace> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWorkspace(o[0]);
   checkWorkspace(o[1]);
@@ -1106,7 +1106,7 @@
   buildCounterListWorkspacesResponse++;
   if (buildCounterListWorkspacesResponse < 3) {
     o.nextPageToken = "foo";
-    o.workspace = buildUnnamed1403();
+    o.workspace = buildUnnamed1419();
   }
   buildCounterListWorkspacesResponse--;
   return o;
@@ -1116,7 +1116,7 @@
   buildCounterListWorkspacesResponse++;
   if (buildCounterListWorkspacesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1403(o.workspace);
+    checkUnnamed1419(o.workspace);
   }
   buildCounterListWorkspacesResponse--;
 }
@@ -1142,27 +1142,27 @@
   buildCounterMergeConflict--;
 }
 
-buildUnnamed1404() {
+buildUnnamed1420() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed1404(core.List<api.Parameter> o) {
+checkUnnamed1420(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
 }
 
-buildUnnamed1405() {
+buildUnnamed1421() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed1405(core.List<api.Parameter> o) {
+checkUnnamed1421(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -1174,8 +1174,8 @@
   buildCounterParameter++;
   if (buildCounterParameter < 3) {
     o.key = "foo";
-    o.list = buildUnnamed1404();
-    o.map = buildUnnamed1405();
+    o.list = buildUnnamed1420();
+    o.map = buildUnnamed1421();
     o.type = "foo";
     o.value = "foo";
   }
@@ -1187,8 +1187,8 @@
   buildCounterParameter++;
   if (buildCounterParameter < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkUnnamed1404(o.list);
-    checkUnnamed1405(o.map);
+    checkUnnamed1420(o.list);
+    checkUnnamed1421(o.map);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
@@ -1376,14 +1376,14 @@
   buildCounterSyncStatus--;
 }
 
-buildUnnamed1406() {
+buildUnnamed1422() {
   var o = new core.List<api.MergeConflict>();
   o.add(buildMergeConflict());
   o.add(buildMergeConflict());
   return o;
 }
 
-checkUnnamed1406(core.List<api.MergeConflict> o) {
+checkUnnamed1422(core.List<api.MergeConflict> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMergeConflict(o[0]);
   checkMergeConflict(o[1]);
@@ -1394,7 +1394,7 @@
   var o = new api.SyncWorkspaceResponse();
   buildCounterSyncWorkspaceResponse++;
   if (buildCounterSyncWorkspaceResponse < 3) {
-    o.mergeConflict = buildUnnamed1406();
+    o.mergeConflict = buildUnnamed1422();
     o.syncStatus = buildSyncStatus();
   }
   buildCounterSyncWorkspaceResponse--;
@@ -1404,98 +1404,98 @@
 checkSyncWorkspaceResponse(api.SyncWorkspaceResponse o) {
   buildCounterSyncWorkspaceResponse++;
   if (buildCounterSyncWorkspaceResponse < 3) {
-    checkUnnamed1406(o.mergeConflict);
+    checkUnnamed1422(o.mergeConflict);
     checkSyncStatus(o.syncStatus);
   }
   buildCounterSyncWorkspaceResponse--;
 }
 
-buildUnnamed1407() {
+buildUnnamed1423() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1407(core.List<core.String> o) {
+checkUnnamed1423(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1408() {
+buildUnnamed1424() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1408(core.List<core.String> o) {
+checkUnnamed1424(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1409() {
+buildUnnamed1425() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1409(core.List<core.String> o) {
+checkUnnamed1425(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1410() {
+buildUnnamed1426() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1410(core.List<core.String> o) {
+checkUnnamed1426(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1411() {
+buildUnnamed1427() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed1411(core.List<api.Parameter> o) {
+checkUnnamed1427(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
 }
 
-buildUnnamed1412() {
+buildUnnamed1428() {
   var o = new core.List<api.SetupTag>();
   o.add(buildSetupTag());
   o.add(buildSetupTag());
   return o;
 }
 
-checkUnnamed1412(core.List<api.SetupTag> o) {
+checkUnnamed1428(core.List<api.SetupTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSetupTag(o[0]);
   checkSetupTag(o[1]);
 }
 
-buildUnnamed1413() {
+buildUnnamed1429() {
   var o = new core.List<api.TeardownTag>();
   o.add(buildTeardownTag());
   o.add(buildTeardownTag());
   return o;
 }
 
-checkUnnamed1413(core.List<api.TeardownTag> o) {
+checkUnnamed1429(core.List<api.TeardownTag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTeardownTag(o[0]);
   checkTeardownTag(o[1]);
@@ -1507,27 +1507,27 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     o.accountId = "foo";
-    o.blockingRuleId = buildUnnamed1407();
-    o.blockingTriggerId = buildUnnamed1408();
+    o.blockingRuleId = buildUnnamed1423();
+    o.blockingTriggerId = buildUnnamed1424();
     o.containerId = "foo";
     o.fingerprint = "foo";
-    o.firingRuleId = buildUnnamed1409();
-    o.firingTriggerId = buildUnnamed1410();
+    o.firingRuleId = buildUnnamed1425();
+    o.firingTriggerId = buildUnnamed1426();
     o.liveOnly = true;
     o.name = "foo";
     o.notes = "foo";
-    o.parameter = buildUnnamed1411();
+    o.parameter = buildUnnamed1427();
     o.parentFolderId = "foo";
     o.path = "foo";
     o.paused = true;
     o.priority = buildParameter();
     o.scheduleEndMs = "foo";
     o.scheduleStartMs = "foo";
-    o.setupTag = buildUnnamed1412();
+    o.setupTag = buildUnnamed1428();
     o.tagFiringOption = "foo";
     o.tagId = "foo";
     o.tagManagerUrl = "foo";
-    o.teardownTag = buildUnnamed1413();
+    o.teardownTag = buildUnnamed1429();
     o.type = "foo";
     o.workspaceId = "foo";
   }
@@ -1539,27 +1539,27 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed1407(o.blockingRuleId);
-    checkUnnamed1408(o.blockingTriggerId);
+    checkUnnamed1423(o.blockingRuleId);
+    checkUnnamed1424(o.blockingTriggerId);
     unittest.expect(o.containerId, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed1409(o.firingRuleId);
-    checkUnnamed1410(o.firingTriggerId);
+    checkUnnamed1425(o.firingRuleId);
+    checkUnnamed1426(o.firingTriggerId);
     unittest.expect(o.liveOnly, unittest.isTrue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkUnnamed1411(o.parameter);
+    checkUnnamed1427(o.parameter);
     unittest.expect(o.parentFolderId, unittest.equals('foo'));
     unittest.expect(o.path, unittest.equals('foo'));
     unittest.expect(o.paused, unittest.isTrue);
     checkParameter(o.priority);
     unittest.expect(o.scheduleEndMs, unittest.equals('foo'));
     unittest.expect(o.scheduleStartMs, unittest.equals('foo'));
-    checkUnnamed1412(o.setupTag);
+    checkUnnamed1428(o.setupTag);
     unittest.expect(o.tagFiringOption, unittest.equals('foo'));
     unittest.expect(o.tagId, unittest.equals('foo'));
     unittest.expect(o.tagManagerUrl, unittest.equals('foo'));
-    checkUnnamed1413(o.teardownTag);
+    checkUnnamed1429(o.teardownTag);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.workspaceId, unittest.equals('foo'));
   }
@@ -1608,53 +1608,53 @@
   buildCounterTimestamp--;
 }
 
-buildUnnamed1414() {
+buildUnnamed1430() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed1414(core.List<api.Condition> o) {
+checkUnnamed1430(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
 }
 
-buildUnnamed1415() {
+buildUnnamed1431() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed1415(core.List<api.Condition> o) {
+checkUnnamed1431(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
 }
 
-buildUnnamed1416() {
+buildUnnamed1432() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed1416(core.List<api.Condition> o) {
+checkUnnamed1432(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
 }
 
-buildUnnamed1417() {
+buildUnnamed1433() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed1417(core.List<api.Parameter> o) {
+checkUnnamed1433(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -1666,13 +1666,13 @@
   buildCounterTrigger++;
   if (buildCounterTrigger < 3) {
     o.accountId = "foo";
-    o.autoEventFilter = buildUnnamed1414();
+    o.autoEventFilter = buildUnnamed1430();
     o.checkValidation = buildParameter();
     o.containerId = "foo";
     o.continuousTimeMinMilliseconds = buildParameter();
-    o.customEventFilter = buildUnnamed1415();
+    o.customEventFilter = buildUnnamed1431();
     o.eventName = buildParameter();
-    o.filter = buildUnnamed1416();
+    o.filter = buildUnnamed1432();
     o.fingerprint = "foo";
     o.horizontalScrollPercentageList = buildParameter();
     o.interval = buildParameter();
@@ -1681,7 +1681,7 @@
     o.maxTimerLengthSeconds = buildParameter();
     o.name = "foo";
     o.notes = "foo";
-    o.parameter = buildUnnamed1417();
+    o.parameter = buildUnnamed1433();
     o.parentFolderId = "foo";
     o.path = "foo";
     o.selector = buildParameter();
@@ -1706,13 +1706,13 @@
   buildCounterTrigger++;
   if (buildCounterTrigger < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed1414(o.autoEventFilter);
+    checkUnnamed1430(o.autoEventFilter);
     checkParameter(o.checkValidation);
     unittest.expect(o.containerId, unittest.equals('foo'));
     checkParameter(o.continuousTimeMinMilliseconds);
-    checkUnnamed1415(o.customEventFilter);
+    checkUnnamed1431(o.customEventFilter);
     checkParameter(o.eventName);
-    checkUnnamed1416(o.filter);
+    checkUnnamed1432(o.filter);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     checkParameter(o.horizontalScrollPercentageList);
     checkParameter(o.interval);
@@ -1721,7 +1721,7 @@
     checkParameter(o.maxTimerLengthSeconds);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkUnnamed1417(o.parameter);
+    checkUnnamed1433(o.parameter);
     unittest.expect(o.parentFolderId, unittest.equals('foo'));
     unittest.expect(o.path, unittest.equals('foo'));
     checkParameter(o.selector);
@@ -1741,14 +1741,14 @@
   buildCounterTrigger--;
 }
 
-buildUnnamed1418() {
+buildUnnamed1434() {
   var o = new core.List<api.WorkspaceProposalUser>();
   o.add(buildWorkspaceProposalUser());
   o.add(buildWorkspaceProposalUser());
   return o;
 }
 
-checkUnnamed1418(core.List<api.WorkspaceProposalUser> o) {
+checkUnnamed1434(core.List<api.WorkspaceProposalUser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWorkspaceProposalUser(o[0]);
   checkWorkspaceProposalUser(o[1]);
@@ -1761,7 +1761,7 @@
   if (buildCounterUpdateWorkspaceProposalRequest < 3) {
     o.fingerprint = "foo";
     o.newComment = buildWorkspaceProposalHistoryComment();
-    o.reviewers = buildUnnamed1418();
+    o.reviewers = buildUnnamed1434();
     o.status = "foo";
   }
   buildCounterUpdateWorkspaceProposalRequest--;
@@ -1773,20 +1773,20 @@
   if (buildCounterUpdateWorkspaceProposalRequest < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     checkWorkspaceProposalHistoryComment(o.newComment);
-    checkUnnamed1418(o.reviewers);
+    checkUnnamed1434(o.reviewers);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterUpdateWorkspaceProposalRequest--;
 }
 
-buildUnnamed1419() {
+buildUnnamed1435() {
   var o = new core.List<api.ContainerAccess>();
   o.add(buildContainerAccess());
   o.add(buildContainerAccess());
   return o;
 }
 
-checkUnnamed1419(core.List<api.ContainerAccess> o) {
+checkUnnamed1435(core.List<api.ContainerAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContainerAccess(o[0]);
   checkContainerAccess(o[1]);
@@ -1799,7 +1799,7 @@
   if (buildCounterUserPermission < 3) {
     o.accountAccess = buildAccountAccess();
     o.accountId = "foo";
-    o.containerAccess = buildUnnamed1419();
+    o.containerAccess = buildUnnamed1435();
     o.emailAddress = "foo";
     o.path = "foo";
   }
@@ -1812,47 +1812,47 @@
   if (buildCounterUserPermission < 3) {
     checkAccountAccess(o.accountAccess);
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed1419(o.containerAccess);
+    checkUnnamed1435(o.containerAccess);
     unittest.expect(o.emailAddress, unittest.equals('foo'));
     unittest.expect(o.path, unittest.equals('foo'));
   }
   buildCounterUserPermission--;
 }
 
-buildUnnamed1420() {
+buildUnnamed1436() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1420(core.List<core.String> o) {
+checkUnnamed1436(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1421() {
+buildUnnamed1437() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1421(core.List<core.String> o) {
+checkUnnamed1437(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1422() {
+buildUnnamed1438() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed1422(core.List<api.Parameter> o) {
+checkUnnamed1438(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -1865,12 +1865,12 @@
   if (buildCounterVariable < 3) {
     o.accountId = "foo";
     o.containerId = "foo";
-    o.disablingTriggerId = buildUnnamed1420();
-    o.enablingTriggerId = buildUnnamed1421();
+    o.disablingTriggerId = buildUnnamed1436();
+    o.enablingTriggerId = buildUnnamed1437();
     o.fingerprint = "foo";
     o.name = "foo";
     o.notes = "foo";
-    o.parameter = buildUnnamed1422();
+    o.parameter = buildUnnamed1438();
     o.parentFolderId = "foo";
     o.path = "foo";
     o.scheduleEndMs = "foo";
@@ -1889,12 +1889,12 @@
   if (buildCounterVariable < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkUnnamed1420(o.disablingTriggerId);
-    checkUnnamed1421(o.enablingTriggerId);
+    checkUnnamed1436(o.disablingTriggerId);
+    checkUnnamed1437(o.enablingTriggerId);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkUnnamed1422(o.parameter);
+    checkUnnamed1438(o.parameter);
     unittest.expect(o.parentFolderId, unittest.equals('foo'));
     unittest.expect(o.path, unittest.equals('foo'));
     unittest.expect(o.scheduleEndMs, unittest.equals('foo'));
@@ -1940,40 +1940,40 @@
   buildCounterWorkspace--;
 }
 
-buildUnnamed1423() {
+buildUnnamed1439() {
   var o = new core.List<api.WorkspaceProposalUser>();
   o.add(buildWorkspaceProposalUser());
   o.add(buildWorkspaceProposalUser());
   return o;
 }
 
-checkUnnamed1423(core.List<api.WorkspaceProposalUser> o) {
+checkUnnamed1439(core.List<api.WorkspaceProposalUser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWorkspaceProposalUser(o[0]);
   checkWorkspaceProposalUser(o[1]);
 }
 
-buildUnnamed1424() {
+buildUnnamed1440() {
   var o = new core.List<api.WorkspaceProposalHistory>();
   o.add(buildWorkspaceProposalHistory());
   o.add(buildWorkspaceProposalHistory());
   return o;
 }
 
-checkUnnamed1424(core.List<api.WorkspaceProposalHistory> o) {
+checkUnnamed1440(core.List<api.WorkspaceProposalHistory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWorkspaceProposalHistory(o[0]);
   checkWorkspaceProposalHistory(o[1]);
 }
 
-buildUnnamed1425() {
+buildUnnamed1441() {
   var o = new core.List<api.WorkspaceProposalUser>();
   o.add(buildWorkspaceProposalUser());
   o.add(buildWorkspaceProposalUser());
   return o;
 }
 
-checkUnnamed1425(core.List<api.WorkspaceProposalUser> o) {
+checkUnnamed1441(core.List<api.WorkspaceProposalUser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWorkspaceProposalUser(o[0]);
   checkWorkspaceProposalUser(o[1]);
@@ -1984,11 +1984,11 @@
   var o = new api.WorkspaceProposal();
   buildCounterWorkspaceProposal++;
   if (buildCounterWorkspaceProposal < 3) {
-    o.authors = buildUnnamed1423();
+    o.authors = buildUnnamed1439();
     o.fingerprint = "foo";
-    o.history = buildUnnamed1424();
+    o.history = buildUnnamed1440();
     o.path = "foo";
-    o.reviewers = buildUnnamed1425();
+    o.reviewers = buildUnnamed1441();
     o.status = "foo";
   }
   buildCounterWorkspaceProposal--;
@@ -1998,11 +1998,11 @@
 checkWorkspaceProposal(api.WorkspaceProposal o) {
   buildCounterWorkspaceProposal++;
   if (buildCounterWorkspaceProposal < 3) {
-    checkUnnamed1423(o.authors);
+    checkUnnamed1439(o.authors);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed1424(o.history);
+    checkUnnamed1440(o.history);
     unittest.expect(o.path, unittest.equals('foo'));
-    checkUnnamed1425(o.reviewers);
+    checkUnnamed1441(o.reviewers);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterWorkspaceProposal--;
@@ -2097,14 +2097,14 @@
   buildCounterWorkspaceProposalUser--;
 }
 
-buildUnnamed1426() {
+buildUnnamed1442() {
   var o = new core.List<api.ZoneChildContainer>();
   o.add(buildZoneChildContainer());
   o.add(buildZoneChildContainer());
   return o;
 }
 
-checkUnnamed1426(core.List<api.ZoneChildContainer> o) {
+checkUnnamed1442(core.List<api.ZoneChildContainer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZoneChildContainer(o[0]);
   checkZoneChildContainer(o[1]);
@@ -2117,7 +2117,7 @@
   if (buildCounterZone < 3) {
     o.accountId = "foo";
     o.boundary = buildZoneBoundary();
-    o.childContainer = buildUnnamed1426();
+    o.childContainer = buildUnnamed1442();
     o.containerId = "foo";
     o.fingerprint = "foo";
     o.name = "foo";
@@ -2137,7 +2137,7 @@
   if (buildCounterZone < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     checkZoneBoundary(o.boundary);
-    checkUnnamed1426(o.childContainer);
+    checkUnnamed1442(o.childContainer);
     unittest.expect(o.containerId, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -2151,27 +2151,27 @@
   buildCounterZone--;
 }
 
-buildUnnamed1427() {
+buildUnnamed1443() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed1427(core.List<api.Condition> o) {
+checkUnnamed1443(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
 }
 
-buildUnnamed1428() {
+buildUnnamed1444() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1428(core.List<core.String> o) {
+checkUnnamed1444(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2182,8 +2182,8 @@
   var o = new api.ZoneBoundary();
   buildCounterZoneBoundary++;
   if (buildCounterZoneBoundary < 3) {
-    o.condition = buildUnnamed1427();
-    o.customEvaluationTriggerId = buildUnnamed1428();
+    o.condition = buildUnnamed1443();
+    o.customEvaluationTriggerId = buildUnnamed1444();
   }
   buildCounterZoneBoundary--;
   return o;
@@ -2192,8 +2192,8 @@
 checkZoneBoundary(api.ZoneBoundary o) {
   buildCounterZoneBoundary++;
   if (buildCounterZoneBoundary < 3) {
-    checkUnnamed1427(o.condition);
-    checkUnnamed1428(o.customEvaluationTriggerId);
+    checkUnnamed1443(o.condition);
+    checkUnnamed1444(o.customEvaluationTriggerId);
   }
   buildCounterZoneBoundary--;
 }
@@ -2219,14 +2219,14 @@
   buildCounterZoneChildContainer--;
 }
 
-buildUnnamed1429() {
+buildUnnamed1445() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1429(core.List<core.String> o) {
+checkUnnamed1445(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2238,7 +2238,7 @@
   buildCounterZoneTypeRestriction++;
   if (buildCounterZoneTypeRestriction < 3) {
     o.enable = true;
-    o.whitelistedTypeId = buildUnnamed1429();
+    o.whitelistedTypeId = buildUnnamed1445();
   }
   buildCounterZoneTypeRestriction--;
   return o;
@@ -2248,71 +2248,71 @@
   buildCounterZoneTypeRestriction++;
   if (buildCounterZoneTypeRestriction < 3) {
     unittest.expect(o.enable, unittest.isTrue);
-    checkUnnamed1429(o.whitelistedTypeId);
+    checkUnnamed1445(o.whitelistedTypeId);
   }
   buildCounterZoneTypeRestriction--;
 }
 
-buildUnnamed1430() {
+buildUnnamed1446() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1430(core.List<core.String> o) {
+checkUnnamed1446(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1431() {
+buildUnnamed1447() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1431(core.List<core.String> o) {
+checkUnnamed1447(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1432() {
+buildUnnamed1448() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1432(core.List<core.String> o) {
+checkUnnamed1448(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1433() {
+buildUnnamed1449() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1433(core.List<core.String> o) {
+checkUnnamed1449(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1434() {
+buildUnnamed1450() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1434(core.List<core.String> o) {
+checkUnnamed1450(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -4629,7 +4629,7 @@
               .workspaces
               .builtInVariables;
       var arg_parent = "foo";
-      var arg_type = buildUnnamed1430();
+      var arg_type = buildUnnamed1446();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -4682,7 +4682,7 @@
               .workspaces
               .builtInVariables;
       var arg_path = "foo";
-      var arg_type = buildUnnamed1431();
+      var arg_type = buildUnnamed1447();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -5090,9 +5090,9 @@
           new api.TagmanagerApi(mock).accounts.containers.workspaces.folders;
       var arg_request = buildFolder();
       var arg_path = "foo";
-      var arg_tagId = buildUnnamed1432();
-      var arg_triggerId = buildUnnamed1433();
-      var arg_variableId = buildUnnamed1434();
+      var arg_tagId = buildUnnamed1448();
+      var arg_triggerId = buildUnnamed1449();
+      var arg_variableId = buildUnnamed1450();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.Folder.fromJson(json);
diff --git a/generated/googleapis/test/tasks/v1_test.dart b/generated/googleapis/test/tasks/v1_test.dart
index d577149..11b3610 100644
--- a/generated/googleapis/test/tasks/v1_test.dart
+++ b/generated/googleapis/test/tasks/v1_test.dart
@@ -73,14 +73,14 @@
   buildCounterTaskLinks--;
 }
 
-buildUnnamed3184() {
+buildUnnamed3212() {
   var o = new core.List<api.TaskLinks>();
   o.add(buildTaskLinks());
   o.add(buildTaskLinks());
   return o;
 }
 
-checkUnnamed3184(core.List<api.TaskLinks> o) {
+checkUnnamed3212(core.List<api.TaskLinks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaskLinks(o[0]);
   checkTaskLinks(o[1]);
@@ -98,7 +98,7 @@
     o.hidden = true;
     o.id = "foo";
     o.kind = "foo";
-    o.links = buildUnnamed3184();
+    o.links = buildUnnamed3212();
     o.notes = "foo";
     o.parent = "foo";
     o.position = "foo";
@@ -123,7 +123,7 @@
     unittest.expect(o.hidden, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed3184(o.links);
+    checkUnnamed3212(o.links);
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
     unittest.expect(o.position, unittest.equals('foo'));
@@ -166,14 +166,14 @@
   buildCounterTaskList--;
 }
 
-buildUnnamed3185() {
+buildUnnamed3213() {
   var o = new core.List<api.TaskList>();
   o.add(buildTaskList());
   o.add(buildTaskList());
   return o;
 }
 
-checkUnnamed3185(core.List<api.TaskList> o) {
+checkUnnamed3213(core.List<api.TaskList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaskList(o[0]);
   checkTaskList(o[1]);
@@ -185,7 +185,7 @@
   buildCounterTaskLists++;
   if (buildCounterTaskLists < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed3185();
+    o.items = buildUnnamed3213();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -197,21 +197,21 @@
   buildCounterTaskLists++;
   if (buildCounterTaskLists < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed3185(o.items);
+    checkUnnamed3213(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterTaskLists--;
 }
 
-buildUnnamed3186() {
+buildUnnamed3214() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed3186(core.List<api.Task> o) {
+checkUnnamed3214(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -223,7 +223,7 @@
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed3186();
+    o.items = buildUnnamed3214();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -235,7 +235,7 @@
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed3186(o.items);
+    checkUnnamed3214(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/testing/v1_test.dart b/generated/googleapis/test/testing/v1_test.dart
index 9b0588a..8de3664 100644
--- a/generated/googleapis/test/testing/v1_test.dart
+++ b/generated/googleapis/test/testing/v1_test.dart
@@ -94,27 +94,27 @@
   buildCounterAndroidDevice--;
 }
 
-buildUnnamed3148() {
+buildUnnamed3174() {
   var o = new core.List<api.AndroidModel>();
   o.add(buildAndroidModel());
   o.add(buildAndroidModel());
   return o;
 }
 
-checkUnnamed3148(core.List<api.AndroidModel> o) {
+checkUnnamed3174(core.List<api.AndroidModel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAndroidModel(o[0]);
   checkAndroidModel(o[1]);
 }
 
-buildUnnamed3149() {
+buildUnnamed3175() {
   var o = new core.List<api.AndroidVersion>();
   o.add(buildAndroidVersion());
   o.add(buildAndroidVersion());
   return o;
 }
 
-checkUnnamed3149(core.List<api.AndroidVersion> o) {
+checkUnnamed3175(core.List<api.AndroidVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAndroidVersion(o[0]);
   checkAndroidVersion(o[1]);
@@ -125,9 +125,9 @@
   var o = new api.AndroidDeviceCatalog();
   buildCounterAndroidDeviceCatalog++;
   if (buildCounterAndroidDeviceCatalog < 3) {
-    o.models = buildUnnamed3148();
+    o.models = buildUnnamed3174();
     o.runtimeConfiguration = buildAndroidRuntimeConfiguration();
-    o.versions = buildUnnamed3149();
+    o.versions = buildUnnamed3175();
   }
   buildCounterAndroidDeviceCatalog--;
   return o;
@@ -136,21 +136,21 @@
 checkAndroidDeviceCatalog(api.AndroidDeviceCatalog o) {
   buildCounterAndroidDeviceCatalog++;
   if (buildCounterAndroidDeviceCatalog < 3) {
-    checkUnnamed3148(o.models);
+    checkUnnamed3174(o.models);
     checkAndroidRuntimeConfiguration(o.runtimeConfiguration);
-    checkUnnamed3149(o.versions);
+    checkUnnamed3175(o.versions);
   }
   buildCounterAndroidDeviceCatalog--;
 }
 
-buildUnnamed3150() {
+buildUnnamed3176() {
   var o = new core.List<api.AndroidDevice>();
   o.add(buildAndroidDevice());
   o.add(buildAndroidDevice());
   return o;
 }
 
-checkUnnamed3150(core.List<api.AndroidDevice> o) {
+checkUnnamed3176(core.List<api.AndroidDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAndroidDevice(o[0]);
   checkAndroidDevice(o[1]);
@@ -161,7 +161,7 @@
   var o = new api.AndroidDeviceList();
   buildCounterAndroidDeviceList++;
   if (buildCounterAndroidDeviceList < 3) {
-    o.androidDevices = buildUnnamed3150();
+    o.androidDevices = buildUnnamed3176();
   }
   buildCounterAndroidDeviceList--;
   return o;
@@ -170,19 +170,19 @@
 checkAndroidDeviceList(api.AndroidDeviceList o) {
   buildCounterAndroidDeviceList++;
   if (buildCounterAndroidDeviceList < 3) {
-    checkUnnamed3150(o.androidDevices);
+    checkUnnamed3176(o.androidDevices);
   }
   buildCounterAndroidDeviceList--;
 }
 
-buildUnnamed3151() {
+buildUnnamed3177() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3151(core.List<core.String> o) {
+checkUnnamed3177(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -199,7 +199,7 @@
     o.testApk = buildFileReference();
     o.testPackageId = "foo";
     o.testRunnerClass = "foo";
-    o.testTargets = buildUnnamed3151();
+    o.testTargets = buildUnnamed3177();
   }
   buildCounterAndroidInstrumentationTest--;
   return o;
@@ -214,58 +214,58 @@
     checkFileReference(o.testApk);
     unittest.expect(o.testPackageId, unittest.equals('foo'));
     unittest.expect(o.testRunnerClass, unittest.equals('foo'));
-    checkUnnamed3151(o.testTargets);
+    checkUnnamed3177(o.testTargets);
   }
   buildCounterAndroidInstrumentationTest--;
 }
 
-buildUnnamed3152() {
+buildUnnamed3178() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3152(core.List<core.String> o) {
+checkUnnamed3178(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3153() {
+buildUnnamed3179() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3153(core.List<core.String> o) {
+checkUnnamed3179(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3154() {
+buildUnnamed3180() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3154(core.List<core.String> o) {
+checkUnnamed3180(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3155() {
+buildUnnamed3181() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3155(core.List<core.String> o) {
+checkUnnamed3181(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -276,10 +276,10 @@
   var o = new api.AndroidMatrix();
   buildCounterAndroidMatrix++;
   if (buildCounterAndroidMatrix < 3) {
-    o.androidModelIds = buildUnnamed3152();
-    o.androidVersionIds = buildUnnamed3153();
-    o.locales = buildUnnamed3154();
-    o.orientations = buildUnnamed3155();
+    o.androidModelIds = buildUnnamed3178();
+    o.androidVersionIds = buildUnnamed3179();
+    o.locales = buildUnnamed3180();
+    o.orientations = buildUnnamed3181();
   }
   buildCounterAndroidMatrix--;
   return o;
@@ -288,48 +288,48 @@
 checkAndroidMatrix(api.AndroidMatrix o) {
   buildCounterAndroidMatrix++;
   if (buildCounterAndroidMatrix < 3) {
-    checkUnnamed3152(o.androidModelIds);
-    checkUnnamed3153(o.androidVersionIds);
-    checkUnnamed3154(o.locales);
-    checkUnnamed3155(o.orientations);
+    checkUnnamed3178(o.androidModelIds);
+    checkUnnamed3179(o.androidVersionIds);
+    checkUnnamed3180(o.locales);
+    checkUnnamed3181(o.orientations);
   }
   buildCounterAndroidMatrix--;
 }
 
-buildUnnamed3156() {
+buildUnnamed3182() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3156(core.List<core.String> o) {
+checkUnnamed3182(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3157() {
+buildUnnamed3183() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3157(core.List<core.String> o) {
+checkUnnamed3183(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3158() {
+buildUnnamed3184() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3158(core.List<core.String> o) {
+checkUnnamed3184(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -349,9 +349,9 @@
     o.screenDensity = 42;
     o.screenX = 42;
     o.screenY = 42;
-    o.supportedAbis = buildUnnamed3156();
-    o.supportedVersionIds = buildUnnamed3157();
-    o.tags = buildUnnamed3158();
+    o.supportedAbis = buildUnnamed3182();
+    o.supportedVersionIds = buildUnnamed3183();
+    o.tags = buildUnnamed3184();
   }
   buildCounterAndroidModel--;
   return o;
@@ -369,26 +369,39 @@
     unittest.expect(o.screenDensity, unittest.equals(42));
     unittest.expect(o.screenX, unittest.equals(42));
     unittest.expect(o.screenY, unittest.equals(42));
-    checkUnnamed3156(o.supportedAbis);
-    checkUnnamed3157(o.supportedVersionIds);
-    checkUnnamed3158(o.tags);
+    checkUnnamed3182(o.supportedAbis);
+    checkUnnamed3183(o.supportedVersionIds);
+    checkUnnamed3184(o.tags);
   }
   buildCounterAndroidModel--;
 }
 
-buildUnnamed3159() {
+buildUnnamed3185() {
   var o = new core.List<api.RoboDirective>();
   o.add(buildRoboDirective());
   o.add(buildRoboDirective());
   return o;
 }
 
-checkUnnamed3159(core.List<api.RoboDirective> o) {
+checkUnnamed3185(core.List<api.RoboDirective> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoboDirective(o[0]);
   checkRoboDirective(o[1]);
 }
 
+buildUnnamed3186() {
+  var o = new core.List<api.RoboStartingIntent>();
+  o.add(buildRoboStartingIntent());
+  o.add(buildRoboStartingIntent());
+  return o;
+}
+
+checkUnnamed3186(core.List<api.RoboStartingIntent> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkRoboStartingIntent(o[0]);
+  checkRoboStartingIntent(o[1]);
+}
+
 core.int buildCounterAndroidRoboTest = 0;
 buildAndroidRoboTest() {
   var o = new api.AndroidRoboTest();
@@ -399,7 +412,8 @@
     o.appPackageId = "foo";
     o.maxDepth = 42;
     o.maxSteps = 42;
-    o.roboDirectives = buildUnnamed3159();
+    o.roboDirectives = buildUnnamed3185();
+    o.startingIntents = buildUnnamed3186();
   }
   buildCounterAndroidRoboTest--;
   return o;
@@ -413,32 +427,33 @@
     unittest.expect(o.appPackageId, unittest.equals('foo'));
     unittest.expect(o.maxDepth, unittest.equals(42));
     unittest.expect(o.maxSteps, unittest.equals(42));
-    checkUnnamed3159(o.roboDirectives);
+    checkUnnamed3185(o.roboDirectives);
+    checkUnnamed3186(o.startingIntents);
   }
   buildCounterAndroidRoboTest--;
 }
 
-buildUnnamed3160() {
+buildUnnamed3187() {
   var o = new core.List<api.Locale>();
   o.add(buildLocale());
   o.add(buildLocale());
   return o;
 }
 
-checkUnnamed3160(core.List<api.Locale> o) {
+checkUnnamed3187(core.List<api.Locale> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocale(o[0]);
   checkLocale(o[1]);
 }
 
-buildUnnamed3161() {
+buildUnnamed3188() {
   var o = new core.List<api.Orientation>();
   o.add(buildOrientation());
   o.add(buildOrientation());
   return o;
 }
 
-checkUnnamed3161(core.List<api.Orientation> o) {
+checkUnnamed3188(core.List<api.Orientation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrientation(o[0]);
   checkOrientation(o[1]);
@@ -449,8 +464,8 @@
   var o = new api.AndroidRuntimeConfiguration();
   buildCounterAndroidRuntimeConfiguration++;
   if (buildCounterAndroidRuntimeConfiguration < 3) {
-    o.locales = buildUnnamed3160();
-    o.orientations = buildUnnamed3161();
+    o.locales = buildUnnamed3187();
+    o.orientations = buildUnnamed3188();
   }
   buildCounterAndroidRuntimeConfiguration--;
   return o;
@@ -459,33 +474,33 @@
 checkAndroidRuntimeConfiguration(api.AndroidRuntimeConfiguration o) {
   buildCounterAndroidRuntimeConfiguration++;
   if (buildCounterAndroidRuntimeConfiguration < 3) {
-    checkUnnamed3160(o.locales);
-    checkUnnamed3161(o.orientations);
+    checkUnnamed3187(o.locales);
+    checkUnnamed3188(o.orientations);
   }
   buildCounterAndroidRuntimeConfiguration--;
 }
 
-buildUnnamed3162() {
+buildUnnamed3189() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3162(core.List<core.String> o) {
+checkUnnamed3189(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3163() {
+buildUnnamed3190() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed3163(core.List<core.int> o) {
+checkUnnamed3190(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));
@@ -498,8 +513,8 @@
   if (buildCounterAndroidTestLoop < 3) {
     o.appApk = buildFileReference();
     o.appPackageId = "foo";
-    o.scenarioLabels = buildUnnamed3162();
-    o.scenarios = buildUnnamed3163();
+    o.scenarioLabels = buildUnnamed3189();
+    o.scenarios = buildUnnamed3190();
   }
   buildCounterAndroidTestLoop--;
   return o;
@@ -510,20 +525,20 @@
   if (buildCounterAndroidTestLoop < 3) {
     checkFileReference(o.appApk);
     unittest.expect(o.appPackageId, unittest.equals('foo'));
-    checkUnnamed3162(o.scenarioLabels);
-    checkUnnamed3163(o.scenarios);
+    checkUnnamed3189(o.scenarioLabels);
+    checkUnnamed3190(o.scenarios);
   }
   buildCounterAndroidTestLoop--;
 }
 
-buildUnnamed3164() {
+buildUnnamed3191() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3164(core.List<core.String> o) {
+checkUnnamed3191(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -539,7 +554,7 @@
     o.distribution = buildDistribution();
     o.id = "foo";
     o.releaseDate = buildDate();
-    o.tags = buildUnnamed3164();
+    o.tags = buildUnnamed3191();
     o.versionString = "foo";
   }
   buildCounterAndroidVersion--;
@@ -554,7 +569,7 @@
     checkDistribution(o.distribution);
     unittest.expect(o.id, unittest.equals('foo'));
     checkDate(o.releaseDate);
-    checkUnnamed3164(o.tags);
+    checkUnnamed3191(o.tags);
     unittest.expect(o.versionString, unittest.equals('foo'));
   }
   buildCounterAndroidVersion--;
@@ -579,14 +594,14 @@
   buildCounterCancelTestMatrixResponse--;
 }
 
-buildUnnamed3165() {
+buildUnnamed3192() {
   var o = new core.List<api.ClientInfoDetail>();
   o.add(buildClientInfoDetail());
   o.add(buildClientInfoDetail());
   return o;
 }
 
-checkUnnamed3165(core.List<api.ClientInfoDetail> o) {
+checkUnnamed3192(core.List<api.ClientInfoDetail> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkClientInfoDetail(o[0]);
   checkClientInfoDetail(o[1]);
@@ -597,7 +612,7 @@
   var o = new api.ClientInfo();
   buildCounterClientInfo++;
   if (buildCounterClientInfo < 3) {
-    o.clientInfoDetails = buildUnnamed3165();
+    o.clientInfoDetails = buildUnnamed3192();
     o.name = "foo";
   }
   buildCounterClientInfo--;
@@ -607,7 +622,7 @@
 checkClientInfo(api.ClientInfo o) {
   buildCounterClientInfo++;
   if (buildCounterClientInfo < 3) {
-    checkUnnamed3165(o.clientInfoDetails);
+    checkUnnamed3192(o.clientInfoDetails);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterClientInfo--;
@@ -811,14 +826,29 @@
   buildCounterGoogleCloudStorage--;
 }
 
-buildUnnamed3166() {
+core.int buildCounterLauncherActivityIntent = 0;
+buildLauncherActivityIntent() {
+  var o = new api.LauncherActivityIntent();
+  buildCounterLauncherActivityIntent++;
+  if (buildCounterLauncherActivityIntent < 3) {}
+  buildCounterLauncherActivityIntent--;
+  return o;
+}
+
+checkLauncherActivityIntent(api.LauncherActivityIntent o) {
+  buildCounterLauncherActivityIntent++;
+  if (buildCounterLauncherActivityIntent < 3) {}
+  buildCounterLauncherActivityIntent--;
+}
+
+buildUnnamed3193() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3166(core.List<core.String> o) {
+checkUnnamed3193(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -832,7 +862,7 @@
     o.id = "foo";
     o.name = "foo";
     o.region = "foo";
-    o.tags = buildUnnamed3166();
+    o.tags = buildUnnamed3193();
   }
   buildCounterLocale--;
   return o;
@@ -844,7 +874,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed3166(o.tags);
+    checkUnnamed3193(o.tags);
   }
   buildCounterLocale--;
 }
@@ -872,14 +902,14 @@
   buildCounterNetworkConfiguration--;
 }
 
-buildUnnamed3167() {
+buildUnnamed3194() {
   var o = new core.List<api.NetworkConfiguration>();
   o.add(buildNetworkConfiguration());
   o.add(buildNetworkConfiguration());
   return o;
 }
 
-checkUnnamed3167(core.List<api.NetworkConfiguration> o) {
+checkUnnamed3194(core.List<api.NetworkConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkConfiguration(o[0]);
   checkNetworkConfiguration(o[1]);
@@ -890,7 +920,7 @@
   var o = new api.NetworkConfigurationCatalog();
   buildCounterNetworkConfigurationCatalog++;
   if (buildCounterNetworkConfigurationCatalog < 3) {
-    o.configurations = buildUnnamed3167();
+    o.configurations = buildUnnamed3194();
   }
   buildCounterNetworkConfigurationCatalog--;
   return o;
@@ -899,7 +929,7 @@
 checkNetworkConfigurationCatalog(api.NetworkConfigurationCatalog o) {
   buildCounterNetworkConfigurationCatalog++;
   if (buildCounterNetworkConfigurationCatalog < 3) {
-    checkUnnamed3167(o.configurations);
+    checkUnnamed3194(o.configurations);
   }
   buildCounterNetworkConfigurationCatalog--;
 }
@@ -925,14 +955,14 @@
   buildCounterObbFile--;
 }
 
-buildUnnamed3168() {
+buildUnnamed3195() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3168(core.List<core.String> o) {
+checkUnnamed3195(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -945,7 +975,7 @@
   if (buildCounterOrientation < 3) {
     o.id = "foo";
     o.name = "foo";
-    o.tags = buildUnnamed3168();
+    o.tags = buildUnnamed3195();
   }
   buildCounterOrientation--;
   return o;
@@ -956,7 +986,7 @@
   if (buildCounterOrientation < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed3168(o.tags);
+    checkUnnamed3195(o.tags);
   }
   buildCounterOrientation--;
 }
@@ -1007,14 +1037,71 @@
   buildCounterRoboDirective--;
 }
 
-buildUnnamed3169() {
+core.int buildCounterRoboStartingIntent = 0;
+buildRoboStartingIntent() {
+  var o = new api.RoboStartingIntent();
+  buildCounterRoboStartingIntent++;
+  if (buildCounterRoboStartingIntent < 3) {
+    o.launcherActivity = buildLauncherActivityIntent();
+    o.startActivity = buildStartActivityIntent();
+  }
+  buildCounterRoboStartingIntent--;
+  return o;
+}
+
+checkRoboStartingIntent(api.RoboStartingIntent o) {
+  buildCounterRoboStartingIntent++;
+  if (buildCounterRoboStartingIntent < 3) {
+    checkLauncherActivityIntent(o.launcherActivity);
+    checkStartActivityIntent(o.startActivity);
+  }
+  buildCounterRoboStartingIntent--;
+}
+
+buildUnnamed3196() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3169(core.List<core.String> o) {
+checkUnnamed3196(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterStartActivityIntent = 0;
+buildStartActivityIntent() {
+  var o = new api.StartActivityIntent();
+  buildCounterStartActivityIntent++;
+  if (buildCounterStartActivityIntent < 3) {
+    o.action = "foo";
+    o.categories = buildUnnamed3196();
+    o.uri = "foo";
+  }
+  buildCounterStartActivityIntent--;
+  return o;
+}
+
+checkStartActivityIntent(api.StartActivityIntent o) {
+  buildCounterStartActivityIntent++;
+  if (buildCounterStartActivityIntent < 3) {
+    unittest.expect(o.action, unittest.equals('foo'));
+    checkUnnamed3196(o.categories);
+    unittest.expect(o.uri, unittest.equals('foo'));
+  }
+  buildCounterStartActivityIntent--;
+}
+
+buildUnnamed3197() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed3197(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1026,7 +1113,7 @@
   buildCounterTestDetails++;
   if (buildCounterTestDetails < 3) {
     o.errorMessage = "foo";
-    o.progressMessages = buildUnnamed3169();
+    o.progressMessages = buildUnnamed3197();
   }
   buildCounterTestDetails--;
   return o;
@@ -1036,7 +1123,7 @@
   buildCounterTestDetails++;
   if (buildCounterTestDetails < 3) {
     unittest.expect(o.errorMessage, unittest.equals('foo'));
-    checkUnnamed3169(o.progressMessages);
+    checkUnnamed3197(o.progressMessages);
   }
   buildCounterTestDetails--;
 }
@@ -1097,14 +1184,14 @@
   buildCounterTestExecution--;
 }
 
-buildUnnamed3170() {
+buildUnnamed3198() {
   var o = new core.List<api.TestExecution>();
   o.add(buildTestExecution());
   o.add(buildTestExecution());
   return o;
 }
 
-checkUnnamed3170(core.List<api.TestExecution> o) {
+checkUnnamed3198(core.List<api.TestExecution> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTestExecution(o[0]);
   checkTestExecution(o[1]);
@@ -1121,7 +1208,7 @@
     o.projectId = "foo";
     o.resultStorage = buildResultStorage();
     o.state = "foo";
-    o.testExecutions = buildUnnamed3170();
+    o.testExecutions = buildUnnamed3198();
     o.testMatrixId = "foo";
     o.testSpecification = buildTestSpecification();
     o.timestamp = "foo";
@@ -1139,7 +1226,7 @@
     unittest.expect(o.projectId, unittest.equals('foo'));
     checkResultStorage(o.resultStorage);
     unittest.expect(o.state, unittest.equals('foo'));
-    checkUnnamed3170(o.testExecutions);
+    checkUnnamed3198(o.testExecutions);
     unittest.expect(o.testMatrixId, unittest.equals('foo'));
     checkTestSpecification(o.testSpecification);
     unittest.expect(o.timestamp, unittest.equals('foo'));
@@ -1147,40 +1234,40 @@
   buildCounterTestMatrix--;
 }
 
-buildUnnamed3171() {
+buildUnnamed3199() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3171(core.List<core.String> o) {
+checkUnnamed3199(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3172() {
+buildUnnamed3200() {
   var o = new core.List<api.EnvironmentVariable>();
   o.add(buildEnvironmentVariable());
   o.add(buildEnvironmentVariable());
   return o;
 }
 
-checkUnnamed3172(core.List<api.EnvironmentVariable> o) {
+checkUnnamed3200(core.List<api.EnvironmentVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnvironmentVariable(o[0]);
   checkEnvironmentVariable(o[1]);
 }
 
-buildUnnamed3173() {
+buildUnnamed3201() {
   var o = new core.List<api.DeviceFile>();
   o.add(buildDeviceFile());
   o.add(buildDeviceFile());
   return o;
 }
 
-checkUnnamed3173(core.List<api.DeviceFile> o) {
+checkUnnamed3201(core.List<api.DeviceFile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeviceFile(o[0]);
   checkDeviceFile(o[1]);
@@ -1192,9 +1279,9 @@
   buildCounterTestSetup++;
   if (buildCounterTestSetup < 3) {
     o.account = buildAccount();
-    o.directoriesToPull = buildUnnamed3171();
-    o.environmentVariables = buildUnnamed3172();
-    o.filesToPush = buildUnnamed3173();
+    o.directoriesToPull = buildUnnamed3199();
+    o.environmentVariables = buildUnnamed3200();
+    o.filesToPush = buildUnnamed3201();
     o.networkProfile = "foo";
   }
   buildCounterTestSetup--;
@@ -1205,9 +1292,9 @@
   buildCounterTestSetup++;
   if (buildCounterTestSetup < 3) {
     checkAccount(o.account);
-    checkUnnamed3171(o.directoriesToPull);
-    checkUnnamed3172(o.environmentVariables);
-    checkUnnamed3173(o.filesToPush);
+    checkUnnamed3199(o.directoriesToPull);
+    checkUnnamed3200(o.environmentVariables);
+    checkUnnamed3201(o.filesToPush);
     unittest.expect(o.networkProfile, unittest.equals('foo'));
   }
   buildCounterTestSetup--;
@@ -1527,6 +1614,14 @@
     });
   });
 
+  unittest.group("obj-schema-LauncherActivityIntent", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildLauncherActivityIntent();
+      var od = new api.LauncherActivityIntent.fromJson(o.toJson());
+      checkLauncherActivityIntent(od);
+    });
+  });
+
   unittest.group("obj-schema-Locale", () {
     unittest.test("to-json--from-json", () {
       var o = buildLocale();
@@ -1583,6 +1678,22 @@
     });
   });
 
+  unittest.group("obj-schema-RoboStartingIntent", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildRoboStartingIntent();
+      var od = new api.RoboStartingIntent.fromJson(o.toJson());
+      checkRoboStartingIntent(od);
+    });
+  });
+
+  unittest.group("obj-schema-StartActivityIntent", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildStartActivityIntent();
+      var od = new api.StartActivityIntent.fromJson(o.toJson());
+      checkStartActivityIntent(od);
+    });
+  });
+
   unittest.group("obj-schema-TestDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestDetails();
diff --git a/generated/googleapis/test/translate/v2_test.dart b/generated/googleapis/test/translate/v2_test.dart
index e66fb0c..72078b7 100644
--- a/generated/googleapis/test/translate/v2_test.dart
+++ b/generated/googleapis/test/translate/v2_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed796() {
+buildUnnamed800() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed796(core.List<core.String> o) {
+checkUnnamed800(core.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.DetectLanguageRequest();
   buildCounterDetectLanguageRequest++;
   if (buildCounterDetectLanguageRequest < 3) {
-    o.q = buildUnnamed796();
+    o.q = buildUnnamed800();
   }
   buildCounterDetectLanguageRequest--;
   return o;
@@ -77,19 +77,19 @@
 checkDetectLanguageRequest(api.DetectLanguageRequest o) {
   buildCounterDetectLanguageRequest++;
   if (buildCounterDetectLanguageRequest < 3) {
-    checkUnnamed796(o.q);
+    checkUnnamed800(o.q);
   }
   buildCounterDetectLanguageRequest--;
 }
 
-buildUnnamed797() {
+buildUnnamed801() {
   var o = new core.List<api.DetectionsResource>();
   o.add(buildDetectionsResource());
   o.add(buildDetectionsResource());
   return o;
 }
 
-checkUnnamed797(core.List<api.DetectionsResource> o) {
+checkUnnamed801(core.List<api.DetectionsResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDetectionsResource(o[0]);
   checkDetectionsResource(o[1]);
@@ -100,7 +100,7 @@
   var o = new api.DetectionsListResponse();
   buildCounterDetectionsListResponse++;
   if (buildCounterDetectionsListResponse < 3) {
-    o.detections = buildUnnamed797();
+    o.detections = buildUnnamed801();
   }
   buildCounterDetectionsListResponse--;
   return o;
@@ -109,7 +109,7 @@
 checkDetectionsListResponse(api.DetectionsListResponse o) {
   buildCounterDetectionsListResponse++;
   if (buildCounterDetectionsListResponse < 3) {
-    checkUnnamed797(o.detections);
+    checkUnnamed801(o.detections);
   }
   buildCounterDetectionsListResponse--;
 }
@@ -169,14 +169,14 @@
   buildCounterGetSupportedLanguagesRequest--;
 }
 
-buildUnnamed798() {
+buildUnnamed802() {
   var o = new core.List<api.LanguagesResource>();
   o.add(buildLanguagesResource());
   o.add(buildLanguagesResource());
   return o;
 }
 
-checkUnnamed798(core.List<api.LanguagesResource> o) {
+checkUnnamed802(core.List<api.LanguagesResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLanguagesResource(o[0]);
   checkLanguagesResource(o[1]);
@@ -187,7 +187,7 @@
   var o = new api.LanguagesListResponse();
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
-    o.languages = buildUnnamed798();
+    o.languages = buildUnnamed802();
   }
   buildCounterLanguagesListResponse--;
   return o;
@@ -196,7 +196,7 @@
 checkLanguagesListResponse(api.LanguagesListResponse o) {
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
-    checkUnnamed798(o.languages);
+    checkUnnamed802(o.languages);
   }
   buildCounterLanguagesListResponse--;
 }
@@ -222,14 +222,14 @@
   buildCounterLanguagesResource--;
 }
 
-buildUnnamed799() {
+buildUnnamed803() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed799(core.List<core.String> o) {
+checkUnnamed803(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -242,7 +242,7 @@
   if (buildCounterTranslateTextRequest < 3) {
     o.format = "foo";
     o.model = "foo";
-    o.q = buildUnnamed799();
+    o.q = buildUnnamed803();
     o.source = "foo";
     o.target = "foo";
   }
@@ -255,21 +255,21 @@
   if (buildCounterTranslateTextRequest < 3) {
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.model, unittest.equals('foo'));
-    checkUnnamed799(o.q);
+    checkUnnamed803(o.q);
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
   }
   buildCounterTranslateTextRequest--;
 }
 
-buildUnnamed800() {
+buildUnnamed804() {
   var o = new core.List<api.TranslationsResource>();
   o.add(buildTranslationsResource());
   o.add(buildTranslationsResource());
   return o;
 }
 
-checkUnnamed800(core.List<api.TranslationsResource> o) {
+checkUnnamed804(core.List<api.TranslationsResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTranslationsResource(o[0]);
   checkTranslationsResource(o[1]);
@@ -280,7 +280,7 @@
   var o = new api.TranslationsListResponse();
   buildCounterTranslationsListResponse++;
   if (buildCounterTranslationsListResponse < 3) {
-    o.translations = buildUnnamed800();
+    o.translations = buildUnnamed804();
   }
   buildCounterTranslationsListResponse--;
   return o;
@@ -289,7 +289,7 @@
 checkTranslationsListResponse(api.TranslationsListResponse o) {
   buildCounterTranslationsListResponse++;
   if (buildCounterTranslationsListResponse < 3) {
-    checkUnnamed800(o.translations);
+    checkUnnamed804(o.translations);
   }
   buildCounterTranslationsListResponse--;
 }
@@ -317,40 +317,40 @@
   buildCounterTranslationsResource--;
 }
 
-buildUnnamed801() {
+buildUnnamed805() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed801(core.List<core.String> o) {
+checkUnnamed805(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed802() {
+buildUnnamed806() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed802(core.List<core.String> o) {
+checkUnnamed806(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed803() {
+buildUnnamed807() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed803(core.List<core.String> o) {
+checkUnnamed807(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -497,7 +497,7 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.DetectionsResourceApi res = new api.TranslateApi(mock).detections;
-      var arg_q = buildUnnamed801();
+      var arg_q = buildUnnamed805();
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -553,8 +553,8 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.LanguagesResourceApi res = new api.TranslateApi(mock).languages;
-      var arg_target = "foo";
       var arg_model = "foo";
+      var arg_target = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -589,8 +589,8 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["target"].first, unittest.equals(arg_target));
         unittest.expect(queryMap["model"].first, unittest.equals(arg_model));
+        unittest.expect(queryMap["target"].first, unittest.equals(arg_target));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -600,7 +600,7 @@
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
       res
-          .list(target: arg_target, model: arg_model, $fields: arg_$fields)
+          .list(model: arg_model, target: arg_target, $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.LanguagesListResponse response) {
         checkLanguagesListResponse(response);
       })));
@@ -611,12 +611,12 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.TranslationsResourceApi res = new api.TranslateApi(mock).translations;
-      var arg_q = buildUnnamed802();
+      var arg_q = buildUnnamed806();
       var arg_target = "foo";
-      var arg_source = "foo";
-      var arg_cid = buildUnnamed803();
-      var arg_format = "foo";
       var arg_model = "foo";
+      var arg_source = "foo";
+      var arg_cid = buildUnnamed807();
+      var arg_format = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -653,10 +653,10 @@
         }
         unittest.expect(queryMap["q"], unittest.equals(arg_q));
         unittest.expect(queryMap["target"].first, unittest.equals(arg_target));
+        unittest.expect(queryMap["model"].first, unittest.equals(arg_model));
         unittest.expect(queryMap["source"].first, unittest.equals(arg_source));
         unittest.expect(queryMap["cid"], unittest.equals(arg_cid));
         unittest.expect(queryMap["format"].first, unittest.equals(arg_format));
-        unittest.expect(queryMap["model"].first, unittest.equals(arg_model));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -667,10 +667,10 @@
       }), true);
       res
           .list(arg_q, arg_target,
+              model: arg_model,
               source: arg_source,
               cid: arg_cid,
               format: arg_format,
-              model: arg_model,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.TranslationsListResponse response) {
         checkTranslationsListResponse(response);
diff --git a/generated/googleapis/test/urlshortener/v1_test.dart b/generated/googleapis/test/urlshortener/v1_test.dart
index e2f172a..1c59c77 100644
--- a/generated/googleapis/test/urlshortener/v1_test.dart
+++ b/generated/googleapis/test/urlshortener/v1_test.dart
@@ -50,53 +50,53 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed831() {
+buildUnnamed836() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed831(core.List<api.StringCount> o) {
+checkUnnamed836(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed832() {
+buildUnnamed837() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed832(core.List<api.StringCount> o) {
+checkUnnamed837(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed833() {
+buildUnnamed838() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed833(core.List<api.StringCount> o) {
+checkUnnamed838(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed834() {
+buildUnnamed839() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed834(core.List<api.StringCount> o) {
+checkUnnamed839(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
@@ -107,11 +107,11 @@
   var o = new api.AnalyticsSnapshot();
   buildCounterAnalyticsSnapshot++;
   if (buildCounterAnalyticsSnapshot < 3) {
-    o.browsers = buildUnnamed831();
-    o.countries = buildUnnamed832();
+    o.browsers = buildUnnamed836();
+    o.countries = buildUnnamed837();
     o.longUrlClicks = "foo";
-    o.platforms = buildUnnamed833();
-    o.referrers = buildUnnamed834();
+    o.platforms = buildUnnamed838();
+    o.referrers = buildUnnamed839();
     o.shortUrlClicks = "foo";
   }
   buildCounterAnalyticsSnapshot--;
@@ -121,11 +121,11 @@
 checkAnalyticsSnapshot(api.AnalyticsSnapshot o) {
   buildCounterAnalyticsSnapshot++;
   if (buildCounterAnalyticsSnapshot < 3) {
-    checkUnnamed831(o.browsers);
-    checkUnnamed832(o.countries);
+    checkUnnamed836(o.browsers);
+    checkUnnamed837(o.countries);
     unittest.expect(o.longUrlClicks, unittest.equals('foo'));
-    checkUnnamed833(o.platforms);
-    checkUnnamed834(o.referrers);
+    checkUnnamed838(o.platforms);
+    checkUnnamed839(o.referrers);
     unittest.expect(o.shortUrlClicks, unittest.equals('foo'));
   }
   buildCounterAnalyticsSnapshot--;
@@ -208,14 +208,14 @@
   buildCounterUrl--;
 }
 
-buildUnnamed835() {
+buildUnnamed840() {
   var o = new core.List<api.Url>();
   o.add(buildUrl());
   o.add(buildUrl());
   return o;
 }
 
-checkUnnamed835(core.List<api.Url> o) {
+checkUnnamed840(core.List<api.Url> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrl(o[0]);
   checkUrl(o[1]);
@@ -226,7 +226,7 @@
   var o = new api.UrlHistory();
   buildCounterUrlHistory++;
   if (buildCounterUrlHistory < 3) {
-    o.items = buildUnnamed835();
+    o.items = buildUnnamed840();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -239,7 +239,7 @@
 checkUrlHistory(api.UrlHistory o) {
   buildCounterUrlHistory++;
   if (buildCounterUrlHistory < 3) {
-    checkUnnamed835(o.items);
+    checkUnnamed840(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/vault/v1_test.dart b/generated/googleapis/test/vault/v1_test.dart
index ee6ba46..885fa5b 100644
--- a/generated/googleapis/test/vault/v1_test.dart
+++ b/generated/googleapis/test/vault/v1_test.dart
@@ -252,14 +252,14 @@
   buildCounterHeldOrgUnit--;
 }
 
-buildUnnamed1697() {
+buildUnnamed1719() {
   var o = new core.List<api.HeldAccount>();
   o.add(buildHeldAccount());
   o.add(buildHeldAccount());
   return o;
 }
 
-checkUnnamed1697(core.List<api.HeldAccount> o) {
+checkUnnamed1719(core.List<api.HeldAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHeldAccount(o[0]);
   checkHeldAccount(o[1]);
@@ -270,7 +270,7 @@
   var o = new api.Hold();
   buildCounterHold++;
   if (buildCounterHold < 3) {
-    o.accounts = buildUnnamed1697();
+    o.accounts = buildUnnamed1719();
     o.corpus = "foo";
     o.holdId = "foo";
     o.name = "foo";
@@ -285,7 +285,7 @@
 checkHold(api.Hold o) {
   buildCounterHold++;
   if (buildCounterHold < 3) {
-    checkUnnamed1697(o.accounts);
+    checkUnnamed1719(o.accounts);
     unittest.expect(o.corpus, unittest.equals('foo'));
     unittest.expect(o.holdId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -296,14 +296,14 @@
   buildCounterHold--;
 }
 
-buildUnnamed1698() {
+buildUnnamed1720() {
   var o = new core.List<api.HeldAccount>();
   o.add(buildHeldAccount());
   o.add(buildHeldAccount());
   return o;
 }
 
-checkUnnamed1698(core.List<api.HeldAccount> o) {
+checkUnnamed1720(core.List<api.HeldAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHeldAccount(o[0]);
   checkHeldAccount(o[1]);
@@ -314,7 +314,7 @@
   var o = new api.ListHeldAccountsResponse();
   buildCounterListHeldAccountsResponse++;
   if (buildCounterListHeldAccountsResponse < 3) {
-    o.accounts = buildUnnamed1698();
+    o.accounts = buildUnnamed1720();
   }
   buildCounterListHeldAccountsResponse--;
   return o;
@@ -323,19 +323,19 @@
 checkListHeldAccountsResponse(api.ListHeldAccountsResponse o) {
   buildCounterListHeldAccountsResponse++;
   if (buildCounterListHeldAccountsResponse < 3) {
-    checkUnnamed1698(o.accounts);
+    checkUnnamed1720(o.accounts);
   }
   buildCounterListHeldAccountsResponse--;
 }
 
-buildUnnamed1699() {
+buildUnnamed1721() {
   var o = new core.List<api.Hold>();
   o.add(buildHold());
   o.add(buildHold());
   return o;
 }
 
-checkUnnamed1699(core.List<api.Hold> o) {
+checkUnnamed1721(core.List<api.Hold> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHold(o[0]);
   checkHold(o[1]);
@@ -346,7 +346,7 @@
   var o = new api.ListHoldsResponse();
   buildCounterListHoldsResponse++;
   if (buildCounterListHoldsResponse < 3) {
-    o.holds = buildUnnamed1699();
+    o.holds = buildUnnamed1721();
     o.nextPageToken = "foo";
   }
   buildCounterListHoldsResponse--;
@@ -356,20 +356,20 @@
 checkListHoldsResponse(api.ListHoldsResponse o) {
   buildCounterListHoldsResponse++;
   if (buildCounterListHoldsResponse < 3) {
-    checkUnnamed1699(o.holds);
+    checkUnnamed1721(o.holds);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListHoldsResponse--;
 }
 
-buildUnnamed1700() {
+buildUnnamed1722() {
   var o = new core.List<api.Matter>();
   o.add(buildMatter());
   o.add(buildMatter());
   return o;
 }
 
-checkUnnamed1700(core.List<api.Matter> o) {
+checkUnnamed1722(core.List<api.Matter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMatter(o[0]);
   checkMatter(o[1]);
@@ -380,7 +380,7 @@
   var o = new api.ListMattersResponse();
   buildCounterListMattersResponse++;
   if (buildCounterListMattersResponse < 3) {
-    o.matters = buildUnnamed1700();
+    o.matters = buildUnnamed1722();
     o.nextPageToken = "foo";
   }
   buildCounterListMattersResponse--;
@@ -390,20 +390,20 @@
 checkListMattersResponse(api.ListMattersResponse o) {
   buildCounterListMattersResponse++;
   if (buildCounterListMattersResponse < 3) {
-    checkUnnamed1700(o.matters);
+    checkUnnamed1722(o.matters);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListMattersResponse--;
 }
 
-buildUnnamed1701() {
+buildUnnamed1723() {
   var o = new core.List<api.MatterPermission>();
   o.add(buildMatterPermission());
   o.add(buildMatterPermission());
   return o;
 }
 
-checkUnnamed1701(core.List<api.MatterPermission> o) {
+checkUnnamed1723(core.List<api.MatterPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMatterPermission(o[0]);
   checkMatterPermission(o[1]);
@@ -416,7 +416,7 @@
   if (buildCounterMatter < 3) {
     o.description = "foo";
     o.matterId = "foo";
-    o.matterPermissions = buildUnnamed1701();
+    o.matterPermissions = buildUnnamed1723();
     o.name = "foo";
     o.state = "foo";
   }
@@ -429,7 +429,7 @@
   if (buildCounterMatter < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.matterId, unittest.equals('foo'));
-    checkUnnamed1701(o.matterPermissions);
+    checkUnnamed1723(o.matterPermissions);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/vision/v1_test.dart b/generated/googleapis/test/vision/v1_test.dart
index 9abb7b7..b7b7caa 100644
--- a/generated/googleapis/test/vision/v1_test.dart
+++ b/generated/googleapis/test/vision/v1_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1348() {
+buildUnnamed1364() {
   var o = new core.List<api.Feature>();
   o.add(buildFeature());
   o.add(buildFeature());
   return o;
 }
 
-checkUnnamed1348(core.List<api.Feature> o) {
+checkUnnamed1364(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFeature(o[0]);
   checkFeature(o[1]);
@@ -68,7 +68,7 @@
   var o = new api.AnnotateImageRequest();
   buildCounterAnnotateImageRequest++;
   if (buildCounterAnnotateImageRequest < 3) {
-    o.features = buildUnnamed1348();
+    o.features = buildUnnamed1364();
     o.image = buildImage();
     o.imageContext = buildImageContext();
   }
@@ -79,73 +79,73 @@
 checkAnnotateImageRequest(api.AnnotateImageRequest o) {
   buildCounterAnnotateImageRequest++;
   if (buildCounterAnnotateImageRequest < 3) {
-    checkUnnamed1348(o.features);
+    checkUnnamed1364(o.features);
     checkImage(o.image);
     checkImageContext(o.imageContext);
   }
   buildCounterAnnotateImageRequest--;
 }
 
-buildUnnamed1349() {
+buildUnnamed1365() {
   var o = new core.List<api.FaceAnnotation>();
   o.add(buildFaceAnnotation());
   o.add(buildFaceAnnotation());
   return o;
 }
 
-checkUnnamed1349(core.List<api.FaceAnnotation> o) {
+checkUnnamed1365(core.List<api.FaceAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFaceAnnotation(o[0]);
   checkFaceAnnotation(o[1]);
 }
 
-buildUnnamed1350() {
+buildUnnamed1366() {
   var o = new core.List<api.EntityAnnotation>();
   o.add(buildEntityAnnotation());
   o.add(buildEntityAnnotation());
   return o;
 }
 
-checkUnnamed1350(core.List<api.EntityAnnotation> o) {
+checkUnnamed1366(core.List<api.EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAnnotation(o[0]);
   checkEntityAnnotation(o[1]);
 }
 
-buildUnnamed1351() {
+buildUnnamed1367() {
   var o = new core.List<api.EntityAnnotation>();
   o.add(buildEntityAnnotation());
   o.add(buildEntityAnnotation());
   return o;
 }
 
-checkUnnamed1351(core.List<api.EntityAnnotation> o) {
+checkUnnamed1367(core.List<api.EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAnnotation(o[0]);
   checkEntityAnnotation(o[1]);
 }
 
-buildUnnamed1352() {
+buildUnnamed1368() {
   var o = new core.List<api.EntityAnnotation>();
   o.add(buildEntityAnnotation());
   o.add(buildEntityAnnotation());
   return o;
 }
 
-checkUnnamed1352(core.List<api.EntityAnnotation> o) {
+checkUnnamed1368(core.List<api.EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAnnotation(o[0]);
   checkEntityAnnotation(o[1]);
 }
 
-buildUnnamed1353() {
+buildUnnamed1369() {
   var o = new core.List<api.EntityAnnotation>();
   o.add(buildEntityAnnotation());
   o.add(buildEntityAnnotation());
   return o;
 }
 
-checkUnnamed1353(core.List<api.EntityAnnotation> o) {
+checkUnnamed1369(core.List<api.EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAnnotation(o[0]);
   checkEntityAnnotation(o[1]);
@@ -158,14 +158,14 @@
   if (buildCounterAnnotateImageResponse < 3) {
     o.cropHintsAnnotation = buildCropHintsAnnotation();
     o.error = buildStatus();
-    o.faceAnnotations = buildUnnamed1349();
+    o.faceAnnotations = buildUnnamed1365();
     o.fullTextAnnotation = buildTextAnnotation();
     o.imagePropertiesAnnotation = buildImageProperties();
-    o.labelAnnotations = buildUnnamed1350();
-    o.landmarkAnnotations = buildUnnamed1351();
-    o.logoAnnotations = buildUnnamed1352();
+    o.labelAnnotations = buildUnnamed1366();
+    o.landmarkAnnotations = buildUnnamed1367();
+    o.logoAnnotations = buildUnnamed1368();
     o.safeSearchAnnotation = buildSafeSearchAnnotation();
-    o.textAnnotations = buildUnnamed1353();
+    o.textAnnotations = buildUnnamed1369();
     o.webDetection = buildWebDetection();
   }
   buildCounterAnnotateImageResponse--;
@@ -177,27 +177,27 @@
   if (buildCounterAnnotateImageResponse < 3) {
     checkCropHintsAnnotation(o.cropHintsAnnotation);
     checkStatus(o.error);
-    checkUnnamed1349(o.faceAnnotations);
+    checkUnnamed1365(o.faceAnnotations);
     checkTextAnnotation(o.fullTextAnnotation);
     checkImageProperties(o.imagePropertiesAnnotation);
-    checkUnnamed1350(o.labelAnnotations);
-    checkUnnamed1351(o.landmarkAnnotations);
-    checkUnnamed1352(o.logoAnnotations);
+    checkUnnamed1366(o.labelAnnotations);
+    checkUnnamed1367(o.landmarkAnnotations);
+    checkUnnamed1368(o.logoAnnotations);
     checkSafeSearchAnnotation(o.safeSearchAnnotation);
-    checkUnnamed1353(o.textAnnotations);
+    checkUnnamed1369(o.textAnnotations);
     checkWebDetection(o.webDetection);
   }
   buildCounterAnnotateImageResponse--;
 }
 
-buildUnnamed1354() {
+buildUnnamed1370() {
   var o = new core.List<api.AnnotateImageRequest>();
   o.add(buildAnnotateImageRequest());
   o.add(buildAnnotateImageRequest());
   return o;
 }
 
-checkUnnamed1354(core.List<api.AnnotateImageRequest> o) {
+checkUnnamed1370(core.List<api.AnnotateImageRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotateImageRequest(o[0]);
   checkAnnotateImageRequest(o[1]);
@@ -208,7 +208,7 @@
   var o = new api.BatchAnnotateImagesRequest();
   buildCounterBatchAnnotateImagesRequest++;
   if (buildCounterBatchAnnotateImagesRequest < 3) {
-    o.requests = buildUnnamed1354();
+    o.requests = buildUnnamed1370();
   }
   buildCounterBatchAnnotateImagesRequest--;
   return o;
@@ -217,19 +217,19 @@
 checkBatchAnnotateImagesRequest(api.BatchAnnotateImagesRequest o) {
   buildCounterBatchAnnotateImagesRequest++;
   if (buildCounterBatchAnnotateImagesRequest < 3) {
-    checkUnnamed1354(o.requests);
+    checkUnnamed1370(o.requests);
   }
   buildCounterBatchAnnotateImagesRequest--;
 }
 
-buildUnnamed1355() {
+buildUnnamed1371() {
   var o = new core.List<api.AnnotateImageResponse>();
   o.add(buildAnnotateImageResponse());
   o.add(buildAnnotateImageResponse());
   return o;
 }
 
-checkUnnamed1355(core.List<api.AnnotateImageResponse> o) {
+checkUnnamed1371(core.List<api.AnnotateImageResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotateImageResponse(o[0]);
   checkAnnotateImageResponse(o[1]);
@@ -240,7 +240,7 @@
   var o = new api.BatchAnnotateImagesResponse();
   buildCounterBatchAnnotateImagesResponse++;
   if (buildCounterBatchAnnotateImagesResponse < 3) {
-    o.responses = buildUnnamed1355();
+    o.responses = buildUnnamed1371();
   }
   buildCounterBatchAnnotateImagesResponse--;
   return o;
@@ -249,19 +249,19 @@
 checkBatchAnnotateImagesResponse(api.BatchAnnotateImagesResponse o) {
   buildCounterBatchAnnotateImagesResponse++;
   if (buildCounterBatchAnnotateImagesResponse < 3) {
-    checkUnnamed1355(o.responses);
+    checkUnnamed1371(o.responses);
   }
   buildCounterBatchAnnotateImagesResponse--;
 }
 
-buildUnnamed1356() {
+buildUnnamed1372() {
   var o = new core.List<api.Paragraph>();
   o.add(buildParagraph());
   o.add(buildParagraph());
   return o;
 }
 
-checkUnnamed1356(core.List<api.Paragraph> o) {
+checkUnnamed1372(core.List<api.Paragraph> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParagraph(o[0]);
   checkParagraph(o[1]);
@@ -274,7 +274,7 @@
   if (buildCounterBlock < 3) {
     o.blockType = "foo";
     o.boundingBox = buildBoundingPoly();
-    o.paragraphs = buildUnnamed1356();
+    o.paragraphs = buildUnnamed1372();
     o.property = buildTextProperty();
   }
   buildCounterBlock--;
@@ -286,20 +286,20 @@
   if (buildCounterBlock < 3) {
     unittest.expect(o.blockType, unittest.equals('foo'));
     checkBoundingPoly(o.boundingBox);
-    checkUnnamed1356(o.paragraphs);
+    checkUnnamed1372(o.paragraphs);
     checkTextProperty(o.property);
   }
   buildCounterBlock--;
 }
 
-buildUnnamed1357() {
+buildUnnamed1373() {
   var o = new core.List<api.Vertex>();
   o.add(buildVertex());
   o.add(buildVertex());
   return o;
 }
 
-checkUnnamed1357(core.List<api.Vertex> o) {
+checkUnnamed1373(core.List<api.Vertex> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVertex(o[0]);
   checkVertex(o[1]);
@@ -310,7 +310,7 @@
   var o = new api.BoundingPoly();
   buildCounterBoundingPoly++;
   if (buildCounterBoundingPoly < 3) {
-    o.vertices = buildUnnamed1357();
+    o.vertices = buildUnnamed1373();
   }
   buildCounterBoundingPoly--;
   return o;
@@ -319,7 +319,7 @@
 checkBoundingPoly(api.BoundingPoly o) {
   buildCounterBoundingPoly++;
   if (buildCounterBoundingPoly < 3) {
-    checkUnnamed1357(o.vertices);
+    checkUnnamed1373(o.vertices);
   }
   buildCounterBoundingPoly--;
 }
@@ -395,14 +395,14 @@
   buildCounterCropHint--;
 }
 
-buildUnnamed1358() {
+buildUnnamed1374() {
   var o = new core.List<api.CropHint>();
   o.add(buildCropHint());
   o.add(buildCropHint());
   return o;
 }
 
-checkUnnamed1358(core.List<api.CropHint> o) {
+checkUnnamed1374(core.List<api.CropHint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCropHint(o[0]);
   checkCropHint(o[1]);
@@ -413,7 +413,7 @@
   var o = new api.CropHintsAnnotation();
   buildCounterCropHintsAnnotation++;
   if (buildCounterCropHintsAnnotation < 3) {
-    o.cropHints = buildUnnamed1358();
+    o.cropHints = buildUnnamed1374();
   }
   buildCounterCropHintsAnnotation--;
   return o;
@@ -422,19 +422,19 @@
 checkCropHintsAnnotation(api.CropHintsAnnotation o) {
   buildCounterCropHintsAnnotation++;
   if (buildCounterCropHintsAnnotation < 3) {
-    checkUnnamed1358(o.cropHints);
+    checkUnnamed1374(o.cropHints);
   }
   buildCounterCropHintsAnnotation--;
 }
 
-buildUnnamed1359() {
+buildUnnamed1375() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1359(core.List<core.double> o) {
+checkUnnamed1375(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));
@@ -445,7 +445,7 @@
   var o = new api.CropHintsParams();
   buildCounterCropHintsParams++;
   if (buildCounterCropHintsParams < 3) {
-    o.aspectRatios = buildUnnamed1359();
+    o.aspectRatios = buildUnnamed1375();
   }
   buildCounterCropHintsParams--;
   return o;
@@ -454,7 +454,7 @@
 checkCropHintsParams(api.CropHintsParams o) {
   buildCounterCropHintsParams++;
   if (buildCounterCropHintsParams < 3) {
-    checkUnnamed1359(o.aspectRatios);
+    checkUnnamed1375(o.aspectRatios);
   }
   buildCounterCropHintsParams--;
 }
@@ -501,14 +501,14 @@
   buildCounterDetectedLanguage--;
 }
 
-buildUnnamed1360() {
+buildUnnamed1376() {
   var o = new core.List<api.ColorInfo>();
   o.add(buildColorInfo());
   o.add(buildColorInfo());
   return o;
 }
 
-checkUnnamed1360(core.List<api.ColorInfo> o) {
+checkUnnamed1376(core.List<api.ColorInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorInfo(o[0]);
   checkColorInfo(o[1]);
@@ -519,7 +519,7 @@
   var o = new api.DominantColorsAnnotation();
   buildCounterDominantColorsAnnotation++;
   if (buildCounterDominantColorsAnnotation < 3) {
-    o.colors = buildUnnamed1360();
+    o.colors = buildUnnamed1376();
   }
   buildCounterDominantColorsAnnotation--;
   return o;
@@ -528,32 +528,32 @@
 checkDominantColorsAnnotation(api.DominantColorsAnnotation o) {
   buildCounterDominantColorsAnnotation++;
   if (buildCounterDominantColorsAnnotation < 3) {
-    checkUnnamed1360(o.colors);
+    checkUnnamed1376(o.colors);
   }
   buildCounterDominantColorsAnnotation--;
 }
 
-buildUnnamed1361() {
+buildUnnamed1377() {
   var o = new core.List<api.LocationInfo>();
   o.add(buildLocationInfo());
   o.add(buildLocationInfo());
   return o;
 }
 
-checkUnnamed1361(core.List<api.LocationInfo> o) {
+checkUnnamed1377(core.List<api.LocationInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocationInfo(o[0]);
   checkLocationInfo(o[1]);
 }
 
-buildUnnamed1362() {
+buildUnnamed1378() {
   var o = new core.List<api.Property>();
   o.add(buildProperty());
   o.add(buildProperty());
   return o;
 }
 
-checkUnnamed1362(core.List<api.Property> o) {
+checkUnnamed1378(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o[0]);
   checkProperty(o[1]);
@@ -568,9 +568,9 @@
     o.confidence = 42.0;
     o.description = "foo";
     o.locale = "foo";
-    o.locations = buildUnnamed1361();
+    o.locations = buildUnnamed1377();
     o.mid = "foo";
-    o.properties = buildUnnamed1362();
+    o.properties = buildUnnamed1378();
     o.score = 42.0;
     o.topicality = 42.0;
   }
@@ -585,23 +585,23 @@
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.locale, unittest.equals('foo'));
-    checkUnnamed1361(o.locations);
+    checkUnnamed1377(o.locations);
     unittest.expect(o.mid, unittest.equals('foo'));
-    checkUnnamed1362(o.properties);
+    checkUnnamed1378(o.properties);
     unittest.expect(o.score, unittest.equals(42.0));
     unittest.expect(o.topicality, unittest.equals(42.0));
   }
   buildCounterEntityAnnotation--;
 }
 
-buildUnnamed1363() {
+buildUnnamed1379() {
   var o = new core.List<api.Landmark>();
   o.add(buildLandmark());
   o.add(buildLandmark());
   return o;
 }
 
-checkUnnamed1363(core.List<api.Landmark> o) {
+checkUnnamed1379(core.List<api.Landmark> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLandmark(o[0]);
   checkLandmark(o[1]);
@@ -620,7 +620,7 @@
     o.headwearLikelihood = "foo";
     o.joyLikelihood = "foo";
     o.landmarkingConfidence = 42.0;
-    o.landmarks = buildUnnamed1363();
+    o.landmarks = buildUnnamed1379();
     o.panAngle = 42.0;
     o.rollAngle = 42.0;
     o.sorrowLikelihood = "foo";
@@ -643,7 +643,7 @@
     unittest.expect(o.headwearLikelihood, unittest.equals('foo'));
     unittest.expect(o.joyLikelihood, unittest.equals('foo'));
     unittest.expect(o.landmarkingConfidence, unittest.equals(42.0));
-    checkUnnamed1363(o.landmarks);
+    checkUnnamed1379(o.landmarks);
     unittest.expect(o.panAngle, unittest.equals(42.0));
     unittest.expect(o.rollAngle, unittest.equals(42.0));
     unittest.expect(o.sorrowLikelihood, unittest.equals('foo'));
@@ -696,14 +696,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed1364() {
+buildUnnamed1380() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1364(core.List<core.String> o) {
+checkUnnamed1380(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -715,7 +715,7 @@
   buildCounterImageContext++;
   if (buildCounterImageContext < 3) {
     o.cropHintsParams = buildCropHintsParams();
-    o.languageHints = buildUnnamed1364();
+    o.languageHints = buildUnnamed1380();
     o.latLongRect = buildLatLongRect();
   }
   buildCounterImageContext--;
@@ -726,7 +726,7 @@
   buildCounterImageContext++;
   if (buildCounterImageContext < 3) {
     checkCropHintsParams(o.cropHintsParams);
-    checkUnnamed1364(o.languageHints);
+    checkUnnamed1380(o.languageHints);
     checkLatLongRect(o.latLongRect);
   }
   buildCounterImageContext--;
@@ -854,14 +854,14 @@
   buildCounterLocationInfo--;
 }
 
-buildUnnamed1365() {
+buildUnnamed1381() {
   var o = new core.List<api.Block>();
   o.add(buildBlock());
   o.add(buildBlock());
   return o;
 }
 
-checkUnnamed1365(core.List<api.Block> o) {
+checkUnnamed1381(core.List<api.Block> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBlock(o[0]);
   checkBlock(o[1]);
@@ -872,7 +872,7 @@
   var o = new api.Page();
   buildCounterPage++;
   if (buildCounterPage < 3) {
-    o.blocks = buildUnnamed1365();
+    o.blocks = buildUnnamed1381();
     o.height = 42;
     o.property = buildTextProperty();
     o.width = 42;
@@ -884,7 +884,7 @@
 checkPage(api.Page o) {
   buildCounterPage++;
   if (buildCounterPage < 3) {
-    checkUnnamed1365(o.blocks);
+    checkUnnamed1381(o.blocks);
     unittest.expect(o.height, unittest.equals(42));
     checkTextProperty(o.property);
     unittest.expect(o.width, unittest.equals(42));
@@ -892,14 +892,14 @@
   buildCounterPage--;
 }
 
-buildUnnamed1366() {
+buildUnnamed1382() {
   var o = new core.List<api.Word>();
   o.add(buildWord());
   o.add(buildWord());
   return o;
 }
 
-checkUnnamed1366(core.List<api.Word> o) {
+checkUnnamed1382(core.List<api.Word> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWord(o[0]);
   checkWord(o[1]);
@@ -912,7 +912,7 @@
   if (buildCounterParagraph < 3) {
     o.boundingBox = buildBoundingPoly();
     o.property = buildTextProperty();
-    o.words = buildUnnamed1366();
+    o.words = buildUnnamed1382();
   }
   buildCounterParagraph--;
   return o;
@@ -923,7 +923,7 @@
   if (buildCounterParagraph < 3) {
     checkBoundingPoly(o.boundingBox);
     checkTextProperty(o.property);
-    checkUnnamed1366(o.words);
+    checkUnnamed1382(o.words);
   }
   buildCounterParagraph--;
 }
@@ -999,7 +999,7 @@
   buildCounterSafeSearchAnnotation--;
 }
 
-buildUnnamed1367() {
+buildUnnamed1383() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1014,7 +1014,7 @@
   return o;
 }
 
-checkUnnamed1367(core.Map<core.String, core.Object> o) {
+checkUnnamed1383(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));
@@ -1028,17 +1028,17 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1368() {
+buildUnnamed1384() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1367());
-  o.add(buildUnnamed1367());
+  o.add(buildUnnamed1383());
+  o.add(buildUnnamed1383());
   return o;
 }
 
-checkUnnamed1368(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1384(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1367(o[0]);
-  checkUnnamed1367(o[1]);
+  checkUnnamed1383(o[0]);
+  checkUnnamed1383(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1047,7 +1047,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1368();
+    o.details = buildUnnamed1384();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1058,7 +1058,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1368(o.details);
+    checkUnnamed1384(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -1087,14 +1087,14 @@
   buildCounterSymbol--;
 }
 
-buildUnnamed1369() {
+buildUnnamed1385() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1369(core.List<api.Page> o) {
+checkUnnamed1385(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
@@ -1105,7 +1105,7 @@
   var o = new api.TextAnnotation();
   buildCounterTextAnnotation++;
   if (buildCounterTextAnnotation < 3) {
-    o.pages = buildUnnamed1369();
+    o.pages = buildUnnamed1385();
     o.text = "foo";
   }
   buildCounterTextAnnotation--;
@@ -1115,20 +1115,20 @@
 checkTextAnnotation(api.TextAnnotation o) {
   buildCounterTextAnnotation++;
   if (buildCounterTextAnnotation < 3) {
-    checkUnnamed1369(o.pages);
+    checkUnnamed1385(o.pages);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterTextAnnotation--;
 }
 
-buildUnnamed1370() {
+buildUnnamed1386() {
   var o = new core.List<api.DetectedLanguage>();
   o.add(buildDetectedLanguage());
   o.add(buildDetectedLanguage());
   return o;
 }
 
-checkUnnamed1370(core.List<api.DetectedLanguage> o) {
+checkUnnamed1386(core.List<api.DetectedLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDetectedLanguage(o[0]);
   checkDetectedLanguage(o[1]);
@@ -1140,7 +1140,7 @@
   buildCounterTextProperty++;
   if (buildCounterTextProperty < 3) {
     o.detectedBreak = buildDetectedBreak();
-    o.detectedLanguages = buildUnnamed1370();
+    o.detectedLanguages = buildUnnamed1386();
   }
   buildCounterTextProperty--;
   return o;
@@ -1150,7 +1150,7 @@
   buildCounterTextProperty++;
   if (buildCounterTextProperty < 3) {
     checkDetectedBreak(o.detectedBreak);
-    checkUnnamed1370(o.detectedLanguages);
+    checkUnnamed1386(o.detectedLanguages);
   }
   buildCounterTextProperty--;
 }
@@ -1176,66 +1176,66 @@
   buildCounterVertex--;
 }
 
-buildUnnamed1371() {
+buildUnnamed1387() {
   var o = new core.List<api.WebImage>();
   o.add(buildWebImage());
   o.add(buildWebImage());
   return o;
 }
 
-checkUnnamed1371(core.List<api.WebImage> o) {
+checkUnnamed1387(core.List<api.WebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebImage(o[0]);
   checkWebImage(o[1]);
 }
 
-buildUnnamed1372() {
+buildUnnamed1388() {
   var o = new core.List<api.WebPage>();
   o.add(buildWebPage());
   o.add(buildWebPage());
   return o;
 }
 
-checkUnnamed1372(core.List<api.WebPage> o) {
+checkUnnamed1388(core.List<api.WebPage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebPage(o[0]);
   checkWebPage(o[1]);
 }
 
-buildUnnamed1373() {
+buildUnnamed1389() {
   var o = new core.List<api.WebImage>();
   o.add(buildWebImage());
   o.add(buildWebImage());
   return o;
 }
 
-checkUnnamed1373(core.List<api.WebImage> o) {
+checkUnnamed1389(core.List<api.WebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebImage(o[0]);
   checkWebImage(o[1]);
 }
 
-buildUnnamed1374() {
+buildUnnamed1390() {
   var o = new core.List<api.WebImage>();
   o.add(buildWebImage());
   o.add(buildWebImage());
   return o;
 }
 
-checkUnnamed1374(core.List<api.WebImage> o) {
+checkUnnamed1390(core.List<api.WebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebImage(o[0]);
   checkWebImage(o[1]);
 }
 
-buildUnnamed1375() {
+buildUnnamed1391() {
   var o = new core.List<api.WebEntity>();
   o.add(buildWebEntity());
   o.add(buildWebEntity());
   return o;
 }
 
-checkUnnamed1375(core.List<api.WebEntity> o) {
+checkUnnamed1391(core.List<api.WebEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebEntity(o[0]);
   checkWebEntity(o[1]);
@@ -1246,11 +1246,11 @@
   var o = new api.WebDetection();
   buildCounterWebDetection++;
   if (buildCounterWebDetection < 3) {
-    o.fullMatchingImages = buildUnnamed1371();
-    o.pagesWithMatchingImages = buildUnnamed1372();
-    o.partialMatchingImages = buildUnnamed1373();
-    o.visuallySimilarImages = buildUnnamed1374();
-    o.webEntities = buildUnnamed1375();
+    o.fullMatchingImages = buildUnnamed1387();
+    o.pagesWithMatchingImages = buildUnnamed1388();
+    o.partialMatchingImages = buildUnnamed1389();
+    o.visuallySimilarImages = buildUnnamed1390();
+    o.webEntities = buildUnnamed1391();
   }
   buildCounterWebDetection--;
   return o;
@@ -1259,11 +1259,11 @@
 checkWebDetection(api.WebDetection o) {
   buildCounterWebDetection++;
   if (buildCounterWebDetection < 3) {
-    checkUnnamed1371(o.fullMatchingImages);
-    checkUnnamed1372(o.pagesWithMatchingImages);
-    checkUnnamed1373(o.partialMatchingImages);
-    checkUnnamed1374(o.visuallySimilarImages);
-    checkUnnamed1375(o.webEntities);
+    checkUnnamed1387(o.fullMatchingImages);
+    checkUnnamed1388(o.pagesWithMatchingImages);
+    checkUnnamed1389(o.partialMatchingImages);
+    checkUnnamed1390(o.visuallySimilarImages);
+    checkUnnamed1391(o.webEntities);
   }
   buildCounterWebDetection--;
 }
@@ -1333,14 +1333,14 @@
   buildCounterWebPage--;
 }
 
-buildUnnamed1376() {
+buildUnnamed1392() {
   var o = new core.List<api.Symbol>();
   o.add(buildSymbol());
   o.add(buildSymbol());
   return o;
 }
 
-checkUnnamed1376(core.List<api.Symbol> o) {
+checkUnnamed1392(core.List<api.Symbol> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSymbol(o[0]);
   checkSymbol(o[1]);
@@ -1353,7 +1353,7 @@
   if (buildCounterWord < 3) {
     o.boundingBox = buildBoundingPoly();
     o.property = buildTextProperty();
-    o.symbols = buildUnnamed1376();
+    o.symbols = buildUnnamed1392();
   }
   buildCounterWord--;
   return o;
@@ -1364,7 +1364,7 @@
   if (buildCounterWord < 3) {
     checkBoundingPoly(o.boundingBox);
     checkTextProperty(o.property);
-    checkUnnamed1376(o.symbols);
+    checkUnnamed1392(o.symbols);
   }
   buildCounterWord--;
 }
diff --git a/generated/googleapis/test/webfonts/v1_test.dart b/generated/googleapis/test/webfonts/v1_test.dart
index 6a9d238..84f0758 100644
--- a/generated/googleapis/test/webfonts/v1_test.dart
+++ b/generated/googleapis/test/webfonts/v1_test.dart
@@ -50,40 +50,40 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1751() {
+buildUnnamed1773() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1751(core.Map<core.String, core.String> o) {
+checkUnnamed1773(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'));
 }
 
-buildUnnamed1752() {
+buildUnnamed1774() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1752(core.List<core.String> o) {
+checkUnnamed1774(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1753() {
+buildUnnamed1775() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1753(core.List<core.String> o) {
+checkUnnamed1775(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -96,11 +96,11 @@
   if (buildCounterWebfont < 3) {
     o.category = "foo";
     o.family = "foo";
-    o.files = buildUnnamed1751();
+    o.files = buildUnnamed1773();
     o.kind = "foo";
     o.lastModified = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.subsets = buildUnnamed1752();
-    o.variants = buildUnnamed1753();
+    o.subsets = buildUnnamed1774();
+    o.variants = buildUnnamed1775();
     o.version = "foo";
   }
   buildCounterWebfont--;
@@ -112,25 +112,25 @@
   if (buildCounterWebfont < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
     unittest.expect(o.family, unittest.equals('foo'));
-    checkUnnamed1751(o.files);
+    checkUnnamed1773(o.files);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastModified,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed1752(o.subsets);
-    checkUnnamed1753(o.variants);
+    checkUnnamed1774(o.subsets);
+    checkUnnamed1775(o.variants);
     unittest.expect(o.version, unittest.equals('foo'));
   }
   buildCounterWebfont--;
 }
 
-buildUnnamed1754() {
+buildUnnamed1776() {
   var o = new core.List<api.Webfont>();
   o.add(buildWebfont());
   o.add(buildWebfont());
   return o;
 }
 
-checkUnnamed1754(core.List<api.Webfont> o) {
+checkUnnamed1776(core.List<api.Webfont> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebfont(o[0]);
   checkWebfont(o[1]);
@@ -141,7 +141,7 @@
   var o = new api.WebfontList();
   buildCounterWebfontList++;
   if (buildCounterWebfontList < 3) {
-    o.items = buildUnnamed1754();
+    o.items = buildUnnamed1776();
     o.kind = "foo";
   }
   buildCounterWebfontList--;
@@ -151,7 +151,7 @@
 checkWebfontList(api.WebfontList o) {
   buildCounterWebfontList++;
   if (buildCounterWebfontList < 3) {
-    checkUnnamed1754(o.items);
+    checkUnnamed1776(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 1243dff..3a63c2c 100644
--- a/generated/googleapis/test/webmasters/v3_test.dart
+++ b/generated/googleapis/test/webmasters/v3_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed710() {
+buildUnnamed714() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed710(core.List<core.String> o) {
+checkUnnamed714(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -71,7 +71,7 @@
     o.clicks = 42.0;
     o.ctr = 42.0;
     o.impressions = 42.0;
-    o.keys = buildUnnamed710();
+    o.keys = buildUnnamed714();
     o.position = 42.0;
   }
   buildCounterApiDataRow--;
@@ -84,7 +84,7 @@
     unittest.expect(o.clicks, unittest.equals(42.0));
     unittest.expect(o.ctr, unittest.equals(42.0));
     unittest.expect(o.impressions, unittest.equals(42.0));
-    checkUnnamed710(o.keys);
+    checkUnnamed714(o.keys);
     unittest.expect(o.position, unittest.equals(42.0));
   }
   buildCounterApiDataRow--;
@@ -113,14 +113,14 @@
   buildCounterApiDimensionFilter--;
 }
 
-buildUnnamed711() {
+buildUnnamed715() {
   var o = new core.List<api.ApiDimensionFilter>();
   o.add(buildApiDimensionFilter());
   o.add(buildApiDimensionFilter());
   return o;
 }
 
-checkUnnamed711(core.List<api.ApiDimensionFilter> o) {
+checkUnnamed715(core.List<api.ApiDimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApiDimensionFilter(o[0]);
   checkApiDimensionFilter(o[1]);
@@ -131,7 +131,7 @@
   var o = new api.ApiDimensionFilterGroup();
   buildCounterApiDimensionFilterGroup++;
   if (buildCounterApiDimensionFilterGroup < 3) {
-    o.filters = buildUnnamed711();
+    o.filters = buildUnnamed715();
     o.groupType = "foo";
   }
   buildCounterApiDimensionFilterGroup--;
@@ -141,33 +141,33 @@
 checkApiDimensionFilterGroup(api.ApiDimensionFilterGroup o) {
   buildCounterApiDimensionFilterGroup++;
   if (buildCounterApiDimensionFilterGroup < 3) {
-    checkUnnamed711(o.filters);
+    checkUnnamed715(o.filters);
     unittest.expect(o.groupType, unittest.equals('foo'));
   }
   buildCounterApiDimensionFilterGroup--;
 }
 
-buildUnnamed712() {
+buildUnnamed716() {
   var o = new core.List<api.ApiDimensionFilterGroup>();
   o.add(buildApiDimensionFilterGroup());
   o.add(buildApiDimensionFilterGroup());
   return o;
 }
 
-checkUnnamed712(core.List<api.ApiDimensionFilterGroup> o) {
+checkUnnamed716(core.List<api.ApiDimensionFilterGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApiDimensionFilterGroup(o[0]);
   checkApiDimensionFilterGroup(o[1]);
 }
 
-buildUnnamed713() {
+buildUnnamed717() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed713(core.List<core.String> o) {
+checkUnnamed717(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -179,8 +179,8 @@
   buildCounterSearchAnalyticsQueryRequest++;
   if (buildCounterSearchAnalyticsQueryRequest < 3) {
     o.aggregationType = "foo";
-    o.dimensionFilterGroups = buildUnnamed712();
-    o.dimensions = buildUnnamed713();
+    o.dimensionFilterGroups = buildUnnamed716();
+    o.dimensions = buildUnnamed717();
     o.endDate = "foo";
     o.rowLimit = 42;
     o.searchType = "foo";
@@ -195,8 +195,8 @@
   buildCounterSearchAnalyticsQueryRequest++;
   if (buildCounterSearchAnalyticsQueryRequest < 3) {
     unittest.expect(o.aggregationType, unittest.equals('foo'));
-    checkUnnamed712(o.dimensionFilterGroups);
-    checkUnnamed713(o.dimensions);
+    checkUnnamed716(o.dimensionFilterGroups);
+    checkUnnamed717(o.dimensions);
     unittest.expect(o.endDate, unittest.equals('foo'));
     unittest.expect(o.rowLimit, unittest.equals(42));
     unittest.expect(o.searchType, unittest.equals('foo'));
@@ -206,14 +206,14 @@
   buildCounterSearchAnalyticsQueryRequest--;
 }
 
-buildUnnamed714() {
+buildUnnamed718() {
   var o = new core.List<api.ApiDataRow>();
   o.add(buildApiDataRow());
   o.add(buildApiDataRow());
   return o;
 }
 
-checkUnnamed714(core.List<api.ApiDataRow> o) {
+checkUnnamed718(core.List<api.ApiDataRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApiDataRow(o[0]);
   checkApiDataRow(o[1]);
@@ -225,7 +225,7 @@
   buildCounterSearchAnalyticsQueryResponse++;
   if (buildCounterSearchAnalyticsQueryResponse < 3) {
     o.responseAggregationType = "foo";
-    o.rows = buildUnnamed714();
+    o.rows = buildUnnamed718();
   }
   buildCounterSearchAnalyticsQueryResponse--;
   return o;
@@ -235,19 +235,19 @@
   buildCounterSearchAnalyticsQueryResponse++;
   if (buildCounterSearchAnalyticsQueryResponse < 3) {
     unittest.expect(o.responseAggregationType, unittest.equals('foo'));
-    checkUnnamed714(o.rows);
+    checkUnnamed718(o.rows);
   }
   buildCounterSearchAnalyticsQueryResponse--;
 }
 
-buildUnnamed715() {
+buildUnnamed719() {
   var o = new core.List<api.WmxSitemap>();
   o.add(buildWmxSitemap());
   o.add(buildWmxSitemap());
   return o;
 }
 
-checkUnnamed715(core.List<api.WmxSitemap> o) {
+checkUnnamed719(core.List<api.WmxSitemap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSitemap(o[0]);
   checkWmxSitemap(o[1]);
@@ -258,7 +258,7 @@
   var o = new api.SitemapsListResponse();
   buildCounterSitemapsListResponse++;
   if (buildCounterSitemapsListResponse < 3) {
-    o.sitemap = buildUnnamed715();
+    o.sitemap = buildUnnamed719();
   }
   buildCounterSitemapsListResponse--;
   return o;
@@ -267,19 +267,19 @@
 checkSitemapsListResponse(api.SitemapsListResponse o) {
   buildCounterSitemapsListResponse++;
   if (buildCounterSitemapsListResponse < 3) {
-    checkUnnamed715(o.sitemap);
+    checkUnnamed719(o.sitemap);
   }
   buildCounterSitemapsListResponse--;
 }
 
-buildUnnamed716() {
+buildUnnamed720() {
   var o = new core.List<api.WmxSite>();
   o.add(buildWmxSite());
   o.add(buildWmxSite());
   return o;
 }
 
-checkUnnamed716(core.List<api.WmxSite> o) {
+checkUnnamed720(core.List<api.WmxSite> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSite(o[0]);
   checkWmxSite(o[1]);
@@ -290,7 +290,7 @@
   var o = new api.SitesListResponse();
   buildCounterSitesListResponse++;
   if (buildCounterSitesListResponse < 3) {
-    o.siteEntry = buildUnnamed716();
+    o.siteEntry = buildUnnamed720();
   }
   buildCounterSitesListResponse--;
   return o;
@@ -299,7 +299,7 @@
 checkSitesListResponse(api.SitesListResponse o) {
   buildCounterSitesListResponse++;
   if (buildCounterSitesListResponse < 3) {
-    checkUnnamed716(o.siteEntry);
+    checkUnnamed720(o.siteEntry);
   }
   buildCounterSitesListResponse--;
 }
@@ -326,14 +326,14 @@
   buildCounterUrlCrawlErrorCount--;
 }
 
-buildUnnamed717() {
+buildUnnamed721() {
   var o = new core.List<api.UrlCrawlErrorCount>();
   o.add(buildUrlCrawlErrorCount());
   o.add(buildUrlCrawlErrorCount());
   return o;
 }
 
-checkUnnamed717(core.List<api.UrlCrawlErrorCount> o) {
+checkUnnamed721(core.List<api.UrlCrawlErrorCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorCount(o[0]);
   checkUrlCrawlErrorCount(o[1]);
@@ -345,7 +345,7 @@
   buildCounterUrlCrawlErrorCountsPerType++;
   if (buildCounterUrlCrawlErrorCountsPerType < 3) {
     o.category = "foo";
-    o.entries = buildUnnamed717();
+    o.entries = buildUnnamed721();
     o.platform = "foo";
   }
   buildCounterUrlCrawlErrorCountsPerType--;
@@ -356,20 +356,20 @@
   buildCounterUrlCrawlErrorCountsPerType++;
   if (buildCounterUrlCrawlErrorCountsPerType < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
-    checkUnnamed717(o.entries);
+    checkUnnamed721(o.entries);
     unittest.expect(o.platform, unittest.equals('foo'));
   }
   buildCounterUrlCrawlErrorCountsPerType--;
 }
 
-buildUnnamed718() {
+buildUnnamed722() {
   var o = new core.List<api.UrlCrawlErrorCountsPerType>();
   o.add(buildUrlCrawlErrorCountsPerType());
   o.add(buildUrlCrawlErrorCountsPerType());
   return o;
 }
 
-checkUnnamed718(core.List<api.UrlCrawlErrorCountsPerType> o) {
+checkUnnamed722(core.List<api.UrlCrawlErrorCountsPerType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorCountsPerType(o[0]);
   checkUrlCrawlErrorCountsPerType(o[1]);
@@ -380,7 +380,7 @@
   var o = new api.UrlCrawlErrorsCountsQueryResponse();
   buildCounterUrlCrawlErrorsCountsQueryResponse++;
   if (buildCounterUrlCrawlErrorsCountsQueryResponse < 3) {
-    o.countPerTypes = buildUnnamed718();
+    o.countPerTypes = buildUnnamed722();
   }
   buildCounterUrlCrawlErrorsCountsQueryResponse--;
   return o;
@@ -390,7 +390,7 @@
     api.UrlCrawlErrorsCountsQueryResponse o) {
   buildCounterUrlCrawlErrorsCountsQueryResponse++;
   if (buildCounterUrlCrawlErrorsCountsQueryResponse < 3) {
-    checkUnnamed718(o.countPerTypes);
+    checkUnnamed722(o.countPerTypes);
   }
   buildCounterUrlCrawlErrorsCountsQueryResponse--;
 }
@@ -424,14 +424,14 @@
   buildCounterUrlCrawlErrorsSample--;
 }
 
-buildUnnamed719() {
+buildUnnamed723() {
   var o = new core.List<api.UrlCrawlErrorsSample>();
   o.add(buildUrlCrawlErrorsSample());
   o.add(buildUrlCrawlErrorsSample());
   return o;
 }
 
-checkUnnamed719(core.List<api.UrlCrawlErrorsSample> o) {
+checkUnnamed723(core.List<api.UrlCrawlErrorsSample> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorsSample(o[0]);
   checkUrlCrawlErrorsSample(o[1]);
@@ -442,7 +442,7 @@
   var o = new api.UrlCrawlErrorsSamplesListResponse();
   buildCounterUrlCrawlErrorsSamplesListResponse++;
   if (buildCounterUrlCrawlErrorsSamplesListResponse < 3) {
-    o.urlCrawlErrorSample = buildUnnamed719();
+    o.urlCrawlErrorSample = buildUnnamed723();
   }
   buildCounterUrlCrawlErrorsSamplesListResponse--;
   return o;
@@ -452,32 +452,32 @@
     api.UrlCrawlErrorsSamplesListResponse o) {
   buildCounterUrlCrawlErrorsSamplesListResponse++;
   if (buildCounterUrlCrawlErrorsSamplesListResponse < 3) {
-    checkUnnamed719(o.urlCrawlErrorSample);
+    checkUnnamed723(o.urlCrawlErrorSample);
   }
   buildCounterUrlCrawlErrorsSamplesListResponse--;
 }
 
-buildUnnamed720() {
+buildUnnamed724() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed720(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'));
 }
 
-buildUnnamed721() {
+buildUnnamed725() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed721(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'));
@@ -488,8 +488,8 @@
   var o = new api.UrlSampleDetails();
   buildCounterUrlSampleDetails++;
   if (buildCounterUrlSampleDetails < 3) {
-    o.containingSitemaps = buildUnnamed720();
-    o.linkedFromUrls = buildUnnamed721();
+    o.containingSitemaps = buildUnnamed724();
+    o.linkedFromUrls = buildUnnamed725();
   }
   buildCounterUrlSampleDetails--;
   return o;
@@ -498,8 +498,8 @@
 checkUrlSampleDetails(api.UrlSampleDetails o) {
   buildCounterUrlSampleDetails++;
   if (buildCounterUrlSampleDetails < 3) {
-    checkUnnamed720(o.containingSitemaps);
-    checkUnnamed721(o.linkedFromUrls);
+    checkUnnamed724(o.containingSitemaps);
+    checkUnnamed725(o.linkedFromUrls);
   }
   buildCounterUrlSampleDetails--;
 }
@@ -525,14 +525,14 @@
   buildCounterWmxSite--;
 }
 
-buildUnnamed722() {
+buildUnnamed726() {
   var o = new core.List<api.WmxSitemapContent>();
   o.add(buildWmxSitemapContent());
   o.add(buildWmxSitemapContent());
   return o;
 }
 
-checkUnnamed722(core.List<api.WmxSitemapContent> o) {
+checkUnnamed726(core.List<api.WmxSitemapContent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSitemapContent(o[0]);
   checkWmxSitemapContent(o[1]);
@@ -543,7 +543,7 @@
   var o = new api.WmxSitemap();
   buildCounterWmxSitemap++;
   if (buildCounterWmxSitemap < 3) {
-    o.contents = buildUnnamed722();
+    o.contents = buildUnnamed726();
     o.errors = "foo";
     o.isPending = true;
     o.isSitemapsIndex = true;
@@ -560,7 +560,7 @@
 checkWmxSitemap(api.WmxSitemap o) {
   buildCounterWmxSitemap++;
   if (buildCounterWmxSitemap < 3) {
-    checkUnnamed722(o.contents);
+    checkUnnamed726(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 c2e90dc..c52937e 100644
--- a/generated/googleapis/test/youtube/v3_test.dart
+++ b/generated/googleapis/test/youtube/v3_test.dart
@@ -50,14 +50,14 @@
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed593() {
+buildUnnamed591() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed593(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'));
@@ -69,7 +69,7 @@
   buildCounterAccessPolicy++;
   if (buildCounterAccessPolicy < 3) {
     o.allowed = true;
-    o.exception = buildUnnamed593();
+    o.exception = buildUnnamed591();
   }
   buildCounterAccessPolicy--;
   return o;
@@ -79,7 +79,7 @@
   buildCounterAccessPolicy++;
   if (buildCounterAccessPolicy < 3) {
     unittest.expect(o.allowed, unittest.isTrue);
-    checkUnnamed593(o.exception);
+    checkUnnamed591(o.exception);
   }
   buildCounterAccessPolicy--;
 }
@@ -270,27 +270,27 @@
   buildCounterActivityContentDetailsPlaylistItem--;
 }
 
-buildUnnamed594() {
+buildUnnamed592() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed594(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'));
 }
 
-buildUnnamed595() {
+buildUnnamed593() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed595(core.List<core.String> o) {
+checkUnnamed593(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -308,8 +308,8 @@
     o.customCtaButtonText = "foo";
     o.descriptionText = "foo";
     o.destinationUrl = "foo";
-    o.forecastingUrl = buildUnnamed594();
-    o.impressionUrl = buildUnnamed595();
+    o.forecastingUrl = buildUnnamed592();
+    o.impressionUrl = buildUnnamed593();
     o.videoId = "foo";
   }
   buildCounterActivityContentDetailsPromotedItem--;
@@ -327,8 +327,8 @@
     unittest.expect(o.customCtaButtonText, unittest.equals('foo'));
     unittest.expect(o.descriptionText, unittest.equals('foo'));
     unittest.expect(o.destinationUrl, unittest.equals('foo'));
-    checkUnnamed594(o.forecastingUrl);
-    checkUnnamed595(o.impressionUrl);
+    checkUnnamed592(o.forecastingUrl);
+    checkUnnamed593(o.impressionUrl);
     unittest.expect(o.videoId, unittest.equals('foo'));
   }
   buildCounterActivityContentDetailsPromotedItem--;
@@ -424,14 +424,14 @@
   buildCounterActivityContentDetailsUpload--;
 }
 
-buildUnnamed596() {
+buildUnnamed594() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed596(core.List<api.Activity> o) {
+checkUnnamed594(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -444,7 +444,7 @@
   if (buildCounterActivityListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed596();
+    o.items = buildUnnamed594();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -461,7 +461,7 @@
   if (buildCounterActivityListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed596(o.items);
+    checkUnnamed594(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -531,14 +531,14 @@
   buildCounterCaption--;
 }
 
-buildUnnamed597() {
+buildUnnamed595() {
   var o = new core.List<api.Caption>();
   o.add(buildCaption());
   o.add(buildCaption());
   return o;
 }
 
-checkUnnamed597(core.List<api.Caption> o) {
+checkUnnamed595(core.List<api.Caption> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCaption(o[0]);
   checkCaption(o[1]);
@@ -551,7 +551,7 @@
   if (buildCounterCaptionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed597();
+    o.items = buildUnnamed595();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -564,7 +564,7 @@
   if (buildCounterCaptionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed597(o.items);
+    checkUnnamed595(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -642,14 +642,14 @@
   buildCounterCdnSettings--;
 }
 
-buildUnnamed598() {
+buildUnnamed596() {
   var o = new core.Map<core.String, api.ChannelLocalization>();
   o["x"] = buildChannelLocalization();
   o["y"] = buildChannelLocalization();
   return o;
 }
 
-checkUnnamed598(core.Map<core.String, api.ChannelLocalization> o) {
+checkUnnamed596(core.Map<core.String, api.ChannelLocalization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelLocalization(o["x"]);
   checkChannelLocalization(o["y"]);
@@ -669,7 +669,7 @@
     o.id = "foo";
     o.invideoPromotion = buildInvideoPromotion();
     o.kind = "foo";
-    o.localizations = buildUnnamed598();
+    o.localizations = buildUnnamed596();
     o.snippet = buildChannelSnippet();
     o.statistics = buildChannelStatistics();
     o.status = buildChannelStatus();
@@ -691,7 +691,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkInvideoPromotion(o.invideoPromotion);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed598(o.localizations);
+    checkUnnamed596(o.localizations);
     checkChannelSnippet(o.snippet);
     checkChannelStatistics(o.statistics);
     checkChannelStatus(o.status);
@@ -748,14 +748,14 @@
   buildCounterChannelBannerResource--;
 }
 
-buildUnnamed599() {
+buildUnnamed597() {
   var o = new core.List<api.PropertyValue>();
   o.add(buildPropertyValue());
   o.add(buildPropertyValue());
   return o;
 }
 
-checkUnnamed599(core.List<api.PropertyValue> o) {
+checkUnnamed597(core.List<api.PropertyValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyValue(o[0]);
   checkPropertyValue(o[1]);
@@ -767,7 +767,7 @@
   buildCounterChannelBrandingSettings++;
   if (buildCounterChannelBrandingSettings < 3) {
     o.channel = buildChannelSettings();
-    o.hints = buildUnnamed599();
+    o.hints = buildUnnamed597();
     o.image = buildImageSettings();
     o.watch = buildWatchSettings();
   }
@@ -779,7 +779,7 @@
   buildCounterChannelBrandingSettings++;
   if (buildCounterChannelBrandingSettings < 3) {
     checkChannelSettings(o.channel);
-    checkUnnamed599(o.hints);
+    checkUnnamed597(o.hints);
     checkImageSettings(o.image);
     checkWatchSettings(o.watch);
   }
@@ -876,14 +876,14 @@
   buildCounterChannelConversionPing--;
 }
 
-buildUnnamed600() {
+buildUnnamed598() {
   var o = new core.List<api.ChannelConversionPing>();
   o.add(buildChannelConversionPing());
   o.add(buildChannelConversionPing());
   return o;
 }
 
-checkUnnamed600(core.List<api.ChannelConversionPing> o) {
+checkUnnamed598(core.List<api.ChannelConversionPing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelConversionPing(o[0]);
   checkChannelConversionPing(o[1]);
@@ -894,7 +894,7 @@
   var o = new api.ChannelConversionPings();
   buildCounterChannelConversionPings++;
   if (buildCounterChannelConversionPings < 3) {
-    o.pings = buildUnnamed600();
+    o.pings = buildUnnamed598();
   }
   buildCounterChannelConversionPings--;
   return o;
@@ -903,19 +903,19 @@
 checkChannelConversionPings(api.ChannelConversionPings o) {
   buildCounterChannelConversionPings++;
   if (buildCounterChannelConversionPings < 3) {
-    checkUnnamed600(o.pings);
+    checkUnnamed598(o.pings);
   }
   buildCounterChannelConversionPings--;
 }
 
-buildUnnamed601() {
+buildUnnamed599() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed601(core.List<api.Channel> o) {
+checkUnnamed599(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -928,7 +928,7 @@
   if (buildCounterChannelListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed601();
+    o.items = buildUnnamed599();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -945,7 +945,7 @@
   if (buildCounterChannelListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed601(o.items);
+    checkUnnamed599(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1002,14 +1002,14 @@
   buildCounterChannelProfileDetails--;
 }
 
-buildUnnamed602() {
+buildUnnamed600() {
   var o = new core.Map<core.String, api.ChannelSectionLocalization>();
   o["x"] = buildChannelSectionLocalization();
   o["y"] = buildChannelSectionLocalization();
   return o;
 }
 
-checkUnnamed602(core.Map<core.String, api.ChannelSectionLocalization> o) {
+checkUnnamed600(core.Map<core.String, api.ChannelSectionLocalization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelSectionLocalization(o["x"]);
   checkChannelSectionLocalization(o["y"]);
@@ -1024,7 +1024,7 @@
     o.etag = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.localizations = buildUnnamed602();
+    o.localizations = buildUnnamed600();
     o.snippet = buildChannelSectionSnippet();
     o.targeting = buildChannelSectionTargeting();
   }
@@ -1039,34 +1039,34 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed602(o.localizations);
+    checkUnnamed600(o.localizations);
     checkChannelSectionSnippet(o.snippet);
     checkChannelSectionTargeting(o.targeting);
   }
   buildCounterChannelSection--;
 }
 
-buildUnnamed603() {
+buildUnnamed601() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed603(core.List<core.String> o) {
+checkUnnamed601(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed604() {
+buildUnnamed602() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed604(core.List<core.String> o) {
+checkUnnamed602(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1077,8 +1077,8 @@
   var o = new api.ChannelSectionContentDetails();
   buildCounterChannelSectionContentDetails++;
   if (buildCounterChannelSectionContentDetails < 3) {
-    o.channels = buildUnnamed603();
-    o.playlists = buildUnnamed604();
+    o.channels = buildUnnamed601();
+    o.playlists = buildUnnamed602();
   }
   buildCounterChannelSectionContentDetails--;
   return o;
@@ -1087,20 +1087,20 @@
 checkChannelSectionContentDetails(api.ChannelSectionContentDetails o) {
   buildCounterChannelSectionContentDetails++;
   if (buildCounterChannelSectionContentDetails < 3) {
-    checkUnnamed603(o.channels);
-    checkUnnamed604(o.playlists);
+    checkUnnamed601(o.channels);
+    checkUnnamed602(o.playlists);
   }
   buildCounterChannelSectionContentDetails--;
 }
 
-buildUnnamed605() {
+buildUnnamed603() {
   var o = new core.List<api.ChannelSection>();
   o.add(buildChannelSection());
   o.add(buildChannelSection());
   return o;
 }
 
-checkUnnamed605(core.List<api.ChannelSection> o) {
+checkUnnamed603(core.List<api.ChannelSection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelSection(o[0]);
   checkChannelSection(o[1]);
@@ -1113,7 +1113,7 @@
   if (buildCounterChannelSectionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed605();
+    o.items = buildUnnamed603();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -1126,7 +1126,7 @@
   if (buildCounterChannelSectionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed605(o.items);
+    checkUnnamed603(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -1183,6 +1183,32 @@
   buildCounterChannelSectionSnippet--;
 }
 
+buildUnnamed604() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed604(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed605() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
 buildUnnamed606() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1196,6 +1222,29 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+core.int buildCounterChannelSectionTargeting = 0;
+buildChannelSectionTargeting() {
+  var o = new api.ChannelSectionTargeting();
+  buildCounterChannelSectionTargeting++;
+  if (buildCounterChannelSectionTargeting < 3) {
+    o.countries = buildUnnamed604();
+    o.languages = buildUnnamed605();
+    o.regions = buildUnnamed606();
+  }
+  buildCounterChannelSectionTargeting--;
+  return o;
+}
+
+checkChannelSectionTargeting(api.ChannelSectionTargeting o) {
+  buildCounterChannelSectionTargeting++;
+  if (buildCounterChannelSectionTargeting < 3) {
+    checkUnnamed604(o.countries);
+    checkUnnamed605(o.languages);
+    checkUnnamed606(o.regions);
+  }
+  buildCounterChannelSectionTargeting--;
+}
+
 buildUnnamed607() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1209,55 +1258,6 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed608() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return 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'));
-}
-
-core.int buildCounterChannelSectionTargeting = 0;
-buildChannelSectionTargeting() {
-  var o = new api.ChannelSectionTargeting();
-  buildCounterChannelSectionTargeting++;
-  if (buildCounterChannelSectionTargeting < 3) {
-    o.countries = buildUnnamed606();
-    o.languages = buildUnnamed607();
-    o.regions = buildUnnamed608();
-  }
-  buildCounterChannelSectionTargeting--;
-  return o;
-}
-
-checkChannelSectionTargeting(api.ChannelSectionTargeting o) {
-  buildCounterChannelSectionTargeting++;
-  if (buildCounterChannelSectionTargeting < 3) {
-    checkUnnamed606(o.countries);
-    checkUnnamed607(o.languages);
-    checkUnnamed608(o.regions);
-  }
-  buildCounterChannelSectionTargeting--;
-}
-
-buildUnnamed609() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed609(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterChannelSettings = 0;
 buildChannelSettings() {
   var o = new api.ChannelSettings();
@@ -1268,7 +1268,7 @@
     o.defaultTab = "foo";
     o.description = "foo";
     o.featuredChannelsTitle = "foo";
-    o.featuredChannelsUrls = buildUnnamed609();
+    o.featuredChannelsUrls = buildUnnamed607();
     o.keywords = "foo";
     o.moderateComments = true;
     o.profileColor = "foo";
@@ -1290,7 +1290,7 @@
     unittest.expect(o.defaultTab, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.featuredChannelsTitle, unittest.equals('foo'));
-    checkUnnamed609(o.featuredChannelsUrls);
+    checkUnnamed607(o.featuredChannelsUrls);
     unittest.expect(o.keywords, unittest.equals('foo'));
     unittest.expect(o.moderateComments, unittest.isTrue);
     unittest.expect(o.profileColor, unittest.equals('foo'));
@@ -1387,27 +1387,27 @@
   buildCounterChannelStatus--;
 }
 
-buildUnnamed610() {
+buildUnnamed608() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed610(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'));
 }
 
-buildUnnamed611() {
+buildUnnamed609() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed611(core.List<core.String> o) {
+checkUnnamed609(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1418,8 +1418,8 @@
   var o = new api.ChannelTopicDetails();
   buildCounterChannelTopicDetails++;
   if (buildCounterChannelTopicDetails < 3) {
-    o.topicCategories = buildUnnamed610();
-    o.topicIds = buildUnnamed611();
+    o.topicCategories = buildUnnamed608();
+    o.topicIds = buildUnnamed609();
   }
   buildCounterChannelTopicDetails--;
   return o;
@@ -1428,8 +1428,8 @@
 checkChannelTopicDetails(api.ChannelTopicDetails o) {
   buildCounterChannelTopicDetails++;
   if (buildCounterChannelTopicDetails < 3) {
-    checkUnnamed610(o.topicCategories);
-    checkUnnamed611(o.topicIds);
+    checkUnnamed608(o.topicCategories);
+    checkUnnamed609(o.topicIds);
   }
   buildCounterChannelTopicDetails--;
 }
@@ -1459,14 +1459,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed612() {
+buildUnnamed610() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed612(core.List<api.Comment> o) {
+checkUnnamed610(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -1479,7 +1479,7 @@
   if (buildCounterCommentListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed612();
+    o.items = buildUnnamed610();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1495,7 +1495,7 @@
   if (buildCounterCommentListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed612(o.items);
+    checkUnnamed610(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1589,14 +1589,14 @@
   buildCounterCommentThread--;
 }
 
-buildUnnamed613() {
+buildUnnamed611() {
   var o = new core.List<api.CommentThread>();
   o.add(buildCommentThread());
   o.add(buildCommentThread());
   return o;
 }
 
-checkUnnamed613(core.List<api.CommentThread> o) {
+checkUnnamed611(core.List<api.CommentThread> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentThread(o[0]);
   checkCommentThread(o[1]);
@@ -1609,7 +1609,7 @@
   if (buildCounterCommentThreadListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed613();
+    o.items = buildUnnamed611();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1625,7 +1625,7 @@
   if (buildCounterCommentThreadListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed613(o.items);
+    checkUnnamed611(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1635,14 +1635,14 @@
   buildCounterCommentThreadListResponse--;
 }
 
-buildUnnamed614() {
+buildUnnamed612() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed614(core.List<api.Comment> o) {
+checkUnnamed612(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -1653,7 +1653,7 @@
   var o = new api.CommentThreadReplies();
   buildCounterCommentThreadReplies++;
   if (buildCounterCommentThreadReplies < 3) {
-    o.comments = buildUnnamed614();
+    o.comments = buildUnnamed612();
   }
   buildCounterCommentThreadReplies--;
   return o;
@@ -1662,7 +1662,7 @@
 checkCommentThreadReplies(api.CommentThreadReplies o) {
   buildCounterCommentThreadReplies++;
   if (buildCounterCommentThreadReplies < 3) {
-    checkUnnamed614(o.comments);
+    checkUnnamed612(o.comments);
   }
   buildCounterCommentThreadReplies--;
 }
@@ -1696,27 +1696,27 @@
   buildCounterCommentThreadSnippet--;
 }
 
-buildUnnamed615() {
+buildUnnamed613() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed615(core.List<core.String> o) {
+checkUnnamed613(core.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() {
+buildUnnamed614() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed616(core.List<core.String> o) {
+checkUnnamed614(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1747,7 +1747,7 @@
     o.cscfRating = "foo";
     o.czfilmRating = "foo";
     o.djctqRating = "foo";
-    o.djctqRatingReasons = buildUnnamed615();
+    o.djctqRatingReasons = buildUnnamed613();
     o.ecbmctRating = "foo";
     o.eefilmRating = "foo";
     o.egfilmRating = "foo";
@@ -1756,7 +1756,7 @@
     o.fcoRating = "foo";
     o.fmocRating = "foo";
     o.fpbRating = "foo";
-    o.fpbRatingReasons = buildUnnamed616();
+    o.fpbRatingReasons = buildUnnamed614();
     o.fskRating = "foo";
     o.grfilmRating = "foo";
     o.icaaRating = "foo";
@@ -1825,7 +1825,7 @@
     unittest.expect(o.cscfRating, unittest.equals('foo'));
     unittest.expect(o.czfilmRating, unittest.equals('foo'));
     unittest.expect(o.djctqRating, unittest.equals('foo'));
-    checkUnnamed615(o.djctqRatingReasons);
+    checkUnnamed613(o.djctqRatingReasons);
     unittest.expect(o.ecbmctRating, unittest.equals('foo'));
     unittest.expect(o.eefilmRating, unittest.equals('foo'));
     unittest.expect(o.egfilmRating, unittest.equals('foo'));
@@ -1834,7 +1834,7 @@
     unittest.expect(o.fcoRating, unittest.equals('foo'));
     unittest.expect(o.fmocRating, unittest.equals('foo'));
     unittest.expect(o.fpbRating, unittest.equals('foo'));
-    checkUnnamed616(o.fpbRatingReasons);
+    checkUnnamed614(o.fpbRatingReasons);
     unittest.expect(o.fskRating, unittest.equals('foo'));
     unittest.expect(o.grfilmRating, unittest.equals('foo'));
     unittest.expect(o.icaaRating, unittest.equals('foo'));
@@ -1904,14 +1904,14 @@
   buildCounterFanFundingEvent--;
 }
 
-buildUnnamed617() {
+buildUnnamed615() {
   var o = new core.List<api.FanFundingEvent>();
   o.add(buildFanFundingEvent());
   o.add(buildFanFundingEvent());
   return o;
 }
 
-checkUnnamed617(core.List<api.FanFundingEvent> o) {
+checkUnnamed615(core.List<api.FanFundingEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFanFundingEvent(o[0]);
   checkFanFundingEvent(o[1]);
@@ -1924,7 +1924,7 @@
   if (buildCounterFanFundingEventListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed617();
+    o.items = buildUnnamed615();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1940,7 +1940,7 @@
   if (buildCounterFanFundingEventListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed617(o.items);
+    checkUnnamed615(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2030,14 +2030,14 @@
   buildCounterGuideCategory--;
 }
 
-buildUnnamed618() {
+buildUnnamed616() {
   var o = new core.List<api.GuideCategory>();
   o.add(buildGuideCategory());
   o.add(buildGuideCategory());
   return o;
 }
 
-checkUnnamed618(core.List<api.GuideCategory> o) {
+checkUnnamed616(core.List<api.GuideCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGuideCategory(o[0]);
   checkGuideCategory(o[1]);
@@ -2050,7 +2050,7 @@
   if (buildCounterGuideCategoryListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed618();
+    o.items = buildUnnamed616();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2067,7 +2067,7 @@
   if (buildCounterGuideCategoryListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed618(o.items);
+    checkUnnamed616(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2124,14 +2124,14 @@
   buildCounterI18nLanguage--;
 }
 
-buildUnnamed619() {
+buildUnnamed617() {
   var o = new core.List<api.I18nLanguage>();
   o.add(buildI18nLanguage());
   o.add(buildI18nLanguage());
   return o;
 }
 
-checkUnnamed619(core.List<api.I18nLanguage> o) {
+checkUnnamed617(core.List<api.I18nLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkI18nLanguage(o[0]);
   checkI18nLanguage(o[1]);
@@ -2144,7 +2144,7 @@
   if (buildCounterI18nLanguageListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed619();
+    o.items = buildUnnamed617();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -2157,7 +2157,7 @@
   if (buildCounterI18nLanguageListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed619(o.items);
+    checkUnnamed617(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -2210,14 +2210,14 @@
   buildCounterI18nRegion--;
 }
 
-buildUnnamed620() {
+buildUnnamed618() {
   var o = new core.List<api.I18nRegion>();
   o.add(buildI18nRegion());
   o.add(buildI18nRegion());
   return o;
 }
 
-checkUnnamed620(core.List<api.I18nRegion> o) {
+checkUnnamed618(core.List<api.I18nRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkI18nRegion(o[0]);
   checkI18nRegion(o[1]);
@@ -2230,7 +2230,7 @@
   if (buildCounterI18nRegionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed620();
+    o.items = buildUnnamed618();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -2243,7 +2243,7 @@
   if (buildCounterI18nRegionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed620(o.items);
+    checkUnnamed618(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -2403,14 +2403,14 @@
   buildCounterInvideoPosition--;
 }
 
-buildUnnamed621() {
+buildUnnamed619() {
   var o = new core.List<api.PromotedItem>();
   o.add(buildPromotedItem());
   o.add(buildPromotedItem());
   return o;
 }
 
-checkUnnamed621(core.List<api.PromotedItem> o) {
+checkUnnamed619(core.List<api.PromotedItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotedItem(o[0]);
   checkPromotedItem(o[1]);
@@ -2422,7 +2422,7 @@
   buildCounterInvideoPromotion++;
   if (buildCounterInvideoPromotion < 3) {
     o.defaultTiming = buildInvideoTiming();
-    o.items = buildUnnamed621();
+    o.items = buildUnnamed619();
     o.position = buildInvideoPosition();
     o.useSmartTiming = true;
   }
@@ -2434,7 +2434,7 @@
   buildCounterInvideoPromotion++;
   if (buildCounterInvideoPromotion < 3) {
     checkInvideoTiming(o.defaultTiming);
-    checkUnnamed621(o.items);
+    checkUnnamed619(o.items);
     checkInvideoPosition(o.position);
     unittest.expect(o.useSmartTiming, unittest.isTrue);
   }
@@ -2562,14 +2562,14 @@
   buildCounterLiveBroadcastContentDetails--;
 }
 
-buildUnnamed622() {
+buildUnnamed620() {
   var o = new core.List<api.LiveBroadcast>();
   o.add(buildLiveBroadcast());
   o.add(buildLiveBroadcast());
   return o;
 }
 
-checkUnnamed622(core.List<api.LiveBroadcast> o) {
+checkUnnamed620(core.List<api.LiveBroadcast> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveBroadcast(o[0]);
   checkLiveBroadcast(o[1]);
@@ -2582,7 +2582,7 @@
   if (buildCounterLiveBroadcastListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed622();
+    o.items = buildUnnamed620();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2599,7 +2599,7 @@
   if (buildCounterLiveBroadcastListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed622(o.items);
+    checkUnnamed620(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2854,14 +2854,14 @@
   buildCounterLiveChatMessageDeletedDetails--;
 }
 
-buildUnnamed623() {
+buildUnnamed621() {
   var o = new core.List<api.LiveChatMessage>();
   o.add(buildLiveChatMessage());
   o.add(buildLiveChatMessage());
   return o;
 }
 
-checkUnnamed623(core.List<api.LiveChatMessage> o) {
+checkUnnamed621(core.List<api.LiveChatMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveChatMessage(o[0]);
   checkLiveChatMessage(o[1]);
@@ -2874,7 +2874,7 @@
   if (buildCounterLiveChatMessageListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed623();
+    o.items = buildUnnamed621();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.offlineAt = core.DateTime.parse("2002-02-27T14:01:02");
@@ -2892,7 +2892,7 @@
   if (buildCounterLiveChatMessageListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed623(o.items);
+    checkUnnamed621(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.offlineAt,
@@ -2999,14 +2999,14 @@
   buildCounterLiveChatModerator--;
 }
 
-buildUnnamed624() {
+buildUnnamed622() {
   var o = new core.List<api.LiveChatModerator>();
   o.add(buildLiveChatModerator());
   o.add(buildLiveChatModerator());
   return o;
 }
 
-checkUnnamed624(core.List<api.LiveChatModerator> o) {
+checkUnnamed622(core.List<api.LiveChatModerator> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveChatModerator(o[0]);
   checkLiveChatModerator(o[1]);
@@ -3019,7 +3019,7 @@
   if (buildCounterLiveChatModeratorListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed624();
+    o.items = buildUnnamed622();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3036,7 +3036,7 @@
   if (buildCounterLiveChatModeratorListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed624(o.items);
+    checkUnnamed622(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3087,14 +3087,14 @@
   buildCounterLiveChatPollClosedDetails--;
 }
 
-buildUnnamed625() {
+buildUnnamed623() {
   var o = new core.List<api.LiveChatPollItem>();
   o.add(buildLiveChatPollItem());
   o.add(buildLiveChatPollItem());
   return o;
 }
 
-checkUnnamed625(core.List<api.LiveChatPollItem> o) {
+checkUnnamed623(core.List<api.LiveChatPollItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveChatPollItem(o[0]);
   checkLiveChatPollItem(o[1]);
@@ -3106,7 +3106,7 @@
   buildCounterLiveChatPollEditedDetails++;
   if (buildCounterLiveChatPollEditedDetails < 3) {
     o.id = "foo";
-    o.items = buildUnnamed625();
+    o.items = buildUnnamed623();
     o.prompt = "foo";
   }
   buildCounterLiveChatPollEditedDetails--;
@@ -3117,7 +3117,7 @@
   buildCounterLiveChatPollEditedDetails++;
   if (buildCounterLiveChatPollEditedDetails < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed625(o.items);
+    checkUnnamed623(o.items);
     unittest.expect(o.prompt, unittest.equals('foo'));
   }
   buildCounterLiveChatPollEditedDetails--;
@@ -3144,14 +3144,14 @@
   buildCounterLiveChatPollItem--;
 }
 
-buildUnnamed626() {
+buildUnnamed624() {
   var o = new core.List<api.LiveChatPollItem>();
   o.add(buildLiveChatPollItem());
   o.add(buildLiveChatPollItem());
   return o;
 }
 
-checkUnnamed626(core.List<api.LiveChatPollItem> o) {
+checkUnnamed624(core.List<api.LiveChatPollItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveChatPollItem(o[0]);
   checkLiveChatPollItem(o[1]);
@@ -3163,7 +3163,7 @@
   buildCounterLiveChatPollOpenedDetails++;
   if (buildCounterLiveChatPollOpenedDetails < 3) {
     o.id = "foo";
-    o.items = buildUnnamed626();
+    o.items = buildUnnamed624();
     o.prompt = "foo";
   }
   buildCounterLiveChatPollOpenedDetails--;
@@ -3174,7 +3174,7 @@
   buildCounterLiveChatPollOpenedDetails++;
   if (buildCounterLiveChatPollOpenedDetails < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed626(o.items);
+    checkUnnamed624(o.items);
     unittest.expect(o.prompt, unittest.equals('foo'));
   }
   buildCounterLiveChatPollOpenedDetails--;
@@ -3347,14 +3347,14 @@
   buildCounterLiveStreamContentDetails--;
 }
 
-buildUnnamed627() {
+buildUnnamed625() {
   var o = new core.List<api.LiveStreamConfigurationIssue>();
   o.add(buildLiveStreamConfigurationIssue());
   o.add(buildLiveStreamConfigurationIssue());
   return o;
 }
 
-checkUnnamed627(core.List<api.LiveStreamConfigurationIssue> o) {
+checkUnnamed625(core.List<api.LiveStreamConfigurationIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveStreamConfigurationIssue(o[0]);
   checkLiveStreamConfigurationIssue(o[1]);
@@ -3365,7 +3365,7 @@
   var o = new api.LiveStreamHealthStatus();
   buildCounterLiveStreamHealthStatus++;
   if (buildCounterLiveStreamHealthStatus < 3) {
-    o.configurationIssues = buildUnnamed627();
+    o.configurationIssues = buildUnnamed625();
     o.lastUpdateTimeSeconds = "foo";
     o.status = "foo";
   }
@@ -3376,21 +3376,21 @@
 checkLiveStreamHealthStatus(api.LiveStreamHealthStatus o) {
   buildCounterLiveStreamHealthStatus++;
   if (buildCounterLiveStreamHealthStatus < 3) {
-    checkUnnamed627(o.configurationIssues);
+    checkUnnamed625(o.configurationIssues);
     unittest.expect(o.lastUpdateTimeSeconds, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterLiveStreamHealthStatus--;
 }
 
-buildUnnamed628() {
+buildUnnamed626() {
   var o = new core.List<api.LiveStream>();
   o.add(buildLiveStream());
   o.add(buildLiveStream());
   return o;
 }
 
-checkUnnamed628(core.List<api.LiveStream> o) {
+checkUnnamed626(core.List<api.LiveStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveStream(o[0]);
   checkLiveStream(o[1]);
@@ -3403,7 +3403,7 @@
   if (buildCounterLiveStreamListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed628();
+    o.items = buildUnnamed626();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3420,7 +3420,7 @@
   if (buildCounterLiveStreamListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed628(o.items);
+    checkUnnamed626(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3480,14 +3480,14 @@
   buildCounterLiveStreamStatus--;
 }
 
-buildUnnamed629() {
+buildUnnamed627() {
   var o = new core.List<api.LocalizedString>();
   o.add(buildLocalizedString());
   o.add(buildLocalizedString());
   return o;
 }
 
-checkUnnamed629(core.List<api.LocalizedString> o) {
+checkUnnamed627(core.List<api.LocalizedString> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocalizedString(o[0]);
   checkLocalizedString(o[1]);
@@ -3500,7 +3500,7 @@
   if (buildCounterLocalizedProperty < 3) {
     o.default_ = "foo";
     o.defaultLanguage = buildLanguageTag();
-    o.localized = buildUnnamed629();
+    o.localized = buildUnnamed627();
   }
   buildCounterLocalizedProperty--;
   return o;
@@ -3511,7 +3511,7 @@
   if (buildCounterLocalizedProperty < 3) {
     unittest.expect(o.default_, unittest.equals('foo'));
     checkLanguageTag(o.defaultLanguage);
-    checkUnnamed629(o.localized);
+    checkUnnamed627(o.localized);
   }
   buildCounterLocalizedProperty--;
 }
@@ -3581,14 +3581,14 @@
   buildCounterPageInfo--;
 }
 
-buildUnnamed630() {
+buildUnnamed628() {
   var o = new core.Map<core.String, api.PlaylistLocalization>();
   o["x"] = buildPlaylistLocalization();
   o["y"] = buildPlaylistLocalization();
   return o;
 }
 
-checkUnnamed630(core.Map<core.String, api.PlaylistLocalization> o) {
+checkUnnamed628(core.Map<core.String, api.PlaylistLocalization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylistLocalization(o["x"]);
   checkPlaylistLocalization(o["y"]);
@@ -3603,7 +3603,7 @@
     o.etag = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.localizations = buildUnnamed630();
+    o.localizations = buildUnnamed628();
     o.player = buildPlaylistPlayer();
     o.snippet = buildPlaylistSnippet();
     o.status = buildPlaylistStatus();
@@ -3619,7 +3619,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed630(o.localizations);
+    checkUnnamed628(o.localizations);
     checkPlaylistPlayer(o.player);
     checkPlaylistSnippet(o.snippet);
     checkPlaylistStatus(o.status);
@@ -3703,14 +3703,14 @@
   buildCounterPlaylistItemContentDetails--;
 }
 
-buildUnnamed631() {
+buildUnnamed629() {
   var o = new core.List<api.PlaylistItem>();
   o.add(buildPlaylistItem());
   o.add(buildPlaylistItem());
   return o;
 }
 
-checkUnnamed631(core.List<api.PlaylistItem> o) {
+checkUnnamed629(core.List<api.PlaylistItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylistItem(o[0]);
   checkPlaylistItem(o[1]);
@@ -3723,7 +3723,7 @@
   if (buildCounterPlaylistItemListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed631();
+    o.items = buildUnnamed629();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3740,7 +3740,7 @@
   if (buildCounterPlaylistItemListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed631(o.items);
+    checkUnnamed629(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3806,14 +3806,14 @@
   buildCounterPlaylistItemStatus--;
 }
 
-buildUnnamed632() {
+buildUnnamed630() {
   var o = new core.List<api.Playlist>();
   o.add(buildPlaylist());
   o.add(buildPlaylist());
   return o;
 }
 
-checkUnnamed632(core.List<api.Playlist> o) {
+checkUnnamed630(core.List<api.Playlist> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylist(o[0]);
   checkPlaylist(o[1]);
@@ -3826,7 +3826,7 @@
   if (buildCounterPlaylistListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed632();
+    o.items = buildUnnamed630();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3843,7 +3843,7 @@
   if (buildCounterPlaylistListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed632(o.items);
+    checkUnnamed630(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3894,14 +3894,14 @@
   buildCounterPlaylistPlayer--;
 }
 
-buildUnnamed633() {
+buildUnnamed631() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed633(core.List<core.String> o) {
+checkUnnamed631(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3918,7 +3918,7 @@
     o.description = "foo";
     o.localized = buildPlaylistLocalization();
     o.publishedAt = core.DateTime.parse("2002-02-27T14:01:02");
-    o.tags = buildUnnamed633();
+    o.tags = buildUnnamed631();
     o.thumbnails = buildThumbnailDetails();
     o.title = "foo";
   }
@@ -3936,7 +3936,7 @@
     checkPlaylistLocalization(o.localized);
     unittest.expect(o.publishedAt,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed633(o.tags);
+    checkUnnamed631(o.tags);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -4058,14 +4058,14 @@
   buildCounterResourceId--;
 }
 
-buildUnnamed634() {
+buildUnnamed632() {
   var o = new core.List<api.SearchResult>();
   o.add(buildSearchResult());
   o.add(buildSearchResult());
   return o;
 }
 
-checkUnnamed634(core.List<api.SearchResult> o) {
+checkUnnamed632(core.List<api.SearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSearchResult(o[0]);
   checkSearchResult(o[1]);
@@ -4078,7 +4078,7 @@
   if (buildCounterSearchListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed634();
+    o.items = buildUnnamed632();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -4096,7 +4096,7 @@
   if (buildCounterSearchListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed634(o.items);
+    checkUnnamed632(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -4190,14 +4190,14 @@
   buildCounterSponsor--;
 }
 
-buildUnnamed635() {
+buildUnnamed633() {
   var o = new core.List<api.Sponsor>();
   o.add(buildSponsor());
   o.add(buildSponsor());
   return o;
 }
 
-checkUnnamed635(core.List<api.Sponsor> o) {
+checkUnnamed633(core.List<api.Sponsor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSponsor(o[0]);
   checkSponsor(o[1]);
@@ -4210,7 +4210,7 @@
   if (buildCounterSponsorListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed635();
+    o.items = buildUnnamed633();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -4226,7 +4226,7 @@
   if (buildCounterSponsorListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed635(o.items);
+    checkUnnamed633(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -4312,14 +4312,14 @@
   buildCounterSubscriptionContentDetails--;
 }
 
-buildUnnamed636() {
+buildUnnamed634() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed636(core.List<api.Subscription> o) {
+checkUnnamed634(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -4332,7 +4332,7 @@
   if (buildCounterSubscriptionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed636();
+    o.items = buildUnnamed634();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -4349,7 +4349,7 @@
   if (buildCounterSubscriptionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed636(o.items);
+    checkUnnamed634(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -4442,14 +4442,14 @@
   buildCounterSuperChatEvent--;
 }
 
-buildUnnamed637() {
+buildUnnamed635() {
   var o = new core.List<api.SuperChatEvent>();
   o.add(buildSuperChatEvent());
   o.add(buildSuperChatEvent());
   return o;
 }
 
-checkUnnamed637(core.List<api.SuperChatEvent> o) {
+checkUnnamed635(core.List<api.SuperChatEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSuperChatEvent(o[0]);
   checkSuperChatEvent(o[1]);
@@ -4462,7 +4462,7 @@
   if (buildCounterSuperChatEventListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed637();
+    o.items = buildUnnamed635();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -4478,7 +4478,7 @@
   if (buildCounterSuperChatEventListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed637(o.items);
+    checkUnnamed635(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -4572,14 +4572,14 @@
   buildCounterThumbnailDetails--;
 }
 
-buildUnnamed638() {
+buildUnnamed636() {
   var o = new core.List<api.ThumbnailDetails>();
   o.add(buildThumbnailDetails());
   o.add(buildThumbnailDetails());
   return o;
 }
 
-checkUnnamed638(core.List<api.ThumbnailDetails> o) {
+checkUnnamed636(core.List<api.ThumbnailDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThumbnailDetails(o[0]);
   checkThumbnailDetails(o[1]);
@@ -4592,7 +4592,7 @@
   if (buildCounterThumbnailSetResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed638();
+    o.items = buildUnnamed636();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -4605,7 +4605,7 @@
   if (buildCounterThumbnailSetResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed638(o.items);
+    checkUnnamed636(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -4627,14 +4627,14 @@
   buildCounterTokenPagination--;
 }
 
-buildUnnamed639() {
+buildUnnamed637() {
   var o = new core.Map<core.String, api.VideoLocalization>();
   o["x"] = buildVideoLocalization();
   o["y"] = buildVideoLocalization();
   return o;
 }
 
-checkUnnamed639(core.Map<core.String, api.VideoLocalization> o) {
+checkUnnamed637(core.Map<core.String, api.VideoLocalization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoLocalization(o["x"]);
   checkVideoLocalization(o["y"]);
@@ -4645,7 +4645,6 @@
   var o = new api.Video();
   buildCounterVideo++;
   if (buildCounterVideo < 3) {
-    o.accessToken = "foo";
     o.ageGating = buildVideoAgeGating();
     o.contentDetails = buildVideoContentDetails();
     o.etag = "foo";
@@ -4653,7 +4652,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.liveStreamingDetails = buildVideoLiveStreamingDetails();
-    o.localizations = buildUnnamed639();
+    o.localizations = buildUnnamed637();
     o.monetizationDetails = buildVideoMonetizationDetails();
     o.player = buildVideoPlayer();
     o.processingDetails = buildVideoProcessingDetails();
@@ -4672,7 +4671,6 @@
 checkVideo(api.Video o) {
   buildCounterVideo++;
   if (buildCounterVideo < 3) {
-    unittest.expect(o.accessToken, unittest.equals('foo'));
     checkVideoAgeGating(o.ageGating);
     checkVideoContentDetails(o.contentDetails);
     unittest.expect(o.etag, unittest.equals('foo'));
@@ -4680,7 +4678,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkVideoLiveStreamingDetails(o.liveStreamingDetails);
-    checkUnnamed639(o.localizations);
+    checkUnnamed637(o.localizations);
     checkVideoMonetizationDetails(o.monetizationDetails);
     checkVideoPlayer(o.player);
     checkVideoProcessingDetails(o.processingDetails);
@@ -4747,14 +4745,14 @@
   buildCounterVideoAbuseReportReason--;
 }
 
-buildUnnamed640() {
+buildUnnamed638() {
   var o = new core.List<api.VideoAbuseReportReason>();
   o.add(buildVideoAbuseReportReason());
   o.add(buildVideoAbuseReportReason());
   return o;
 }
 
-checkUnnamed640(core.List<api.VideoAbuseReportReason> o) {
+checkUnnamed638(core.List<api.VideoAbuseReportReason> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoAbuseReportReason(o[0]);
   checkVideoAbuseReportReason(o[1]);
@@ -4767,7 +4765,7 @@
   if (buildCounterVideoAbuseReportReasonListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed640();
+    o.items = buildUnnamed638();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -4781,21 +4779,21 @@
   if (buildCounterVideoAbuseReportReasonListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed640(o.items);
+    checkUnnamed638(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterVideoAbuseReportReasonListResponse--;
 }
 
-buildUnnamed641() {
+buildUnnamed639() {
   var o = new core.List<api.VideoAbuseReportSecondaryReason>();
   o.add(buildVideoAbuseReportSecondaryReason());
   o.add(buildVideoAbuseReportSecondaryReason());
   return o;
 }
 
-checkUnnamed641(core.List<api.VideoAbuseReportSecondaryReason> o) {
+checkUnnamed639(core.List<api.VideoAbuseReportSecondaryReason> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoAbuseReportSecondaryReason(o[0]);
   checkVideoAbuseReportSecondaryReason(o[1]);
@@ -4807,7 +4805,7 @@
   buildCounterVideoAbuseReportReasonSnippet++;
   if (buildCounterVideoAbuseReportReasonSnippet < 3) {
     o.label = "foo";
-    o.secondaryReasons = buildUnnamed641();
+    o.secondaryReasons = buildUnnamed639();
   }
   buildCounterVideoAbuseReportReasonSnippet--;
   return o;
@@ -4817,7 +4815,7 @@
   buildCounterVideoAbuseReportReasonSnippet++;
   if (buildCounterVideoAbuseReportReasonSnippet < 3) {
     unittest.expect(o.label, unittest.equals('foo'));
-    checkUnnamed641(o.secondaryReasons);
+    checkUnnamed639(o.secondaryReasons);
   }
   buildCounterVideoAbuseReportReasonSnippet--;
 }
@@ -4891,14 +4889,14 @@
   buildCounterVideoCategory--;
 }
 
-buildUnnamed642() {
+buildUnnamed640() {
   var o = new core.List<api.VideoCategory>();
   o.add(buildVideoCategory());
   o.add(buildVideoCategory());
   return o;
 }
 
-checkUnnamed642(core.List<api.VideoCategory> o) {
+checkUnnamed640(core.List<api.VideoCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoCategory(o[0]);
   checkVideoCategory(o[1]);
@@ -4911,7 +4909,7 @@
   if (buildCounterVideoCategoryListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed642();
+    o.items = buildUnnamed640();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -4928,7 +4926,7 @@
   if (buildCounterVideoCategoryListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed642(o.items);
+    checkUnnamed640(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -4999,27 +4997,27 @@
   buildCounterVideoContentDetails--;
 }
 
-buildUnnamed643() {
+buildUnnamed641() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed643(core.List<core.String> o) {
+checkUnnamed641(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed644() {
+buildUnnamed642() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed644(core.List<core.String> o) {
+checkUnnamed642(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5030,8 +5028,8 @@
   var o = new api.VideoContentDetailsRegionRestriction();
   buildCounterVideoContentDetailsRegionRestriction++;
   if (buildCounterVideoContentDetailsRegionRestriction < 3) {
-    o.allowed = buildUnnamed643();
-    o.blocked = buildUnnamed644();
+    o.allowed = buildUnnamed641();
+    o.blocked = buildUnnamed642();
   }
   buildCounterVideoContentDetailsRegionRestriction--;
   return o;
@@ -5041,33 +5039,33 @@
     api.VideoContentDetailsRegionRestriction o) {
   buildCounterVideoContentDetailsRegionRestriction++;
   if (buildCounterVideoContentDetailsRegionRestriction < 3) {
-    checkUnnamed643(o.allowed);
-    checkUnnamed644(o.blocked);
+    checkUnnamed641(o.allowed);
+    checkUnnamed642(o.blocked);
   }
   buildCounterVideoContentDetailsRegionRestriction--;
 }
 
-buildUnnamed645() {
+buildUnnamed643() {
   var o = new core.List<api.VideoFileDetailsAudioStream>();
   o.add(buildVideoFileDetailsAudioStream());
   o.add(buildVideoFileDetailsAudioStream());
   return o;
 }
 
-checkUnnamed645(core.List<api.VideoFileDetailsAudioStream> o) {
+checkUnnamed643(core.List<api.VideoFileDetailsAudioStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFileDetailsAudioStream(o[0]);
   checkVideoFileDetailsAudioStream(o[1]);
 }
 
-buildUnnamed646() {
+buildUnnamed644() {
   var o = new core.List<api.VideoFileDetailsVideoStream>();
   o.add(buildVideoFileDetailsVideoStream());
   o.add(buildVideoFileDetailsVideoStream());
   return o;
 }
 
-checkUnnamed646(core.List<api.VideoFileDetailsVideoStream> o) {
+checkUnnamed644(core.List<api.VideoFileDetailsVideoStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFileDetailsVideoStream(o[0]);
   checkVideoFileDetailsVideoStream(o[1]);
@@ -5078,7 +5076,7 @@
   var o = new api.VideoFileDetails();
   buildCounterVideoFileDetails++;
   if (buildCounterVideoFileDetails < 3) {
-    o.audioStreams = buildUnnamed645();
+    o.audioStreams = buildUnnamed643();
     o.bitrateBps = "foo";
     o.container = "foo";
     o.creationTime = "foo";
@@ -5086,7 +5084,7 @@
     o.fileName = "foo";
     o.fileSize = "foo";
     o.fileType = "foo";
-    o.videoStreams = buildUnnamed646();
+    o.videoStreams = buildUnnamed644();
   }
   buildCounterVideoFileDetails--;
   return o;
@@ -5095,7 +5093,7 @@
 checkVideoFileDetails(api.VideoFileDetails o) {
   buildCounterVideoFileDetails++;
   if (buildCounterVideoFileDetails < 3) {
-    checkUnnamed645(o.audioStreams);
+    checkUnnamed643(o.audioStreams);
     unittest.expect(o.bitrateBps, unittest.equals('foo'));
     unittest.expect(o.container, unittest.equals('foo'));
     unittest.expect(o.creationTime, unittest.equals('foo'));
@@ -5103,7 +5101,7 @@
     unittest.expect(o.fileName, unittest.equals('foo'));
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.fileType, unittest.equals('foo'));
-    checkUnnamed646(o.videoStreams);
+    checkUnnamed644(o.videoStreams);
   }
   buildCounterVideoFileDetails--;
 }
@@ -5166,14 +5164,14 @@
   buildCounterVideoFileDetailsVideoStream--;
 }
 
-buildUnnamed647() {
+buildUnnamed645() {
   var o = new core.List<api.VideoRating>();
   o.add(buildVideoRating());
   o.add(buildVideoRating());
   return o;
 }
 
-checkUnnamed647(core.List<api.VideoRating> o) {
+checkUnnamed645(core.List<api.VideoRating> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoRating(o[0]);
   checkVideoRating(o[1]);
@@ -5186,7 +5184,7 @@
   if (buildCounterVideoGetRatingResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed647();
+    o.items = buildUnnamed645();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -5199,21 +5197,21 @@
   if (buildCounterVideoGetRatingResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed647(o.items);
+    checkUnnamed645(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterVideoGetRatingResponse--;
 }
 
-buildUnnamed648() {
+buildUnnamed646() {
   var o = new core.List<api.Video>();
   o.add(buildVideo());
   o.add(buildVideo());
   return o;
 }
 
-checkUnnamed648(core.List<api.Video> o) {
+checkUnnamed646(core.List<api.Video> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideo(o[0]);
   checkVideo(o[1]);
@@ -5226,7 +5224,7 @@
   if (buildCounterVideoListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed648();
+    o.items = buildUnnamed646();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -5243,7 +5241,7 @@
   if (buildCounterVideoListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed648(o.items);
+    checkUnnamed646(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -5407,14 +5405,14 @@
   buildCounterVideoProcessingDetailsProcessingProgress--;
 }
 
-buildUnnamed649() {
+buildUnnamed647() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed649(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'));
@@ -5425,7 +5423,7 @@
   var o = new api.VideoProjectDetails();
   buildCounterVideoProjectDetails++;
   if (buildCounterVideoProjectDetails < 3) {
-    o.tags = buildUnnamed649();
+    o.tags = buildUnnamed647();
   }
   buildCounterVideoProjectDetails--;
   return o;
@@ -5434,7 +5432,7 @@
 checkVideoProjectDetails(api.VideoProjectDetails o) {
   buildCounterVideoProjectDetails++;
   if (buildCounterVideoProjectDetails < 3) {
-    checkUnnamed649(o.tags);
+    checkUnnamed647(o.tags);
   }
   buildCounterVideoProjectDetails--;
 }
@@ -5484,14 +5482,14 @@
   buildCounterVideoRecordingDetails--;
 }
 
-buildUnnamed650() {
+buildUnnamed648() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed650(core.List<core.String> o) {
+checkUnnamed648(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5511,7 +5509,7 @@
     o.liveBroadcastContent = "foo";
     o.localized = buildVideoLocalization();
     o.publishedAt = core.DateTime.parse("2002-02-27T14:01:02");
-    o.tags = buildUnnamed650();
+    o.tags = buildUnnamed648();
     o.thumbnails = buildThumbnailDetails();
     o.title = "foo";
   }
@@ -5532,7 +5530,7 @@
     checkVideoLocalization(o.localized);
     unittest.expect(o.publishedAt,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed650(o.tags);
+    checkUnnamed648(o.tags);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -5600,6 +5598,32 @@
   buildCounterVideoStatus--;
 }
 
+buildUnnamed649() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed649(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed650() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed650(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed651() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -5627,16 +5651,43 @@
 }
 
 buildUnnamed653() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
+  var o = new core.List<api.VideoSuggestionsTagSuggestion>();
+  o.add(buildVideoSuggestionsTagSuggestion());
+  o.add(buildVideoSuggestionsTagSuggestion());
   return o;
 }
 
-checkUnnamed653(core.List<core.String> o) {
+checkUnnamed653(core.List<api.VideoSuggestionsTagSuggestion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
+  checkVideoSuggestionsTagSuggestion(o[0]);
+  checkVideoSuggestionsTagSuggestion(o[1]);
+}
+
+core.int buildCounterVideoSuggestions = 0;
+buildVideoSuggestions() {
+  var o = new api.VideoSuggestions();
+  buildCounterVideoSuggestions++;
+  if (buildCounterVideoSuggestions < 3) {
+    o.editorSuggestions = buildUnnamed649();
+    o.processingErrors = buildUnnamed650();
+    o.processingHints = buildUnnamed651();
+    o.processingWarnings = buildUnnamed652();
+    o.tagSuggestions = buildUnnamed653();
+  }
+  buildCounterVideoSuggestions--;
+  return o;
+}
+
+checkVideoSuggestions(api.VideoSuggestions o) {
+  buildCounterVideoSuggestions++;
+  if (buildCounterVideoSuggestions < 3) {
+    checkUnnamed649(o.editorSuggestions);
+    checkUnnamed650(o.processingErrors);
+    checkUnnamed651(o.processingHints);
+    checkUnnamed652(o.processingWarnings);
+    checkUnnamed653(o.tagSuggestions);
+  }
+  buildCounterVideoSuggestions--;
 }
 
 buildUnnamed654() {
@@ -5652,44 +5703,38 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+core.int buildCounterVideoSuggestionsTagSuggestion = 0;
+buildVideoSuggestionsTagSuggestion() {
+  var o = new api.VideoSuggestionsTagSuggestion();
+  buildCounterVideoSuggestionsTagSuggestion++;
+  if (buildCounterVideoSuggestionsTagSuggestion < 3) {
+    o.categoryRestricts = buildUnnamed654();
+    o.tag = "foo";
+  }
+  buildCounterVideoSuggestionsTagSuggestion--;
+  return o;
+}
+
+checkVideoSuggestionsTagSuggestion(api.VideoSuggestionsTagSuggestion o) {
+  buildCounterVideoSuggestionsTagSuggestion++;
+  if (buildCounterVideoSuggestionsTagSuggestion < 3) {
+    checkUnnamed654(o.categoryRestricts);
+    unittest.expect(o.tag, unittest.equals('foo'));
+  }
+  buildCounterVideoSuggestionsTagSuggestion--;
+}
+
 buildUnnamed655() {
-  var o = new core.List<api.VideoSuggestionsTagSuggestion>();
-  o.add(buildVideoSuggestionsTagSuggestion());
-  o.add(buildVideoSuggestionsTagSuggestion());
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
   return o;
 }
 
-checkUnnamed655(core.List<api.VideoSuggestionsTagSuggestion> o) {
+checkUnnamed655(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVideoSuggestionsTagSuggestion(o[0]);
-  checkVideoSuggestionsTagSuggestion(o[1]);
-}
-
-core.int buildCounterVideoSuggestions = 0;
-buildVideoSuggestions() {
-  var o = new api.VideoSuggestions();
-  buildCounterVideoSuggestions++;
-  if (buildCounterVideoSuggestions < 3) {
-    o.editorSuggestions = buildUnnamed651();
-    o.processingErrors = buildUnnamed652();
-    o.processingHints = buildUnnamed653();
-    o.processingWarnings = buildUnnamed654();
-    o.tagSuggestions = buildUnnamed655();
-  }
-  buildCounterVideoSuggestions--;
-  return o;
-}
-
-checkVideoSuggestions(api.VideoSuggestions o) {
-  buildCounterVideoSuggestions++;
-  if (buildCounterVideoSuggestions < 3) {
-    checkUnnamed651(o.editorSuggestions);
-    checkUnnamed652(o.processingErrors);
-    checkUnnamed653(o.processingHints);
-    checkUnnamed654(o.processingWarnings);
-    checkUnnamed655(o.tagSuggestions);
-  }
-  buildCounterVideoSuggestions--;
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
 }
 
 buildUnnamed656() {
@@ -5705,27 +5750,6 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterVideoSuggestionsTagSuggestion = 0;
-buildVideoSuggestionsTagSuggestion() {
-  var o = new api.VideoSuggestionsTagSuggestion();
-  buildCounterVideoSuggestionsTagSuggestion++;
-  if (buildCounterVideoSuggestionsTagSuggestion < 3) {
-    o.categoryRestricts = buildUnnamed656();
-    o.tag = "foo";
-  }
-  buildCounterVideoSuggestionsTagSuggestion--;
-  return o;
-}
-
-checkVideoSuggestionsTagSuggestion(api.VideoSuggestionsTagSuggestion o) {
-  buildCounterVideoSuggestionsTagSuggestion++;
-  if (buildCounterVideoSuggestionsTagSuggestion < 3) {
-    checkUnnamed656(o.categoryRestricts);
-    unittest.expect(o.tag, unittest.equals('foo'));
-  }
-  buildCounterVideoSuggestionsTagSuggestion--;
-}
-
 buildUnnamed657() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -5739,40 +5763,14 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed658() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed658(core.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() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed659(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterVideoTopicDetails = 0;
 buildVideoTopicDetails() {
   var o = new api.VideoTopicDetails();
   buildCounterVideoTopicDetails++;
   if (buildCounterVideoTopicDetails < 3) {
-    o.relevantTopicIds = buildUnnamed657();
-    o.topicCategories = buildUnnamed658();
-    o.topicIds = buildUnnamed659();
+    o.relevantTopicIds = buildUnnamed655();
+    o.topicCategories = buildUnnamed656();
+    o.topicIds = buildUnnamed657();
   }
   buildCounterVideoTopicDetails--;
   return o;
@@ -5781,9 +5779,9 @@
 checkVideoTopicDetails(api.VideoTopicDetails o) {
   buildCounterVideoTopicDetails++;
   if (buildCounterVideoTopicDetails < 3) {
-    checkUnnamed657(o.relevantTopicIds);
-    checkUnnamed658(o.topicCategories);
-    checkUnnamed659(o.topicIds);
+    checkUnnamed655(o.relevantTopicIds);
+    checkUnnamed656(o.topicCategories);
+    checkUnnamed657(o.topicIds);
   }
   buildCounterVideoTopicDetails--;
 }
diff --git a/generated/googleapis/test/youtubeanalytics/v1_test.dart b/generated/googleapis/test/youtubeanalytics/v1_test.dart
index b3753ba..39b24ed 100644
--- a/generated/googleapis/test/youtubeanalytics/v1_test.dart
+++ b/generated/googleapis/test/youtubeanalytics/v1_test.dart
@@ -168,14 +168,14 @@
   buildCounterGroupItem--;
 }
 
-buildUnnamed258() {
+buildUnnamed252() {
   var o = new core.List<api.GroupItem>();
   o.add(buildGroupItem());
   o.add(buildGroupItem());
   return o;
 }
 
-checkUnnamed258(core.List<api.GroupItem> o) {
+checkUnnamed252(core.List<api.GroupItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGroupItem(o[0]);
   checkGroupItem(o[1]);
@@ -187,7 +187,7 @@
   buildCounterGroupItemListResponse++;
   if (buildCounterGroupItemListResponse < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed258();
+    o.items = buildUnnamed252();
     o.kind = "foo";
   }
   buildCounterGroupItemListResponse--;
@@ -198,20 +198,20 @@
   buildCounterGroupItemListResponse++;
   if (buildCounterGroupItemListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed258(o.items);
+    checkUnnamed252(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterGroupItemListResponse--;
 }
 
-buildUnnamed259() {
+buildUnnamed253() {
   var o = new core.List<api.Group>();
   o.add(buildGroup());
   o.add(buildGroup());
   return o;
 }
 
-checkUnnamed259(core.List<api.Group> o) {
+checkUnnamed253(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGroup(o[0]);
   checkGroup(o[1]);
@@ -223,7 +223,7 @@
   buildCounterGroupListResponse++;
   if (buildCounterGroupListResponse < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed259();
+    o.items = buildUnnamed253();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -235,7 +235,7 @@
   buildCounterGroupListResponse++;
   if (buildCounterGroupListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed259(o.items);
+    checkUnnamed253(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -265,20 +265,20 @@
   buildCounterResultTableColumnHeaders--;
 }
 
-buildUnnamed260() {
+buildUnnamed254() {
   var o = new core.List<api.ResultTableColumnHeaders>();
   o.add(buildResultTableColumnHeaders());
   o.add(buildResultTableColumnHeaders());
   return o;
 }
 
-checkUnnamed260(core.List<api.ResultTableColumnHeaders> o) {
+checkUnnamed254(core.List<api.ResultTableColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultTableColumnHeaders(o[0]);
   checkResultTableColumnHeaders(o[1]);
 }
 
-buildUnnamed261() {
+buildUnnamed255() {
   var o = new core.List<core.Object>();
   o.add({
     'list': [1, 2, 3],
@@ -293,7 +293,7 @@
   return o;
 }
 
-checkUnnamed261(core.List<core.Object> o) {
+checkUnnamed255(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map;
   unittest.expect(casted1, unittest.hasLength(3));
@@ -307,17 +307,17 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed262() {
+buildUnnamed256() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed261());
-  o.add(buildUnnamed261());
+  o.add(buildUnnamed255());
+  o.add(buildUnnamed255());
   return o;
 }
 
-checkUnnamed262(core.List<core.List<core.Object>> o) {
+checkUnnamed256(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed261(o[0]);
-  checkUnnamed261(o[1]);
+  checkUnnamed255(o[0]);
+  checkUnnamed255(o[1]);
 }
 
 core.int buildCounterResultTable = 0;
@@ -325,9 +325,9 @@
   var o = new api.ResultTable();
   buildCounterResultTable++;
   if (buildCounterResultTable < 3) {
-    o.columnHeaders = buildUnnamed260();
+    o.columnHeaders = buildUnnamed254();
     o.kind = "foo";
-    o.rows = buildUnnamed262();
+    o.rows = buildUnnamed256();
   }
   buildCounterResultTable--;
   return o;
@@ -336,9 +336,9 @@
 checkResultTable(api.ResultTable o) {
   buildCounterResultTable++;
   if (buildCounterResultTable < 3) {
-    checkUnnamed260(o.columnHeaders);
+    checkUnnamed254(o.columnHeaders);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed262(o.rows);
+    checkUnnamed256(o.rows);
   }
   buildCounterResultTable--;
 }
diff --git a/generated/googleapis/test/youtubereporting/v1_test.dart b/generated/googleapis/test/youtubereporting/v1_test.dart
index d3e1e0f..b5bba42 100644
--- a/generated/googleapis/test/youtubereporting/v1_test.dart
+++ b/generated/googleapis/test/youtubereporting/v1_test.dart
@@ -65,6 +65,344 @@
   buildCounterEmpty--;
 }
 
+core.int buildCounterGdataBlobstore2Info = 0;
+buildGdataBlobstore2Info() {
+  var o = new api.GdataBlobstore2Info();
+  buildCounterGdataBlobstore2Info++;
+  if (buildCounterGdataBlobstore2Info < 3) {
+    o.blobGeneration = "foo";
+    o.blobId = "foo";
+    o.downloadReadHandle = "foo";
+    o.readToken = "foo";
+    o.uploadMetadataContainer = "foo";
+  }
+  buildCounterGdataBlobstore2Info--;
+  return o;
+}
+
+checkGdataBlobstore2Info(api.GdataBlobstore2Info o) {
+  buildCounterGdataBlobstore2Info++;
+  if (buildCounterGdataBlobstore2Info < 3) {
+    unittest.expect(o.blobGeneration, unittest.equals('foo'));
+    unittest.expect(o.blobId, unittest.equals('foo'));
+    unittest.expect(o.downloadReadHandle, unittest.equals('foo'));
+    unittest.expect(o.readToken, unittest.equals('foo'));
+    unittest.expect(o.uploadMetadataContainer, unittest.equals('foo'));
+  }
+  buildCounterGdataBlobstore2Info--;
+}
+
+core.int buildCounterGdataCompositeMedia = 0;
+buildGdataCompositeMedia() {
+  var o = new api.GdataCompositeMedia();
+  buildCounterGdataCompositeMedia++;
+  if (buildCounterGdataCompositeMedia < 3) {
+    o.blobRef = "foo";
+    o.blobstore2Info = buildGdataBlobstore2Info();
+    o.cosmoBinaryReference = "foo";
+    o.crc32cHash = 42;
+    o.inline = "foo";
+    o.length = "foo";
+    o.md5Hash = "foo";
+    o.objectId = buildGdataObjectId();
+    o.path = "foo";
+    o.referenceType = "foo";
+    o.sha1Hash = "foo";
+  }
+  buildCounterGdataCompositeMedia--;
+  return o;
+}
+
+checkGdataCompositeMedia(api.GdataCompositeMedia o) {
+  buildCounterGdataCompositeMedia++;
+  if (buildCounterGdataCompositeMedia < 3) {
+    unittest.expect(o.blobRef, unittest.equals('foo'));
+    checkGdataBlobstore2Info(o.blobstore2Info);
+    unittest.expect(o.cosmoBinaryReference, unittest.equals('foo'));
+    unittest.expect(o.crc32cHash, unittest.equals(42));
+    unittest.expect(o.inline, unittest.equals('foo'));
+    unittest.expect(o.length, unittest.equals('foo'));
+    unittest.expect(o.md5Hash, unittest.equals('foo'));
+    checkGdataObjectId(o.objectId);
+    unittest.expect(o.path, unittest.equals('foo'));
+    unittest.expect(o.referenceType, unittest.equals('foo'));
+    unittest.expect(o.sha1Hash, unittest.equals('foo'));
+  }
+  buildCounterGdataCompositeMedia--;
+}
+
+core.int buildCounterGdataContentTypeInfo = 0;
+buildGdataContentTypeInfo() {
+  var o = new api.GdataContentTypeInfo();
+  buildCounterGdataContentTypeInfo++;
+  if (buildCounterGdataContentTypeInfo < 3) {
+    o.bestGuess = "foo";
+    o.fromBytes = "foo";
+    o.fromFileName = "foo";
+    o.fromHeader = "foo";
+    o.fromUrlPath = "foo";
+  }
+  buildCounterGdataContentTypeInfo--;
+  return o;
+}
+
+checkGdataContentTypeInfo(api.GdataContentTypeInfo o) {
+  buildCounterGdataContentTypeInfo++;
+  if (buildCounterGdataContentTypeInfo < 3) {
+    unittest.expect(o.bestGuess, unittest.equals('foo'));
+    unittest.expect(o.fromBytes, unittest.equals('foo'));
+    unittest.expect(o.fromFileName, unittest.equals('foo'));
+    unittest.expect(o.fromHeader, unittest.equals('foo'));
+    unittest.expect(o.fromUrlPath, unittest.equals('foo'));
+  }
+  buildCounterGdataContentTypeInfo--;
+}
+
+core.int buildCounterGdataDiffChecksumsResponse = 0;
+buildGdataDiffChecksumsResponse() {
+  var o = new api.GdataDiffChecksumsResponse();
+  buildCounterGdataDiffChecksumsResponse++;
+  if (buildCounterGdataDiffChecksumsResponse < 3) {
+    o.checksumsLocation = buildGdataCompositeMedia();
+    o.chunkSizeBytes = "foo";
+    o.objectLocation = buildGdataCompositeMedia();
+    o.objectSizeBytes = "foo";
+    o.objectVersion = "foo";
+  }
+  buildCounterGdataDiffChecksumsResponse--;
+  return o;
+}
+
+checkGdataDiffChecksumsResponse(api.GdataDiffChecksumsResponse o) {
+  buildCounterGdataDiffChecksumsResponse++;
+  if (buildCounterGdataDiffChecksumsResponse < 3) {
+    checkGdataCompositeMedia(o.checksumsLocation);
+    unittest.expect(o.chunkSizeBytes, unittest.equals('foo'));
+    checkGdataCompositeMedia(o.objectLocation);
+    unittest.expect(o.objectSizeBytes, unittest.equals('foo'));
+    unittest.expect(o.objectVersion, unittest.equals('foo'));
+  }
+  buildCounterGdataDiffChecksumsResponse--;
+}
+
+core.int buildCounterGdataDiffDownloadResponse = 0;
+buildGdataDiffDownloadResponse() {
+  var o = new api.GdataDiffDownloadResponse();
+  buildCounterGdataDiffDownloadResponse++;
+  if (buildCounterGdataDiffDownloadResponse < 3) {
+    o.objectLocation = buildGdataCompositeMedia();
+  }
+  buildCounterGdataDiffDownloadResponse--;
+  return o;
+}
+
+checkGdataDiffDownloadResponse(api.GdataDiffDownloadResponse o) {
+  buildCounterGdataDiffDownloadResponse++;
+  if (buildCounterGdataDiffDownloadResponse < 3) {
+    checkGdataCompositeMedia(o.objectLocation);
+  }
+  buildCounterGdataDiffDownloadResponse--;
+}
+
+core.int buildCounterGdataDiffUploadRequest = 0;
+buildGdataDiffUploadRequest() {
+  var o = new api.GdataDiffUploadRequest();
+  buildCounterGdataDiffUploadRequest++;
+  if (buildCounterGdataDiffUploadRequest < 3) {
+    o.checksumsInfo = buildGdataCompositeMedia();
+    o.objectInfo = buildGdataCompositeMedia();
+    o.objectVersion = "foo";
+  }
+  buildCounterGdataDiffUploadRequest--;
+  return o;
+}
+
+checkGdataDiffUploadRequest(api.GdataDiffUploadRequest o) {
+  buildCounterGdataDiffUploadRequest++;
+  if (buildCounterGdataDiffUploadRequest < 3) {
+    checkGdataCompositeMedia(o.checksumsInfo);
+    checkGdataCompositeMedia(o.objectInfo);
+    unittest.expect(o.objectVersion, unittest.equals('foo'));
+  }
+  buildCounterGdataDiffUploadRequest--;
+}
+
+core.int buildCounterGdataDiffUploadResponse = 0;
+buildGdataDiffUploadResponse() {
+  var o = new api.GdataDiffUploadResponse();
+  buildCounterGdataDiffUploadResponse++;
+  if (buildCounterGdataDiffUploadResponse < 3) {
+    o.objectVersion = "foo";
+    o.originalObject = buildGdataCompositeMedia();
+  }
+  buildCounterGdataDiffUploadResponse--;
+  return o;
+}
+
+checkGdataDiffUploadResponse(api.GdataDiffUploadResponse o) {
+  buildCounterGdataDiffUploadResponse++;
+  if (buildCounterGdataDiffUploadResponse < 3) {
+    unittest.expect(o.objectVersion, unittest.equals('foo'));
+    checkGdataCompositeMedia(o.originalObject);
+  }
+  buildCounterGdataDiffUploadResponse--;
+}
+
+core.int buildCounterGdataDiffVersionResponse = 0;
+buildGdataDiffVersionResponse() {
+  var o = new api.GdataDiffVersionResponse();
+  buildCounterGdataDiffVersionResponse++;
+  if (buildCounterGdataDiffVersionResponse < 3) {
+    o.objectSizeBytes = "foo";
+    o.objectVersion = "foo";
+  }
+  buildCounterGdataDiffVersionResponse--;
+  return o;
+}
+
+checkGdataDiffVersionResponse(api.GdataDiffVersionResponse o) {
+  buildCounterGdataDiffVersionResponse++;
+  if (buildCounterGdataDiffVersionResponse < 3) {
+    unittest.expect(o.objectSizeBytes, unittest.equals('foo'));
+    unittest.expect(o.objectVersion, unittest.equals('foo'));
+  }
+  buildCounterGdataDiffVersionResponse--;
+}
+
+core.int buildCounterGdataDownloadParameters = 0;
+buildGdataDownloadParameters() {
+  var o = new api.GdataDownloadParameters();
+  buildCounterGdataDownloadParameters++;
+  if (buildCounterGdataDownloadParameters < 3) {
+    o.allowGzipCompression = true;
+    o.ignoreRange = true;
+  }
+  buildCounterGdataDownloadParameters--;
+  return o;
+}
+
+checkGdataDownloadParameters(api.GdataDownloadParameters o) {
+  buildCounterGdataDownloadParameters++;
+  if (buildCounterGdataDownloadParameters < 3) {
+    unittest.expect(o.allowGzipCompression, unittest.isTrue);
+    unittest.expect(o.ignoreRange, unittest.isTrue);
+  }
+  buildCounterGdataDownloadParameters--;
+}
+
+buildUnnamed1135() {
+  var o = new core.List<api.GdataCompositeMedia>();
+  o.add(buildGdataCompositeMedia());
+  o.add(buildGdataCompositeMedia());
+  return o;
+}
+
+checkUnnamed1135(core.List<api.GdataCompositeMedia> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkGdataCompositeMedia(o[0]);
+  checkGdataCompositeMedia(o[1]);
+}
+
+core.int buildCounterGdataMedia = 0;
+buildGdataMedia() {
+  var o = new api.GdataMedia();
+  buildCounterGdataMedia++;
+  if (buildCounterGdataMedia < 3) {
+    o.algorithm = "foo";
+    o.bigstoreObjectRef = "foo";
+    o.blobRef = "foo";
+    o.blobstore2Info = buildGdataBlobstore2Info();
+    o.compositeMedia = buildUnnamed1135();
+    o.contentType = "foo";
+    o.contentTypeInfo = buildGdataContentTypeInfo();
+    o.cosmoBinaryReference = "foo";
+    o.crc32cHash = 42;
+    o.diffChecksumsResponse = buildGdataDiffChecksumsResponse();
+    o.diffDownloadResponse = buildGdataDiffDownloadResponse();
+    o.diffUploadRequest = buildGdataDiffUploadRequest();
+    o.diffUploadResponse = buildGdataDiffUploadResponse();
+    o.diffVersionResponse = buildGdataDiffVersionResponse();
+    o.downloadParameters = buildGdataDownloadParameters();
+    o.filename = "foo";
+    o.hash = "foo";
+    o.hashVerified = true;
+    o.inline = "foo";
+    o.isPotentialRetry = true;
+    o.length = "foo";
+    o.md5Hash = "foo";
+    o.mediaId = "foo";
+    o.objectId = buildGdataObjectId();
+    o.path = "foo";
+    o.referenceType = "foo";
+    o.sha1Hash = "foo";
+    o.sha256Hash = "foo";
+    o.timestamp = "foo";
+    o.token = "foo";
+  }
+  buildCounterGdataMedia--;
+  return o;
+}
+
+checkGdataMedia(api.GdataMedia o) {
+  buildCounterGdataMedia++;
+  if (buildCounterGdataMedia < 3) {
+    unittest.expect(o.algorithm, unittest.equals('foo'));
+    unittest.expect(o.bigstoreObjectRef, unittest.equals('foo'));
+    unittest.expect(o.blobRef, unittest.equals('foo'));
+    checkGdataBlobstore2Info(o.blobstore2Info);
+    checkUnnamed1135(o.compositeMedia);
+    unittest.expect(o.contentType, unittest.equals('foo'));
+    checkGdataContentTypeInfo(o.contentTypeInfo);
+    unittest.expect(o.cosmoBinaryReference, unittest.equals('foo'));
+    unittest.expect(o.crc32cHash, unittest.equals(42));
+    checkGdataDiffChecksumsResponse(o.diffChecksumsResponse);
+    checkGdataDiffDownloadResponse(o.diffDownloadResponse);
+    checkGdataDiffUploadRequest(o.diffUploadRequest);
+    checkGdataDiffUploadResponse(o.diffUploadResponse);
+    checkGdataDiffVersionResponse(o.diffVersionResponse);
+    checkGdataDownloadParameters(o.downloadParameters);
+    unittest.expect(o.filename, unittest.equals('foo'));
+    unittest.expect(o.hash, unittest.equals('foo'));
+    unittest.expect(o.hashVerified, unittest.isTrue);
+    unittest.expect(o.inline, unittest.equals('foo'));
+    unittest.expect(o.isPotentialRetry, unittest.isTrue);
+    unittest.expect(o.length, unittest.equals('foo'));
+    unittest.expect(o.md5Hash, unittest.equals('foo'));
+    unittest.expect(o.mediaId, unittest.equals('foo'));
+    checkGdataObjectId(o.objectId);
+    unittest.expect(o.path, unittest.equals('foo'));
+    unittest.expect(o.referenceType, unittest.equals('foo'));
+    unittest.expect(o.sha1Hash, unittest.equals('foo'));
+    unittest.expect(o.sha256Hash, unittest.equals('foo'));
+    unittest.expect(o.timestamp, unittest.equals('foo'));
+    unittest.expect(o.token, unittest.equals('foo'));
+  }
+  buildCounterGdataMedia--;
+}
+
+core.int buildCounterGdataObjectId = 0;
+buildGdataObjectId() {
+  var o = new api.GdataObjectId();
+  buildCounterGdataObjectId++;
+  if (buildCounterGdataObjectId < 3) {
+    o.bucketName = "foo";
+    o.generation = "foo";
+    o.objectName = "foo";
+  }
+  buildCounterGdataObjectId--;
+  return o;
+}
+
+checkGdataObjectId(api.GdataObjectId o) {
+  buildCounterGdataObjectId++;
+  if (buildCounterGdataObjectId < 3) {
+    unittest.expect(o.bucketName, unittest.equals('foo'));
+    unittest.expect(o.generation, unittest.equals('foo'));
+    unittest.expect(o.objectName, unittest.equals('foo'));
+  }
+  buildCounterGdataObjectId--;
+}
+
 core.int buildCounterJob = 0;
 buildJob() {
   var o = new api.Job();
@@ -94,14 +432,14 @@
   buildCounterJob--;
 }
 
-buildUnnamed1126() {
+buildUnnamed1136() {
   var o = new core.List<api.Job>();
   o.add(buildJob());
   o.add(buildJob());
   return o;
 }
 
-checkUnnamed1126(core.List<api.Job> o) {
+checkUnnamed1136(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJob(o[0]);
   checkJob(o[1]);
@@ -112,7 +450,7 @@
   var o = new api.ListJobsResponse();
   buildCounterListJobsResponse++;
   if (buildCounterListJobsResponse < 3) {
-    o.jobs = buildUnnamed1126();
+    o.jobs = buildUnnamed1136();
     o.nextPageToken = "foo";
   }
   buildCounterListJobsResponse--;
@@ -122,20 +460,20 @@
 checkListJobsResponse(api.ListJobsResponse o) {
   buildCounterListJobsResponse++;
   if (buildCounterListJobsResponse < 3) {
-    checkUnnamed1126(o.jobs);
+    checkUnnamed1136(o.jobs);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListJobsResponse--;
 }
 
-buildUnnamed1127() {
+buildUnnamed1137() {
   var o = new core.List<api.ReportType>();
   o.add(buildReportType());
   o.add(buildReportType());
   return o;
 }
 
-checkUnnamed1127(core.List<api.ReportType> o) {
+checkUnnamed1137(core.List<api.ReportType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportType(o[0]);
   checkReportType(o[1]);
@@ -147,7 +485,7 @@
   buildCounterListReportTypesResponse++;
   if (buildCounterListReportTypesResponse < 3) {
     o.nextPageToken = "foo";
-    o.reportTypes = buildUnnamed1127();
+    o.reportTypes = buildUnnamed1137();
   }
   buildCounterListReportTypesResponse--;
   return o;
@@ -157,19 +495,19 @@
   buildCounterListReportTypesResponse++;
   if (buildCounterListReportTypesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1127(o.reportTypes);
+    checkUnnamed1137(o.reportTypes);
   }
   buildCounterListReportTypesResponse--;
 }
 
-buildUnnamed1128() {
+buildUnnamed1138() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed1128(core.List<api.Report> o) {
+checkUnnamed1138(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -181,7 +519,7 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     o.nextPageToken = "foo";
-    o.reports = buildUnnamed1128();
+    o.reports = buildUnnamed1138();
   }
   buildCounterListReportsResponse--;
   return o;
@@ -191,30 +529,11 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1128(o.reports);
+    checkUnnamed1138(o.reports);
   }
   buildCounterListReportsResponse--;
 }
 
-core.int buildCounterMedia = 0;
-buildMedia() {
-  var o = new api.Media();
-  buildCounterMedia++;
-  if (buildCounterMedia < 3) {
-    o.resourceName = "foo";
-  }
-  buildCounterMedia--;
-  return o;
-}
-
-checkMedia(api.Media o) {
-  buildCounterMedia++;
-  if (buildCounterMedia < 3) {
-    unittest.expect(o.resourceName, unittest.equals('foo'));
-  }
-  buildCounterMedia--;
-}
-
 core.int buildCounterReport = 0;
 buildReport() {
   var o = new api.Report();
@@ -280,6 +599,94 @@
     });
   });
 
+  unittest.group("obj-schema-GdataBlobstore2Info", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGdataBlobstore2Info();
+      var od = new api.GdataBlobstore2Info.fromJson(o.toJson());
+      checkGdataBlobstore2Info(od);
+    });
+  });
+
+  unittest.group("obj-schema-GdataCompositeMedia", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGdataCompositeMedia();
+      var od = new api.GdataCompositeMedia.fromJson(o.toJson());
+      checkGdataCompositeMedia(od);
+    });
+  });
+
+  unittest.group("obj-schema-GdataContentTypeInfo", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGdataContentTypeInfo();
+      var od = new api.GdataContentTypeInfo.fromJson(o.toJson());
+      checkGdataContentTypeInfo(od);
+    });
+  });
+
+  unittest.group("obj-schema-GdataDiffChecksumsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGdataDiffChecksumsResponse();
+      var od = new api.GdataDiffChecksumsResponse.fromJson(o.toJson());
+      checkGdataDiffChecksumsResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-GdataDiffDownloadResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGdataDiffDownloadResponse();
+      var od = new api.GdataDiffDownloadResponse.fromJson(o.toJson());
+      checkGdataDiffDownloadResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-GdataDiffUploadRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGdataDiffUploadRequest();
+      var od = new api.GdataDiffUploadRequest.fromJson(o.toJson());
+      checkGdataDiffUploadRequest(od);
+    });
+  });
+
+  unittest.group("obj-schema-GdataDiffUploadResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGdataDiffUploadResponse();
+      var od = new api.GdataDiffUploadResponse.fromJson(o.toJson());
+      checkGdataDiffUploadResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-GdataDiffVersionResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGdataDiffVersionResponse();
+      var od = new api.GdataDiffVersionResponse.fromJson(o.toJson());
+      checkGdataDiffVersionResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-GdataDownloadParameters", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGdataDownloadParameters();
+      var od = new api.GdataDownloadParameters.fromJson(o.toJson());
+      checkGdataDownloadParameters(od);
+    });
+  });
+
+  unittest.group("obj-schema-GdataMedia", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGdataMedia();
+      var od = new api.GdataMedia.fromJson(o.toJson());
+      checkGdataMedia(od);
+    });
+  });
+
+  unittest.group("obj-schema-GdataObjectId", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGdataObjectId();
+      var od = new api.GdataObjectId.fromJson(o.toJson());
+      checkGdataObjectId(od);
+    });
+  });
+
   unittest.group("obj-schema-Job", () {
     unittest.test("to-json--from-json", () {
       var o = buildJob();
@@ -312,14 +719,6 @@
     });
   });
 
-  unittest.group("obj-schema-Media", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildMedia();
-      var od = new api.Media.fromJson(o.toJson());
-      checkMedia(od);
-    });
-  });
-
   unittest.group("obj-schema-Report", () {
     unittest.test("to-json--from-json", () {
       var o = buildReport();
@@ -514,10 +913,10 @@
     unittest.test("method--list", () {
       var mock = new HttpServerMock();
       api.JobsResourceApi res = new api.YoutubereportingApi(mock).jobs;
-      var arg_pageSize = 42;
-      var arg_onBehalfOfContentOwner = "foo";
       var arg_pageToken = "foo";
       var arg_includeSystemManaged = true;
+      var arg_pageSize = 42;
+      var arg_onBehalfOfContentOwner = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -549,14 +948,14 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
-            unittest.equals(arg_onBehalfOfContentOwner));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["includeSystemManaged"].first,
             unittest.equals("$arg_includeSystemManaged"));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -567,10 +966,10 @@
       }), true);
       res
           .list(
-              pageSize: arg_pageSize,
-              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               pageToken: arg_pageToken,
               includeSystemManaged: arg_includeSystemManaged,
+              pageSize: arg_pageSize,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListJobsResponse response) {
         checkListJobsResponse(response);
@@ -653,12 +1052,12 @@
       api.JobsReportsResourceApi res =
           new api.YoutubereportingApi(mock).jobs.reports;
       var arg_jobId = "foo";
-      var arg_pageSize = 42;
       var arg_onBehalfOfContentOwner = "foo";
       var arg_startTimeBefore = "foo";
       var arg_createdAfter = "foo";
-      var arg_startTimeAtOrAfter = "foo";
       var arg_pageToken = "foo";
+      var arg_startTimeAtOrAfter = "foo";
+      var arg_pageSize = 42;
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -699,18 +1098,18 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["onBehalfOfContentOwner"].first,
             unittest.equals(arg_onBehalfOfContentOwner));
         unittest.expect(queryMap["startTimeBefore"].first,
             unittest.equals(arg_startTimeBefore));
         unittest.expect(
             queryMap["createdAfter"].first, unittest.equals(arg_createdAfter));
-        unittest.expect(queryMap["startTimeAtOrAfter"].first,
-            unittest.equals(arg_startTimeAtOrAfter));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["startTimeAtOrAfter"].first,
+            unittest.equals(arg_startTimeAtOrAfter));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -721,12 +1120,12 @@
       }), true);
       res
           .list(arg_jobId,
-              pageSize: arg_pageSize,
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               startTimeBefore: arg_startTimeBefore,
               createdAfter: arg_createdAfter,
-              startTimeAtOrAfter: arg_startTimeAtOrAfter,
               pageToken: arg_pageToken,
+              startTimeAtOrAfter: arg_startTimeAtOrAfter,
+              pageSize: arg_pageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListReportsResponse response) {
         checkListReportsResponse(response);
@@ -779,13 +1178,13 @@
         var h = {
           "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildMedia());
+        var resp = convert.JSON.encode(buildGdataMedia());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
       res
           .download(arg_resourceName, $fields: arg_$fields)
-          .then(unittest.expectAsync1(((api.Media response) {
-        checkMedia(response);
+          .then(unittest.expectAsync1(((api.GdataMedia response) {
+        checkGdataMedia(response);
       })));
     });
   });
@@ -795,10 +1194,10 @@
       var mock = new HttpServerMock();
       api.ReportTypesResourceApi res =
           new api.YoutubereportingApi(mock).reportTypes;
-      var arg_pageSize = 42;
-      var arg_onBehalfOfContentOwner = "foo";
       var arg_pageToken = "foo";
       var arg_includeSystemManaged = true;
+      var arg_pageSize = 42;
+      var arg_onBehalfOfContentOwner = "foo";
       var arg_$fields = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -830,14 +1229,14 @@
                 core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first),
-            unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
-            unittest.equals(arg_onBehalfOfContentOwner));
         unittest.expect(
             queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["includeSystemManaged"].first,
             unittest.equals("$arg_includeSystemManaged"));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
         unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
 
         var h = {
@@ -848,10 +1247,10 @@
       }), true);
       res
           .list(
-              pageSize: arg_pageSize,
-              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               pageToken: arg_pageToken,
               includeSystemManaged: arg_includeSystemManaged,
+              pageSize: arg_pageSize,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((api.ListReportTypesResponse response) {
         checkListReportTypesResponse(response);
