diff --git a/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart b/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
index c539291..c042ab0 100644
--- a/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
+++ b/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
@@ -96,14 +96,14 @@
   buildCounterClaimDeviceResponse--;
 }
 
-buildUnnamed2402() {
+buildUnnamed2535() {
   var o = new core.List<api.PartnerClaim>();
   o.add(buildPartnerClaim());
   o.add(buildPartnerClaim());
   return o;
 }
 
-checkUnnamed2402(core.List<api.PartnerClaim> o) {
+checkUnnamed2535(core.List<api.PartnerClaim> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPartnerClaim(o[0]);
   checkPartnerClaim(o[1]);
@@ -114,7 +114,7 @@
   var o = new api.ClaimDevicesRequest();
   buildCounterClaimDevicesRequest++;
   if (buildCounterClaimDevicesRequest < 3) {
-    o.claims = buildUnnamed2402();
+    o.claims = buildUnnamed2535();
   }
   buildCounterClaimDevicesRequest--;
   return o;
@@ -123,32 +123,32 @@
 checkClaimDevicesRequest(api.ClaimDevicesRequest o) {
   buildCounterClaimDevicesRequest++;
   if (buildCounterClaimDevicesRequest < 3) {
-    checkUnnamed2402(o.claims);
+    checkUnnamed2535(o.claims);
   }
   buildCounterClaimDevicesRequest--;
 }
 
-buildUnnamed2403() {
+buildUnnamed2536() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2403(core.List<core.String> o) {
+checkUnnamed2536(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2404() {
+buildUnnamed2537() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2404(core.List<core.String> o) {
+checkUnnamed2537(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -159,11 +159,11 @@
   var o = new api.Company();
   buildCounterCompany++;
   if (buildCounterCompany < 3) {
-    o.adminEmails = buildUnnamed2403();
+    o.adminEmails = buildUnnamed2536();
     o.companyId = "foo";
     o.companyName = "foo";
     o.name = "foo";
-    o.ownerEmails = buildUnnamed2404();
+    o.ownerEmails = buildUnnamed2537();
     o.termsStatus = "foo";
   }
   buildCounterCompany--;
@@ -173,11 +173,11 @@
 checkCompany(api.Company o) {
   buildCounterCompany++;
   if (buildCounterCompany < 3) {
-    checkUnnamed2403(o.adminEmails);
+    checkUnnamed2536(o.adminEmails);
     unittest.expect(o.companyId, unittest.equals('foo'));
     unittest.expect(o.companyName, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2404(o.ownerEmails);
+    checkUnnamed2537(o.ownerEmails);
     unittest.expect(o.termsStatus, unittest.equals('foo'));
   }
   buildCounterCompany--;
@@ -261,14 +261,14 @@
   buildCounterCustomerApplyConfigurationRequest--;
 }
 
-buildUnnamed2405() {
+buildUnnamed2538() {
   var o = new core.List<api.Configuration>();
   o.add(buildConfiguration());
   o.add(buildConfiguration());
   return o;
 }
 
-checkUnnamed2405(core.List<api.Configuration> o) {
+checkUnnamed2538(core.List<api.Configuration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConfiguration(o[0]);
   checkConfiguration(o[1]);
@@ -279,7 +279,7 @@
   var o = new api.CustomerListConfigurationsResponse();
   buildCounterCustomerListConfigurationsResponse++;
   if (buildCounterCustomerListConfigurationsResponse < 3) {
-    o.configurations = buildUnnamed2405();
+    o.configurations = buildUnnamed2538();
   }
   buildCounterCustomerListConfigurationsResponse--;
   return o;
@@ -289,19 +289,19 @@
     api.CustomerListConfigurationsResponse o) {
   buildCounterCustomerListConfigurationsResponse++;
   if (buildCounterCustomerListConfigurationsResponse < 3) {
-    checkUnnamed2405(o.configurations);
+    checkUnnamed2538(o.configurations);
   }
   buildCounterCustomerListConfigurationsResponse--;
 }
 
-buildUnnamed2406() {
+buildUnnamed2539() {
   var o = new core.List<api.Company>();
   o.add(buildCompany());
   o.add(buildCompany());
   return o;
 }
 
-checkUnnamed2406(core.List<api.Company> o) {
+checkUnnamed2539(core.List<api.Company> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCompany(o[0]);
   checkCompany(o[1]);
@@ -312,7 +312,7 @@
   var o = new api.CustomerListCustomersResponse();
   buildCounterCustomerListCustomersResponse++;
   if (buildCounterCustomerListCustomersResponse < 3) {
-    o.customers = buildUnnamed2406();
+    o.customers = buildUnnamed2539();
     o.nextPageToken = "foo";
   }
   buildCounterCustomerListCustomersResponse--;
@@ -322,20 +322,20 @@
 checkCustomerListCustomersResponse(api.CustomerListCustomersResponse o) {
   buildCounterCustomerListCustomersResponse++;
   if (buildCounterCustomerListCustomersResponse < 3) {
-    checkUnnamed2406(o.customers);
+    checkUnnamed2539(o.customers);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomerListCustomersResponse--;
 }
 
-buildUnnamed2407() {
+buildUnnamed2540() {
   var o = new core.List<api.Device>();
   o.add(buildDevice());
   o.add(buildDevice());
   return o;
 }
 
-checkUnnamed2407(core.List<api.Device> o) {
+checkUnnamed2540(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDevice(o[0]);
   checkDevice(o[1]);
@@ -346,7 +346,7 @@
   var o = new api.CustomerListDevicesResponse();
   buildCounterCustomerListDevicesResponse++;
   if (buildCounterCustomerListDevicesResponse < 3) {
-    o.devices = buildUnnamed2407();
+    o.devices = buildUnnamed2540();
     o.nextPageToken = "foo";
   }
   buildCounterCustomerListDevicesResponse--;
@@ -356,20 +356,20 @@
 checkCustomerListDevicesResponse(api.CustomerListDevicesResponse o) {
   buildCounterCustomerListDevicesResponse++;
   if (buildCounterCustomerListDevicesResponse < 3) {
-    checkUnnamed2407(o.devices);
+    checkUnnamed2540(o.devices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomerListDevicesResponse--;
 }
 
-buildUnnamed2408() {
+buildUnnamed2541() {
   var o = new core.List<api.Dpc>();
   o.add(buildDpc());
   o.add(buildDpc());
   return o;
 }
 
-checkUnnamed2408(core.List<api.Dpc> o) {
+checkUnnamed2541(core.List<api.Dpc> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDpc(o[0]);
   checkDpc(o[1]);
@@ -380,7 +380,7 @@
   var o = new api.CustomerListDpcsResponse();
   buildCounterCustomerListDpcsResponse++;
   if (buildCounterCustomerListDpcsResponse < 3) {
-    o.dpcs = buildUnnamed2408();
+    o.dpcs = buildUnnamed2541();
   }
   buildCounterCustomerListDpcsResponse--;
   return o;
@@ -389,7 +389,7 @@
 checkCustomerListDpcsResponse(api.CustomerListDpcsResponse o) {
   buildCounterCustomerListDpcsResponse++;
   if (buildCounterCustomerListDpcsResponse < 3) {
-    checkUnnamed2408(o.dpcs);
+    checkUnnamed2541(o.dpcs);
   }
   buildCounterCustomerListDpcsResponse--;
 }
@@ -433,14 +433,14 @@
   buildCounterCustomerUnclaimDeviceRequest--;
 }
 
-buildUnnamed2409() {
+buildUnnamed2542() {
   var o = new core.List<api.DeviceClaim>();
   o.add(buildDeviceClaim());
   o.add(buildDeviceClaim());
   return o;
 }
 
-checkUnnamed2409(core.List<api.DeviceClaim> o) {
+checkUnnamed2542(core.List<api.DeviceClaim> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeviceClaim(o[0]);
   checkDeviceClaim(o[1]);
@@ -451,7 +451,7 @@
   var o = new api.Device();
   buildCounterDevice++;
   if (buildCounterDevice < 3) {
-    o.claims = buildUnnamed2409();
+    o.claims = buildUnnamed2542();
     o.configuration = "foo";
     o.deviceId = "foo";
     o.deviceIdentifier = buildDeviceIdentifier();
@@ -465,7 +465,7 @@
 checkDevice(api.Device o) {
   buildCounterDevice++;
   if (buildCounterDevice < 3) {
-    checkUnnamed2409(o.claims);
+    checkUnnamed2542(o.claims);
     unittest.expect(o.configuration, unittest.equals('foo'));
     unittest.expect(o.deviceId, unittest.equals('foo'));
     checkDeviceIdentifier(o.deviceIdentifier);
@@ -529,14 +529,14 @@
   buildCounterDeviceIdentifier--;
 }
 
-buildUnnamed2410() {
+buildUnnamed2543() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2410(core.Map<core.String, core.String> o) {
+checkUnnamed2543(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'));
@@ -547,7 +547,7 @@
   var o = new api.DeviceMetadata();
   buildCounterDeviceMetadata++;
   if (buildCounterDeviceMetadata < 3) {
-    o.entries = buildUnnamed2410();
+    o.entries = buildUnnamed2543();
   }
   buildCounterDeviceMetadata--;
   return o;
@@ -556,7 +556,7 @@
 checkDeviceMetadata(api.DeviceMetadata o) {
   buildCounterDeviceMetadata++;
   if (buildCounterDeviceMetadata < 3) {
-    checkUnnamed2410(o.entries);
+    checkUnnamed2543(o.entries);
   }
   buildCounterDeviceMetadata--;
 }
@@ -606,14 +606,14 @@
   buildCounterDevicesLongRunningOperationMetadata--;
 }
 
-buildUnnamed2411() {
+buildUnnamed2544() {
   var o = new core.List<api.OperationPerDevice>();
   o.add(buildOperationPerDevice());
   o.add(buildOperationPerDevice());
   return o;
 }
 
-checkUnnamed2411(core.List<api.OperationPerDevice> o) {
+checkUnnamed2544(core.List<api.OperationPerDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationPerDevice(o[0]);
   checkOperationPerDevice(o[1]);
@@ -624,7 +624,7 @@
   var o = new api.DevicesLongRunningOperationResponse();
   buildCounterDevicesLongRunningOperationResponse++;
   if (buildCounterDevicesLongRunningOperationResponse < 3) {
-    o.perDeviceStatus = buildUnnamed2411();
+    o.perDeviceStatus = buildUnnamed2544();
     o.successCount = 42;
   }
   buildCounterDevicesLongRunningOperationResponse--;
@@ -635,7 +635,7 @@
     api.DevicesLongRunningOperationResponse o) {
   buildCounterDevicesLongRunningOperationResponse++;
   if (buildCounterDevicesLongRunningOperationResponse < 3) {
-    checkUnnamed2411(o.perDeviceStatus);
+    checkUnnamed2544(o.perDeviceStatus);
     unittest.expect(o.successCount, unittest.equals(42));
   }
   buildCounterDevicesLongRunningOperationResponse--;
@@ -703,14 +703,14 @@
   buildCounterFindDevicesByDeviceIdentifierRequest--;
 }
 
-buildUnnamed2412() {
+buildUnnamed2545() {
   var o = new core.List<api.Device>();
   o.add(buildDevice());
   o.add(buildDevice());
   return o;
 }
 
-checkUnnamed2412(core.List<api.Device> o) {
+checkUnnamed2545(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDevice(o[0]);
   checkDevice(o[1]);
@@ -721,7 +721,7 @@
   var o = new api.FindDevicesByDeviceIdentifierResponse();
   buildCounterFindDevicesByDeviceIdentifierResponse++;
   if (buildCounterFindDevicesByDeviceIdentifierResponse < 3) {
-    o.devices = buildUnnamed2412();
+    o.devices = buildUnnamed2545();
     o.nextPageToken = "foo";
     o.totalSize = 42;
   }
@@ -733,21 +733,21 @@
     api.FindDevicesByDeviceIdentifierResponse o) {
   buildCounterFindDevicesByDeviceIdentifierResponse++;
   if (buildCounterFindDevicesByDeviceIdentifierResponse < 3) {
-    checkUnnamed2412(o.devices);
+    checkUnnamed2545(o.devices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterFindDevicesByDeviceIdentifierResponse--;
 }
 
-buildUnnamed2413() {
+buildUnnamed2546() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2413(core.List<core.String> o) {
+checkUnnamed2546(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -758,7 +758,7 @@
   var o = new api.FindDevicesByOwnerRequest();
   buildCounterFindDevicesByOwnerRequest++;
   if (buildCounterFindDevicesByOwnerRequest < 3) {
-    o.customerId = buildUnnamed2413();
+    o.customerId = buildUnnamed2546();
     o.limit = "foo";
     o.pageToken = "foo";
     o.sectionType = "foo";
@@ -770,7 +770,7 @@
 checkFindDevicesByOwnerRequest(api.FindDevicesByOwnerRequest o) {
   buildCounterFindDevicesByOwnerRequest++;
   if (buildCounterFindDevicesByOwnerRequest < 3) {
-    checkUnnamed2413(o.customerId);
+    checkUnnamed2546(o.customerId);
     unittest.expect(o.limit, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     unittest.expect(o.sectionType, unittest.equals('foo'));
@@ -778,14 +778,14 @@
   buildCounterFindDevicesByOwnerRequest--;
 }
 
-buildUnnamed2414() {
+buildUnnamed2547() {
   var o = new core.List<api.Device>();
   o.add(buildDevice());
   o.add(buildDevice());
   return o;
 }
 
-checkUnnamed2414(core.List<api.Device> o) {
+checkUnnamed2547(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDevice(o[0]);
   checkDevice(o[1]);
@@ -796,7 +796,7 @@
   var o = new api.FindDevicesByOwnerResponse();
   buildCounterFindDevicesByOwnerResponse++;
   if (buildCounterFindDevicesByOwnerResponse < 3) {
-    o.devices = buildUnnamed2414();
+    o.devices = buildUnnamed2547();
     o.nextPageToken = "foo";
     o.totalSize = 42;
   }
@@ -807,21 +807,21 @@
 checkFindDevicesByOwnerResponse(api.FindDevicesByOwnerResponse o) {
   buildCounterFindDevicesByOwnerResponse++;
   if (buildCounterFindDevicesByOwnerResponse < 3) {
-    checkUnnamed2414(o.devices);
+    checkUnnamed2547(o.devices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterFindDevicesByOwnerResponse--;
 }
 
-buildUnnamed2415() {
+buildUnnamed2548() {
   var o = new core.List<api.Company>();
   o.add(buildCompany());
   o.add(buildCompany());
   return o;
 }
 
-checkUnnamed2415(core.List<api.Company> o) {
+checkUnnamed2548(core.List<api.Company> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCompany(o[0]);
   checkCompany(o[1]);
@@ -832,7 +832,7 @@
   var o = new api.ListCustomersResponse();
   buildCounterListCustomersResponse++;
   if (buildCounterListCustomersResponse < 3) {
-    o.customers = buildUnnamed2415();
+    o.customers = buildUnnamed2548();
     o.nextPageToken = "foo";
     o.totalSize = 42;
   }
@@ -843,21 +843,21 @@
 checkListCustomersResponse(api.ListCustomersResponse o) {
   buildCounterListCustomersResponse++;
   if (buildCounterListCustomersResponse < 3) {
-    checkUnnamed2415(o.customers);
+    checkUnnamed2548(o.customers);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterListCustomersResponse--;
 }
 
-buildUnnamed2416() {
+buildUnnamed2549() {
   var o = new core.List<api.Company>();
   o.add(buildCompany());
   o.add(buildCompany());
   return o;
 }
 
-checkUnnamed2416(core.List<api.Company> o) {
+checkUnnamed2549(core.List<api.Company> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCompany(o[0]);
   checkCompany(o[1]);
@@ -868,7 +868,7 @@
   var o = new api.ListVendorCustomersResponse();
   buildCounterListVendorCustomersResponse++;
   if (buildCounterListVendorCustomersResponse < 3) {
-    o.customers = buildUnnamed2416();
+    o.customers = buildUnnamed2549();
     o.nextPageToken = "foo";
     o.totalSize = 42;
   }
@@ -879,21 +879,21 @@
 checkListVendorCustomersResponse(api.ListVendorCustomersResponse o) {
   buildCounterListVendorCustomersResponse++;
   if (buildCounterListVendorCustomersResponse < 3) {
-    checkUnnamed2416(o.customers);
+    checkUnnamed2549(o.customers);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterListVendorCustomersResponse--;
 }
 
-buildUnnamed2417() {
+buildUnnamed2550() {
   var o = new core.List<api.Company>();
   o.add(buildCompany());
   o.add(buildCompany());
   return o;
 }
 
-checkUnnamed2417(core.List<api.Company> o) {
+checkUnnamed2550(core.List<api.Company> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCompany(o[0]);
   checkCompany(o[1]);
@@ -906,7 +906,7 @@
   if (buildCounterListVendorsResponse < 3) {
     o.nextPageToken = "foo";
     o.totalSize = 42;
-    o.vendors = buildUnnamed2417();
+    o.vendors = buildUnnamed2550();
   }
   buildCounterListVendorsResponse--;
   return o;
@@ -917,12 +917,12 @@
   if (buildCounterListVendorsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
-    checkUnnamed2417(o.vendors);
+    checkUnnamed2550(o.vendors);
   }
   buildCounterListVendorsResponse--;
 }
 
-buildUnnamed2418() {
+buildUnnamed2551() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -937,7 +937,7 @@
   return o;
 }
 
-checkUnnamed2418(core.Map<core.String, core.Object> o) {
+checkUnnamed2551(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));
@@ -951,7 +951,7 @@
   unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2419() {
+buildUnnamed2552() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -966,7 +966,7 @@
   return o;
 }
 
-checkUnnamed2419(core.Map<core.String, core.Object> o) {
+checkUnnamed2552(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));
@@ -987,9 +987,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed2418();
+    o.metadata = buildUnnamed2551();
     o.name = "foo";
-    o.response = buildUnnamed2419();
+    o.response = buildUnnamed2552();
   }
   buildCounterOperation--;
   return o;
@@ -1000,9 +1000,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed2418(o.metadata);
+    checkUnnamed2551(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2419(o.response);
+    checkUnnamed2552(o.response);
   }
   buildCounterOperation--;
 }
@@ -1109,7 +1109,7 @@
   buildCounterPerDeviceStatusInBatch--;
 }
 
-buildUnnamed2420() {
+buildUnnamed2553() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {
     'list': [1, 2, 3],
@@ -1124,7 +1124,7 @@
   return o;
 }
 
-checkUnnamed2420(core.Map<core.String, core.Object> o) {
+checkUnnamed2553(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));
@@ -1138,17 +1138,17 @@
   unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2421() {
+buildUnnamed2554() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed2420());
-  o.add(buildUnnamed2420());
+  o.add(buildUnnamed2553());
+  o.add(buildUnnamed2553());
   return o;
 }
 
-checkUnnamed2421(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed2554(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2420(o[0]);
-  checkUnnamed2420(o[1]);
+  checkUnnamed2553(o[0]);
+  checkUnnamed2553(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1157,7 +1157,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed2421();
+    o.details = buildUnnamed2554();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1168,7 +1168,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed2421(o.details);
+    checkUnnamed2554(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -1201,14 +1201,14 @@
   buildCounterUnclaimDeviceRequest--;
 }
 
-buildUnnamed2422() {
+buildUnnamed2555() {
   var o = new core.List<api.PartnerUnclaim>();
   o.add(buildPartnerUnclaim());
   o.add(buildPartnerUnclaim());
   return o;
 }
 
-checkUnnamed2422(core.List<api.PartnerUnclaim> o) {
+checkUnnamed2555(core.List<api.PartnerUnclaim> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPartnerUnclaim(o[0]);
   checkPartnerUnclaim(o[1]);
@@ -1219,7 +1219,7 @@
   var o = new api.UnclaimDevicesRequest();
   buildCounterUnclaimDevicesRequest++;
   if (buildCounterUnclaimDevicesRequest < 3) {
-    o.unclaims = buildUnnamed2422();
+    o.unclaims = buildUnnamed2555();
   }
   buildCounterUnclaimDevicesRequest--;
   return o;
@@ -1228,19 +1228,19 @@
 checkUnclaimDevicesRequest(api.UnclaimDevicesRequest o) {
   buildCounterUnclaimDevicesRequest++;
   if (buildCounterUnclaimDevicesRequest < 3) {
-    checkUnnamed2422(o.unclaims);
+    checkUnnamed2555(o.unclaims);
   }
   buildCounterUnclaimDevicesRequest--;
 }
 
-buildUnnamed2423() {
+buildUnnamed2556() {
   var o = new core.List<api.UpdateMetadataArguments>();
   o.add(buildUpdateMetadataArguments());
   o.add(buildUpdateMetadataArguments());
   return o;
 }
 
-checkUnnamed2423(core.List<api.UpdateMetadataArguments> o) {
+checkUnnamed2556(core.List<api.UpdateMetadataArguments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUpdateMetadataArguments(o[0]);
   checkUpdateMetadataArguments(o[1]);
@@ -1251,7 +1251,7 @@
   var o = new api.UpdateDeviceMetadataInBatchRequest();
   buildCounterUpdateDeviceMetadataInBatchRequest++;
   if (buildCounterUpdateDeviceMetadataInBatchRequest < 3) {
-    o.updates = buildUnnamed2423();
+    o.updates = buildUnnamed2556();
   }
   buildCounterUpdateDeviceMetadataInBatchRequest--;
   return o;
@@ -1261,7 +1261,7 @@
     api.UpdateDeviceMetadataInBatchRequest o) {
   buildCounterUpdateDeviceMetadataInBatchRequest++;
   if (buildCounterUpdateDeviceMetadataInBatchRequest < 3) {
-    checkUnnamed2423(o.updates);
+    checkUnnamed2556(o.updates);
   }
   buildCounterUpdateDeviceMetadataInBatchRequest--;
 }
@@ -2988,8 +2988,8 @@
       api.PartnersVendorsResourceApi res =
           new api.AndroiddeviceprovisioningApi(mock).partners.vendors;
       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;
@@ -3022,10 +3022,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 = {
@@ -3036,8 +3036,8 @@
       }), true);
       res
           .list(arg_parent,
-              pageToken: arg_pageToken,
               pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
         checkListVendorsResponse(response);
