[dart] Update packages.

Change-Id: Ibb61c3b4f77542d54619c3e42affa83cf0af8b25
diff --git a/dart_style/BUILD.gn b/dart_style/BUILD.gn
index 7c7ede8..2624f2d 100644
--- a/dart_style/BUILD.gn
+++ b/dart_style/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for dart_style-1.0.9+1
+# This file is generated by importer.py for dart_style-1.0.10
 
 import("//build/dart/dart_library.gni")
 
diff --git a/dart_style/CHANGELOG.md b/dart_style/CHANGELOG.md
index 83c3efd..4439dae 100644
--- a/dart_style/CHANGELOG.md
+++ b/dart_style/CHANGELOG.md
@@ -1,3 +1,11 @@
+# 1.0.10
+
+* Don't split before `.` if the target expression is an argument list with a
+  trailing comma (#548, #665).
+* Preserve metadata on for-in variables (#648).
+* Support optional `new`/`const` (#652).
+* Better formatting of initialization lists after trailing commas (#658).
+
 # 1.0.9
 
 * Updated tests. No user-facing changes.
diff --git a/dart_style/bin/format.dart b/dart_style/bin/format.dart
index bdd5a9b..22c266c 100644
--- a/dart_style/bin/format.dart
+++ b/dart_style/bin/format.dart
@@ -14,7 +14,7 @@
 import 'package:dart_style/src/source_code.dart';
 
 // Note: The following line of code is modified by tool/grind.dart.
-const version = "1.0.9";
+const version = "1.0.10";
 
 void main(List<String> args) {
   var parser = new ArgParser(allowTrailingOptions: true);
diff --git a/dart_style/lib/src/call_chain_visitor.dart b/dart_style/lib/src/call_chain_visitor.dart
index 9c40dca..d9ebf12 100644
--- a/dart_style/lib/src/call_chain_visitor.dart
+++ b/dart_style/lib/src/call_chain_visitor.dart
@@ -5,6 +5,7 @@
 library dart_style.src.call_chain_visitor;
 
 import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/dart/ast/token.dart';
 
 import 'argument_list_visitor.dart';
 import 'rule/argument.dart';
@@ -331,6 +332,10 @@
     if (argumentList.arguments.isEmpty) return true;
 
     var argument = argumentList.arguments.last;
+
+    // If the argument list has a trailing comma, treat it like a collection.
+    if (argument.endToken.next.type == TokenType.COMMA) return false;
+
     if (argument is NamedExpression) {
       argument = (argument as NamedExpression).expression;
     }
diff --git a/dart_style/lib/src/dart_formatter.dart b/dart_style/lib/src/dart_formatter.dart
index 22d0a6a..3db322f 100644
--- a/dart_style/lib/src/dart_formatter.dart
+++ b/dart_style/lib/src/dart_formatter.dart
@@ -103,7 +103,7 @@
 
     // Parse it.
     var parser = new Parser(stringSource, errorListener);
-    parser.enableAssertInitializer = true;
+    parser.enableOptionalNewAndConst = true;
 
     AstNode node;
     if (source.isCompilationUnit) {
diff --git a/dart_style/lib/src/source_visitor.dart b/dart_style/lib/src/source_visitor.dart
index cef1340..319a53e 100644
--- a/dart_style/lib/src/source_visitor.dart
+++ b/dart_style/lib/src/source_visitor.dart
@@ -705,15 +705,62 @@
   }
 
   void _visitConstructorInitializers(ConstructorDeclaration node) {
-    // Shift the ":" forward.
-    builder.indent(Indent.constructorInitializer);
+    var hasTrailingComma = node.parameters.parameters.isNotEmpty &&
+        node.parameters.parameters.last.endToken.next.type == TokenType.COMMA;
 
-    split();
-    token(node.separator); // ":".
-    space();
+    if (hasTrailingComma) {
+      // Since the ")", "])", or "})" on the preceding line doesn't take up
+      // much space, it looks weird to move the ":" onto it's own line. Instead,
+      // keep it and the first initializer on the current line but add enough
+      // space before it to line it up with any subsequent initializers.
+      //
+      //     Foo(
+      //       parameter,
+      //     )   : field = value,
+      //           super();
+      space();
+      var isOptional =
+          node.parameters.parameters.last.kind != ParameterKind.REQUIRED;
+      if (node.initializers.length > 1) {
+        _writeText(isOptional ? " " : "  ", node.separator.offset);
+      }
 
-    // Shift everything past the ":".
-    builder.indent();
+      // ":".
+      token(node.separator);
+      space();
+
+      builder.indent(6);
+    } else {
+      // Shift the itself ":" forward.
+      builder.indent(Indent.constructorInitializer);
+
+      // If the parameters or initializers split, put the ":" on its own line.
+      split();
+
+      // ":".
+      token(node.separator);
+      space();
+
+      // Try to line up the initializers with the first one that follows the ":":
+      //
+      //     Foo(notTrailing)
+      //         : initializer = value,
+      //           super(); // +2 from previous line.
+      //
+      //     Foo(
+      //       trailing,
+      //     ) : initializer = value,
+      //         super(); // +4 from previous line.
+      //
+      // This doesn't work if there is a trailing comma in an optional parameter,
+      // but we don't want to do a weird +5 alignment:
+      //
+      //     Foo({
+      //       trailing,
+      //     }) : initializer = value,
+      //         super(); // Doesn't quite line up. :(
+      builder.indent(2);
+    }
 
     for (var i = 0; i < node.initializers.length; i++) {
       if (i > 0) {
@@ -726,7 +773,7 @@
     }
 
     builder.unindent();
-    builder.unindent();
+    if (!hasTrailingComma) builder.unindent();
 
     // End the rule for ":" after all of the initializers.
     builder.endRule();
@@ -940,8 +987,39 @@
     token(node.forKeyword);
     space();
     token(node.leftParenthesis);
+
     if (node.loopVariable != null) {
+      // TODO(rnystrom): The formatting logic here is slightly different from
+      // how parameter metadata is handled and from how variable metadata is
+      // handled. I think what it does works better in the context of a for-in
+      // loop, but consider trying to unify this with one of the above.
+      //
+      // Metadata on class and variable declarations is *always* split:
+      //
+      //     @foo
+      //     class Bar {}
+      //
+      // Metadata on parameters has some complex logic to handle multiple
+      // parameters with metadata. It also indents the parameters farther than
+      // the metadata when split:
+      //
+      //     function(
+      //         @foo(long arg list...)
+      //             parameter1,
+      //         @foo
+      //             parameter2) {}
+      //
+      // For for-in variables, we allow it to not split, like parameters, but
+      // don't indent the variable when it does split:
+      //
+      //     for (
+      //         @foo
+      //         @bar
+      //         var blah in stuff) {}
+      builder.startRule();
+      visitNodes(node.loopVariable.metadata, between: split, after: split);
       visit(node.loopVariable);
+      builder.endRule();
     } else {
       visit(node.identifier);
     }
@@ -1341,8 +1419,7 @@
 
   visitInstanceCreationExpression(InstanceCreationExpression node) {
     builder.startSpan();
-    token(node.keyword);
-    space();
+    token(node.keyword, after: space);
     builder.startSpan(Cost.constructorName);
 
     // Start the expression nesting for the argument list here, in case this
diff --git a/dart_style/pubspec.yaml b/dart_style/pubspec.yaml
index 0d9467f..e89d909 100644
--- a/dart_style/pubspec.yaml
+++ b/dart_style/pubspec.yaml
@@ -1,27 +1,27 @@
 name: dart_style
 # Note: See tool/grind.dart for how to bump the version.
-version: 1.0.9+1
+version: 1.0.10
 author: Dart Team <misc@dartlang.org>
 description: Opinionated, automatic Dart source code formatter.
 homepage: https://github.com/dart-lang/dart_style
 environment:
-  sdk: ">=1.8.0 <2.0.0"
+  sdk: '>=1.8.0 <2.0.0'
 dependencies:
-  analyzer: '>=0.30.0 <0.32.0'
+  analyzer: ^0.31.2-alpha.0
   args: '>=0.12.1 <2.0.0'
-  path: '>=1.0.0 <2.0.0'
-  source_span: '>=1.4.0 <2.0.0'
+  path: ^1.0.0
+  source_span: ^1.4.0
 dev_dependencies:
   async: '>=1.0.0 <=3.0.0'
-  browser: '>=0.10.0 <0.11.0'
-  grinder: '^0.8.0'
+  browser: ^0.10.0
+  grinder: ^0.8.0
   js: ^0.6.0
   node_preamble: ^1.0.0
-  pub_semver: '^1.2.3'
-  test: '>=0.12.0 <0.13.0'
-  test_descriptor: "^1.0.0"
-  test_process: "^1.0.0"
-  yaml: '^2.0.0'
+  pub_semver: ^1.2.3
+  test: ^0.12.0
+  test_descriptor: ^1.0.0
+  test_process: ^1.0.0
+  yaml: ^2.0.0
 executables:
   dartfmt: format
   dartformat: format # Allow the old name for compatibility.
diff --git a/flutter_markdown/BUILD.gn b/flutter_markdown/BUILD.gn
index 91e4b29..dc8ebaf 100644
--- a/flutter_markdown/BUILD.gn
+++ b/flutter_markdown/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for flutter_markdown-0.1.1
+# This file is generated by importer.py for flutter_markdown-0.1.3
 
 import("//build/dart/dart_library.gni")
 
@@ -10,6 +10,7 @@
   disable_analysis = true
 
   deps = [
+    "//third_party/dart-pkg/pub/path",
     "//third_party/dart-pkg/pub/markdown",
     "//third_party/dart-pkg/pub/meta",
     "//third_party/dart-pkg/git/flutter/packages/flutter",
diff --git a/flutter_markdown/CHANGELOG.md b/flutter_markdown/CHANGELOG.md
index 0a3ba9f..f4555ae 100644
--- a/flutter_markdown/CHANGELOG.md
+++ b/flutter_markdown/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 0.1.3
+
+* Add `path` and `http` as declared dependencies in `pubspec.yaml`
+
+## 0.1.2
+
+* Add support for horizontal rules.
+* Fix the `onTap` callback on images nested in hyperlinks
+
 ## 0.1.1
 
 * Add support for local file paths in image links. Make sure to set the
diff --git a/flutter_markdown/README.md b/flutter_markdown/README.md
index c5a5ed9..05bb266 100644
--- a/flutter_markdown/README.md
+++ b/flutter_markdown/README.md
@@ -23,3 +23,15 @@
 but it's possible to create your own custom styling. Use the MarkdownStyle class
 to pass in your own style. If you don't want to use Markdown outside of material
 design, use the MarkdownRaw class.
+
+## Image support
+
+The `Img` tag only supports the following image locations. It specifically
+does not support image locations referring to bundled assets.
+
+* From the network: Use a URL prefixed by either `http://` or `https://`.
+
+* From local files on the device: Use an absolute path to the file, for example by
+  concatenating the file name with the path returned by a known storage location,
+  such as those provided by the [`path_provider`](https://pub.dartlang.org/packages/path_provider)
+  plugin.
diff --git a/flutter_markdown/ios/Flutter/Generated.xcconfig b/flutter_markdown/ios/Flutter/Generated.xcconfig
new file mode 100644
index 0000000..56ef542
--- /dev/null
+++ b/flutter_markdown/ios/Flutter/Generated.xcconfig
@@ -0,0 +1,8 @@
+// This is a generated file; do not edit or check into version control.
+FLUTTER_ROOT=/Users/mit/dev/flutter
+FLUTTER_APPLICATION_PATH=/Users/mit/dev/mit-flutter_markdown
+FLUTTER_TARGET=lib/main.dart
+FLUTTER_BUILD_MODE=debug
+FLUTTER_BUILD_DIR=build
+SYMROOT=${SOURCE_ROOT}/../build/ios
+FLUTTER_FRAMEWORK_DIR=/Users/mit/dev/flutter/bin/cache/artifacts/engine/ios
diff --git a/flutter_markdown/ios/Runner/GeneratedPluginRegistrant.h b/flutter_markdown/ios/Runner/GeneratedPluginRegistrant.h
new file mode 100644
index 0000000..3b700eb
--- /dev/null
+++ b/flutter_markdown/ios/Runner/GeneratedPluginRegistrant.h
@@ -0,0 +1,14 @@
+//
+//  Generated file. Do not edit.
+//
+
+#ifndef GeneratedPluginRegistrant_h
+#define GeneratedPluginRegistrant_h
+
+#import <Flutter/Flutter.h>
+
+@interface GeneratedPluginRegistrant : NSObject
++ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry;
+@end
+
+#endif /* GeneratedPluginRegistrant_h */
diff --git a/flutter_markdown/ios/Runner/GeneratedPluginRegistrant.m b/flutter_markdown/ios/Runner/GeneratedPluginRegistrant.m
new file mode 100644
index 0000000..60dfa42
--- /dev/null
+++ b/flutter_markdown/ios/Runner/GeneratedPluginRegistrant.m
@@ -0,0 +1,12 @@
+//
+//  Generated file. Do not edit.
+//
+
+#import "GeneratedPluginRegistrant.h"
+
+@implementation GeneratedPluginRegistrant
+
++ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry {
+}
+
+@end
diff --git a/flutter_markdown/lib/src/builder.dart b/flutter_markdown/lib/src/builder.dart
index 18bf8b7..0c0dffe 100644
--- a/flutter_markdown/lib/src/builder.dart
+++ b/flutter_markdown/lib/src/builder.dart
@@ -24,6 +24,7 @@
   'pre',
   'ol',
   'ul',
+  'hr',
 ]);
 
 const List<String> _kListTags = const <String>['ul', 'ol'];
@@ -214,6 +215,11 @@
             child: child,
           ),
         );
+      } else if (tag == 'hr') {
+        child = new DecoratedBox(
+          decoration: styleSheet.horizontalRuleDecoration,
+          child: child,
+        );
       }
 
       _addBlockChild(child);
@@ -251,13 +257,21 @@
     }
 
     Uri uri = Uri.parse(path);
+    Widget child;
     if (uri.scheme == 'http' || uri.scheme == 'https') {
-      return new Image.network(uri.toString(), width: width, height: height);
+      child = new Image.network(uri.toString(), width: width, height: height);
     } else {
       String filePath = (imageDirectory == null
           ? uri.toFilePath()
           : p.join(imageDirectory.path, uri.toFilePath()));
-      return new Image.file(new File(filePath), width: width, height: height);
+      child = new Image.file(new File(filePath), width: width, height: height);
+    }
+
+    if (_linkHandlers.isNotEmpty) {
+      TapGestureRecognizer recognizer = _linkHandlers.last;
+      return new GestureDetector(child: child, onTap: recognizer.onTap);
+    } else {
+      return child;
     }
   }
 
diff --git a/flutter_markdown/lib/src/style_sheet.dart b/flutter_markdown/lib/src/style_sheet.dart
index 5505f7d..e0dc79e 100644
--- a/flutter_markdown/lib/src/style_sheet.dart
+++ b/flutter_markdown/lib/src/style_sheet.dart
@@ -26,7 +26,8 @@
     this.blockquotePadding,
     this.blockquoteDecoration,
     this.codeblockPadding,
-    this.codeblockDecoration
+    this.codeblockDecoration,
+    this.horizontalRuleDecoration
   }) : _styles = <String, TextStyle>{
     'a': a,
     'p': p,
@@ -77,7 +78,12 @@
       codeblockDecoration: new BoxDecoration(
         color: Colors.grey.shade100,
         borderRadius: new BorderRadius.circular(2.0)
-      )
+      ),
+      horizontalRuleDecoration: new BoxDecoration(
+        border: new Border(
+          top: new BorderSide(width: 5.0, color: Colors.grey.shade300)
+        ),
+      ),
     );
   }
 
@@ -115,7 +121,12 @@
       codeblockDecoration: new BoxDecoration(
         color: Colors.grey.shade100,
         borderRadius: new BorderRadius.circular(2.0)
-      )
+      ),
+      horizontalRuleDecoration: new BoxDecoration(
+        border: new Border(
+          top: new BorderSide(width: 5.0, color: Colors.grey.shade300)
+        ),
+      ),
     );
   }
 
@@ -140,7 +151,8 @@
     double blockquotePadding,
     Decoration blockquoteDecoration,
     double codeblockPadding,
-    Decoration codeblockDecoration
+    Decoration codeblockDecoration,
+    Decoration horizontalRuleDecoration
   }) {
     return new MarkdownStyleSheet(
       a: a != null ? a : this.a,
@@ -161,7 +173,8 @@
       blockquotePadding: blockquotePadding != null ? blockquotePadding : this.blockquotePadding,
       blockquoteDecoration: blockquoteDecoration != null ? blockquoteDecoration : this.blockquoteDecoration,
       codeblockPadding: codeblockPadding != null ? codeblockPadding : this.codeblockPadding,
-      codeblockDecoration: codeblockDecoration != null ? codeblockDecoration : this.codeblockDecoration
+      codeblockDecoration: codeblockDecoration != null ? codeblockDecoration : this.codeblockDecoration,
+      horizontalRuleDecoration: horizontalRuleDecoration != null ? horizontalRuleDecoration : this.horizontalRuleDecoration
     );
   }
 
@@ -222,6 +235,9 @@
   /// The decoration to use behind for `pre` elements.
   final Decoration codeblockDecoration;
 
+  /// The decoration to use for `hr` elements.
+  final Decoration horizontalRuleDecoration;
+
   /// A [Map] from element name to the cooresponding [TextStyle] object.
   Map<String, TextStyle> get styles => _styles;
   Map<String, TextStyle> _styles;
@@ -251,7 +267,8 @@
         && typedOther.blockquotePadding == blockquotePadding
         && typedOther.blockquoteDecoration == blockquoteDecoration
         && typedOther.codeblockPadding == codeblockPadding
-        && typedOther.codeblockDecoration == codeblockDecoration;
+        && typedOther.codeblockDecoration == codeblockDecoration
+        && typedOther.horizontalRuleDecoration == horizontalRuleDecoration;
   }
 
   @override
@@ -276,6 +293,7 @@
       blockquoteDecoration,
       codeblockPadding,
       codeblockDecoration,
+      horizontalRuleDecoration,
     );
   }
 }
diff --git a/flutter_markdown/pubspec.yaml b/flutter_markdown/pubspec.yaml
index 2df97d3..93b58f9 100644
--- a/flutter_markdown/pubspec.yaml
+++ b/flutter_markdown/pubspec.yaml
@@ -2,7 +2,7 @@
 author: Flutter Authors <flutter-dev@googlegroups.com>
 description: A markdown renderer for Flutter.
 homepage: https://github.com/flutter/flutter_markdown
-version: 0.1.1
+version: 0.1.3
 
 dependencies:
   flutter:
@@ -10,10 +10,12 @@
   markdown: ^1.0.0
   meta: ^1.0.5
   string_scanner: ^1.0.0
+  path: ^1.5.1
 
 dev_dependencies:
   flutter_test:
     sdk: flutter
+  http: ^0.11.3+16
 
 environment:
   sdk: '>=1.19.0 <2.0.0'
diff --git a/googleapis/BUILD.gn b/googleapis/BUILD.gn
index e0e9696..525bb28 100644
--- a/googleapis/BUILD.gn
+++ b/googleapis/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for googleapis-0.46.0
+# This file is generated by importer.py for googleapis-0.50.0
 
 import("//build/dart/dart_library.gni")
 
diff --git a/googleapis/CHANGELOG.md b/googleapis/CHANGELOG.md
index 72cec11..d48d405 100644
--- a/googleapis/CHANGELOG.md
+++ b/googleapis/CHANGELOG.md
@@ -1,3 +1,156 @@
+## 0.50.0
+
+* [api-new] serviceusage:v1
+* [api] androidenterprise:v1
+* [api] androidmanagement:v1
+* [api] appengine:v1
+* [api] bigquery:v2
+* [api] calendar:v3
+* [api] cloudiot:v1
+* [api] compute:v1
+* [api] doubleclickbidmanager:v1
+* [api] gmail:v1
+* [api] iam:v1
+* [api] manufacturers:v1
+* [api] ml:v1
+* [api] monitoring:v3
+* [api] poly:v1
+* [api] safebrowsing:v4
+* [api] serviceconsumermanagement:v1
+* [api] servicemanagement:v1
+* [api] sheets:v4
+* [api] slides:v1
+* [api] spanner:v1
+* [api] testing:v1
+* [api] youtube:v3
+* [api-breaking] bigquery:v2
+* [api-breaking] bigquery:v2
+* [api-breaking] cloudiot:v1
+* [api-breaking] manufacturers:v1
+* [api-breaking] ml:v1
+* [api-breaking] servicemanagement:v1
+
+## 0.49.0
+
+* [api] analytics:v3
+* [api] androidenterprise:v1
+* [api] androidmanagement:v1
+* [api] appengine:v1
+* [api] books:v1
+* [api] compute:v1
+* [api] content:v2
+* [api] content:v2sandbox
+* [api] drive:v2
+* [api] drive:v3
+* [api] firebasedynamiclinks:v1
+* [api] iam:v1
+* [api] logging:v2
+* [api] ml:v1
+* [api] pagespeedonline:v1
+* [api] pagespeedonline:v2
+* [api] pubsub:v1
+* [api] safebrowsing:v4
+* [api] script:v1
+* [api] sheets:v4
+* [api] slides:v1
+* [api] speech:v1
+* [api] vision:v1
+* [api-breaking] appsactivity:v1
+* [api-breaking] cloudiot:v1
+* [api-breaking] cloudkms:v1
+* [api-breaking] firebaserules:v1
+* [api-breaking] games:v1
+* [api-breaking] ml:v1
+* [api-breaking] oslogin:v1
+* [api-breaking] partners:v2
+* [api-breaking] serviceconsumermanagement:v1
+* [api-breaking] servicemanagement:v1
+* [api-breaking] serviceuser:v1
+* [api-breaking] speech:v1
+
+## 0.48.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
+* [api-new] poly:v1
+* [api-new] serviceconsumermanagement:v1
+* [api] admin:directory_v1
+* [api] androidenterprise:v1
+* [api] androidmanagement:v1
+* [api] appengine:v1
+* [api] cloudbuild:v1
+* [api] content:v2
+* [api] content:v2sandbox
+* [api] fusiontables:v2
+* [api] ml:v1
+* [api] monitoring:v3
+* [api] pubsub:v1
+* [api] slides:v1
+* [api] speech:v1
+* [api] youtube:v3
+
+## 0.47.0
+
+* [api-new] dfareporting:v3_0
+* [api] analyticsreporting:v4
+* [api] androidenterprise:v1
+* [api] bigquerydatatransfer:v1
+* [api] bigquery:v2
+* [api] classroom:v1
+* [api] cloudbuild:v1
+* [api] cloudfunctions:v1
+* [api] drive:v2
+* [api] drive:v3
+* [api] firebasedynamiclinks:v1
+* [api] firebaseremoteconfig:v1
+* [api] language:v1
+* [api] logging:v2
+* [api] ml:v1
+* [api] tagmanager:v1
+* [api] tagmanager:v2
+* [api-breaking] androidpublisher:v2
+* [api-breaking] appengine:v1
+* [api-breaking] bigquerydatatransfer:v1
+* [api-breaking] content:v2
+* [api-breaking] content:v2sandbox
+* [api-breaking] monitoring:v3
+* [api-breaking] script:v1
+* [api-breaking] servicemanagement:v1
+* [api-breaking] serviceuser:v1
+* [api-breaking] storage:v1
+* [api-breaking] tagmanager:v1
+* [api-removed] playmoviespartner:v1
+
 ## 0.46.0
 
 * [api] admin:directory_v1
diff --git a/googleapis/README.md b/googleapis/README.md
index 9ed79bf..c20db2b 100644
--- a/googleapis/README.md
+++ b/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).
@@ -149,7 +155,7 @@
 
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Android Device Provisioning Partner API - androiddeviceprovisioning v1
 
-Automates reseller integration into zero-touch enrollment by assigning devices to customers and creating device reports.
+Automates Android zero-touch enrollment for device resellers, customers, and EMMs.
 
 Official API documentation: https://developers.google.com/zero-touch/
 
@@ -282,16 +288,23 @@
 
 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
 
-Send and retrieve trace data from Stackdriver Trace. Data is generated and available by default for all App Engine applications. Data from other applications can be written to Stackdriver Trace for display, reporting, and analysis.
+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.
 
 
 Official API documentation: https://cloud.google.com/trace
 
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Stackdriver Trace API - cloudtrace v2
 
-Send and retrieve trace data from Stackdriver Trace. Data is generated and available by default for all App Engine applications. Data from other applications can be written to Stackdriver Trace for display, reporting, and analysis.
+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.
 
 
 Official API documentation: https://cloud.google.com/trace
@@ -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
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Kubernetes Engine API - container v1
 
-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/
 
@@ -355,6 +364,18 @@
 
 Official API documentation: https://developers.google.com/doubleclick-advertisers/
 
+#### ![Logo](https://www.google.com/images/icons/product/doubleclick-16.gif) DCM/DFA Reporting And Trafficking API - dfareporting v3.0
+
+Manages your DoubleClick Campaign Manager ad campaigns and reports.
+
+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.
@@ -536,6 +557,12 @@
 
 Official API documentation: https://developers.google.com/accounts/docs/OAuth2
 
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Cloud OS Login API - oslogin v1
+
+Manages OS login configuration for Google account users.
+
+Official API documentation: https://cloud.google.com/compute/docs/oslogin/rest/
+
 #### ![Logo](https://www.google.com/images/icons/product/pagespeed-16.png) PageSpeed Insights API - pagespeedonline v1
 
 Analyzes the performance of a web page and provides tailored suggestions to make that page faster.
@@ -566,12 +593,6 @@
 
 Official API documentation: https://developers.google.com/android/work/play/custom-app-api
 
-#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Play Movies Partner API - playmoviespartner v1
-
-Gets the delivery status of titles for Google Play Movies Partners.
-
-Official API documentation: https://developers.google.com/playmoviespartner/
-
 #### ![Logo](http://www.google.com/images/icons/product/gplus-16.png) Google+ API - plus v1
 
 Builds on top of the Google+ platform.
@@ -584,6 +605,13 @@
 
 Official API documentation: https://developers.google.com/+/domains/
 
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Poly API - poly v1
+
+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://developers.google.com/poly/
+
 #### ![Logo](https://www.google.com/images/icons/feature/predictionapi-16.png) Prediction API - prediction v1.6
 
 Lets you access a cloud hosted machine learning service that makes it easy to build smart apps
@@ -615,11 +643,11 @@
 
 Official API documentation: https://developers.google.com/safe-browsing/
 
-#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Apps Script Execution API - script v1
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Apps Script API - script v1
 
 An API for managing and executing Google Apps Script projects.
 
-Official API documentation: https://developers.google.com/apps-script/execution/rest/v1/scripts/run
+Official API documentation: https://developers.google.com/apps-script/api/
 
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Search Console URL Testing Tools API - searchconsole v1
 
@@ -627,6 +655,12 @@
 
 Official API documentation: https://developers.google.com/webmaster-tools/search-console-api/
 
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Service Consumer Management API - serviceconsumermanagement v1
+
+Provides management methods for configuring service producer resources on Google Cloud.
+
+Official API documentation: https://cloud.google.com/service-consumer-management/docs/overview
+
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Service Control API - servicecontrol v1
 
 Google Service Control provides control plane functionality to managed services, such as logging, monitoring, and status checks.
@@ -639,6 +673,12 @@
 
 Official API documentation: https://cloud.google.com/service-management/
 
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Service Usage API - serviceusage v1
+
+Enables services that service consumers want to use on Google Cloud Platform, lists the available or enabled services, or disables services that service consumers no longer use.
+
+Official API documentation: https://cloud.google.com/service-usage/
+
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Service User API - serviceuser v1
 
 Enables services that service consumers want to use on Google Cloud Platform, lists the available or enabled services, or disables services that service consumers no longer use.
diff --git a/googleapis/lib/abusiveexperiencereport/v1.dart b/googleapis/lib/abusiveexperiencereport/v1.dart
new file mode 100644
index 0000000..7bf4fa2
--- /dev/null
+++ b/googleapis/lib/abusiveexperiencereport/v1.dart
@@ -0,0 +1,246 @@
+// 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 '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/googleapis/lib/adexchangeseller/v1_1.dart b/googleapis/lib/adexchangeseller/v1_1.dart
index d5b5b5b..787fc61 100644
--- a/googleapis/lib/adexchangeseller/v1_1.dart
+++ b/googleapis/lib/adexchangeseller/v1_1.dart
@@ -4,7 +4,6 @@
 
 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;
diff --git a/googleapis/lib/adexchangeseller/v2_0.dart b/googleapis/lib/adexchangeseller/v2_0.dart
index e504532..33b0d31 100644
--- a/googleapis/lib/adexchangeseller/v2_0.dart
+++ b/googleapis/lib/adexchangeseller/v2_0.dart
@@ -4,7 +4,6 @@
 
 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;
diff --git a/googleapis/lib/adexperiencereport/v1.dart b/googleapis/lib/adexperiencereport/v1.dart
index e493efb..04b7251 100644
--- a/googleapis/lib/adexperiencereport/v1.dart
+++ b/googleapis/lib/adexperiencereport/v1.dart
@@ -4,7 +4,6 @@
 
 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;
diff --git a/googleapis/lib/admin/directory_v1.dart b/googleapis/lib/admin/directory_v1.dart
index 73044d4..5065aed 100644
--- a/googleapis/lib/admin/directory_v1.dart
+++ b/googleapis/lib/admin/directory_v1.dart
@@ -507,7 +507,7 @@
   /// - "status" : Chromebook status.
   /// - "supportEndDate" : Chromebook support end date.
   ///
-  /// [orgUnitPath] - Full path of the organization unit or its Id
+  /// [orgUnitPath] - Full path of the organizational unit or its ID
   ///
   /// [pageToken] - Token to specify next page in the list
   ///
@@ -593,7 +593,7 @@
     return _response.then((data) => new ChromeOsDevices.fromJson(data));
   }
 
-  /// Move or insert multiple Chrome OS Devices to Organization Unit
+  /// Move or insert multiple Chrome OS Devices to organizational unit
   ///
   /// [request] - The metadata request object.
   ///
@@ -601,7 +601,7 @@
   ///
   /// [customerId] - Immutable ID of the G Suite account
   ///
-  /// [orgUnitPath] - Full path of the target organization unit or its Id
+  /// [orgUnitPath] - Full path of the target organizational unit or its ID
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1349,7 +1349,7 @@
   ///
   /// Request parameters:
   ///
-  /// [groupKey] - Email or immutable Id of the group
+  /// [groupKey] - Email or immutable ID of the group
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1391,7 +1391,7 @@
   ///
   /// Request parameters:
   ///
-  /// [groupKey] - Email or immutable Id of the group
+  /// [groupKey] - Email or immutable ID of the group
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1486,8 +1486,8 @@
   ///
   /// [pageToken] - Token to specify next page in the list
   ///
-  /// [userKey] - Email or immutable Id of the user if only those groups are to
-  /// be listed, the given user is a member of. If Id, it should match with id
+  /// [userKey] - Email or immutable ID of the user if only those groups are to
+  /// be listed, the given user is a member of. If ID, it should match with id
   /// of user object
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -1550,7 +1550,7 @@
   ///
   /// Request parameters:
   ///
-  /// [groupKey] - Email or immutable Id of the group. If Id, it should match
+  /// [groupKey] - Email or immutable ID of the group. If ID, it should match
   /// with id of group object
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -1599,7 +1599,7 @@
   ///
   /// Request parameters:
   ///
-  /// [groupKey] - Email or immutable Id of the group. If Id, it should match
+  /// [groupKey] - Email or immutable ID of the group. If ID, it should match
   /// with id of group object
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -1652,7 +1652,7 @@
   ///
   /// Request parameters:
   ///
-  /// [groupKey] - Email or immutable Id of the group
+  /// [groupKey] - Email or immutable ID of the group
   ///
   /// [alias] - The alias to be removed
   ///
@@ -1705,7 +1705,7 @@
   ///
   /// Request parameters:
   ///
-  /// [groupKey] - Email or immutable Id of the group
+  /// [groupKey] - Email or immutable ID of the group
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1751,7 +1751,7 @@
   ///
   /// Request parameters:
   ///
-  /// [groupKey] - Email or immutable Id of the group
+  /// [groupKey] - Email or immutable ID of the group
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1799,9 +1799,9 @@
   ///
   /// Request parameters:
   ///
-  /// [groupKey] - Email or immutable Id of the group
+  /// [groupKey] - Email or immutable ID of the group
   ///
-  /// [memberKey] - Email or immutable Id of the member
+  /// [memberKey] - Email or immutable ID of the member
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1850,9 +1850,9 @@
   ///
   /// Request parameters:
   ///
-  /// [groupKey] - Email or immutable Id of the group
+  /// [groupKey] - Email or immutable ID of the group
   ///
-  /// [memberKey] - Email or immutable Id of the member
+  /// [memberKey] - Email or immutable ID of the member
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1897,13 +1897,65 @@
     return _response.then((data) => new Member.fromJson(data));
   }
 
+  /// Checks Membership of an user within a Group
+  ///
+  /// Request parameters:
+  ///
+  /// [groupKey] - Email or immutable Id of the group
+  ///
+  /// [memberKey] - Email or immutable Id of the member
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [MembersHasMember].
+  ///
+  /// 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<MembersHasMember> hasMember(
+      core.String groupKey, core.String memberKey,
+      {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 (groupKey == null) {
+      throw new core.ArgumentError("Parameter groupKey is required.");
+    }
+    if (memberKey == null) {
+      throw new core.ArgumentError("Parameter memberKey is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'groups/' +
+        commons.Escaper.ecapeVariable('$groupKey') +
+        '/hasMember/' +
+        commons.Escaper.ecapeVariable('$memberKey');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new MembersHasMember.fromJson(data));
+  }
+
   /// Add user to the specified group.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [groupKey] - Email or immutable Id of the group
+  /// [groupKey] - Email or immutable ID of the group
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1949,7 +2001,7 @@
   ///
   /// Request parameters:
   ///
-  /// [groupKey] - Email or immutable Id of the group
+  /// [groupKey] - Email or immutable ID of the group
   ///
   /// [maxResults] - Maximum number of results to return. Default is 200
   ///
@@ -2013,10 +2065,10 @@
   ///
   /// Request parameters:
   ///
-  /// [groupKey] - Email or immutable Id of the group. If Id, it should match
+  /// [groupKey] - Email or immutable ID of the group. If ID, it should match
   /// with id of group object
   ///
-  /// [memberKey] - Email or immutable Id of the user. If Id, it should match
+  /// [memberKey] - Email or immutable ID of the user. If ID, it should match
   /// with id of member object
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -2072,10 +2124,10 @@
   ///
   /// Request parameters:
   ///
-  /// [groupKey] - Email or immutable Id of the group. If Id, it should match
+  /// [groupKey] - Email or immutable ID of the group. If ID, it should match
   /// with id of group object
   ///
-  /// [memberKey] - Email or immutable Id of the user. If Id, it should match
+  /// [memberKey] - Email or immutable ID of the user. If ID, it should match
   /// with id of member object
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -2695,13 +2747,13 @@
 
   OrgunitsResourceApi(commons.ApiRequester client) : _requester = client;
 
-  /// Remove Organization Unit
+  /// Remove organizational unit
   ///
   /// Request parameters:
   ///
   /// [customerId] - Immutable ID of the G Suite account
   ///
-  /// [orgUnitPath] - Full path of the organization unit or its Id
+  /// [orgUnitPath] - Full path of the organizational unit or its ID
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -2750,13 +2802,13 @@
     return _response.then((data) => null);
   }
 
-  /// Retrieve Organization Unit
+  /// Retrieve organizational unit
   ///
   /// Request parameters:
   ///
   /// [customerId] - Immutable ID of the G Suite account
   ///
-  /// [orgUnitPath] - Full path of the organization unit or its Id
+  /// [orgUnitPath] - Full path of the organizational unit or its ID
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -2805,7 +2857,7 @@
     return _response.then((data) => new OrgUnit.fromJson(data));
   }
 
-  /// Add Organization Unit
+  /// Add organizational unit
   ///
   /// [request] - The metadata request object.
   ///
@@ -2855,18 +2907,18 @@
     return _response.then((data) => new OrgUnit.fromJson(data));
   }
 
-  /// Retrieve all Organization Units
+  /// Retrieve all organizational units
   ///
   /// Request parameters:
   ///
   /// [customerId] - Immutable ID of the G Suite account
   ///
-  /// [orgUnitPath] - the URL-encoded organization unit's path or its Id
+  /// [orgUnitPath] - the URL-encoded organizational unit's path or its ID
   ///
   /// [type] - Whether to return all sub-organizations or just immediate
   /// children
   /// Possible string values are:
-  /// - "all" : All sub-organization units.
+  /// - "all" : All sub-organizational units.
   /// - "children" : Immediate children only (default).
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -2914,7 +2966,7 @@
     return _response.then((data) => new OrgUnits.fromJson(data));
   }
 
-  /// Update Organization Unit. This method supports patch semantics.
+  /// Update organizational unit. This method supports patch semantics.
   ///
   /// [request] - The metadata request object.
   ///
@@ -2922,7 +2974,7 @@
   ///
   /// [customerId] - Immutable ID of the G Suite account
   ///
-  /// [orgUnitPath] - Full path of the organization unit or its Id
+  /// [orgUnitPath] - Full path of the organizational unit or its ID
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -2974,7 +3026,7 @@
     return _response.then((data) => new OrgUnit.fromJson(data));
   }
 
-  /// Update Organization Unit
+  /// Update organizational unit
   ///
   /// [request] - The metadata request object.
   ///
@@ -2982,7 +3034,7 @@
   ///
   /// [customerId] - Immutable ID of the G Suite account
   ///
-  /// [orgUnitPath] - Full path of the organization unit or its Id
+  /// [orgUnitPath] - Full path of the organizational unit or its ID
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -3169,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;
 
@@ -3352,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.
   ///
@@ -3365,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;
@@ -3379,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];
     }
@@ -3526,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;
 
@@ -4094,7 +4898,7 @@
   ///
   /// [customerId] - Immutable ID of the G Suite account
   ///
-  /// [schemaKey] - Name or immutable Id of the schema
+  /// [schemaKey] - Name or immutable ID of the schema
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -4145,7 +4949,7 @@
   ///
   /// [customerId] - Immutable ID of the G Suite account
   ///
-  /// [schemaKey] - Name or immutable Id of the schema
+  /// [schemaKey] - Name or immutable ID of the schema
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -4290,7 +5094,7 @@
   ///
   /// [customerId] - Immutable ID of the G Suite account
   ///
-  /// [schemaKey] - Name or immutable Id of the schema.
+  /// [schemaKey] - Name or immutable ID of the schema.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -4347,7 +5151,7 @@
   ///
   /// [customerId] - Immutable ID of the G Suite account
   ///
-  /// [schemaKey] - Name or immutable Id of the schema.
+  /// [schemaKey] - Name or immutable ID of the schema.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -4564,7 +5368,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user
+  /// [userKey] - Email or immutable ID of the user
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -4606,7 +5410,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user
+  /// [userKey] - Email or immutable ID of the user
   ///
   /// [customFieldMask] - Comma-separated list of schema names. All fields from
   /// these schemas are fetched. This should only be set when projection=custom.
@@ -4861,7 +5665,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user as admin
+  /// [userKey] - Email or immutable ID of the user as admin
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -4909,7 +5713,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user. If Id, it should match with
+  /// [userKey] - Email or immutable ID of the user. If ID, it should match with
   /// id of user object
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -5006,7 +5810,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user. If Id, it should match with
+  /// [userKey] - Email or immutable ID of the user. If ID, it should match with
   /// id of user object
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -5204,7 +6008,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user
+  /// [userKey] - Email or immutable ID of the user
   ///
   /// [alias] - The alias to be removed
   ///
@@ -5257,7 +6061,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user
+  /// [userKey] - Email or immutable ID of the user
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -5303,7 +6107,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user
+  /// [userKey] - Email or immutable ID of the user
   ///
   /// [event] - Event on which subscription is intended (if subscribing)
   /// Possible string values are:
@@ -5356,7 +6160,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user
+  /// [userKey] - Email or immutable ID of the user
   ///
   /// [event] - Event on which subscription is intended (if subscribing)
   /// Possible string values are:
@@ -5417,7 +6221,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user
+  /// [userKey] - Email or immutable ID of the user
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -5461,7 +6265,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user
+  /// [userKey] - Email or immutable ID of the user
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -5507,7 +6311,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user
+  /// [userKey] - Email or immutable ID of the user
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -5557,7 +6361,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user
+  /// [userKey] - Email or immutable ID of the user
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -5612,7 +6416,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user
+  /// [userKey] - Email or immutable ID of the user
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -5656,7 +6460,7 @@
   ///
   /// Request parameters:
   ///
-  /// [userKey] - Email or immutable Id of the user
+  /// [userKey] - Email or immutable ID of the user
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -6055,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"];
     }
@@ -6113,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;
     }
@@ -6142,6 +7176,9 @@
     if (resourceType != null) {
       _json["resourceType"] = resourceType;
     }
+    if (userVisibleDescription != null) {
+      _json["userVisibleDescription"] = userVisibleDescription;
+    }
     return _json;
   }
 }
@@ -6340,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;
@@ -6371,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)
@@ -6388,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;
 
@@ -6447,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;
@@ -6471,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"];
     }
@@ -6530,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"];
     }
@@ -6554,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;
     }
@@ -6612,6 +7771,9 @@
     if (supportEndDate != null) {
       _json["supportEndDate"] = (supportEndDate).toIso8601String();
     }
+    if (tpmVersionInfo != null) {
+      _json["tpmVersionInfo"] = (tpmVersionInfo).toJson();
+    }
     if (willAutoRenew != null) {
       _json["willAutoRenew"] = willAutoRenew;
     }
@@ -7162,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) *
@@ -7446,6 +8747,29 @@
   }
 }
 
+/// JSON template for Has Member response in Directory API.
+class MembersHasMember {
+  /// Identifies whether given user is a member or not.
+  core.bool isMember;
+
+  MembersHasMember();
+
+  MembersHasMember.fromJson(core.Map _json) {
+    if (_json.containsKey("isMember")) {
+      isMember = _json["isMember"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (isMember != null) {
+      _json["isMember"] = isMember;
+    }
+    return _json;
+  }
+}
+
 class MobileDeviceApplications {
   /// Display name of application
   core.String displayName;
@@ -9775,7 +11099,7 @@
 
   UserCustomProperties();
 
-  UserCustomProperties.fromJson(core.Map _json) {
+  UserCustomProperties.fromJson(core.Map<core.String, core.dynamic> _json) {
     _json.forEach((core.String key, value) {
       this[key] = value;
     });
@@ -10522,6 +11846,9 @@
 /// JSON template for a POSIX account entry. Description of the field family:
 /// go/fbs-posix.
 class UserPosixAccount {
+  /// A POSIX account field identifier. (Read-only)
+  core.String accountId;
+
   /// The GECOS (user information) for this account.
   core.String gecos;
 
@@ -10549,6 +11876,9 @@
   UserPosixAccount();
 
   UserPosixAccount.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
     if (_json.containsKey("gecos")) {
       gecos = _json["gecos"];
     }
@@ -10578,6 +11908,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
     if (gecos != null) {
       _json["gecos"] = gecos;
     }
diff --git a/googleapis/lib/admin/reports_v1.dart b/googleapis/lib/admin/reports_v1.dart
index efa1f1f..f3b1866 100644
--- a/googleapis/lib/admin/reports_v1.dart
+++ b/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);
 
@@ -359,7 +361,7 @@
   /// [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
-  /// "(((accounts)|(app_maker)|(apps_scripts)|(classroom)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)|(device_management)|(drive)):[^,]+,)*(((accounts)|(app_maker)|(apps_scripts)|(classroom)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)|(device_management)|(drive)):[^,]+)".
+  /// "(((accounts)|(app_maker)|(apps_scripts)|(classroom)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)|(device_management)|(drive)|(meet)):[^,]+,)*(((accounts)|(app_maker)|(apps_scripts)|(classroom)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)|(device_management)|(drive)|(meet)):[^,]+)".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -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/googleapis/lib/adsense/v1_4.dart b/googleapis/lib/adsense/v1_4.dart
index b86f497..508eeb3 100644
--- a/googleapis/lib/adsense/v1_4.dart
+++ b/googleapis/lib/adsense/v1_4.dart
@@ -4,7 +4,6 @@
 
 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;
diff --git a/googleapis/lib/analytics/v3.dart b/googleapis/lib/analytics/v3.dart
index 7f0ce7f..ff9b0ad 100644
--- a/googleapis/lib/analytics/v3.dart
+++ b/googleapis/lib/analytics/v3.dart
@@ -5921,6 +5921,50 @@
         downloadOptions: _downloadOptions);
     return _response.then((data) => new AccountTicket.fromJson(data));
   }
+
+  /// Provision account.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AccountTreeResponse].
+  ///
+  /// 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<AccountTreeResponse> createAccountTree(
+      AccountTreeRequest 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 = 'provisioning/createAccount';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new AccountTreeResponse.fromJson(data));
+  }
 }
 
 /// Child link for an account entry. Points to the list of web properties for
@@ -6355,6 +6399,248 @@
   }
 }
 
+class AccountTreeRequestAccountSettings {
+  core.bool admobReporting;
+  core.bool sharingWithGoogleAnySales;
+  core.bool sharingWithGoogleProducts;
+  core.bool sharingWithGoogleSales;
+  core.bool sharingWithGoogleSupport;
+  core.bool sharingWithOthers;
+
+  AccountTreeRequestAccountSettings();
+
+  AccountTreeRequestAccountSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("admobReporting")) {
+      admobReporting = _json["admobReporting"];
+    }
+    if (_json.containsKey("sharingWithGoogleAnySales")) {
+      sharingWithGoogleAnySales = _json["sharingWithGoogleAnySales"];
+    }
+    if (_json.containsKey("sharingWithGoogleProducts")) {
+      sharingWithGoogleProducts = _json["sharingWithGoogleProducts"];
+    }
+    if (_json.containsKey("sharingWithGoogleSales")) {
+      sharingWithGoogleSales = _json["sharingWithGoogleSales"];
+    }
+    if (_json.containsKey("sharingWithGoogleSupport")) {
+      sharingWithGoogleSupport = _json["sharingWithGoogleSupport"];
+    }
+    if (_json.containsKey("sharingWithOthers")) {
+      sharingWithOthers = _json["sharingWithOthers"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (admobReporting != null) {
+      _json["admobReporting"] = admobReporting;
+    }
+    if (sharingWithGoogleAnySales != null) {
+      _json["sharingWithGoogleAnySales"] = sharingWithGoogleAnySales;
+    }
+    if (sharingWithGoogleProducts != null) {
+      _json["sharingWithGoogleProducts"] = sharingWithGoogleProducts;
+    }
+    if (sharingWithGoogleSales != null) {
+      _json["sharingWithGoogleSales"] = sharingWithGoogleSales;
+    }
+    if (sharingWithGoogleSupport != null) {
+      _json["sharingWithGoogleSupport"] = sharingWithGoogleSupport;
+    }
+    if (sharingWithOthers != null) {
+      _json["sharingWithOthers"] = sharingWithOthers;
+    }
+    return _json;
+  }
+}
+
+/// JSON template for an Analytics account tree requests. The account tree
+/// request is used in the provisioning api to create an account, property, and
+/// view (profile). It contains the basic information required to make these
+/// fields.
+class AccountTreeRequest {
+  core.String accountName;
+  AccountTreeRequestAccountSettings accountSettings;
+
+  /// Resource type for account ticket.
+  core.String kind;
+  core.String profileName;
+  core.String timezone;
+  core.String webpropertyName;
+  core.String websiteUrl;
+
+  AccountTreeRequest();
+
+  AccountTreeRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("accountName")) {
+      accountName = _json["accountName"];
+    }
+    if (_json.containsKey("accountSettings")) {
+      accountSettings = new AccountTreeRequestAccountSettings.fromJson(
+          _json["accountSettings"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("profileName")) {
+      profileName = _json["profileName"];
+    }
+    if (_json.containsKey("timezone")) {
+      timezone = _json["timezone"];
+    }
+    if (_json.containsKey("webpropertyName")) {
+      webpropertyName = _json["webpropertyName"];
+    }
+    if (_json.containsKey("websiteUrl")) {
+      websiteUrl = _json["websiteUrl"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountName != null) {
+      _json["accountName"] = accountName;
+    }
+    if (accountSettings != null) {
+      _json["accountSettings"] = (accountSettings).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (profileName != null) {
+      _json["profileName"] = profileName;
+    }
+    if (timezone != null) {
+      _json["timezone"] = timezone;
+    }
+    if (webpropertyName != null) {
+      _json["webpropertyName"] = webpropertyName;
+    }
+    if (websiteUrl != null) {
+      _json["websiteUrl"] = websiteUrl;
+    }
+    return _json;
+  }
+}
+
+class AccountTreeResponseAccountSettings {
+  core.bool admobReporting;
+  core.bool sharingWithGoogleAnySales;
+  core.bool sharingWithGoogleProducts;
+  core.bool sharingWithGoogleSales;
+  core.bool sharingWithGoogleSupport;
+  core.bool sharingWithOthers;
+
+  AccountTreeResponseAccountSettings();
+
+  AccountTreeResponseAccountSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("admobReporting")) {
+      admobReporting = _json["admobReporting"];
+    }
+    if (_json.containsKey("sharingWithGoogleAnySales")) {
+      sharingWithGoogleAnySales = _json["sharingWithGoogleAnySales"];
+    }
+    if (_json.containsKey("sharingWithGoogleProducts")) {
+      sharingWithGoogleProducts = _json["sharingWithGoogleProducts"];
+    }
+    if (_json.containsKey("sharingWithGoogleSales")) {
+      sharingWithGoogleSales = _json["sharingWithGoogleSales"];
+    }
+    if (_json.containsKey("sharingWithGoogleSupport")) {
+      sharingWithGoogleSupport = _json["sharingWithGoogleSupport"];
+    }
+    if (_json.containsKey("sharingWithOthers")) {
+      sharingWithOthers = _json["sharingWithOthers"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (admobReporting != null) {
+      _json["admobReporting"] = admobReporting;
+    }
+    if (sharingWithGoogleAnySales != null) {
+      _json["sharingWithGoogleAnySales"] = sharingWithGoogleAnySales;
+    }
+    if (sharingWithGoogleProducts != null) {
+      _json["sharingWithGoogleProducts"] = sharingWithGoogleProducts;
+    }
+    if (sharingWithGoogleSales != null) {
+      _json["sharingWithGoogleSales"] = sharingWithGoogleSales;
+    }
+    if (sharingWithGoogleSupport != null) {
+      _json["sharingWithGoogleSupport"] = sharingWithGoogleSupport;
+    }
+    if (sharingWithOthers != null) {
+      _json["sharingWithOthers"] = sharingWithOthers;
+    }
+    return _json;
+  }
+}
+
+/// JSON template for an Analytics account tree response. The account tree
+/// response is used in the provisioning api to return the result of creating an
+/// account, property, and view (profile).
+class AccountTreeResponse {
+  /// The account created.
+  Account account;
+  AccountTreeResponseAccountSettings accountSettings;
+
+  /// Resource type for account ticket.
+  core.String kind;
+
+  /// View (Profile) for the account.
+  Profile profile;
+
+  /// Web property for the account.
+  Webproperty webproperty;
+
+  AccountTreeResponse();
+
+  AccountTreeResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("account")) {
+      account = new Account.fromJson(_json["account"]);
+    }
+    if (_json.containsKey("accountSettings")) {
+      accountSettings = new AccountTreeResponseAccountSettings.fromJson(
+          _json["accountSettings"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("profile")) {
+      profile = new Profile.fromJson(_json["profile"]);
+    }
+    if (_json.containsKey("webproperty")) {
+      webproperty = new Webproperty.fromJson(_json["webproperty"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (account != null) {
+      _json["account"] = (account).toJson();
+    }
+    if (accountSettings != null) {
+      _json["accountSettings"] = (accountSettings).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (profile != null) {
+      _json["profile"] = (profile).toJson();
+    }
+    if (webproperty != null) {
+      _json["webproperty"] = (webproperty).toJson();
+    }
+    return _json;
+  }
+}
+
 /// An account collection provides a list of Analytics accounts to which a user
 /// has access. The account collection is the entry point to all management
 /// information. Each resource in the collection corresponds to a single
diff --git a/googleapis/lib/analyticsreporting/v4.dart b/googleapis/lib/analyticsreporting/v4.dart
index 940dcc3..0e41eaa 100644
--- a/googleapis/lib/analyticsreporting/v4.dart
+++ b/googleapis/lib/analyticsreporting/v4.dart
@@ -576,6 +576,19 @@
   /// `dateRanges`, `viewId`, `segments`, `samplingLevel`, and `cohortGroup`.
   core.List<ReportRequest> reportRequests;
 
+  /// Enables
+  /// [resource based
+  /// quotas](/analytics/devguides/reporting/core/v4/limits-quotas#analytics_reporting_api_v4),
+  /// (defaults to `False`). If this field is set to `True` the
+  /// per view (profile) quotas are governed by the computational
+  /// cost of the request. Note that using cost based quotas will
+  /// higher enable sampling rates. (10 Million for `SMALL`,
+  /// 100M for `LARGE`. See the
+  /// [limits and quotas
+  /// documentation](/analytics/devguides/reporting/core/v4/limits-quotas#analytics_reporting_api_v4)
+  /// for details.
+  core.bool useResourceQuotas;
+
   GetReportsRequest();
 
   GetReportsRequest.fromJson(core.Map _json) {
@@ -584,6 +597,9 @@
           .map((value) => new ReportRequest.fromJson(value))
           .toList();
     }
+    if (_json.containsKey("useResourceQuotas")) {
+      useResourceQuotas = _json["useResourceQuotas"];
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -593,6 +609,9 @@
       _json["reportRequests"] =
           reportRequests.map((value) => (value).toJson()).toList();
     }
+    if (useResourceQuotas != null) {
+      _json["useResourceQuotas"] = useResourceQuotas;
+    }
     return _json;
   }
 }
@@ -600,24 +619,45 @@
 /// The main response class which holds the reports from the Reporting API
 /// `batchGet` call.
 class GetReportsResponse {
+  /// The amount of resource quota tokens deducted to execute the query.
+  /// Includes
+  /// all responses.
+  core.int queryCost;
+
   /// Responses corresponding to each of the request.
   core.List<Report> reports;
 
+  /// The amount of resource quota remaining for the property.
+  ResourceQuotasRemaining resourceQuotasRemaining;
+
   GetReportsResponse();
 
   GetReportsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("queryCost")) {
+      queryCost = _json["queryCost"];
+    }
     if (_json.containsKey("reports")) {
       reports =
           _json["reports"].map((value) => new Report.fromJson(value)).toList();
     }
+    if (_json.containsKey("resourceQuotasRemaining")) {
+      resourceQuotasRemaining = new ResourceQuotasRemaining.fromJson(
+          _json["resourceQuotasRemaining"]);
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (queryCost != null) {
+      _json["queryCost"] = queryCost;
+    }
     if (reports != null) {
       _json["reports"] = reports.map((value) => (value).toJson()).toList();
     }
+    if (resourceQuotasRemaining != null) {
+      _json["resourceQuotasRemaining"] = (resourceQuotasRemaining).toJson();
+    }
     return _json;
   }
 }
@@ -1614,6 +1654,39 @@
   }
 }
 
+/// The resource quota tokens remaining for the property after the request is
+/// completed.
+class ResourceQuotasRemaining {
+  /// Daily resource quota remaining remaining.
+  core.int dailyQuotaTokensRemaining;
+
+  /// Hourly resource quota tokens remaining.
+  core.int hourlyQuotaTokensRemaining;
+
+  ResourceQuotasRemaining();
+
+  ResourceQuotasRemaining.fromJson(core.Map _json) {
+    if (_json.containsKey("dailyQuotaTokensRemaining")) {
+      dailyQuotaTokensRemaining = _json["dailyQuotaTokensRemaining"];
+    }
+    if (_json.containsKey("hourlyQuotaTokensRemaining")) {
+      hourlyQuotaTokensRemaining = _json["hourlyQuotaTokensRemaining"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (dailyQuotaTokensRemaining != null) {
+      _json["dailyQuotaTokensRemaining"] = dailyQuotaTokensRemaining;
+    }
+    if (hourlyQuotaTokensRemaining != null) {
+      _json["hourlyQuotaTokensRemaining"] = hourlyQuotaTokensRemaining;
+    }
+    return _json;
+  }
+}
+
 /// The segment definition, if the report needs to be segmented.
 /// A Segment is a subset of the Analytics data. For example, of the entire
 /// set of users, one Segment might be users from a particular country or city.
diff --git a/googleapis/lib/androiddeviceprovisioning/v1.dart b/googleapis/lib/androiddeviceprovisioning/v1.dart
index c8c7861..15845fc 100644
--- a/googleapis/lib/androiddeviceprovisioning/v1.dart
+++ b/googleapis/lib/androiddeviceprovisioning/v1.dart
@@ -14,11 +14,12 @@
 
 const core.String USER_AGENT = 'dart-api-client androiddeviceprovisioning/v1';
 
-/// Automates reseller integration into zero-touch enrollment by assigning
-/// devices to customers and creating device reports.
+/// Automates Android zero-touch enrollment for device resellers, customers, and
+/// EMMs.
 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,663 @@
             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;
+
+  /// Lists the user's customer accounts.
+  ///
+  /// Request parameters:
+  ///
+  /// [pageToken] - A token specifying which result page to return.
+  ///
+  /// [pageSize] - The maximum number of customers to show in a page of results.
+  /// A number between 1 and 100 (inclusive).
+  ///
+  /// [$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.
+  /// Must be between 1 and 100 inclusive.
+  ///
+  /// [$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;
 
@@ -107,7 +765,7 @@
   ///
   /// Request parameters:
   ///
-  /// [parent] - Required. The parent resource ID in format
+  /// [parent] - Required. The parent resource ID in the format
   /// `partners/[PARTNER_ID]` that
   /// identifies the reseller.
   /// Value must have pattern "^partners/[^/]+$".
@@ -691,7 +1349,7 @@
   /// The section to claim.
   /// Possible string values are:
   /// - "SECTION_TYPE_UNSPECIFIED" : Unspecified section type.
-  /// - "SECTION_TYPE_ZERO_TOUCH" : Zero touch section type.
+  /// - "SECTION_TYPE_ZERO_TOUCH" : Zero-touch enrollment section type.
   core.String sectionType;
 
   ClaimDeviceRequest();
@@ -851,6 +1509,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,25 +1668,232 @@
   }
 }
 
-/// An Android device.
-class Device {
-  /// Claims.
-  core.List<DeviceClaim> claims;
-
-  /// The resource name of the configuration.
-  /// Only set for customers.
+/// 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;
 
-  /// Device ID.
+  /// 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 {
+  /// The customer accounts the calling user is a member of.
+  core.List<Company> customers;
+
+  /// A token used to access the next page of results. Omitted if no further
+  /// results are available.
+  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
+  /// zero-touch enrollment have a claim with the type
+  /// `SECTION_TYPE_ZERO_TOUCH`.
+  /// Call
+  /// `partners.devices.unclaim`
+  /// or
+  /// `partners.devices.unclaimAsync`
+  /// to remove the device from zero-touch enrollment.
+  core.List<DeviceClaim> claims;
+
+  /// Not available to resellers.
+  core.String configuration;
+
+  /// Output only. The ID of the device. Assigned by the server.
   core.String deviceId;
 
-  /// Device identifier.
+  /// The hardware IDs that identify a manufactured device. To learn more, read
+  /// [Identifiers](/zero-touch/guides/identifiers).
   DeviceIdentifier deviceIdentifier;
 
-  /// Device metadata.
+  /// The metadata attached to the device. Structured as key-value pairs. To
+  /// learn more, read [Device metadata](/zero-touch/guides/metadata).
   DeviceMetadata deviceMetadata;
 
-  /// Resource name in `partners/[PARTNER_ID]/devices/[DEVICE_ID]`.
+  /// Output only. The API resource name in the format
+  /// `partners/[PARTNER_ID]/devices/[DEVICE_ID]`. Assigned by the server.
   core.String name;
 
   Device();
@@ -949,15 +1947,18 @@
   }
 }
 
-/// Information about a device claimed for a partner.
+/// A record of a device claimed by a reseller for a customer. Devices claimed
+/// for zero-touch enrollment have a claim with the type
+/// `SECTION_TYPE_ZERO_TOUCH`. To learn more, read
+/// [Claim devices for customers](/zero-touch/guides/how-it-works#claim).
 class DeviceClaim {
-  /// Owner ID.
+  /// The ID of the Customer that purchased the device.
   core.String ownerCompanyId;
 
-  /// Section type of the device claim.
+  /// Output only. The type of claim made on the device.
   /// Possible string values are:
   /// - "SECTION_TYPE_UNSPECIFIED" : Unspecified section type.
-  /// - "SECTION_TYPE_ZERO_TOUCH" : Zero touch section type.
+  /// - "SECTION_TYPE_ZERO_TOUCH" : Zero-touch enrollment section type.
   core.String sectionType;
 
   DeviceClaim();
@@ -984,20 +1985,22 @@
   }
 }
 
-/// Identifies a unique device.
+/// Encapsulates hardware and product IDs to identify a manufactured device. To
+/// learn more, read [Identifiers](/zero-touch/guides/identifiers).
 class DeviceIdentifier {
-  /// IMEI number.
+  /// The device’s IMEI number. Validated on input.
   core.String imei;
 
-  /// Manufacturer name to match `android.os.Build.MANUFACTURER` (required).
-  /// Allowed values listed in
-  /// [manufacturer names](/zero-touch/resources/manufacturer-names).
+  /// Required. The device manufacturer’s name. Matches the device's built-in
+  /// value returned from `android.os.Build.MANUFACTURER`. Allowed values are
+  /// listed in [manufacturer names](/zero-touch/resources/manufacturer-names).
   core.String manufacturer;
 
-  /// MEID number.
+  /// The device’s MEID number.
   core.String meid;
 
-  /// Serial number (optional).
+  /// The manufacturer's serial number for the device. This value might not be
+  /// unique.
   core.String serialNumber;
 
   DeviceIdentifier();
@@ -1036,9 +2039,10 @@
   }
 }
 
-/// A key-value pair of the device metadata.
+/// Metadata entries that can be attached to a `Device`. To learn more, read
+/// [Device metadata](/zero-touch/guides/metadata).
 class DeviceMetadata {
-  /// Metadata entries
+  /// Metadata entries recorded as key-value pairs.
   core.Map<core.String, core.String> entries;
 
   DeviceMetadata();
@@ -1059,6 +2063,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.
@@ -1144,6 +2191,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:
@@ -1254,7 +2352,7 @@
   /// The section type.
   /// Possible string values are:
   /// - "SECTION_TYPE_UNSPECIFIED" : Unspecified section type.
-  /// - "SECTION_TYPE_ZERO_TOUCH" : Zero touch section type.
+  /// - "SECTION_TYPE_ZERO_TOUCH" : Zero-touch enrollment section type.
   core.String sectionType;
 
   FindDevicesByOwnerRequest();
@@ -1494,7 +2592,7 @@
   /// Section type to claim.
   /// Possible string values are:
   /// - "SECTION_TYPE_UNSPECIFIED" : Unspecified section type.
-  /// - "SECTION_TYPE_ZERO_TOUCH" : Zero touch section type.
+  /// - "SECTION_TYPE_ZERO_TOUCH" : Zero-touch enrollment section type.
   core.String sectionType;
 
   PartnerClaim();
@@ -1545,7 +2643,7 @@
   /// Section type to unclaim.
   /// Possible string values are:
   /// - "SECTION_TYPE_UNSPECIFIED" : Unspecified section type.
-  /// - "SECTION_TYPE_ZERO_TOUCH" : Zero touch section type.
+  /// - "SECTION_TYPE_ZERO_TOUCH" : Zero-touch enrollment section type.
   core.String sectionType;
 
   PartnerUnclaim();
@@ -1756,7 +2854,7 @@
   /// The section type to unclaim for.
   /// Possible string values are:
   /// - "SECTION_TYPE_UNSPECIFIED" : Unspecified section type.
-  /// - "SECTION_TYPE_ZERO_TOUCH" : Zero touch section type.
+  /// - "SECTION_TYPE_ZERO_TOUCH" : Zero-touch enrollment section type.
   core.String sectionType;
 
   UnclaimDeviceRequest();
diff --git a/googleapis/lib/androidenterprise/v1.dart b/googleapis/lib/androidenterprise/v1.dart
index b5d4617..23b6d2f 100644
--- a/googleapis/lib/androidenterprise/v1.dart
+++ b/googleapis/lib/androidenterprise/v1.dart
@@ -37,6 +37,8 @@
           new ManagedconfigurationsfordeviceResourceApi(_requester);
   ManagedconfigurationsforuserResourceApi get managedconfigurationsforuser =>
       new ManagedconfigurationsforuserResourceApi(_requester);
+  ManagedconfigurationssettingsResourceApi get managedconfigurationssettings =>
+      new ManagedconfigurationssettingsResourceApi(_requester);
   PermissionsResourceApi get permissions =>
       new PermissionsResourceApi(_requester);
   ProductsResourceApi get products => new ProductsResourceApi(_requester);
@@ -236,6 +238,79 @@
     return _response.then((data) => new DevicesListResponse.fromJson(data));
   }
 
+  /// Updates the device policy. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [enterpriseId] - The ID of the enterprise.
+  ///
+  /// [userId] - The ID of the user.
+  ///
+  /// [deviceId] - The ID of the device.
+  ///
+  /// [updateMask] - Mask that identifies which fields to update. If not set,
+  /// all modifiable fields will be modified.
+  ///
+  /// When set in a query parameter, this field should be specified as
+  /// updateMask=<field1>,<field2>,...
+  ///
+  /// [$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> patch(Device request, core.String enterpriseId,
+      core.String userId, core.String deviceId,
+      {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 (enterpriseId == null) {
+      throw new core.ArgumentError("Parameter enterpriseId is required.");
+    }
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+    if (deviceId == null) {
+      throw new core.ArgumentError("Parameter deviceId is required.");
+    }
+    if (updateMask != null) {
+      _queryParams["updateMask"] = [updateMask];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'enterprises/' +
+        commons.Escaper.ecapeVariable('$enterpriseId') +
+        '/users/' +
+        commons.Escaper.ecapeVariable('$userId') +
+        '/devices/' +
+        commons.Escaper.ecapeVariable('$deviceId');
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Device.fromJson(data));
+  }
+
   /// Sets whether a device's access to Google services is enabled or disabled.
   /// The device state takes effect only if enforcing EMM policies on Android
   /// devices is enabled in the Google Admin Console. Otherwise, the device
@@ -304,6 +379,79 @@
         downloadOptions: _downloadOptions);
     return _response.then((data) => new DeviceState.fromJson(data));
   }
+
+  /// Updates the device policy
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [enterpriseId] - The ID of the enterprise.
+  ///
+  /// [userId] - The ID of the user.
+  ///
+  /// [deviceId] - The ID of the device.
+  ///
+  /// [updateMask] - Mask that identifies which fields to update. If not set,
+  /// all modifiable fields will be modified.
+  ///
+  /// When set in a query parameter, this field should be specified as
+  /// updateMask=<field1>,<field2>,...
+  ///
+  /// [$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> update(Device request, core.String enterpriseId,
+      core.String userId, core.String deviceId,
+      {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 (enterpriseId == null) {
+      throw new core.ArgumentError("Parameter enterpriseId is required.");
+    }
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+    if (deviceId == null) {
+      throw new core.ArgumentError("Parameter deviceId is required.");
+    }
+    if (updateMask != null) {
+      _queryParams["updateMask"] = [updateMask];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'enterprises/' +
+        commons.Escaper.ecapeVariable('$enterpriseId') +
+        '/users/' +
+        commons.Escaper.ecapeVariable('$userId') +
+        '/devices/' +
+        commons.Escaper.ecapeVariable('$deviceId');
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Device.fromJson(data));
+  }
 }
 
 class EnterprisesResourceApi {
@@ -2632,8 +2780,12 @@
         (data) => new ManagedConfigurationsForUserListResponse.fromJson(data));
   }
 
-  /// Adds or updates a per-user managed configuration for an app for the
-  /// specified user. This method supports patch semantics.
+  /// Adds or updates the managed configuration settings for an app for the
+  /// specified user. If you support the Managed configurations iframe, you can
+  /// apply managed configurations to a user by specifying an mcmId and its
+  /// associated configuration variables (if any) in the request. Alternatively,
+  /// all EMMs can apply managed configurations by passing a list of managed
+  /// properties. This method supports patch semantics.
   ///
   /// [request] - The metadata request object.
   ///
@@ -2702,8 +2854,12 @@
     return _response.then((data) => new ManagedConfiguration.fromJson(data));
   }
 
-  /// Adds or updates a per-user managed configuration for an app for the
-  /// specified user.
+  /// Adds or updates the managed configuration settings for an app for the
+  /// specified user. If you support the Managed configurations iframe, you can
+  /// apply managed configurations to a user by specifying an mcmId and its
+  /// associated configuration variables (if any) in the request. Alternatively,
+  /// all EMMs can apply managed configurations by passing a list of managed
+  /// properties.
   ///
   /// [request] - The metadata request object.
   ///
@@ -2773,6 +2929,69 @@
   }
 }
 
+class ManagedconfigurationssettingsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ManagedconfigurationssettingsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Lists all the managed configurations settings for the specified app. Only
+  /// the ID and the name is set.
+  ///
+  /// Request parameters:
+  ///
+  /// [enterpriseId] - The ID of the enterprise.
+  ///
+  /// [productId] - The ID of the product for which the managed configurations
+  /// settings applies to.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ManagedConfigurationsSettingsListResponse].
+  ///
+  /// 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<ManagedConfigurationsSettingsListResponse> list(
+      core.String enterpriseId, core.String productId,
+      {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 (enterpriseId == null) {
+      throw new core.ArgumentError("Parameter enterpriseId is required.");
+    }
+    if (productId == null) {
+      throw new core.ArgumentError("Parameter productId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'enterprises/' +
+        commons.Escaper.ecapeVariable('$enterpriseId') +
+        '/products/' +
+        commons.Escaper.ecapeVariable('$productId') +
+        '/managedConfigurationsSettings';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then(
+        (data) => new ManagedConfigurationsSettingsListResponse.fromJson(data));
+  }
+}
+
 class PermissionsResourceApi {
   final commons.ApiRequester _requester;
 
@@ -4581,6 +4800,62 @@
     return _response.then((data) => new User.fromJson(data));
   }
 
+  /// Revokes access to all devices currently provisioned to the user. The user
+  /// will no longer be able to use the managed Play store on any of their
+  /// managed devices.
+  ///
+  /// This call only works with EMM-managed accounts.
+  ///
+  /// Request parameters:
+  ///
+  /// [enterpriseId] - The ID of the enterprise.
+  ///
+  /// [userId] - The ID of the user.
+  ///
+  /// [$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 revokeDeviceAccess(core.String enterpriseId, core.String userId,
+      {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 (enterpriseId == null) {
+      throw new core.ArgumentError("Parameter enterpriseId is required.");
+    }
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'enterprises/' +
+        commons.Escaper.ecapeVariable('$enterpriseId') +
+        '/users/' +
+        commons.Escaper.ecapeVariable('$userId') +
+        '/deviceAccess';
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
   /// Revokes a previously generated token (activation code) for the user.
   ///
   /// Request parameters:
@@ -5264,11 +5539,56 @@
   }
 }
 
+/// A configuration variables resource contains the managed configuration
+/// settings ID to be applied to a single user, as well as the variable set that
+/// is attributed to the user. The variable set will be used to replace
+/// placeholders in the managed configuration settings.
+class ConfigurationVariables {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "androidenterprise#configurationVariables".
+  core.String kind;
+
+  /// The ID of the managed configurations settings.
+  core.String mcmId;
+
+  /// The variable set that is attributed to the user.
+  core.List<VariableSet> variableSet;
+
+  ConfigurationVariables();
+
+  ConfigurationVariables.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("mcmId")) {
+      mcmId = _json["mcmId"];
+    }
+    if (_json.containsKey("variableSet")) {
+      variableSet = _json["variableSet"]
+          .map((value) => new VariableSet.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (mcmId != null) {
+      _json["mcmId"] = mcmId;
+    }
+    if (variableSet != null) {
+      _json["variableSet"] =
+          variableSet.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
 /// A Devices resource represents a mobile device managed by the EMM and
 /// belonging to a specific enterprise user.
-///
-/// This collection cannot be modified via the API. It is automatically
-/// populated as devices are set up to be managed.
 class Device {
   /// The Google Play Services Android ID for the device encoded as a lowercase
   /// hex string. For example, "123456789abcdef0".
@@ -5293,6 +5613,9 @@
   /// Google Play, but the profile is itself not owned by a DPC.
   core.String managementType;
 
+  /// The policy enforced on the device.
+  Policy policy;
+
   Device();
 
   Device.fromJson(core.Map _json) {
@@ -5305,6 +5628,9 @@
     if (_json.containsKey("managementType")) {
       managementType = _json["managementType"];
     }
+    if (_json.containsKey("policy")) {
+      policy = new Policy.fromJson(_json["policy"]);
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -5319,6 +5645,9 @@
     if (managementType != null) {
       _json["managementType"] = managementType;
     }
+    if (policy != null) {
+      _json["policy"] = (policy).toJson();
+    }
     return _json;
   }
 }
@@ -6069,10 +6398,14 @@
   }
 }
 
-/// A managed configuration resource contains the set of managed properties that
-/// have been configured for an Android app. The app's developer would have
-/// defined configurable properties in the managed configurations schema.
+/// A managed configuration resource contains the set of managed properties
+/// defined by the app developer in the app's managed configurations schema, as
+/// well as any configuration variables defined for the user.
 class ManagedConfiguration {
+  /// Contains the ID of the managed configuration profile and the set of
+  /// configuration variables (if any) defined for the user.
+  ConfigurationVariables configurationVariables;
+
   /// Identifies what kind of resource this is. Value: the fixed string
   /// "androidenterprise#managedConfiguration".
   core.String kind;
@@ -6087,6 +6420,10 @@
   ManagedConfiguration();
 
   ManagedConfiguration.fromJson(core.Map _json) {
+    if (_json.containsKey("configurationVariables")) {
+      configurationVariables =
+          new ConfigurationVariables.fromJson(_json["configurationVariables"]);
+    }
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
@@ -6103,6 +6440,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (configurationVariables != null) {
+      _json["configurationVariables"] = (configurationVariables).toJson();
+    }
     if (kind != null) {
       _json["kind"] = kind;
     }
@@ -6190,6 +6530,111 @@
   }
 }
 
+/// A managed configurations settings resource contains the set of managed
+/// properties that have been configured for an Android app to be applied to a
+/// set of users. The app's developer would have defined configurable properties
+/// in the managed configurations schema.
+class ManagedConfigurationsSettings {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "androidenterprise#managedConfigurationsSettings".
+  core.String kind;
+
+  /// The last updated time of the managed configuration settings in
+  /// milliseconds since 1970-01-01T00:00:00Z.
+  core.String lastUpdatedTimestampMillis;
+
+  /// The set of managed properties for this configuration.
+  core.List<ManagedProperty> managedProperty;
+
+  /// The ID of the managed configurations settings.
+  core.String mcmId;
+
+  /// The name of the managed configurations settings.
+  core.String name;
+
+  ManagedConfigurationsSettings();
+
+  ManagedConfigurationsSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lastUpdatedTimestampMillis")) {
+      lastUpdatedTimestampMillis = _json["lastUpdatedTimestampMillis"];
+    }
+    if (_json.containsKey("managedProperty")) {
+      managedProperty = _json["managedProperty"]
+          .map((value) => new ManagedProperty.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("mcmId")) {
+      mcmId = _json["mcmId"];
+    }
+    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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lastUpdatedTimestampMillis != null) {
+      _json["lastUpdatedTimestampMillis"] = lastUpdatedTimestampMillis;
+    }
+    if (managedProperty != null) {
+      _json["managedProperty"] =
+          managedProperty.map((value) => (value).toJson()).toList();
+    }
+    if (mcmId != null) {
+      _json["mcmId"] = mcmId;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// The managed configurations settings for a product.
+class ManagedConfigurationsSettingsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "androidenterprise#managedConfigurationsSettingsListResponse".
+  core.String kind;
+
+  /// A managed configurations settings for an app that may be assigned to a
+  /// group of users in an enterprise.
+  core.List<ManagedConfigurationsSettings> managedConfigurationsSettings;
+
+  ManagedConfigurationsSettingsListResponse();
+
+  ManagedConfigurationsSettingsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("managedConfigurationsSettings")) {
+      managedConfigurationsSettings = _json["managedConfigurationsSettings"]
+          .map((value) => new ManagedConfigurationsSettings.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (managedConfigurationsSettings != null) {
+      _json["managedConfigurationsSettings"] = managedConfigurationsSettings
+          .map((value) => (value).toJson())
+          .toList();
+    }
+    return _json;
+  }
+}
+
 /// A managed property of a managed configuration. The property must match one
 /// of the properties in the app restrictions schema of the product. Exactly one
 /// of the value fields must be populated, and it must match the property's type
@@ -6310,6 +6755,9 @@
   /// The Android ID of the device. This field will always be present.
   core.String deviceId;
 
+  /// Policy app on the device.
+  core.String dpcPackageName;
+
   /// Identifies the extent to which the device is controlled by an Android EMM
   /// in various deployment configurations.
   ///
@@ -6327,6 +6775,9 @@
     if (_json.containsKey("deviceId")) {
       deviceId = _json["deviceId"];
     }
+    if (_json.containsKey("dpcPackageName")) {
+      dpcPackageName = _json["dpcPackageName"];
+    }
     if (_json.containsKey("managementType")) {
       managementType = _json["managementType"];
     }
@@ -6341,6 +6792,9 @@
     if (deviceId != null) {
       _json["deviceId"] = deviceId;
     }
+    if (dpcPackageName != null) {
+      _json["dpcPackageName"] = dpcPackageName;
+    }
     if (managementType != null) {
       _json["managementType"] = managementType;
     }
@@ -6655,6 +7109,49 @@
   }
 }
 
+/// The device policy for a given managed device.
+class Policy {
+  /// The availability granted to the device for the specified products. "all"
+  /// gives the device access to all products, regardless of approval status.
+  /// "allApproved" entitles the device to access all products that are approved
+  /// for the enterprise. "allApproved" and "all" do not enable automatic
+  /// visibility of "alpha" or "beta" tracks. "whitelist" grants the device
+  /// access the products specified in productPolicy[]. Only products that are
+  /// approved or products that were previously approved (products with revoked
+  /// approval) by the enterprise can be whitelisted. If no value is provided,
+  /// the availability set at the user level is applied by default.
+  core.String productAvailabilityPolicy;
+
+  /// The list of product policies.
+  core.List<ProductPolicy> productPolicy;
+
+  Policy();
+
+  Policy.fromJson(core.Map _json) {
+    if (_json.containsKey("productAvailabilityPolicy")) {
+      productAvailabilityPolicy = _json["productAvailabilityPolicy"];
+    }
+    if (_json.containsKey("productPolicy")) {
+      productPolicy = _json["productPolicy"]
+          .map((value) => new ProductPolicy.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 (productAvailabilityPolicy != null) {
+      _json["productAvailabilityPolicy"] = productAvailabilityPolicy;
+    }
+    if (productPolicy != null) {
+      _json["productPolicy"] =
+          productPolicy.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
 /// A Products resource represents an app in the Google Play store that is
 /// available to at least some users in the enterprise. (Some apps are
 /// restricted to a single enterprise, and no information about them is made
@@ -6670,9 +7167,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;
+
+  /// The localized promotional description, if available.
+  core.String description;
+
   /// A link to the (consumer) Google Play details page for the product.
   core.String detailsUrl;
 
@@ -6693,6 +7202,16 @@
   /// "androidenterprise#product".
   core.String kind;
 
+  /// The approximate time (within 7 days) the app was last published, expressed
+  /// in milliseconds since epoch.
+  core.String lastUpdatedTimestampMillis;
+
+  /// The minimum Android SDK necessary to run the app.
+  core.int minAndroidSdkVersion;
+
+  /// A list of permissions required by the 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;
@@ -6702,9 +7221,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;
 
@@ -6730,9 +7255,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"];
     }
@@ -6745,15 +7282,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"]);
@@ -6779,9 +7333,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;
     }
@@ -6794,15 +7360,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();
     }
@@ -6970,6 +7552,52 @@
   }
 }
 
+/// The policy for a product.
+class ProductPolicy {
+  /// The ID of the product. For example, "app:com.google.android.gm".
+  core.String productId;
+
+  /// Grants visibility to the specified track(s) of the product to the device.
+  /// The track available to the device is based on the following order of
+  /// preference: alpha, beta, production. For example, if an app has a prod
+  /// version, a beta version and an alpha version and the enterprise has been
+  /// granted visibility to both the alpha and beta tracks, if tracks is
+  /// {"beta", "production"} then the beta version of the app is made available
+  /// to the device. If there are no app versions in the specified track adding
+  /// the "alpha" and "beta" values to the list of tracks will have no effect.
+  /// Note that the enterprise requires access to alpha and/or beta tracks
+  /// before users can be granted visibility to apps in those tracks.
+  ///
+  /// The allowed sets are: {} (considered equivalent to {"production"})
+  /// {"production"} {"beta", "production"} {"alpha", "beta", "production"} The
+  /// order of elements is not relevant. Any other set of tracks will be
+  /// rejected with an error.
+  core.List<core.String> tracks;
+
+  ProductPolicy();
+
+  ProductPolicy.fromJson(core.Map _json) {
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("tracks")) {
+      tracks = _json["tracks"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (tracks != null) {
+      _json["tracks"] = tracks;
+    }
+    return _json;
+  }
+}
+
 /// A set of products.
 class ProductSet {
   /// Identifies what kind of resource this is. Value: the fixed string
@@ -7885,3 +8513,48 @@
     return _json;
   }
 }
+
+/// A variable set is a key-value pair of EMM-provided placeholders and its
+/// corresponding value, which is attributed to a user. For example, $FIRSTNAME
+/// could be a placeholder, and its value could be Alice. Placeholders should
+/// start with a '$' sign and should be alphanumeric only.
+class VariableSet {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "androidenterprise#variableSet".
+  core.String kind;
+
+  /// The placeholder string; defined by EMM.
+  core.String placeholder;
+
+  /// The value of the placeholder, specific to the user.
+  core.String userValue;
+
+  VariableSet();
+
+  VariableSet.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("placeholder")) {
+      placeholder = _json["placeholder"];
+    }
+    if (_json.containsKey("userValue")) {
+      userValue = _json["userValue"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (placeholder != null) {
+      _json["placeholder"] = placeholder;
+    }
+    if (userValue != null) {
+      _json["userValue"] = userValue;
+    }
+    return _json;
+  }
+}
diff --git a/googleapis/lib/androidmanagement/v1.dart b/googleapis/lib/androidmanagement/v1.dart
index 758cd23..4230ae0 100644
--- a/googleapis/lib/androidmanagement/v1.dart
+++ b/googleapis/lib/androidmanagement/v1.dart
@@ -50,7 +50,8 @@
 
   EnterprisesResourceApi(commons.ApiRequester client) : _requester = client;
 
-  /// Creates an enterprise by completing the enterprise signup flow.
+  /// Creates an enterprise. This is the last step in the enterprise signup
+  /// flow.
   ///
   /// [request] - The metadata request object.
   ///
@@ -61,7 +62,7 @@
   ///
   /// [enterpriseToken] - The enterprise token appended to the callback URL.
   ///
-  /// [projectId] - The id of the Google Cloud Platform project which will own
+  /// [projectId] - The ID of the Google Cloud Platform project which will own
   /// the enterprise.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -117,7 +118,8 @@
   ///
   /// Request parameters:
   ///
-  /// [name] - The name of the enterprise in the form enterprises/{enterpriseId}
+  /// [name] - The name of the enterprise in the form
+  /// enterprises/{enterpriseId}.
   /// Value must have pattern "^enterprises/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -162,7 +164,8 @@
   ///
   /// Request parameters:
   ///
-  /// [name] - The name of the enterprise in the form enterprises/{enterpriseId}
+  /// [name] - The name of the enterprise in the form
+  /// enterprises/{enterpriseId}.
   /// Value must have pattern "^enterprises/[^/]+$".
   ///
   /// [updateMask] - The field mask indicating the fields to update. If not set,
@@ -223,7 +226,7 @@
   /// Request parameters:
   ///
   /// [name] - The name of the application in the form
-  /// enterprises/{enterpriseId}/applications/{package_name}
+  /// enterprises/{enterpriseId}/applications/{package_name}.
   /// Value must have pattern "^enterprises/[^/]+/applications/[^/]+$".
   ///
   /// [languageCode] - The preferred language for localized application info, as
@@ -280,12 +283,12 @@
   EnterprisesDevicesResourceApi(commons.ApiRequester client)
       : _requester = client;
 
-  /// Deletes a device, which causes the device to be wiped.
+  /// Deletes a device. This operation wipes the device.
   ///
   /// Request parameters:
   ///
   /// [name] - The name of the device in the form
-  /// enterprises/{enterpriseId}/devices/{deviceId}
+  /// enterprises/{enterpriseId}/devices/{deviceId}.
   /// Value must have pattern "^enterprises/[^/]+/devices/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -329,7 +332,7 @@
   /// Request parameters:
   ///
   /// [name] - The name of the device in the form
-  /// enterprises/{enterpriseId}/devices/{deviceId}
+  /// enterprises/{enterpriseId}/devices/{deviceId}.
   /// Value must have pattern "^enterprises/[^/]+/devices/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -377,7 +380,7 @@
   /// Request parameters:
   ///
   /// [name] - The name of the device in the form
-  /// enterprises/{enterpriseId}/devices/{deviceId}
+  /// enterprises/{enterpriseId}/devices/{deviceId}.
   /// Value must have pattern "^enterprises/[^/]+/devices/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -427,14 +430,14 @@
   /// Request parameters:
   ///
   /// [parent] - The name of the enterprise in the form
-  /// enterprises/{enterpriseId}
+  /// enterprises/{enterpriseId}.
   /// Value must have pattern "^enterprises/[^/]+$".
   ///
   /// [pageSize] - The requested page size. The actual page size may be fixed to
   /// a min or max value.
   ///
-  /// [pageToken] - A token identifying a page of results the server should
-  /// return.
+  /// [pageToken] - A token identifying a page of results returned by the
+  /// server.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -487,7 +490,7 @@
   /// Request parameters:
   ///
   /// [name] - The name of the device in the form
-  /// enterprises/{enterpriseId}/devices/{deviceId}
+  /// enterprises/{enterpriseId}/devices/{deviceId}.
   /// Value must have pattern "^enterprises/[^/]+/devices/[^/]+$".
   ///
   /// [updateMask] - The field mask indicating the fields to update. If not set,
@@ -772,7 +775,7 @@
   /// Request parameters:
   ///
   /// [parent] - The name of the enterprise in the form
-  /// enterprises/{enterpriseId}
+  /// enterprises/{enterpriseId}.
   /// Value must have pattern "^enterprises/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -818,12 +821,13 @@
     return _response.then((data) => new EnrollmentToken.fromJson(data));
   }
 
-  /// Deletes an enrollment token, which prevents future use of the token.
+  /// Deletes an enrollment token. This operation invalidates the token,
+  /// preventing its future use.
   ///
   /// Request parameters:
   ///
   /// [name] - The name of the enrollment token in the form
-  /// enterprises/{enterpriseId}/enrollmentTokens/{enrollmentTokenId}
+  /// enterprises/{enterpriseId}/enrollmentTokens/{enrollmentTokenId}.
   /// Value must have pattern "^enterprises/[^/]+/enrollmentTokens/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -875,7 +879,7 @@
   /// Request parameters:
   ///
   /// [name] - The name of the policy in the form
-  /// enterprises/{enterpriseId}/policies/{policyId}
+  /// enterprises/{enterpriseId}/policies/{policyId}.
   /// Value must have pattern "^enterprises/[^/]+/policies/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -919,7 +923,7 @@
   /// Request parameters:
   ///
   /// [name] - The name of the policy in the form
-  /// enterprises/{enterpriseId}/policies/{policyId}
+  /// enterprises/{enterpriseId}/policies/{policyId}.
   /// Value must have pattern "^enterprises/[^/]+/policies/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -963,14 +967,14 @@
   /// Request parameters:
   ///
   /// [parent] - The name of the enterprise in the form
-  /// enterprises/{enterpriseId}
+  /// enterprises/{enterpriseId}.
   /// Value must have pattern "^enterprises/[^/]+$".
   ///
   /// [pageSize] - The requested page size. The actual page size may be fixed to
   /// a min or max value.
   ///
-  /// [pageToken] - A token identifying a page of results the server should
-  /// return.
+  /// [pageToken] - A token identifying a page of results returned by the
+  /// server.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1023,7 +1027,7 @@
   /// Request parameters:
   ///
   /// [name] - The name of the policy in the form
-  /// enterprises/{enterpriseId}/policies/{policyId}
+  /// enterprises/{enterpriseId}/policies/{policyId}.
   /// Value must have pattern "^enterprises/[^/]+/policies/[^/]+$".
   ///
   /// [updateMask] - The field mask indicating the fields to update. If not set,
@@ -1087,7 +1091,7 @@
   /// Request parameters:
   ///
   /// [parent] - The name of the enterprise in the form
-  /// enterprises/{enterpriseId}
+  /// enterprises/{enterpriseId}.
   /// Value must have pattern "^enterprises/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -1141,14 +1145,14 @@
   ///
   /// Request parameters:
   ///
-  /// [callbackUrl] - The callback URL to which the admin will be redirected
+  /// [callbackUrl] - The callback URL that the admin will be redirected to
   /// after successfully creating an enterprise. Before redirecting there the
   /// system will add a query parameter to this URL named enterpriseToken which
   /// will contain an opaque token to be used for the create enterprise request.
   /// The URL will be parsed then reformatted in order to add the
   /// enterpriseToken parameter, so there may be some minor formatting changes.
   ///
-  /// [projectId] - The id of the Google Cloud Platform project which will own
+  /// [projectId] - The ID of the Google Cloud Platform project which will own
   /// the enterprise.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -1192,11 +1196,43 @@
   }
 }
 
+/// Configuration for an always-on VPN connection.
+class AlwaysOnVpnPackage {
+  /// Disallows networking when the VPN is not connected.
+  core.bool lockdownEnabled;
+
+  /// The package name of the VPN app.
+  core.String packageName;
+
+  AlwaysOnVpnPackage();
+
+  AlwaysOnVpnPackage.fromJson(core.Map _json) {
+    if (_json.containsKey("lockdownEnabled")) {
+      lockdownEnabled = _json["lockdownEnabled"];
+    }
+    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 (lockdownEnabled != null) {
+      _json["lockdownEnabled"] = lockdownEnabled;
+    }
+    if (packageName != null) {
+      _json["packageName"] = packageName;
+    }
+    return _json;
+  }
+}
+
 /// A compliance rule condition which is satisfied if the Android Framework API
-/// level on the device does not meet a minimum requirement. There can only be
+/// level on the device doesn't meet a minimum requirement. There can only be
 /// one rule with this type of condition per policy.
 class ApiLevelCondition {
-  /// The minimum desired Android Framework API level. If the device does not
+  /// The minimum desired Android Framework API level. If the device doesn't
   /// meet the minimum requirement, this condition is satisfied. Must be greater
   /// than zero.
   core.int minApiLevel;
@@ -1219,20 +1255,19 @@
   }
 }
 
-/// Application information.
+/// Information about an app.
 class Application {
-  /// The set of managed properties available to be pre-configured for the
-  /// application.
+  /// The set of managed properties available to be pre-configured for the app.
   core.List<ManagedProperty> managedProperties;
 
-  /// The name of the application in the form
-  /// enterprises/{enterpriseId}/applications/{package_name}
+  /// The name of the app in the form
+  /// enterprises/{enterpriseId}/applications/{package_name}.
   core.String name;
 
   /// The permissions required by the app.
   core.List<ApplicationPermission> permissions;
 
-  /// The title of the application. Localized.
+  /// The title of the app. Localized.
   core.String title;
 
   Application();
@@ -1277,9 +1312,9 @@
   }
 }
 
-/// Application permission.
+/// A permission required by the app.
 class ApplicationPermission {
-  /// A longer description of the permission, giving more details of what it
+  /// A longer description of the permission, providing more detail on what it
   /// affects. Localized.
   core.String description;
 
@@ -1333,17 +1368,20 @@
   /// - "DENY" : Automatically deny a permission.
   core.String defaultPermissionPolicy;
 
+  /// The scopes delegated to the app from Android Device Policy.
+  core.List<core.String> delegatedScopes;
+
   /// The type of installation to perform.
   /// Possible string values are:
   /// - "INSTALL_TYPE_UNSPECIFIED" : No automatic installation is performed. Any
   /// other app policies will be applied if the user installs the app.
-  /// - "PREINSTALLED" : The application is automatically installed and can be
+  /// - "PREINSTALLED" : The app is automatically installed and can be removed
+  /// by the user.
+  /// - "FORCE_INSTALLED" : The app is automatically installed and can't be
   /// removed by the user.
-  /// - "FORCE_INSTALLED" : The application is automatically installed and
-  /// cannot be removed by the user.
   core.String installType;
 
-  /// Whether the application is allowed to lock itself in full-screen mode.
+  /// Whether the app is allowed to lock itself in full-screen mode.
   core.bool lockTaskAllowed;
 
   /// Managed configuration applied to the app. The format for the configuration
@@ -1362,8 +1400,16 @@
   /// `String`, `bool` and `null` as well as `Map` and `List` values.
   core.Map<core.String, core.Object> managedConfiguration;
 
-  /// The package name of the app, e.g. com.google.android.youtube for the
-  /// YouTube app.
+  /// The minimum version of the app that runs on the device. If set, the device
+  /// attempts to update the app to at least this version code. If the app is
+  /// not up-to-date, the device will contain a NonComplianceDetail with
+  /// non_compliance_reason set to APP_NOT_UPDATED. The app must already be
+  /// published to Google Play with a version code greater than or equal to this
+  /// value. At most 20 apps may specify a minimum version code per policy.
+  core.int minimumVersionCode;
+
+  /// The package name of the app. For example, com.google.android.youtube for
+  /// the YouTube app.
   core.String packageName;
 
   /// Explicit permission grants or denials for the app. These values override
@@ -1376,6 +1422,9 @@
     if (_json.containsKey("defaultPermissionPolicy")) {
       defaultPermissionPolicy = _json["defaultPermissionPolicy"];
     }
+    if (_json.containsKey("delegatedScopes")) {
+      delegatedScopes = _json["delegatedScopes"];
+    }
     if (_json.containsKey("installType")) {
       installType = _json["installType"];
     }
@@ -1385,6 +1434,9 @@
     if (_json.containsKey("managedConfiguration")) {
       managedConfiguration = _json["managedConfiguration"];
     }
+    if (_json.containsKey("minimumVersionCode")) {
+      minimumVersionCode = _json["minimumVersionCode"];
+    }
     if (_json.containsKey("packageName")) {
       packageName = _json["packageName"];
     }
@@ -1401,6 +1453,9 @@
     if (defaultPermissionPolicy != null) {
       _json["defaultPermissionPolicy"] = defaultPermissionPolicy;
     }
+    if (delegatedScopes != null) {
+      _json["delegatedScopes"] = delegatedScopes;
+    }
     if (installType != null) {
       _json["installType"] = installType;
     }
@@ -1410,6 +1465,9 @@
     if (managedConfiguration != null) {
       _json["managedConfiguration"] = managedConfiguration;
     }
+    if (minimumVersionCode != null) {
+      _json["minimumVersionCode"] = minimumVersionCode;
+    }
     if (packageName != null) {
       _json["packageName"] = packageName;
     }
@@ -1497,14 +1555,13 @@
 /// as well, depending on the field values in the rule.
 class ComplianceRule {
   /// A condition which is satisfied if the Android Framework API level on the
-  /// device does not meet a minimum requirement.
+  /// device doesn't meet a minimum requirement.
   ApiLevelCondition apiLevelCondition;
 
-  /// If set to true, the rule includes a mitigating action to disable
-  /// applications so that the device is effectively disabled, but application
-  /// data is preserved. If the device is running an app in locked task mode,
-  /// the app will be closed and a UI showing the reason for non-compliance will
-  /// be displayed.
+  /// If set to true, the rule includes a mitigating action to disable apps so
+  /// that the device is effectively disabled, but app data is preserved. If the
+  /// device is running an app in locked task mode, the app will be closed and a
+  /// UI showing the reason for non-compliance will be displayed.
   core.bool disableApps;
 
   /// A condition which is satisfied if there exists any matching
@@ -1545,46 +1602,50 @@
 }
 
 /// A device owned by an enterprise. Unless otherwise noted, all fields are
-/// read-only and cannot be modified by an update device request.
+/// read-only and can't be modified by enterprises.devices.patch.
 class Device {
   /// The API level of the Android platform version running on the device.
   core.int apiLevel;
 
-  /// The name of the policy that is currently applied by the device.
+  /// The name of the policy currently applied to the device.
   core.String appliedPolicyName;
 
-  /// The version of the policy that is currently applied by the device.
+  /// The version of the policy currently applied to the device.
   core.String appliedPolicyVersion;
 
-  /// The state that is currently applied by the device.
+  /// The state currently applied to the device.
   /// Possible string values are:
   /// - "DEVICE_STATE_UNSPECIFIED" : This value is disallowed.
   /// - "ACTIVE" : The device is active.
   /// - "DISABLED" : The device is disabled.
   /// - "DELETED" : The device was deleted. This state will never be returned by
-  /// an API call, but will be used in the final policy compliance report
-  /// published to Cloud Pub/Sub when the device acknowledges the deletion.
+  /// an API call, but is used in the final policy compliance report published
+  /// to Cloud Pub/Sub when the device acknowledges the deletion.
   /// - "PROVISIONING" : The device is being provisioned. Newly enrolled devices
-  /// will be in this state until they have applied policy.
+  /// are in this state until they have a policy applied.
   core.String appliedState;
 
+  /// Device settings information. This information is only available if
+  /// 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.
+  /// the device indicating the reason the device is disabled. This field can be
+  /// modified by a patch request.
   UserFacingMessage disabledReason;
 
-  /// Displays on the device. This information is only available when
-  /// displayInfoEnabled is true in the device's policy.
+  /// Detailed information about displays on the device. This information is
+  /// only available if displayInfoEnabled is true in the device's policy.
   core.List<Display> displays;
 
   /// The time of device enrollment.
   core.String enrollmentTime;
 
-  /// If this device was enrolled with an enrollment token with additional data
+  /// If the device was enrolled with an enrollment token with additional data
   /// provided, this field contains that data.
   core.String enrollmentTokenData;
 
-  /// If this device was enrolled with an enrollment token, this field contains
+  /// If the device was enrolled with an enrollment token, this field contains
   /// the name of the token.
   core.String enrollmentTokenName;
 
@@ -1592,7 +1653,7 @@
   HardwareInfo hardwareInfo;
 
   /// Hardware status samples in chronological order. This information is only
-  /// available when hardwareStatusEnabled is true in the device's policy.
+  /// available if hardwareStatusEnabled is true in the device's policy.
   core.List<HardwareStatus> hardwareStatusSamples;
 
   /// The last time the device sent a policy compliance report.
@@ -1605,65 +1666,64 @@
   core.String lastStatusReportTime;
 
   /// Events related to memory and storage measurements in chronological order.
-  /// This information is only available when memoryInfoEnabled is true in the
+  /// This information is only available if memoryInfoEnabled is true in the
   /// device's policy.
   core.List<MemoryEvent> memoryEvents;
 
-  /// Memory information. This information is only available when
+  /// Memory information. This information is only available if
   /// memoryInfoEnabled is true in the device's policy.
   MemoryInfo memoryInfo;
 
   /// The name of the device in the form
-  /// enterprises/{enterpriseId}/devices/{deviceId}
+  /// enterprises/{enterpriseId}/devices/{deviceId}.
   core.String name;
 
-  /// Device network information. This information is only available when
+  /// Device network information. This information is only available if
   /// networkInfoEnabled is true in the device's policy.
   NetworkInfo networkInfo;
 
-  /// Details about policy settings for which the device is not in compliance.
+  /// Details about policy settings that the device is not compliant with.
   core.List<NonComplianceDetail> nonComplianceDetails;
 
   /// Whether the device is compliant with its policy.
   core.bool policyCompliant;
 
-  /// The name of the policy that is intended to be applied to the device. If
-  /// empty, the policy_name for the user that owns this device is applied. This
-  /// field may be modified by an update request. The name of the policy is in
-  /// the form enterprises/{enterpriseId}/policies/{policyId}. It is also
-  /// permissible to only specify the policyId when updating this field as long
-  /// as the policyId contains no slashes since the rest of the policy name can
-  /// be inferred from context.
+  /// The name of the policy applied to the device, in the form
+  /// enterprises/{enterpriseId}/policies/{policyId}. If not specified, the
+  /// policy_name for the device's user is applied. This field can be modified
+  /// by a patch request. You can specify only the policyId when calling
+  /// enterprises.devices.patch, as long as the policyId doesn’t contain any
+  /// slashes. The rest of the policy name is inferred.
   core.String policyName;
 
   /// Power management events on the device in chronological order. This
-  /// information is only available when powerManagementEventsEnabled is true in
+  /// information is only available if powerManagementEventsEnabled is true in
   /// the device's policy.
   core.List<PowerManagementEvent> powerManagementEvents;
 
-  /// The previous device names used for the same physical device when it has
-  /// been enrolled multiple times. The serial number is used as the unique
-  /// identifier to determine if the same physical device has enrolled
+  /// If the same physical device has been enrolled multiple times, this field
+  /// contains its previous device names. The serial number is used as the
+  /// unique identifier to determine if the same physical device has enrolled
   /// previously. The names are in chronological order.
   core.List<core.String> previousDeviceNames;
 
   /// Detailed information about the device software. This information is only
-  /// available when softwareInfoEnabled is true in the device's policy.
+  /// available if softwareInfoEnabled is true in the device's policy.
   SoftwareInfo softwareInfo;
 
-  /// The state that is intended to be applied to the device. This field may be
-  /// modified by an update request. Note that UpdateDevice only handles
-  /// toggling between ACTIVE and DISABLED states. Use the delete device method
-  /// to cause the device to enter the DELETED state.
+  /// The state to be applied to the device. This field can be modified by a
+  /// patch request. Note that when calling enterprises.devices.patch, ACTIVE
+  /// and DISABLED are the only allowable values. To enter the device into a
+  /// DELETED state, call enterprises.devices.delete.
   /// Possible string values are:
   /// - "DEVICE_STATE_UNSPECIFIED" : This value is disallowed.
   /// - "ACTIVE" : The device is active.
   /// - "DISABLED" : The device is disabled.
   /// - "DELETED" : The device was deleted. This state will never be returned by
-  /// an API call, but will be used in the final policy compliance report
-  /// published to Cloud Pub/Sub when the device acknowledges the deletion.
+  /// an API call, but is used in the final policy compliance report published
+  /// to Cloud Pub/Sub when the device acknowledges the deletion.
   /// - "PROVISIONING" : The device is being provisioned. Newly enrolled devices
-  /// will be in this state until they have applied policy.
+  /// are in this state until they have a policy applied.
   core.String state;
 
   /// The resource name of the user that owns this device in the form
@@ -1685,6 +1745,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"]);
     }
@@ -1778,6 +1841,9 @@
     if (appliedState != null) {
       _json["appliedState"] = appliedState;
     }
+    if (deviceSettings != null) {
+      _json["deviceSettings"] = (deviceSettings).toJson();
+    }
     if (disabledReason != null) {
       _json["disabledReason"] = (disabledReason).toJson();
     }
@@ -1852,6 +1918,99 @@
   }
 }
 
+/// Information about security related device settings on device.
+class DeviceSettings {
+  /// Whether ADB (https://developer.android.com/studio/command-line/adb.html)
+  /// is enabled on the device.
+  core.bool adbEnabled;
+
+  /// Whether developer mode is enabled on the device.
+  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 is 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" : Encryption is active, and the encryption key is tied
+  /// to the user profile.
+  core.String encryptionStatus;
+
+  /// Whether the device is secured with PIN/password.
+  core.bool isDeviceSecure;
+
+  /// Whether the storage encryption is enabled.
+  core.bool isEncrypted;
+
+  /// Whether installing apps from unknown sources is enabled.
+  core.bool unknownSourcesEnabled;
+
+  /// Whether Verify Apps (Google Play Protect
+  /// (https://support.google.com/googleplay/answer/2812853)) is enabled on the
+  /// device.
+  core.bool verifyAppsEnabled;
+
+  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"];
+    }
+    if (_json.containsKey("verifyAppsEnabled")) {
+      verifyAppsEnabled = _json["verifyAppsEnabled"];
+    }
+  }
+
+  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;
+    }
+    if (verifyAppsEnabled != null) {
+      _json["verifyAppsEnabled"] = verifyAppsEnabled;
+    }
+    return _json;
+  }
+}
+
 /// Device display information.
 class Display {
   /// Display density expressed as dots-per-inch.
@@ -1957,15 +2116,15 @@
 /// An enrollment token.
 class EnrollmentToken {
   /// Optional, arbitrary data associated with the enrollment token. This could
-  /// contain, for example, the id of an org unit to which the device is
-  /// assigned after enrollment. After a device enrolls with the token, this
-  /// data will be exposed in the enrollment_token_data field of the Device
-  /// resource. The data must be 1024 characters or less; otherwise, the
-  /// creation request will fail.
+  /// contain, for example, the ID of an org unit the device is assigned to
+  /// after enrollment. After a device enrolls with the token, this data will be
+  /// exposed in the enrollment_token_data field of the Device resource. The
+  /// data must be 1024 characters or less; otherwise, the creation request will
+  /// fail.
   core.String additionalData;
 
-  /// The duration of the token. If not specified, the duration will be 1 hour.
-  /// The allowed range is 1 minute to 30 days.
+  /// The length of time the enrollment token is valid, ranging from 1 minute to
+  /// 30 days. If not specified, the default duration is 1 hour.
   core.String duration;
 
   /// The expiration time of the token. This is a read-only field generated by
@@ -1974,17 +2133,16 @@
 
   /// The name of the enrollment token, which is generated by the server during
   /// creation, in the form
-  /// enterprises/{enterpriseId}/enrollmentTokens/{enrollmentTokenId}
+  /// enterprises/{enterpriseId}/enrollmentTokens/{enrollmentTokenId}.
   core.String name;
 
-  /// The name of the policy that will be initially applied to the enrolled
-  /// device in the form enterprises/{enterpriseId}/policies/{policyId}. If not
-  /// specified, the policy_name for the user that owns the device is applied.
-  /// If user_name also isn't specified, the policy defaults to
-  /// enterprises/{enterpriseId}/policies/default. It is permissible to only
-  /// specify the policyId when updating this field as long as the policyId
-  /// contains no slashes since the rest of the policy name can be inferred from
-  /// context.
+  /// The name of the policy initially applied to the enrolled device, in the
+  /// form enterprises/{enterpriseId}/policies/{policyId}. If not specified, the
+  /// policy_name for the device’s user is applied. If user_name is also not
+  /// specified, enterprises/{enterpriseId}/policies/default is applied by
+  /// default. When updating this field, you can specify only the policyId as
+  /// long as the policyId doesn’t contain any slashes. The rest of the policy
+  /// name will be inferred.
   core.String policyName;
 
   /// A JSON string whose UTF-8 representation can be used to generate a QR code
@@ -1993,7 +2151,7 @@
   /// representation of the properties in the JSON.
   core.String qrCode;
 
-  /// The token value which is passed to the device and authorizes the device to
+  /// The token value that's passed to the device and authorizes the device to
   /// enroll. This is a read-only field generated by the server.
   core.String value;
 
@@ -2053,17 +2211,15 @@
 
 /// The configuration applied to an enterprise.
 class Enterprise {
-  /// Whether app auto-approval is enabled. When enabled, apps installed via
-  /// policy for this enterprise have all permissions automatically approved.
-  /// When enabled, it is the caller's responsibility to display the permissions
-  /// required by an app to the enterprise admin before setting the app to be
-  /// installed in a policy.
+  /// Whether permissions for apps installed via policy are automatically
+  /// approved. If enabled, you must display an app's permissions to the
+  /// enterprise admin before setting the app to be installed in a policy.
   core.bool appAutoApprovalEnabled;
 
-  /// The notification types to enable via Google Cloud Pub/Sub.
+  /// The types of Google Pub/Sub notifications enabled for the enterprise.
   core.List<core.String> enabledNotificationTypes;
 
-  /// The name of the enterprise as it will appear to users.
+  /// The name of the enterprise displayed to users.
   core.String enterpriseDisplayName;
 
   /// An image displayed as a logo during device provisioning. Supported types
@@ -2072,20 +2228,18 @@
   ExternalData logo;
 
   /// The name of the enterprise which is generated by the server during
-  /// creation, in the form enterprises/{enterpriseId}
+  /// creation, in the form enterprises/{enterpriseId}.
   core.String name;
 
-  /// A color in RGB format indicating the predominant color to display in the
-  /// device management app UI. The color components are stored as follows: (red
-  /// << 16) | (green << 8) | blue, where each component may take a value
-  /// between 0 and 255 inclusive.
+  /// A color in RGB format that indicates the predominant color to display in
+  /// the device management app UI. The color components are stored as follows:
+  /// (red << 16) | (green << 8) | blue, where the value of each component is
+  /// between 0 and 255, inclusive.
   core.int primaryColor;
 
-  /// When Cloud Pub/Sub notifications are enabled, this field is required to
-  /// indicate the topic to which the notifications will be published. The
-  /// format of this field is projects/{project}/topics/{topic}. You must have
-  /// granted the publish permission on this topic to
-  /// android-cloud-policy@system.gserviceaccount.com
+  /// The topic that Cloud Pub/Sub notifications are published to, in the form
+  /// projects/{project}/topics/{topic}. This field is only required if Pub/Sub
+  /// notifications are enabled.
   core.String pubsubTopic;
 
   Enterprise();
@@ -2146,12 +2300,11 @@
 /// Device Policy and verified against the hash.
 class ExternalData {
   /// The base-64 encoded SHA-256 hash of the content hosted at url. If the
-  /// content does not match this hash, Android Device Policy will not use the
-  /// data.
+  /// content doesn't match this hash, Android Device Policy won't use the data.
   core.String sha256Hash;
 
   /// The absolute URL to the data, which must use either the http or https
-  /// scheme. Android Device Policy does not provide any credentials in the GET
+  /// scheme. Android Device Policy doesn't provide any credentials in the GET
   /// request, so the URL must be publicly accessible. Including a long, random
   /// component in the URL may be used to prevent attackers from discovering the
   /// URL.
@@ -2182,7 +2335,7 @@
 }
 
 /// Information about device hardware. The fields related to temperature
-/// thresholds are only available when hardwareStatusEnabled is true in the
+/// thresholds are only available if hardwareStatusEnabled is true in the
 /// device's policy.
 class HardwareInfo {
   /// Battery shutdown temperature thresholds in Celsius for each battery on the
@@ -2193,7 +2346,7 @@
   /// the device.
   core.List<core.double> batteryThrottlingTemperatures;
 
-  /// Brand of the device, e.g. Google.
+  /// Brand of the device. For example, Google.
   core.String brand;
 
   /// CPU shutdown temperature thresholds in Celsius for each CPU on the device.
@@ -2203,7 +2356,7 @@
   /// device.
   core.List<core.double> cpuThrottlingTemperatures;
 
-  /// Baseband version, e.g. MDM9625_104662.22.05.34p.
+  /// Baseband version. For example, MDM9625_104662.22.05.34p.
   core.String deviceBasebandVersion;
 
   /// GPU shutdown temperature thresholds in Celsius for each GPU on the device.
@@ -2213,13 +2366,13 @@
   /// device.
   core.List<core.double> gpuThrottlingTemperatures;
 
-  /// Name of the hardware, e.g. Angler.
+  /// Name of the hardware. For example, Angler.
   core.String hardware;
 
-  /// Manufacturer, e.g. Motorola.
+  /// Manufacturer. For example, Motorola.
   core.String manufacturer;
 
-  /// The model of the device, e.g. Asus Nexus 7.
+  /// The model of the device. For example, Asus Nexus 7.
   core.String model;
 
   /// The device serial number.
@@ -2511,21 +2664,21 @@
 
 /// Managed property.
 class ManagedProperty {
-  /// The default value of the properties. BUNDLE_ARRAY properties never have a
+  /// The default value of the property. BUNDLE_ARRAY properties don't have a
   /// default value.
   ///
   /// 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 defaultValue;
 
-  /// A longer description of the property, giving more detail of what it
+  /// A longer description of the property, providing more detail of what it
   /// affects. Localized.
   core.String description;
 
   /// For CHOICE or MULTISELECT properties, the list of possible entries.
   core.List<ManagedPropertyEntry> entries;
 
-  /// The unique key that the application uses to identify the property, e.g.
+  /// The unique key that the app uses to identify the property, e.g.
   /// "com.google.android.gm.fieldname".
   core.String key;
 
@@ -2545,7 +2698,7 @@
   /// - "CHOICE" : A choice of one item from a set.
   /// - "MULTISELECT" : A choice of multiple items from a set.
   /// - "HIDDEN" : A hidden restriction of string type (the default value can be
-  /// used to pass along information that cannot be modified, such as a version
+  /// used to pass along information that can't be modified, such as a version
   /// code).
   /// - "BUNDLE_ARRAY" : An array of property bundles.
   core.String type;
@@ -2730,13 +2883,16 @@
 
 /// Device network info.
 class NetworkInfo {
-  /// IMEI number of the GSM device, e.g. A1000031212.
+  /// IMEI number of the GSM device. For example, A1000031212.
   core.String imei;
 
-  /// MEID number of the CDMA device, e.g. A00000292788E1.
+  /// MEID number of the CDMA device. For example, A00000292788E1.
   core.String meid;
 
-  /// WiFi MAC address of the device, e.g. 7c:11:11:11:11:11.
+  /// Alphabetic name of current registered operator. For example, Vodafone.
+  core.String networkOperatorName;
+
+  /// Wi-Fi MAC address of the device. For example, 7c:11:11:11:11:11.
   core.String wifiMacAddress;
 
   NetworkInfo();
@@ -2748,6 +2904,9 @@
     if (_json.containsKey("meid")) {
       meid = _json["meid"];
     }
+    if (_json.containsKey("networkOperatorName")) {
+      networkOperatorName = _json["networkOperatorName"];
+    }
     if (_json.containsKey("wifiMacAddress")) {
       wifiMacAddress = _json["wifiMacAddress"];
     }
@@ -2762,6 +2921,9 @@
     if (meid != null) {
       _json["meid"] = meid;
     }
+    if (networkOperatorName != null) {
+      _json["networkOperatorName"] = networkOperatorName;
+    }
     if (wifiMacAddress != null) {
       _json["wifiMacAddress"] = wifiMacAddress;
     }
@@ -2790,13 +2952,13 @@
   core.String fieldPath;
 
   /// If package_name is set and the non-compliance reason is APP_NOT_INSTALLED
-  /// or APP_NOT_UPDATED, the detailed reason the app cannot be installed or
+  /// or APP_NOT_UPDATED, the detailed reason the app can't be installed or
   /// updated.
   /// Possible string values are:
   /// - "INSTALLATION_FAILURE_REASON_UNSPECIFIED" : This value is disallowed.
   /// - "INSTALLATION_FAILURE_REASON_UNKNOWN" : An unknown condition is
-  /// preventing the app from being installed. Some potential reaons are that
-  /// the device does not have enough storage, the device network connection is
+  /// preventing the app from being installed. Some potential reasons are that
+  /// the device doesn't have enough storage, the device network connection is
   /// unreliable, or the installation is taking longer than expected. The
   /// installation will be retried automatically.
   /// - "IN_PROGRESS" : The installation is still in progress.
@@ -2807,9 +2969,9 @@
   /// been accepted by the admin.
   /// - "NOT_AVAILABLE_IN_COUNTRY" : The app is not available in the user's
   /// country.
-  /// - "NO_LICENSES_REMAINING" : There are no more licenses to assign to the
-  /// user.
-  /// - "NOT_ENROLLED" : The enterprise is no longer enrolled with Play for Work
+  /// - "NO_LICENSES_REMAINING" : There are no licenses available to assign to
+  /// the user.
+  /// - "NOT_ENROLLED" : The enterprise is no longer enrolled with managed Play
   /// or Android Device Policy is not enabled for the enterprise.
   /// - "USER_INVALID" : The user is no longer valid. The user may have been
   /// deleted or disabled.
@@ -2818,29 +2980,28 @@
   /// The reason the device is not in compliance with the setting.
   /// Possible string values are:
   /// - "NON_COMPLIANCE_REASON_UNSPECIFIED" : This value is disallowed.
-  /// - "API_LEVEL" : The setting is not supported in the API level of Android
-  /// OS version the device is running.
-  /// - "ADMIN_TYPE" : The admin type (profile owner, device owner, etc.) does
-  /// not support the setting.
+  /// - "API_LEVEL" : The setting is not supported in the API level of the
+  /// Android version running on the device.
+  /// - "ADMIN_TYPE" : The admin type (profile owner, device owner, etc.)
+  /// doesn't support the setting.
   /// - "USER_ACTION" : The user has not taken required action to comply with
   /// the setting.
   /// - "INVALID_VALUE" : The setting has an invalid value.
-  /// - "APP_NOT_INSTALLED" : The application required to implement the policy
-  /// is not installed.
+  /// - "APP_NOT_INSTALLED" : The app required to implement the policy is not
+  /// installed.
   /// - "UNSUPPORTED" : The policy is not supported by the version of Android
   /// Device Policy on the device.
-  /// - "APP_INSTALLED" : A blocked application is installed.
-  /// - "PENDING" : The setting was not applied yet at the time of the report,
+  /// - "APP_INSTALLED" : A blocked app is installed.
+  /// - "PENDING" : The setting hasn't been applied at the time of the report,
   /// but is expected to be applied shortly.
-  /// - "APP_INCOMPATIBLE" : The setting cannot be applied to the application
-  /// because the application doesn't support it, for example because its target
-  /// SDK version is not high enough.
-  /// - "APP_NOT_UPDATED" : The application is installed but not updated to the
-  /// minimum version code specified by policy
+  /// - "APP_INCOMPATIBLE" : The setting can't be applied to the app because the
+  /// app doesn't support it, for example because its target SDK version is not
+  /// high enough.
+  /// - "APP_NOT_UPDATED" : The app is installed, but it hasn't been updated to
+  /// the minimum version code specified by policy.
   core.String nonComplianceReason;
 
-  /// The package name indicating which application is out of compliance, if
-  /// applicable.
+  /// The package name indicating which app is out of compliance, if applicable.
   core.String packageName;
 
   /// The name of the policy setting. This is the JSON field name of a top-level
@@ -2905,29 +3066,29 @@
   /// then this condition matches any reason.
   /// Possible string values are:
   /// - "NON_COMPLIANCE_REASON_UNSPECIFIED" : This value is disallowed.
-  /// - "API_LEVEL" : The setting is not supported in the API level of Android
-  /// OS version the device is running.
-  /// - "ADMIN_TYPE" : The admin type (profile owner, device owner, etc.) does
-  /// not support the setting.
+  /// - "API_LEVEL" : The setting is not supported in the API level of the
+  /// Android version running on the device.
+  /// - "ADMIN_TYPE" : The admin type (profile owner, device owner, etc.)
+  /// doesn't support the setting.
   /// - "USER_ACTION" : The user has not taken required action to comply with
   /// the setting.
   /// - "INVALID_VALUE" : The setting has an invalid value.
-  /// - "APP_NOT_INSTALLED" : The application required to implement the policy
-  /// is not installed.
+  /// - "APP_NOT_INSTALLED" : The app required to implement the policy is not
+  /// installed.
   /// - "UNSUPPORTED" : The policy is not supported by the version of Android
   /// Device Policy on the device.
-  /// - "APP_INSTALLED" : A blocked application is installed.
-  /// - "PENDING" : The setting was not applied yet at the time of the report,
+  /// - "APP_INSTALLED" : A blocked app is installed.
+  /// - "PENDING" : The setting hasn't been applied at the time of the report,
   /// but is expected to be applied shortly.
-  /// - "APP_INCOMPATIBLE" : The setting cannot be applied to the application
-  /// because the application doesn't support it, for example because its target
-  /// SDK version is not high enough.
-  /// - "APP_NOT_UPDATED" : The application is installed but not updated to the
-  /// minimum version code specified by policy
+  /// - "APP_INCOMPATIBLE" : The setting can't be applied to the app because the
+  /// app doesn't support it, for example because its target SDK version is not
+  /// high enough.
+  /// - "APP_NOT_UPDATED" : The app is installed, but it hasn't been updated to
+  /// the minimum version code specified by policy.
   core.String nonComplianceReason;
 
-  /// The package name indicating which application is out of compliance. If not
-  /// set, then this condition matches any package name.
+  /// The package name of the app that's out of compliance. If not set, then
+  /// this condition matches any package name.
   core.String packageName;
 
   /// The name of the policy setting. This is the JSON field name of a top-level
@@ -3043,18 +3204,41 @@
   }
 }
 
+/// A list of package names.
+class PackageNameList {
+  /// A list of package names.
+  core.List<core.String> packageNames;
+
+  PackageNameList();
+
+  PackageNameList.fromJson(core.Map _json) {
+    if (_json.containsKey("packageNames")) {
+      packageNames = _json["packageNames"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (packageNames != null) {
+      _json["packageNames"] = packageNames;
+    }
+    return _json;
+  }
+}
+
 /// Requirements for the password used to unlock a device.
 class PasswordRequirements {
-  /// A device will be wiped after too many incorrect device-unlock passwords
-  /// have been entered. A value of 0 means there is no restriction.
+  /// Number of incorrect device-unlock passwords that can be entered before a
+  /// device is wiped. A value of 0 means there is no restriction.
   core.int maximumFailedPasswordsForWipe;
 
   /// Password expiration timeout.
   core.String passwordExpirationTimeout;
 
-  /// The length of the password history. After setting this, the user will not
-  /// be able to enter a new password that is the same as any password in the
-  /// history. A value of 0 means there is no restriction.
+  /// The length of the password history. After setting this field, the user
+  /// won't be able to enter a new password that is the same as any password in
+  /// the history. A value of 0 means there is no restriction.
   core.int passwordHistoryLength;
 
   /// The minimum allowed password length. A value of 0 means there is no
@@ -3088,17 +3272,20 @@
 
   /// The required password quality.
   /// Possible string values are:
-  /// - "PASSWORD_QUALITY_UNSPECIFIED" : There are no requirements for the
-  /// password.
-  /// - "SOMETHING" : There must be a password, but there are no restrictions on
-  /// its characters.
+  /// - "PASSWORD_QUALITY_UNSPECIFIED" : There are no password requirements.
+  /// - "BIOMETRIC_WEAK" : The device must be secured with a low-security
+  /// biometric recognition technology, at minimum. This includes technologies
+  /// that can recognize the identity of an individual that are roughly
+  /// equivalent to a 3-digit PIN (false detection is less than 1 in 1,000).
+  /// - "SOMETHING" : A password is required, but there are no restrictions on
+  /// what the password must contain.
   /// - "NUMERIC" : The password must contain numeric characters.
   /// - "NUMERIC_COMPLEX" : The password must contain numeric characters with no
   /// repeating (4444) or ordered (1234, 4321, 2468) sequences.
   /// - "ALPHABETIC" : The password must contain alphabetic (or symbol)
   /// characters.
-  /// - "ALPHANUMERIC" : The password must contain at both numeric and
-  /// alphabetic (or symbol) characters.
+  /// - "ALPHANUMERIC" : The password must contain both numeric and alphabetic
+  /// (or symbol) characters.
   /// - "COMPLEX" : The password must contain at least a letter, a numerical
   /// digit and a special symbol. Other password constraints, for example,
   /// password_minimum_letters are enforced.
@@ -3272,14 +3459,27 @@
   }
 }
 
-/// A policy, which governs behavior for a device.
+/// A policy resources represents a group settings that govern the behavior of a
+/// managed device and the apps installed on it.
 class Policy {
+  /// Account types that can't be managed by the user.
+  core.List<core.String> accountTypesWithManagementDisabled;
+
   /// Whether adding new users and profiles is disabled.
   core.bool addUserDisabled;
 
   /// Whether adjusting the master volume is disabled.
   core.bool adjustVolumeDisabled;
 
+  /// Configuration for an always-on VPN connection. Use with
+  /// vpn_config_disabled to prevent modification of this setting.
+  AlwaysOnVpnPackage alwaysOnVpnPackage;
+
+  /// The app tracks for Android Device Policy the device can access. The device
+  /// receives the latest version among all accessible tracks. If no tracks are
+  /// specified, then the device only uses the production track.
+  core.List<core.String> androidDevicePolicyTracks;
+
   /// Policy applied to apps.
   core.List<ApplicationPolicy> applications;
 
@@ -3293,19 +3493,42 @@
   /// automatically uninstalled.
   core.bool blockApplicationsEnabled;
 
+  /// Whether configuring bluetooth is disabled.
+  core.bool bluetoothConfigDisabled;
+
+  /// Whether bluetooth contact sharing is disabled.
+  core.bool bluetoothContactSharingDisabled;
+
+  /// Whether bluetooth is disabled. Prefer this setting over
+  /// bluetooth_config_disabled because bluetooth_config_disabled can be
+  /// bypassed by the user.
+  core.bool bluetoothDisabled;
+
   /// Whether all cameras on the device are disabled.
   core.bool cameraDisabled;
 
+  /// Whether configuring cell broadcast is disabled.
+  core.bool cellBroadcastsConfigDisabled;
+
   /// Rules declaring which mitigating actions to take when a device is not
   /// compliant with its policy. When the conditions for multiple rules are
   /// satisfied, all of the mitigating actions for the rules are taken. There is
   /// a maximum limit of 100 rules.
   core.List<ComplianceRule> complianceRules;
 
+  /// Whether creating windows besides app windows is disabled.
+  core.bool createWindowsDisabled;
+
+  /// Whether configuring user credentials is disabled.
+  core.bool credentialsConfigDisabled;
+
+  /// Whether roaming data services are disabled.
+  core.bool dataRoamingDisabled;
+
   /// Whether the user is allowed to enable debugging features.
   core.bool debuggingFeaturesAllowed;
 
-  /// The default permission policy for requests for runtime permissions.
+  /// The default permission policy for runtime permission requests.
   /// Possible string values are:
   /// - "PERMISSION_POLICY_UNSPECIFIED" : Policy not specified. If no policy is
   /// specified for a permission at any level, then the PROMPT behavior is used
@@ -3315,13 +3538,16 @@
   /// - "DENY" : Automatically deny a permission.
   core.String defaultPermissionPolicy;
 
+  /// Whether app verification is force-enabled.
+  core.bool ensureVerifyAppsEnabled;
+
   /// Whether factory resetting from settings is disabled.
   core.bool factoryResetDisabled;
 
   /// Email addresses of device administrators for factory reset protection.
   /// When the device is factory reset, it will require one of these admins to
   /// log in with the Google account email and password to unlock the device. If
-  /// no admins are specified, the device will not provide factory reset
+  /// no admins are specified, the device won't provide factory reset
   /// protection.
   core.List<core.String> frpAdminEmails;
 
@@ -3329,6 +3555,9 @@
   /// game in Settings is disabled.
   core.bool funDisabled;
 
+  /// Whether user installation of apps is disabled.
+  core.bool installAppsDisabled;
+
   /// Whether the user is allowed to enable the "Unknown Sources" setting, which
   /// allows installation of apps from unknown sources.
   core.bool installUnknownSourcesAllowed;
@@ -3336,15 +3565,35 @@
   /// Whether the keyguard is disabled.
   core.bool keyguardDisabled;
 
-  /// Maximum time in milliseconds for user activity until the device will lock.
-  /// A value of 0 means there is no restriction.
+  /// Disabled keyguard customizations, such as widgets.
+  core.List<core.String> keyguardDisabledFeatures;
+
+  /// Whether the kiosk custom launcher is enabled. This replaces the home
+  /// screen with a launcher that locks down the device to the apps installed
+  /// via the applications setting. The apps appear on a single page in
+  /// alphabetical order. It is recommended to also use status_bar_disabled to
+  /// block access to device settings.
+  core.bool kioskCustomLauncherEnabled;
+
+  /// A message displayed to the user in the device administators settings
+  /// screen.
+  UserFacingMessage longSupportMessage;
+
+  /// Maximum time in milliseconds for user activity until the device locks. A
+  /// value of 0 means there is no restriction.
   core.String maximumTimeToLock;
 
+  /// Whether configuring mobile networks is disabled.
+  core.bool mobileNetworksConfigDisabled;
+
   /// Whether adding or removing accounts is disabled.
   core.bool modifyAccountsDisabled;
 
+  /// Whether the user mounting physical external media is disabled.
+  core.bool mountPhysicalMediaDisabled;
+
   /// The name of the policy in the form
-  /// enterprises/{enterpriseId}/policies/{policyId}
+  /// enterprises/{enterpriseId}/policies/{policyId}.
   core.String name;
 
   /// Whether the network escape hatch is enabled. If a network connection can't
@@ -3357,6 +3606,9 @@
   /// settings.
   core.bool networkEscapeHatchEnabled;
 
+  /// Whether resetting network settings is disabled.
+  core.bool networkResetDisabled;
+
   /// Network configuration for the device. See configure networks for more
   /// information.
   ///
@@ -3364,12 +3616,30 @@
   /// `String`, `bool` and `null` as well as `Map` and `List` values.
   core.Map<core.String, core.Object> openNetworkConfiguration;
 
+  /// Whether using NFC to beam data from apps is disabled.
+  core.bool outgoingBeamDisabled;
+
+  /// Whether outgoing calls are disabled.
+  core.bool outgoingCallsDisabled;
+
   /// Password requirements.
   PasswordRequirements passwordRequirements;
 
+  /// If present, only the 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.
+  PackageNameList permittedInputMethods;
+
   /// Default intent handler activities.
   core.List<PersistentPreferredActivity> persistentPreferredActivities;
 
+  /// The network-independent global HTTP proxy. Typically proxies should be
+  /// configured per-network in open_network_configuration. However for unusual
+  /// 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.
+  ProxyInfo recommendedGlobalProxy;
+
   /// Whether removing other users is disabled.
   core.bool removeUserDisabled;
 
@@ -3379,8 +3649,21 @@
   /// Whether screen capture is disabled.
   core.bool screenCaptureDisabled;
 
+  /// Whether changing the user icon is disabled.
+  core.bool setUserIconDisabled;
+
+  /// Whether changing the wallpaper is disabled.
+  core.bool setWallpaperDisabled;
+
+  /// A message displayed to the user in the settings screen wherever
+  /// functionality has been disabled by the admin.
+  UserFacingMessage shortSupportMessage;
+
+  /// Whether sending and receiving SMS messages is disabled.
+  core.bool smsDisabled;
+
   /// Whether the status bar is disabled. This disables notifications, quick
-  /// settings and other screen overlays that allow escape from full-screen
+  /// settings, and other screen overlays that allow escape from full-screen
   /// mode.
   core.bool statusBarDisabled;
 
@@ -3397,30 +3680,53 @@
   /// Play app updates as well.
   SystemUpdate systemUpdate;
 
+  /// Whether configuring tethering and portable hotspots is disabled.
+  core.bool tetheringConfigDisabled;
+
+  /// Whether user uninstallation of applications is disabled.
+  core.bool uninstallAppsDisabled;
+
   /// Whether the microphone is muted and adjusting microphone volume is
   /// disabled.
   core.bool unmuteMicrophoneDisabled;
 
+  /// Whether transferring files over USB is disabled.
+  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 WiFi access points is disabled.
+  /// Whether configuring VPN is disabled.
+  core.bool vpnConfigDisabled;
+
+  /// Whether configuring Wi-Fi access points is disabled.
   core.bool wifiConfigDisabled;
 
-  /// Whether WiFi networks defined in Open Network Configuration are locked so
-  /// they cannot be edited by the user.
+  /// Whether Wi-Fi networks defined in Open Network Configuration are locked so
+  /// they can't be edited by the user.
   core.bool wifiConfigsLockdownEnabled;
 
   Policy();
 
   Policy.fromJson(core.Map _json) {
+    if (_json.containsKey("accountTypesWithManagementDisabled")) {
+      accountTypesWithManagementDisabled =
+          _json["accountTypesWithManagementDisabled"];
+    }
     if (_json.containsKey("addUserDisabled")) {
       addUserDisabled = _json["addUserDisabled"];
     }
     if (_json.containsKey("adjustVolumeDisabled")) {
       adjustVolumeDisabled = _json["adjustVolumeDisabled"];
     }
+    if (_json.containsKey("alwaysOnVpnPackage")) {
+      alwaysOnVpnPackage =
+          new AlwaysOnVpnPackage.fromJson(_json["alwaysOnVpnPackage"]);
+    }
+    if (_json.containsKey("androidDevicePolicyTracks")) {
+      androidDevicePolicyTracks = _json["androidDevicePolicyTracks"];
+    }
     if (_json.containsKey("applications")) {
       applications = _json["applications"]
           .map((value) => new ApplicationPolicy.fromJson(value))
@@ -3432,20 +3738,45 @@
     if (_json.containsKey("blockApplicationsEnabled")) {
       blockApplicationsEnabled = _json["blockApplicationsEnabled"];
     }
+    if (_json.containsKey("bluetoothConfigDisabled")) {
+      bluetoothConfigDisabled = _json["bluetoothConfigDisabled"];
+    }
+    if (_json.containsKey("bluetoothContactSharingDisabled")) {
+      bluetoothContactSharingDisabled =
+          _json["bluetoothContactSharingDisabled"];
+    }
+    if (_json.containsKey("bluetoothDisabled")) {
+      bluetoothDisabled = _json["bluetoothDisabled"];
+    }
     if (_json.containsKey("cameraDisabled")) {
       cameraDisabled = _json["cameraDisabled"];
     }
+    if (_json.containsKey("cellBroadcastsConfigDisabled")) {
+      cellBroadcastsConfigDisabled = _json["cellBroadcastsConfigDisabled"];
+    }
     if (_json.containsKey("complianceRules")) {
       complianceRules = _json["complianceRules"]
           .map((value) => new ComplianceRule.fromJson(value))
           .toList();
     }
+    if (_json.containsKey("createWindowsDisabled")) {
+      createWindowsDisabled = _json["createWindowsDisabled"];
+    }
+    if (_json.containsKey("credentialsConfigDisabled")) {
+      credentialsConfigDisabled = _json["credentialsConfigDisabled"];
+    }
+    if (_json.containsKey("dataRoamingDisabled")) {
+      dataRoamingDisabled = _json["dataRoamingDisabled"];
+    }
     if (_json.containsKey("debuggingFeaturesAllowed")) {
       debuggingFeaturesAllowed = _json["debuggingFeaturesAllowed"];
     }
     if (_json.containsKey("defaultPermissionPolicy")) {
       defaultPermissionPolicy = _json["defaultPermissionPolicy"];
     }
+    if (_json.containsKey("ensureVerifyAppsEnabled")) {
+      ensureVerifyAppsEnabled = _json["ensureVerifyAppsEnabled"];
+    }
     if (_json.containsKey("factoryResetDisabled")) {
       factoryResetDisabled = _json["factoryResetDisabled"];
     }
@@ -3455,36 +3786,72 @@
     if (_json.containsKey("funDisabled")) {
       funDisabled = _json["funDisabled"];
     }
+    if (_json.containsKey("installAppsDisabled")) {
+      installAppsDisabled = _json["installAppsDisabled"];
+    }
     if (_json.containsKey("installUnknownSourcesAllowed")) {
       installUnknownSourcesAllowed = _json["installUnknownSourcesAllowed"];
     }
     if (_json.containsKey("keyguardDisabled")) {
       keyguardDisabled = _json["keyguardDisabled"];
     }
+    if (_json.containsKey("keyguardDisabledFeatures")) {
+      keyguardDisabledFeatures = _json["keyguardDisabledFeatures"];
+    }
+    if (_json.containsKey("kioskCustomLauncherEnabled")) {
+      kioskCustomLauncherEnabled = _json["kioskCustomLauncherEnabled"];
+    }
+    if (_json.containsKey("longSupportMessage")) {
+      longSupportMessage =
+          new UserFacingMessage.fromJson(_json["longSupportMessage"]);
+    }
     if (_json.containsKey("maximumTimeToLock")) {
       maximumTimeToLock = _json["maximumTimeToLock"];
     }
+    if (_json.containsKey("mobileNetworksConfigDisabled")) {
+      mobileNetworksConfigDisabled = _json["mobileNetworksConfigDisabled"];
+    }
     if (_json.containsKey("modifyAccountsDisabled")) {
       modifyAccountsDisabled = _json["modifyAccountsDisabled"];
     }
+    if (_json.containsKey("mountPhysicalMediaDisabled")) {
+      mountPhysicalMediaDisabled = _json["mountPhysicalMediaDisabled"];
+    }
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
     if (_json.containsKey("networkEscapeHatchEnabled")) {
       networkEscapeHatchEnabled = _json["networkEscapeHatchEnabled"];
     }
+    if (_json.containsKey("networkResetDisabled")) {
+      networkResetDisabled = _json["networkResetDisabled"];
+    }
     if (_json.containsKey("openNetworkConfiguration")) {
       openNetworkConfiguration = _json["openNetworkConfiguration"];
     }
+    if (_json.containsKey("outgoingBeamDisabled")) {
+      outgoingBeamDisabled = _json["outgoingBeamDisabled"];
+    }
+    if (_json.containsKey("outgoingCallsDisabled")) {
+      outgoingCallsDisabled = _json["outgoingCallsDisabled"];
+    }
     if (_json.containsKey("passwordRequirements")) {
       passwordRequirements =
           new PasswordRequirements.fromJson(_json["passwordRequirements"]);
     }
+    if (_json.containsKey("permittedInputMethods")) {
+      permittedInputMethods =
+          new PackageNameList.fromJson(_json["permittedInputMethods"]);
+    }
     if (_json.containsKey("persistentPreferredActivities")) {
       persistentPreferredActivities = _json["persistentPreferredActivities"]
           .map((value) => new PersistentPreferredActivity.fromJson(value))
           .toList();
     }
+    if (_json.containsKey("recommendedGlobalProxy")) {
+      recommendedGlobalProxy =
+          new ProxyInfo.fromJson(_json["recommendedGlobalProxy"]);
+    }
     if (_json.containsKey("removeUserDisabled")) {
       removeUserDisabled = _json["removeUserDisabled"];
     }
@@ -3494,6 +3861,19 @@
     if (_json.containsKey("screenCaptureDisabled")) {
       screenCaptureDisabled = _json["screenCaptureDisabled"];
     }
+    if (_json.containsKey("setUserIconDisabled")) {
+      setUserIconDisabled = _json["setUserIconDisabled"];
+    }
+    if (_json.containsKey("setWallpaperDisabled")) {
+      setWallpaperDisabled = _json["setWallpaperDisabled"];
+    }
+    if (_json.containsKey("shortSupportMessage")) {
+      shortSupportMessage =
+          new UserFacingMessage.fromJson(_json["shortSupportMessage"]);
+    }
+    if (_json.containsKey("smsDisabled")) {
+      smsDisabled = _json["smsDisabled"];
+    }
     if (_json.containsKey("statusBarDisabled")) {
       statusBarDisabled = _json["statusBarDisabled"];
     }
@@ -3507,12 +3887,24 @@
     if (_json.containsKey("systemUpdate")) {
       systemUpdate = new SystemUpdate.fromJson(_json["systemUpdate"]);
     }
+    if (_json.containsKey("tetheringConfigDisabled")) {
+      tetheringConfigDisabled = _json["tetheringConfigDisabled"];
+    }
+    if (_json.containsKey("uninstallAppsDisabled")) {
+      uninstallAppsDisabled = _json["uninstallAppsDisabled"];
+    }
     if (_json.containsKey("unmuteMicrophoneDisabled")) {
       unmuteMicrophoneDisabled = _json["unmuteMicrophoneDisabled"];
     }
+    if (_json.containsKey("usbFileTransferDisabled")) {
+      usbFileTransferDisabled = _json["usbFileTransferDisabled"];
+    }
     if (_json.containsKey("version")) {
       version = _json["version"];
     }
+    if (_json.containsKey("vpnConfigDisabled")) {
+      vpnConfigDisabled = _json["vpnConfigDisabled"];
+    }
     if (_json.containsKey("wifiConfigDisabled")) {
       wifiConfigDisabled = _json["wifiConfigDisabled"];
     }
@@ -3524,12 +3916,22 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (accountTypesWithManagementDisabled != null) {
+      _json["accountTypesWithManagementDisabled"] =
+          accountTypesWithManagementDisabled;
+    }
     if (addUserDisabled != null) {
       _json["addUserDisabled"] = addUserDisabled;
     }
     if (adjustVolumeDisabled != null) {
       _json["adjustVolumeDisabled"] = adjustVolumeDisabled;
     }
+    if (alwaysOnVpnPackage != null) {
+      _json["alwaysOnVpnPackage"] = (alwaysOnVpnPackage).toJson();
+    }
+    if (androidDevicePolicyTracks != null) {
+      _json["androidDevicePolicyTracks"] = androidDevicePolicyTracks;
+    }
     if (applications != null) {
       _json["applications"] =
           applications.map((value) => (value).toJson()).toList();
@@ -3540,19 +3942,44 @@
     if (blockApplicationsEnabled != null) {
       _json["blockApplicationsEnabled"] = blockApplicationsEnabled;
     }
+    if (bluetoothConfigDisabled != null) {
+      _json["bluetoothConfigDisabled"] = bluetoothConfigDisabled;
+    }
+    if (bluetoothContactSharingDisabled != null) {
+      _json["bluetoothContactSharingDisabled"] =
+          bluetoothContactSharingDisabled;
+    }
+    if (bluetoothDisabled != null) {
+      _json["bluetoothDisabled"] = bluetoothDisabled;
+    }
     if (cameraDisabled != null) {
       _json["cameraDisabled"] = cameraDisabled;
     }
+    if (cellBroadcastsConfigDisabled != null) {
+      _json["cellBroadcastsConfigDisabled"] = cellBroadcastsConfigDisabled;
+    }
     if (complianceRules != null) {
       _json["complianceRules"] =
           complianceRules.map((value) => (value).toJson()).toList();
     }
+    if (createWindowsDisabled != null) {
+      _json["createWindowsDisabled"] = createWindowsDisabled;
+    }
+    if (credentialsConfigDisabled != null) {
+      _json["credentialsConfigDisabled"] = credentialsConfigDisabled;
+    }
+    if (dataRoamingDisabled != null) {
+      _json["dataRoamingDisabled"] = dataRoamingDisabled;
+    }
     if (debuggingFeaturesAllowed != null) {
       _json["debuggingFeaturesAllowed"] = debuggingFeaturesAllowed;
     }
     if (defaultPermissionPolicy != null) {
       _json["defaultPermissionPolicy"] = defaultPermissionPolicy;
     }
+    if (ensureVerifyAppsEnabled != null) {
+      _json["ensureVerifyAppsEnabled"] = ensureVerifyAppsEnabled;
+    }
     if (factoryResetDisabled != null) {
       _json["factoryResetDisabled"] = factoryResetDisabled;
     }
@@ -3562,35 +3989,68 @@
     if (funDisabled != null) {
       _json["funDisabled"] = funDisabled;
     }
+    if (installAppsDisabled != null) {
+      _json["installAppsDisabled"] = installAppsDisabled;
+    }
     if (installUnknownSourcesAllowed != null) {
       _json["installUnknownSourcesAllowed"] = installUnknownSourcesAllowed;
     }
     if (keyguardDisabled != null) {
       _json["keyguardDisabled"] = keyguardDisabled;
     }
+    if (keyguardDisabledFeatures != null) {
+      _json["keyguardDisabledFeatures"] = keyguardDisabledFeatures;
+    }
+    if (kioskCustomLauncherEnabled != null) {
+      _json["kioskCustomLauncherEnabled"] = kioskCustomLauncherEnabled;
+    }
+    if (longSupportMessage != null) {
+      _json["longSupportMessage"] = (longSupportMessage).toJson();
+    }
     if (maximumTimeToLock != null) {
       _json["maximumTimeToLock"] = maximumTimeToLock;
     }
+    if (mobileNetworksConfigDisabled != null) {
+      _json["mobileNetworksConfigDisabled"] = mobileNetworksConfigDisabled;
+    }
     if (modifyAccountsDisabled != null) {
       _json["modifyAccountsDisabled"] = modifyAccountsDisabled;
     }
+    if (mountPhysicalMediaDisabled != null) {
+      _json["mountPhysicalMediaDisabled"] = mountPhysicalMediaDisabled;
+    }
     if (name != null) {
       _json["name"] = name;
     }
     if (networkEscapeHatchEnabled != null) {
       _json["networkEscapeHatchEnabled"] = networkEscapeHatchEnabled;
     }
+    if (networkResetDisabled != null) {
+      _json["networkResetDisabled"] = networkResetDisabled;
+    }
     if (openNetworkConfiguration != null) {
       _json["openNetworkConfiguration"] = openNetworkConfiguration;
     }
+    if (outgoingBeamDisabled != null) {
+      _json["outgoingBeamDisabled"] = outgoingBeamDisabled;
+    }
+    if (outgoingCallsDisabled != null) {
+      _json["outgoingCallsDisabled"] = outgoingCallsDisabled;
+    }
     if (passwordRequirements != null) {
       _json["passwordRequirements"] = (passwordRequirements).toJson();
     }
+    if (permittedInputMethods != null) {
+      _json["permittedInputMethods"] = (permittedInputMethods).toJson();
+    }
     if (persistentPreferredActivities != null) {
       _json["persistentPreferredActivities"] = persistentPreferredActivities
           .map((value) => (value).toJson())
           .toList();
     }
+    if (recommendedGlobalProxy != null) {
+      _json["recommendedGlobalProxy"] = (recommendedGlobalProxy).toJson();
+    }
     if (removeUserDisabled != null) {
       _json["removeUserDisabled"] = removeUserDisabled;
     }
@@ -3600,6 +4060,18 @@
     if (screenCaptureDisabled != null) {
       _json["screenCaptureDisabled"] = screenCaptureDisabled;
     }
+    if (setUserIconDisabled != null) {
+      _json["setUserIconDisabled"] = setUserIconDisabled;
+    }
+    if (setWallpaperDisabled != null) {
+      _json["setWallpaperDisabled"] = setWallpaperDisabled;
+    }
+    if (shortSupportMessage != null) {
+      _json["shortSupportMessage"] = (shortSupportMessage).toJson();
+    }
+    if (smsDisabled != null) {
+      _json["smsDisabled"] = smsDisabled;
+    }
     if (statusBarDisabled != null) {
       _json["statusBarDisabled"] = statusBarDisabled;
     }
@@ -3612,12 +4084,24 @@
     if (systemUpdate != null) {
       _json["systemUpdate"] = (systemUpdate).toJson();
     }
+    if (tetheringConfigDisabled != null) {
+      _json["tetheringConfigDisabled"] = tetheringConfigDisabled;
+    }
+    if (uninstallAppsDisabled != null) {
+      _json["uninstallAppsDisabled"] = uninstallAppsDisabled;
+    }
     if (unmuteMicrophoneDisabled != null) {
       _json["unmuteMicrophoneDisabled"] = unmuteMicrophoneDisabled;
     }
+    if (usbFileTransferDisabled != null) {
+      _json["usbFileTransferDisabled"] = usbFileTransferDisabled;
+    }
     if (version != null) {
       _json["version"] = version;
     }
+    if (vpnConfigDisabled != null) {
+      _json["vpnConfigDisabled"] = vpnConfigDisabled;
+    }
     if (wifiConfigDisabled != null) {
       _json["wifiConfigDisabled"] = wifiConfigDisabled;
     }
@@ -3679,14 +4163,67 @@
   }
 }
 
+/// Configuration info for an HTTP proxy. For a direct proxy, set the host,
+/// port, and excluded_hosts fields. For a PAC script proxy, set the pac_uri
+/// field.
+class ProxyInfo {
+  /// For a direct proxy, the hosts for which the proxy is bypassed. The host
+  /// names may contain wildcards such as *.example.com.
+  core.List<core.String> excludedHosts;
+
+  /// The host of the direct proxy.
+  core.String host;
+
+  /// The URI of the PAC script used to configure the proxy.
+  core.String pacUri;
+
+  /// The port of the direct proxy.
+  core.int port;
+
+  ProxyInfo();
+
+  ProxyInfo.fromJson(core.Map _json) {
+    if (_json.containsKey("excludedHosts")) {
+      excludedHosts = _json["excludedHosts"];
+    }
+    if (_json.containsKey("host")) {
+      host = _json["host"];
+    }
+    if (_json.containsKey("pacUri")) {
+      pacUri = _json["pacUri"];
+    }
+    if (_json.containsKey("port")) {
+      port = _json["port"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (excludedHosts != null) {
+      _json["excludedHosts"] = excludedHosts;
+    }
+    if (host != null) {
+      _json["host"] = host;
+    }
+    if (pacUri != null) {
+      _json["pacUri"] = pacUri;
+    }
+    if (port != null) {
+      _json["port"] = port;
+    }
+    return _json;
+  }
+}
+
 /// An enterprise signup URL.
 class SignupUrl {
-  /// The name of the resource. This must be included in the create enterprise
-  /// request at the end of the signup flow.
+  /// The name of the resource. Use this value in the signupUrl field when
+  /// calling enterprises.create to complete the enterprise signup flow.
   core.String name;
 
-  /// A URL under which the Admin can sign up for an enterprise. The page
-  /// pointed to cannot be rendered in an iframe.
+  /// A URL where an enterprise admin can register their enterprise. The page
+  /// can't be rendered in an iframe.
   core.String url;
 
   SignupUrl();
@@ -3715,20 +4252,32 @@
 
 /// Information about device software.
 class SoftwareInfo {
-  /// Android build Id string meant for displaying to the user, e.g.
+  /// Android build ID string meant for displaying to the user. For example,
   /// shamu-userdebug 6.0.1 MOB30I 2756745 dev-keys.
   core.String androidBuildNumber;
 
   /// Build time.
   core.String androidBuildTime;
 
-  /// The user visible Android version string, e.g. 6.0.1.
+  /// 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. For example, 6.0.1.
   core.String androidVersion;
 
   /// The system bootloader version number, e.g. 0.6.7.
   core.String bootloaderVersion;
 
-  /// Kernel version, e.g. 2.6.32.9-g103d848.
+  /// SHA-256 hash of android.content.pm.Signature
+  /// (https://developer.android.com/reference/android/content/pm/Signature.html)
+  /// associated with the system package, which can be used to verify that the
+  /// system build hasn't been modified.
+  core.String deviceBuildSignature;
+
+  /// Kernel version, for example, 2.6.32.9-g103d848.
   core.String deviceKernelVersion;
 
   /// Security patch level, e.g. 2016-05-01.
@@ -3743,12 +4292,21 @@
     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"];
     }
     if (_json.containsKey("bootloaderVersion")) {
       bootloaderVersion = _json["bootloaderVersion"];
     }
+    if (_json.containsKey("deviceBuildSignature")) {
+      deviceBuildSignature = _json["deviceBuildSignature"];
+    }
     if (_json.containsKey("deviceKernelVersion")) {
       deviceKernelVersion = _json["deviceKernelVersion"];
     }
@@ -3766,12 +4324,21 @@
     if (androidBuildTime != null) {
       _json["androidBuildTime"] = androidBuildTime;
     }
+    if (androidDevicePolicyVersionCode != null) {
+      _json["androidDevicePolicyVersionCode"] = androidDevicePolicyVersionCode;
+    }
+    if (androidDevicePolicyVersionName != null) {
+      _json["androidDevicePolicyVersionName"] = androidDevicePolicyVersionName;
+    }
     if (androidVersion != null) {
       _json["androidVersion"] = androidVersion;
     }
     if (bootloaderVersion != null) {
       _json["bootloaderVersion"] = bootloaderVersion;
     }
+    if (deviceBuildSignature != null) {
+      _json["deviceBuildSignature"] = deviceBuildSignature;
+    }
     if (deviceKernelVersion != null) {
       _json["deviceKernelVersion"] = deviceKernelVersion;
     }
@@ -3865,6 +4432,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;
 
@@ -3886,6 +4456,9 @@
   StatusReportingSettings();
 
   StatusReportingSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("deviceSettingsEnabled")) {
+      deviceSettingsEnabled = _json["deviceSettingsEnabled"];
+    }
     if (_json.containsKey("displayInfoEnabled")) {
       displayInfoEnabled = _json["displayInfoEnabled"];
     }
@@ -3909,6 +4482,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;
     }
@@ -3934,16 +4510,16 @@
 /// Configuration for managing system updates
 class SystemUpdate {
   /// If the type is WINDOWED, the end of the maintenance window, measured as
-  /// the number of minutes after midnight in device local time. This value must
-  /// be between 0 and 1439, inclusive. If this value is less than
+  /// the number of minutes after midnight in device's local time. This value
+  /// must be between 0 and 1439, inclusive. If this value is less than
   /// start_minutes, then the maintenance window spans midnight. If the
   /// maintenance window specified is smaller than 30 minutes, the actual window
   /// is extended to 30 minutes beyond the start time.
   core.int endMinutes;
 
   /// If the type is WINDOWED, the start of the maintenance window, measured as
-  /// the number of minutes after midnight in device local time. This value must
-  /// be between 0 and 1439, inclusive.
+  /// the number of minutes after midnight in the device's local time. This
+  /// value must be between 0 and 1439, inclusive.
   core.int startMinutes;
 
   /// The type of system update to configure.
@@ -3989,17 +4565,17 @@
   }
 }
 
-/// Provides user facing message with locale info. The maximum message length is
-/// 4096 characters.
+/// Provides a user-facing message with locale info. The maximum message length
+/// is 4096 characters.
 class UserFacingMessage {
-  /// The default message that gets displayed if no localized message is
-  /// specified, or the user's locale does not match with any of the localized
-  /// messages. A default message must be provided if any localized messages are
-  /// provided.
+  /// The default message displayed if no localized message is specified or the
+  /// user's locale doesn't match with any of the localized messages. A default
+  /// message must be provided if any localized messages are provided.
   core.String defaultMessage;
 
-  /// A map which contains <locale, message> pairs. The locale is a BCP 47
-  /// language code, e.g. en-US, es-ES, fr.
+  /// A map containing <locale, message> pairs, where locale is a well-formed
+  /// BCP 47 language (https://www.w3.org/International/articles/language-tags/)
+  /// code, such as en-US, es-ES, or fr.
   core.Map<core.String, core.String> localizedMessages;
 
   UserFacingMessage();
@@ -4026,10 +4602,10 @@
   }
 }
 
-/// A web token used to access an embeddable managed Google Play web UI.
+/// A web token used to access the managed Google Play iframe.
 class WebToken {
   /// The name of the web token, which is generated by the server during
-  /// creation, in the form enterprises/{enterpriseId}/webTokens/{webTokenId}.
+  /// creation in the form enterprises/{enterpriseId}/webTokens/{webTokenId}.
   core.String name;
 
   /// The URL of the parent frame hosting the iframe with the embedded UI. To
@@ -4037,7 +4613,7 @@
   /// the https scheme.
   core.String parentFrameUrl;
 
-  /// Permissions the admin may exercise in the embedded UI. The admin must have
+  /// Permissions available to an admin in the embedded UI. An admin must have
   /// all of these permissions in order to view the UI.
   core.List<core.String> permissions;
 
diff --git a/googleapis/lib/androidpublisher/v2.dart b/googleapis/lib/androidpublisher/v2.dart
index 651b54f..52d967e 100644
--- a/googleapis/lib/androidpublisher/v2.dart
+++ b/googleapis/lib/androidpublisher/v2.dart
@@ -2308,12 +2308,9 @@
   ///
   /// [editId] - Unique identifier for this edit.
   ///
-  /// [track] - null
-  /// Possible string values are:
-  /// - "alpha"
-  /// - "beta"
-  /// - "production"
-  /// - "rollout"
+  /// [track] - The track to read or modify. Acceptable values are: "alpha",
+  /// "beta", "production" or "rollout".
+  /// Value must have pattern "(alpha|beta|production|rollout)".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -2372,12 +2369,9 @@
   ///
   /// [editId] - Unique identifier for this edit.
   ///
-  /// [track] - null
-  /// Possible string values are:
-  /// - "alpha"
-  /// - "beta"
-  /// - "production"
-  /// - "rollout"
+  /// [track] - The track to read or modify. Acceptable values are: "alpha",
+  /// "beta", "production" or "rollout".
+  /// Value must have pattern "(alpha|beta|production|rollout)".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -2439,12 +2433,9 @@
   ///
   /// [editId] - Unique identifier for this edit.
   ///
-  /// [track] - null
-  /// Possible string values are:
-  /// - "alpha"
-  /// - "beta"
-  /// - "production"
-  /// - "rollout"
+  /// [track] - The track to read or modify. Acceptable values are: "alpha",
+  /// "beta", "production" or "rollout".
+  /// Value must have pattern "(alpha|beta|production|rollout)".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -2513,12 +2504,9 @@
   ///
   /// [editId] - Unique identifier for this edit.
   ///
-  /// [track] - The track type to read or modify.
-  /// Possible string values are:
-  /// - "alpha"
-  /// - "beta"
-  /// - "production"
-  /// - "rollout"
+  /// [track] - The track to read or modify. Acceptable values are: "alpha",
+  /// "beta", "production" or "rollout".
+  /// Value must have pattern "(alpha|beta|production|rollout)".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -2634,12 +2622,9 @@
   ///
   /// [editId] - Unique identifier for this edit.
   ///
-  /// [track] - The track type to read or modify.
-  /// Possible string values are:
-  /// - "alpha"
-  /// - "beta"
-  /// - "production"
-  /// - "rollout"
+  /// [track] - The track to read or modify. Acceptable values are: "alpha",
+  /// "beta", "production" or "rollout".
+  /// Value must have pattern "(alpha|beta|production|rollout)".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -2705,12 +2690,9 @@
   ///
   /// [editId] - Unique identifier for this edit.
   ///
-  /// [track] - The track type to read or modify.
-  /// Possible string values are:
-  /// - "alpha"
-  /// - "beta"
-  /// - "production"
-  /// - "rollout"
+  /// [track] - The track to read or modify. Acceptable values are: "alpha",
+  /// "beta", "production" or "rollout".
+  /// Value must have pattern "(alpha|beta|production|rollout)".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -2845,49 +2827,6 @@
 
   InappproductsResourceApi(commons.ApiRequester client) : _requester = client;
 
-  /// [request] - The metadata request object.
-  ///
-  /// Request parameters:
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [InappproductsBatchResponse].
-  ///
-  /// 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<InappproductsBatchResponse> batch(
-      InappproductsBatchRequest 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 = 'inappproducts/batch';
-
-    var _response = _requester.request(_url, "POST",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response
-        .then((data) => new InappproductsBatchResponse.fromJson(data));
-  }
-
   /// Delete an in-app product for an app.
   ///
   /// Request parameters:
@@ -3667,7 +3606,7 @@
   PurchasesVoidedpurchasesResourceApi(commons.ApiRequester client)
       : _requester = client;
 
-  /// Lists the purchases that were cancelled, refunded or charged-back.
+  /// Lists the purchases that were canceled, refunded or charged-back.
   ///
   /// Request parameters:
   ///
@@ -5048,189 +4987,6 @@
   }
 }
 
-class InappproductsBatchRequest {
-  core.List<InappproductsBatchRequestEntry> entrys;
-
-  InappproductsBatchRequest();
-
-  InappproductsBatchRequest.fromJson(core.Map _json) {
-    if (_json.containsKey("entrys")) {
-      entrys = _json["entrys"]
-          .map((value) => new InappproductsBatchRequestEntry.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 (entrys != null) {
-      _json["entrys"] = entrys.map((value) => (value).toJson()).toList();
-    }
-    return _json;
-  }
-}
-
-class InappproductsBatchRequestEntry {
-  core.int batchId;
-  InappproductsInsertRequest inappproductsinsertrequest;
-  InappproductsUpdateRequest inappproductsupdaterequest;
-  core.String methodName;
-
-  InappproductsBatchRequestEntry();
-
-  InappproductsBatchRequestEntry.fromJson(core.Map _json) {
-    if (_json.containsKey("batchId")) {
-      batchId = _json["batchId"];
-    }
-    if (_json.containsKey("inappproductsinsertrequest")) {
-      inappproductsinsertrequest = new InappproductsInsertRequest.fromJson(
-          _json["inappproductsinsertrequest"]);
-    }
-    if (_json.containsKey("inappproductsupdaterequest")) {
-      inappproductsupdaterequest = new InappproductsUpdateRequest.fromJson(
-          _json["inappproductsupdaterequest"]);
-    }
-    if (_json.containsKey("methodName")) {
-      methodName = _json["methodName"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (batchId != null) {
-      _json["batchId"] = batchId;
-    }
-    if (inappproductsinsertrequest != null) {
-      _json["inappproductsinsertrequest"] =
-          (inappproductsinsertrequest).toJson();
-    }
-    if (inappproductsupdaterequest != null) {
-      _json["inappproductsupdaterequest"] =
-          (inappproductsupdaterequest).toJson();
-    }
-    if (methodName != null) {
-      _json["methodName"] = methodName;
-    }
-    return _json;
-  }
-}
-
-class InappproductsBatchResponse {
-  core.List<InappproductsBatchResponseEntry> entrys;
-
-  /// Identifies what kind of resource this is. Value: the fixed string
-  /// "androidpublisher#inappproductsBatchResponse".
-  core.String kind;
-
-  InappproductsBatchResponse();
-
-  InappproductsBatchResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("entrys")) {
-      entrys = _json["entrys"]
-          .map((value) => new InappproductsBatchResponseEntry.fromJson(value))
-          .toList();
-    }
-    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 (entrys != null) {
-      _json["entrys"] = entrys.map((value) => (value).toJson()).toList();
-    }
-    if (kind != null) {
-      _json["kind"] = kind;
-    }
-    return _json;
-  }
-}
-
-class InappproductsBatchResponseEntry {
-  core.int batchId;
-  InappproductsInsertResponse inappproductsinsertresponse;
-  InappproductsUpdateResponse inappproductsupdateresponse;
-
-  InappproductsBatchResponseEntry();
-
-  InappproductsBatchResponseEntry.fromJson(core.Map _json) {
-    if (_json.containsKey("batchId")) {
-      batchId = _json["batchId"];
-    }
-    if (_json.containsKey("inappproductsinsertresponse")) {
-      inappproductsinsertresponse = new InappproductsInsertResponse.fromJson(
-          _json["inappproductsinsertresponse"]);
-    }
-    if (_json.containsKey("inappproductsupdateresponse")) {
-      inappproductsupdateresponse = new InappproductsUpdateResponse.fromJson(
-          _json["inappproductsupdateresponse"]);
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (batchId != null) {
-      _json["batchId"] = batchId;
-    }
-    if (inappproductsinsertresponse != null) {
-      _json["inappproductsinsertresponse"] =
-          (inappproductsinsertresponse).toJson();
-    }
-    if (inappproductsupdateresponse != null) {
-      _json["inappproductsupdateresponse"] =
-          (inappproductsupdateresponse).toJson();
-    }
-    return _json;
-  }
-}
-
-class InappproductsInsertRequest {
-  InAppProduct inappproduct;
-
-  InappproductsInsertRequest();
-
-  InappproductsInsertRequest.fromJson(core.Map _json) {
-    if (_json.containsKey("inappproduct")) {
-      inappproduct = new InAppProduct.fromJson(_json["inappproduct"]);
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (inappproduct != null) {
-      _json["inappproduct"] = (inappproduct).toJson();
-    }
-    return _json;
-  }
-}
-
-class InappproductsInsertResponse {
-  InAppProduct inappproduct;
-
-  InappproductsInsertResponse();
-
-  InappproductsInsertResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("inappproduct")) {
-      inappproduct = new InAppProduct.fromJson(_json["inappproduct"]);
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (inappproduct != null) {
-      _json["inappproduct"] = (inappproduct).toJson();
-    }
-    return _json;
-  }
-}
-
 class InappproductsListResponse {
   core.List<InAppProduct> inappproduct;
 
@@ -5279,48 +5035,6 @@
   }
 }
 
-class InappproductsUpdateRequest {
-  InAppProduct inappproduct;
-
-  InappproductsUpdateRequest();
-
-  InappproductsUpdateRequest.fromJson(core.Map _json) {
-    if (_json.containsKey("inappproduct")) {
-      inappproduct = new InAppProduct.fromJson(_json["inappproduct"]);
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (inappproduct != null) {
-      _json["inappproduct"] = (inappproduct).toJson();
-    }
-    return _json;
-  }
-}
-
-class InappproductsUpdateResponse {
-  InAppProduct inappproduct;
-
-  InappproductsUpdateResponse();
-
-  InappproductsUpdateResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("inappproduct")) {
-      inappproduct = new InAppProduct.fromJson(_json["inappproduct"]);
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (inappproduct != null) {
-      _json["inappproduct"] = (inappproduct).toJson();
-    }
-    return _json;
-  }
-}
-
 class Listing {
   /// Full description of the app; this may be up to 4000 characters in length.
   core.String fullDescription;
@@ -5531,13 +5245,20 @@
 
   /// The purchase state of the order. Possible values are:
   /// - Purchased
-  /// - Cancelled
+  /// - Canceled
   core.int purchaseState;
 
   /// The time the product was purchased, in milliseconds since the epoch (Jan
   /// 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)
+  /// - Promo (i.e. purchased using a promo code)
+  core.int purchaseType;
+
   ProductPurchase();
 
   ProductPurchase.fromJson(core.Map _json) {
@@ -5559,6 +5280,9 @@
     if (_json.containsKey("purchaseTimeMillis")) {
       purchaseTimeMillis = _json["purchaseTimeMillis"];
     }
+    if (_json.containsKey("purchaseType")) {
+      purchaseType = _json["purchaseType"];
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -5582,6 +5306,9 @@
     if (purchaseTimeMillis != null) {
       _json["purchaseTimeMillis"] = purchaseTimeMillis;
     }
+    if (purchaseType != null) {
+      _json["purchaseType"] = purchaseType;
+    }
     return _json;
   }
 }
@@ -5863,12 +5590,13 @@
   /// current expiry time.
   core.bool autoRenewing;
 
-  /// The reason why a subscription was cancelled or is not auto-renewing.
+  /// The reason why a subscription was canceled or is not auto-renewing.
   /// Possible values are:
-  /// - User cancelled the subscription
-  /// - Subscription was cancelled by the system, for example because of a
+  /// - User canceled the subscription
+  /// - Subscription was canceled by the system, for example because of a
   /// billing problem
   /// - Subscription was replaced with a new subscription
+  /// - Subscription was canceled by the developer
   core.int cancelReason;
 
   /// ISO 3166-1 alpha-2 billing country/region code of the user at the time the
@@ -5887,6 +5615,19 @@
   /// service.
   core.String kind;
 
+  /// The purchase token of the originating purchase if this subscription is one
+  /// of the following:
+  /// - Re-signup of a canceled 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 (before their subscription
+  /// lapses) and you receive purchase token Y, and finally the user upgrades
+  /// their subscription and you receive purchase token Z. If you call this API
+  /// with purchase token Z, this field will be set to 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.
+  core.String linkedPurchaseToken;
+
   /// The order id of the latest recurring order associated with the purchase of
   /// the subscription.
   core.String orderId;
@@ -5908,6 +5649,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;
@@ -5937,6 +5684,9 @@
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
+    if (_json.containsKey("linkedPurchaseToken")) {
+      linkedPurchaseToken = _json["linkedPurchaseToken"];
+    }
     if (_json.containsKey("orderId")) {
       orderId = _json["orderId"];
     }
@@ -5949,6 +5699,9 @@
     if (_json.containsKey("priceCurrencyCode")) {
       priceCurrencyCode = _json["priceCurrencyCode"];
     }
+    if (_json.containsKey("purchaseType")) {
+      purchaseType = _json["purchaseType"];
+    }
     if (_json.containsKey("startTimeMillis")) {
       startTimeMillis = _json["startTimeMillis"];
     }
@@ -5978,6 +5731,9 @@
     if (kind != null) {
       _json["kind"] = kind;
     }
+    if (linkedPurchaseToken != null) {
+      _json["linkedPurchaseToken"] = linkedPurchaseToken;
+    }
     if (orderId != null) {
       _json["orderId"] = orderId;
     }
@@ -5990,6 +5746,9 @@
     if (priceCurrencyCode != null) {
       _json["priceCurrencyCode"] = priceCurrencyCode;
     }
+    if (purchaseType != null) {
+      _json["purchaseType"] = purchaseType;
+    }
     if (startTimeMillis != null) {
       _json["startTimeMillis"] = startTimeMillis;
     }
@@ -6130,6 +5889,8 @@
 }
 
 class Track {
+  /// Identifier for this track. One of "alpha", "beta", "production" or
+  /// "rollout".
   core.String track;
   core.double userFraction;
   core.List<core.int> versionCodes;
@@ -6325,7 +6086,7 @@
 }
 
 /// A VoidedPurchase resource indicates a purchase that was either
-/// cancelled/refunded/charged-back.
+/// canceled/refunded/charged-back.
 class VoidedPurchase {
   /// This kind represents a voided purchase object in the androidpublisher
   /// service.
@@ -6339,7 +6100,7 @@
   /// identifies a purchase.
   core.String purchaseToken;
 
-  /// The time at which the purchase was cancelled/refunded/charged-back, in
+  /// The time at which the purchase was canceled/refunded/charged-back, in
   /// milliseconds since the epoch (Jan 1, 1970).
   core.String voidedTimeMillis;
 
diff --git a/googleapis/lib/appengine/v1.dart b/googleapis/lib/appengine/v1.dart
index 4f41119..6049461 100644
--- a/googleapis/lib/appengine/v1.dart
+++ b/googleapis/lib/appengine/v1.dart
@@ -66,7 +66,8 @@
   /// location - The region (https://cloud.google.com/appengine/docs/locations)
   /// where you want the App Engine application located.For more information
   /// about App Engine applications, see Managing Projects, Applications, and
-  /// Billing (https://cloud.google.com/appengine/docs/python/console/).
+  /// Billing
+  /// (https://cloud.google.com/appengine/docs/standard/python/console/).
   ///
   /// [request] - The metadata request object.
   ///
@@ -446,15 +447,15 @@
   /// [appsId] - Part of `parent`. Name of the parent Application resource.
   /// Example: apps/myapp.
   ///
+  /// [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.
   /// Possible string values are:
   /// - "BASIC_CERTIFICATE" : A BASIC_CERTIFICATE.
   /// - "FULL_CERTIFICATE" : A FULL_CERTIFICATE.
   ///
-  /// [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.
   ///
@@ -466,9 +467,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<ListAuthorizedCertificatesResponse> list(core.String appsId,
-      {core.String view,
-      core.String pageToken,
+      {core.String pageToken,
       core.int pageSize,
+      core.String view,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -480,15 +481,15 @@
     if (appsId == null) {
       throw new core.ArgumentError("Parameter appsId is required.");
     }
-    if (view != null) {
-      _queryParams["view"] = [view];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (view != null) {
+      _queryParams["view"] = [view];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -660,6 +661,14 @@
   /// [appsId] - Part of `parent`. Name of the parent Application resource.
   /// Example: apps/myapp.
   ///
+  /// [overrideStrategy] - Whether the domain creation should override any
+  /// existing mappings for this domain. By default, overrides are rejected.
+  /// Possible string values are:
+  /// - "UNSPECIFIED_DOMAIN_OVERRIDE_STRATEGY" : A
+  /// UNSPECIFIED_DOMAIN_OVERRIDE_STRATEGY.
+  /// - "STRICT" : A STRICT.
+  /// - "OVERRIDE" : A OVERRIDE.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -671,7 +680,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<Operation> create(DomainMapping request, core.String appsId,
-      {core.String $fields}) {
+      {core.String overrideStrategy, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -685,6 +694,9 @@
     if (appsId == null) {
       throw new core.ArgumentError("Parameter appsId is required.");
     }
+    if (overrideStrategy != null) {
+      _queryParams["overrideStrategy"] = [overrideStrategy];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1167,14 +1179,14 @@
   /// [appsId] - Part of `parent`. Name of the Firewall collection to retrieve.
   /// Example: apps/myapp/firewall/ingressRules.
   ///
-  /// [pageToken] - Continuation token for fetching the next page of results.
-  ///
-  /// [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.
   ///
@@ -1186,9 +1198,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 pageToken,
+      {core.String matchingAddress,
+      core.String pageToken,
       core.int pageSize,
-      core.String matchingAddress,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1200,15 +1212,15 @@
     if (appsId == null) {
       throw new core.ArgumentError("Parameter appsId is required.");
     }
+    if (matchingAddress != null) {
+      _queryParams["matchingAddress"] = [matchingAddress];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (matchingAddress != null) {
-      _queryParams["matchingAddress"] = [matchingAddress];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1482,12 +1494,12 @@
   ///
   /// [appsId] - Part of `name`. The name of the operation's parent resource.
   ///
+  /// [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.
   ///
@@ -1499,9 +1511,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.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();
@@ -1513,15 +1525,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];
     }
@@ -1716,8 +1728,6 @@
   ///
   /// [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
@@ -1732,6 +1742,8 @@
   /// 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.
   ///
@@ -1744,7 +1756,7 @@
   /// this method will complete with the same error.
   async.Future<Operation> patch(
       Service request, core.String appsId, core.String servicesId,
-      {core.String updateMask, core.bool migrateTraffic, core.String $fields}) {
+      {core.bool migrateTraffic, core.String updateMask, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1761,12 +1773,12 @@
     if (servicesId == null) {
       throw new core.ArgumentError("Parameter servicesId is required.");
     }
-    if (updateMask != null) {
-      _queryParams["updateMask"] = [updateMask];
-    }
     if (migrateTraffic != null) {
       _queryParams["migrateTraffic"] = ["${migrateTraffic}"];
     }
+    if (updateMask != null) {
+      _queryParams["updateMask"] = [updateMask];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1992,15 +2004,15 @@
   ///
   /// [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.
   /// Possible string values are:
   /// - "BASIC" : A BASIC.
   /// - "FULL" : A FULL.
   ///
+  /// [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.
   ///
@@ -2013,9 +2025,9 @@
   /// this method will complete with the same error.
   async.Future<ListVersionsResponse> list(
       core.String appsId, core.String servicesId,
-      {core.String pageToken,
+      {core.String view,
+      core.String pageToken,
       core.int pageSize,
-      core.String view,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -2030,15 +2042,15 @@
     if (servicesId == null) {
       throw new core.ArgumentError("Parameter servicesId is required.");
     }
+    if (view != null) {
+      _queryParams["view"] = [view];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (view != null) {
-      _queryParams["view"] = [view];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2079,19 +2091,19 @@
   /// automatic_scaling.min_total_instances
   /// (https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services.versions#Version.FIELDS.automatic_scaling):
   /// For Version resources that use automatic scaling and run in the App
-  /// Engine Flexible environment.
+  /// Engine flexible environment.
   /// automatic_scaling.max_total_instances
   /// (https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services.versions#Version.FIELDS.automatic_scaling):
   /// For Version resources that use automatic scaling and run in the App
-  /// Engine Flexible environment.
+  /// Engine flexible environment.
   /// automatic_scaling.cool_down_period_sec
   /// (https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services.versions#Version.FIELDS.automatic_scaling):
   /// For Version resources that use automatic scaling and run in the App
-  /// Engine Flexible environment.
+  /// Engine flexible environment.
   /// automatic_scaling.cpu_utilization.target_utilization
   /// (https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services.versions#Version.FIELDS.automatic_scaling):
   /// For Version resources that use automatic scaling and run in the App
-  /// Engine Flexible environment.
+  /// Engine flexible environment.
   ///
   /// [request] - The metadata request object.
   ///
@@ -2574,7 +2586,7 @@
 }
 
 /// An Application resource contains the top-level configuration of an App
-/// Engine application. Next tag: 20
+/// Engine application.
 class Application {
   /// Google Apps authentication domain that controls which users can access
   /// this application.Defaults to open access for any Google Account.
@@ -2614,11 +2626,11 @@
   /// deploy your application. Example: myapp.
   core.String id;
 
-  /// Location from which this application will be run. Application instances
-  /// will run out of data centers in the chosen location, which is also where
-  /// all of the application's end user content is stored.Defaults to
-  /// us-central.Options are:us-central - Central USeurope-west - Western
-  /// Europeus-east1 - Eastern US
+  /// Location from which this application runs. Application instances run out
+  /// of the data centers in the specified location, which is also where all of
+  /// the application's end user content is stored.Defaults to us-central1.View
+  /// the list of supported locations
+  /// (https://cloud.google.com/appengine/docs/locations).
   core.String locationId;
 
   /// Full path to the Application resource in the API. Example:
@@ -2872,8 +2884,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.
@@ -2895,7 +2907,8 @@
   /// before starting a new instance to handle it.
   core.String maxPendingLatency;
 
-  /// Maximum number of instances that should be started to handle requests.
+  /// Maximum number of instances that should be started to handle requests for
+  /// this version.
   core.int maxTotalInstances;
 
   /// Minimum number of idle instances that should be maintained for this
@@ -2906,7 +2919,8 @@
   /// starting a new instance to handle it.
   core.String minPendingLatency;
 
-  /// Minimum number of instances that should be maintained for this version.
+  /// Minimum number of running instances that should be maintained for this
+  /// version.
   core.int minTotalInstances;
 
   /// Target scaling by network usage.
@@ -2915,6 +2929,9 @@
   /// Target scaling by request utilization.
   RequestUtilization requestUtilization;
 
+  /// Scheduler settings for standard environment.
+  StandardSchedulerSettings standardSchedulerSettings;
+
   AutomaticScaling();
 
   AutomaticScaling.fromJson(core.Map _json) {
@@ -2956,6 +2973,10 @@
       requestUtilization =
           new RequestUtilization.fromJson(_json["requestUtilization"]);
     }
+    if (_json.containsKey("standardSchedulerSettings")) {
+      standardSchedulerSettings = new StandardSchedulerSettings.fromJson(
+          _json["standardSchedulerSettings"]);
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -2997,6 +3018,9 @@
     if (requestUtilization != null) {
       _json["requestUtilization"] = (requestUtilization).toJson();
     }
+    if (standardSchedulerSettings != null) {
+      _json["standardSchedulerSettings"] = (standardSchedulerSettings).toJson();
+    }
     return _json;
   }
 }
@@ -3188,6 +3212,56 @@
   }
 }
 
+/// Metadata for the given google.longrunning.Operation during a
+/// google.appengine.v1alpha.CreateVersionRequest.
+class CreateVersionMetadataV1Alpha {
+  /// The Cloud Build ID if one was created as part of the version create.
+  /// @OutputOnly
+  core.String cloudBuildId;
+
+  CreateVersionMetadataV1Alpha();
+
+  CreateVersionMetadataV1Alpha.fromJson(core.Map _json) {
+    if (_json.containsKey("cloudBuildId")) {
+      cloudBuildId = _json["cloudBuildId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (cloudBuildId != null) {
+      _json["cloudBuildId"] = cloudBuildId;
+    }
+    return _json;
+  }
+}
+
+/// Metadata for the given google.longrunning.Operation during a
+/// google.appengine.v1beta.CreateVersionRequest.
+class CreateVersionMetadataV1Beta {
+  /// The Cloud Build ID if one was created as part of the version create.
+  /// @OutputOnly
+  core.String cloudBuildId;
+
+  CreateVersionMetadataV1Beta();
+
+  CreateVersionMetadataV1Beta.fromJson(core.Map _json) {
+    if (_json.containsKey("cloudBuildId")) {
+      cloudBuildId = _json["cloudBuildId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (cloudBuildId != null) {
+      _json["cloudBuildId"] = cloudBuildId;
+    }
+    return _json;
+  }
+}
+
 /// Request message for Instances.DebugInstance.
 class DebugInstanceRequest {
   /// Public SSH key to add to the instance. Examples:
@@ -3265,7 +3339,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;
@@ -4406,11 +4481,11 @@
 
 /// Metadata for the given google.cloud.location.Location.
 class LocationMetadata {
-  /// App Engine Flexible Environment is available in the given
+  /// App Engine flexible environment is available in the given
   /// location.@OutputOnly
   core.bool flexibleEnvironmentAvailable;
 
-  /// App Engine Standard Environment is available in the given
+  /// App Engine standard environment is available in the given
   /// location.@OutputOnly
   core.bool standardEnvironmentAvailable;
 
@@ -4465,16 +4540,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 instance during creation. Only applicable in the App
+  /// Engine flexible environment.
   core.String instanceTag;
 
   /// Google Compute Engine network where the virtual machines are created.
@@ -4485,16 +4560,16 @@
   /// Specify the short name, not the resource path.If a subnetwork name is
   /// specified, a network name will also be required unless it is for the
   /// default network.
-  /// If the network the VM instance is being created in is a Legacy network,
+  /// If the network that the instance is being created in is a Legacy network,
   /// then the IP address is allocated from the IPv4Range.
-  /// If the network the VM instance is being created in is an auto Subnet Mode
-  /// Network, then only network name should be specified (not the
+  /// If the network that the instance is being created in is an auto Subnet
+  /// Mode Network, then only network name should be specified (not the
   /// subnetwork_name) and the IP address is created from the IPCidrRange of the
   /// subnetwork that exists in that zone for that network.
-  /// If the network the VM instance is being created in is a custom Subnet Mode
-  /// Network, then the subnetwork_name must be specified and the IP address is
-  /// created from the IPCidrRange of the subnetwork.If specified, the
-  /// subnetwork must exist in the same region as the App Engine flexible
+  /// If the network that the instance is being created in is a custom Subnet
+  /// Mode Network, then the subnetwork_name must be specified and the IP
+  /// address is created from the IPCidrRange of the subnetwork.If specified,
+  /// the subnetwork must exist in the same region as the App Engine flexible
   /// environment application.
   core.String subnetworkName;
 
@@ -4534,7 +4609,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;
@@ -4735,67 +4811,6 @@
 }
 
 /// Metadata for the given google.longrunning.Operation.
-class OperationMetadataExperimental {
-  /// Time that this operation completed.@OutputOnly
-  core.String endTime;
-
-  /// Time that this operation was created.@OutputOnly
-  core.String insertTime;
-
-  /// API method that initiated this operation. Example:
-  /// google.appengine.experimental.CustomDomains.CreateCustomDomain.@OutputOnly
-  core.String method;
-
-  /// Name of the resource that this operation is acting on. Example:
-  /// apps/myapp/customDomains/example.com.@OutputOnly
-  core.String target;
-
-  /// User who requested this operation.@OutputOnly
-  core.String user;
-
-  OperationMetadataExperimental();
-
-  OperationMetadataExperimental.fromJson(core.Map _json) {
-    if (_json.containsKey("endTime")) {
-      endTime = _json["endTime"];
-    }
-    if (_json.containsKey("insertTime")) {
-      insertTime = _json["insertTime"];
-    }
-    if (_json.containsKey("method")) {
-      method = _json["method"];
-    }
-    if (_json.containsKey("target")) {
-      target = _json["target"];
-    }
-    if (_json.containsKey("user")) {
-      user = _json["user"];
-    }
-  }
-
-  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 (insertTime != null) {
-      _json["insertTime"] = insertTime;
-    }
-    if (method != null) {
-      _json["method"] = method;
-    }
-    if (target != null) {
-      _json["target"] = target;
-    }
-    if (user != null) {
-      _json["user"] = user;
-    }
-    return _json;
-  }
-}
-
-/// Metadata for the given google.longrunning.Operation.
 class OperationMetadataV1 {
   /// Time that this operation completed.@OutputOnly
   core.String endTime;
@@ -4877,6 +4892,8 @@
 
 /// Metadata for the given google.longrunning.Operation.
 class OperationMetadataV1Alpha {
+  CreateVersionMetadataV1Alpha createVersionMetadata;
+
   /// Time that this operation completed.@OutputOnly
   core.String endTime;
 
@@ -4904,6 +4921,10 @@
   OperationMetadataV1Alpha();
 
   OperationMetadataV1Alpha.fromJson(core.Map _json) {
+    if (_json.containsKey("createVersionMetadata")) {
+      createVersionMetadata = new CreateVersionMetadataV1Alpha.fromJson(
+          _json["createVersionMetadata"]);
+    }
     if (_json.containsKey("endTime")) {
       endTime = _json["endTime"];
     }
@@ -4930,6 +4951,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (createVersionMetadata != null) {
+      _json["createVersionMetadata"] = (createVersionMetadata).toJson();
+    }
     if (endTime != null) {
       _json["endTime"] = endTime;
     }
@@ -4957,6 +4981,8 @@
 
 /// Metadata for the given google.longrunning.Operation.
 class OperationMetadataV1Beta {
+  CreateVersionMetadataV1Beta createVersionMetadata;
+
   /// Time that this operation completed.@OutputOnly
   core.String endTime;
 
@@ -4984,6 +5010,10 @@
   OperationMetadataV1Beta();
 
   OperationMetadataV1Beta.fromJson(core.Map _json) {
+    if (_json.containsKey("createVersionMetadata")) {
+      createVersionMetadata = new CreateVersionMetadataV1Beta.fromJson(
+          _json["createVersionMetadata"]);
+    }
     if (_json.containsKey("endTime")) {
       endTime = _json["endTime"];
     }
@@ -5010,6 +5040,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (createVersionMetadata != null) {
+      _json["createVersionMetadata"] = (createVersionMetadata).toJson();
+    }
     if (endTime != null) {
       _json["endTime"] = endTime;
     }
@@ -5190,7 +5223,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;
@@ -5417,6 +5451,58 @@
   }
 }
 
+/// Scheduler settings for standard environment.
+class StandardSchedulerSettings {
+  /// Maximum number of instances to run for this version. Set to zero to
+  /// disable max_instances configuration.
+  core.int maxInstances;
+
+  /// Minimum number of instances to run for this version. Set to zero to
+  /// disable min_instances configuration.
+  core.int minInstances;
+
+  /// Target CPU utilization ratio to maintain when scaling.
+  core.double targetCpuUtilization;
+
+  /// Target throughput utilization ratio to maintain when scaling
+  core.double targetThroughputUtilization;
+
+  StandardSchedulerSettings();
+
+  StandardSchedulerSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("maxInstances")) {
+      maxInstances = _json["maxInstances"];
+    }
+    if (_json.containsKey("minInstances")) {
+      minInstances = _json["minInstances"];
+    }
+    if (_json.containsKey("targetCpuUtilization")) {
+      targetCpuUtilization = _json["targetCpuUtilization"];
+    }
+    if (_json.containsKey("targetThroughputUtilization")) {
+      targetThroughputUtilization = _json["targetThroughputUtilization"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (maxInstances != null) {
+      _json["maxInstances"] = maxInstances;
+    }
+    if (minInstances != null) {
+      _json["minInstances"] = minInstances;
+    }
+    if (targetCpuUtilization != null) {
+      _json["targetCpuUtilization"] = targetCpuUtilization;
+    }
+    if (targetThroughputUtilization != null) {
+      _json["targetThroughputUtilization"] = targetThroughputUtilization;
+    }
+    return _json;
+  }
+}
+
 /// Files served directly to the user for a given URL, such as images, CSS
 /// stylesheets, or JavaScript source files. Static file handlers describe which
 /// files in the application directory are static files, and which URLs serve
@@ -5856,7 +5942,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
@@ -5881,9 +5967,9 @@
   /// view=FULL is set.
   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.
+  /// Configures health checking for instances. Unhealthy instances are 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
@@ -5905,9 +5991,9 @@
   /// by the application.Only returned in GET requests if view=FULL is set.
   core.List<Library> libraries;
 
-  /// Configures liveness health checking for VM instances. Unhealthy instances
-  /// are stopped and replaced with new instancesOnly returned in GET requests
-  /// if view=FULL is set.
+  /// Configures liveness health checking for instances. Unhealthy instances are
+  /// stopped and replaced with new instancesOnly returned in GET requests if
+  /// view=FULL is set.
   LivenessCheck livenessCheck;
 
   /// A service with manual scaling runs continuously, allowing you to perform
@@ -5918,8 +6004,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
@@ -5927,12 +6013,13 @@
   /// set.
   core.String nobuildFilesRegex;
 
-  /// Configures readiness health checking for VM instances. Unhealthy instances
+  /// Configures readiness health checking for instances. Unhealthy instances
   /// are not put into the backend traffic rotation.Only returned in GET
   /// requests if view=FULL is set.
   ReadinessCheck readinessCheck;
 
-  /// Machine resources for this version. Only applicable for VM runtimes.
+  /// Machine resources for this version. Only applicable in the App Engine
+  /// flexible environment.
   Resources resources;
 
   /// Desired runtime. Example: python27.
@@ -5943,6 +6030,10 @@
   /// https://cloud.google.com/appengine/docs/standard/<language>/config/appref
   core.String runtimeApiVersion;
 
+  /// The channel of the runtime to use. Only available for some runtimes.
+  /// Defaults to the default channel.
+  core.String runtimeChannel;
+
   /// Current serving status of this version. Only the versions with a SERVING
   /// status create instances and can be billed.SERVING_STATUS_UNSPECIFIED is an
   /// invalid value. Defaults to SERVING.
@@ -5964,6 +6055,10 @@
   /// Whether to deploy this version in a container on a virtual machine.
   core.bool vm;
 
+  /// The Google Compute Engine zones that are supported by this version in the
+  /// App Engine flexible environment.
+  core.List<core.String> zones;
+
   Version();
 
   Version.fromJson(core.Map _json) {
@@ -6058,6 +6153,9 @@
     if (_json.containsKey("runtimeApiVersion")) {
       runtimeApiVersion = _json["runtimeApiVersion"];
     }
+    if (_json.containsKey("runtimeChannel")) {
+      runtimeChannel = _json["runtimeChannel"];
+    }
     if (_json.containsKey("servingStatus")) {
       servingStatus = _json["servingStatus"];
     }
@@ -6070,6 +6168,9 @@
     if (_json.containsKey("vm")) {
       vm = _json["vm"];
     }
+    if (_json.containsKey("zones")) {
+      zones = _json["zones"];
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -6160,6 +6261,9 @@
     if (runtimeApiVersion != null) {
       _json["runtimeApiVersion"] = runtimeApiVersion;
     }
+    if (runtimeChannel != null) {
+      _json["runtimeChannel"] = runtimeChannel;
+    }
     if (servingStatus != null) {
       _json["servingStatus"] = servingStatus;
     }
@@ -6172,11 +6276,15 @@
     if (vm != null) {
       _json["vm"] = vm;
     }
+    if (zones != null) {
+      _json["zones"] = zones;
+    }
     return _json;
   }
 }
 
-/// 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/googleapis/lib/appsactivity/v1.dart b/googleapis/lib/appsactivity/v1.dart
index 086bc65..aa42ae2 100644
--- a/googleapis/lib/appsactivity/v1.dart
+++ b/googleapis/lib/appsactivity/v1.dart
@@ -4,7 +4,6 @@
 
 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;
@@ -19,21 +18,6 @@
   /// View the activity history of your Google apps
   static const ActivityScope = "https://www.googleapis.com/auth/activity";
 
-  /// View and manage the files in your Google Drive
-  static const DriveScope = "https://www.googleapis.com/auth/drive";
-
-  /// View and manage metadata of files in your Google Drive
-  static const DriveMetadataScope =
-      "https://www.googleapis.com/auth/drive.metadata";
-
-  /// View metadata for files in your Google Drive
-  static const DriveMetadataReadonlyScope =
-      "https://www.googleapis.com/auth/drive.metadata.readonly";
-
-  /// View the files in your Google Drive
-  static const DriveReadonlyScope =
-      "https://www.googleapis.com/auth/drive.readonly";
-
   final commons.ApiRequester _requester;
 
   ActivitiesResourceApi get activities => new ActivitiesResourceApi(_requester);
@@ -430,6 +414,7 @@
   /// Possible string values are:
   /// - "commenter"
   /// - "owner"
+  /// - "publishedReader"
   /// - "reader"
   /// - "writer"
   core.String role;
diff --git a/googleapis/lib/bigquery/v2.dart b/googleapis/lib/bigquery/v2.dart
index ca7ba97..8c4517b 100644
--- a/googleapis/lib/bigquery/v2.dart
+++ b/googleapis/lib/bigquery/v2.dart
@@ -441,6 +441,9 @@
   ///
   /// [jobId] - [Required] Job ID of the job to cancel
   ///
+  /// [location] - [Experimental] The geographic location of the job. Required
+  /// except for US and EU.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -453,7 +456,7 @@
   /// this method will complete with the same error.
   async.Future<JobCancelResponse> cancel(
       core.String projectId, core.String jobId,
-      {core.String $fields}) {
+      {core.String location, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -467,6 +470,9 @@
     if (jobId == null) {
       throw new core.ArgumentError("Parameter jobId is required.");
     }
+    if (location != null) {
+      _queryParams["location"] = [location];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -496,6 +502,9 @@
   ///
   /// [jobId] - [Required] Job ID of the requested job
   ///
+  /// [location] - [Experimental] The geographic location of the job. Required
+  /// except for US and EU.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -507,7 +516,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<Job> get(core.String projectId, core.String jobId,
-      {core.String $fields}) {
+      {core.String location, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -521,6 +530,9 @@
     if (jobId == null) {
       throw new core.ArgumentError("Parameter jobId is required.");
     }
+    if (location != null) {
+      _queryParams["location"] = [location];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -547,6 +559,9 @@
   ///
   /// [jobId] - [Required] Job ID of the query job
   ///
+  /// [location] - [Experimental] The geographic location where the job should
+  /// run. Required except for US and EU.
+  ///
   /// [maxResults] - Maximum number of results to read
   ///
   /// [pageToken] - Page token, returned by a previous call, to request the next
@@ -570,7 +585,8 @@
   /// this method will complete with the same error.
   async.Future<GetQueryResultsResponse> getQueryResults(
       core.String projectId, core.String jobId,
-      {core.int maxResults,
+      {core.String location,
+      core.int maxResults,
       core.String pageToken,
       core.String startIndex,
       core.int timeoutMs,
@@ -588,6 +604,9 @@
     if (jobId == null) {
       throw new core.ArgumentError("Parameter jobId is required.");
     }
+    if (location != null) {
+      _queryParams["location"] = [location];
+    }
     if (maxResults != null) {
       _queryParams["maxResults"] = ["${maxResults}"];
     }
@@ -2046,6 +2065,9 @@
   /// group your datasets.
   core.Map<core.String, core.String> labels;
 
+  /// [Experimental] The geographic location where the data resides.
+  core.String location;
+
   DatasetListDatasets();
 
   DatasetListDatasets.fromJson(core.Map _json) {
@@ -2065,6 +2087,9 @@
     if (_json.containsKey("labels")) {
       labels = _json["labels"];
     }
+    if (_json.containsKey("location")) {
+      location = _json["location"];
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -2085,6 +2110,9 @@
     if (labels != null) {
       _json["labels"] = labels;
     }
+    if (location != null) {
+      _json["location"] = location;
+    }
     return _json;
   }
 }
@@ -2179,6 +2207,43 @@
   }
 }
 
+class DestinationTableProperties {
+  /// [Optional] The description for the destination table. This will only be
+  /// used if the destination table is newly created. If the table already
+  /// exists and a value different than the current description is provided, the
+  /// job will fail.
+  core.String description;
+
+  /// [Optional] The friendly name for the destination table. This will only be
+  /// used if the destination table is newly created. If the table already
+  /// exists and a value different than the current friendly name is provided,
+  /// the job will fail.
+  core.String friendlyName;
+
+  DestinationTableProperties();
+
+  DestinationTableProperties.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("friendlyName")) {
+      friendlyName = _json["friendlyName"];
+    }
+  }
+
+  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 (friendlyName != null) {
+      _json["friendlyName"] = friendlyName;
+    }
+    return _json;
+  }
+}
+
 class EncryptionConfiguration {
   /// [Optional] Describes the Cloud KMS encryption key that will be used to
   /// protect destination BigQuery table. The BigQuery Service Account
@@ -2254,6 +2319,9 @@
 }
 
 class ExplainQueryStage {
+  /// Number of parallel input segments completed.
+  core.String completedParallelInputs;
+
   /// Milliseconds the average shard spent on CPU-bound tasks.
   core.String computeMsAvg;
 
@@ -2266,12 +2334,21 @@
   /// Relative amount of time the slowest shard spent on CPU-bound tasks.
   core.double computeRatioMax;
 
+  /// Stage end time in milliseconds.
+  core.String endMs;
+
   /// Unique ID for stage within plan.
   core.String id;
 
+  /// IDs for stages that are inputs to this stage.
+  core.List<core.String> inputStages;
+
   /// 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;
 
@@ -2296,6 +2373,9 @@
   /// Total number of bytes written to shuffle and spilled to disk.
   core.String shuffleOutputBytesSpilled;
 
+  /// Stage start time in milliseconds.
+  core.String startMs;
+
   /// Current status for the stage.
   core.String status;
 
@@ -2330,6 +2410,9 @@
   ExplainQueryStage();
 
   ExplainQueryStage.fromJson(core.Map _json) {
+    if (_json.containsKey("completedParallelInputs")) {
+      completedParallelInputs = _json["completedParallelInputs"];
+    }
     if (_json.containsKey("computeMsAvg")) {
       computeMsAvg = _json["computeMsAvg"];
     }
@@ -2342,12 +2425,21 @@
     if (_json.containsKey("computeRatioMax")) {
       computeRatioMax = _json["computeRatioMax"];
     }
+    if (_json.containsKey("endMs")) {
+      endMs = _json["endMs"];
+    }
     if (_json.containsKey("id")) {
       id = _json["id"];
     }
+    if (_json.containsKey("inputStages")) {
+      inputStages = _json["inputStages"];
+    }
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
+    if (_json.containsKey("parallelInputs")) {
+      parallelInputs = _json["parallelInputs"];
+    }
     if (_json.containsKey("readMsAvg")) {
       readMsAvg = _json["readMsAvg"];
     }
@@ -2372,6 +2464,9 @@
     if (_json.containsKey("shuffleOutputBytesSpilled")) {
       shuffleOutputBytesSpilled = _json["shuffleOutputBytesSpilled"];
     }
+    if (_json.containsKey("startMs")) {
+      startMs = _json["startMs"];
+    }
     if (_json.containsKey("status")) {
       status = _json["status"];
     }
@@ -2409,6 +2504,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;
     }
@@ -2421,12 +2519,21 @@
     if (computeRatioMax != null) {
       _json["computeRatioMax"] = computeRatioMax;
     }
+    if (endMs != null) {
+      _json["endMs"] = endMs;
+    }
     if (id != null) {
       _json["id"] = id;
     }
+    if (inputStages != null) {
+      _json["inputStages"] = inputStages;
+    }
     if (name != null) {
       _json["name"] = name;
     }
+    if (parallelInputs != null) {
+      _json["parallelInputs"] = parallelInputs;
+    }
     if (readMsAvg != null) {
       _json["readMsAvg"] = readMsAvg;
     }
@@ -2451,6 +2558,9 @@
     if (shuffleOutputBytesSpilled != null) {
       _json["shuffleOutputBytesSpilled"] = shuffleOutputBytesSpilled;
     }
+    if (startMs != null) {
+      _json["startMs"] = startMs;
+    }
     if (status != null) {
       _json["status"] = status;
     }
@@ -2992,9 +3102,13 @@
   /// [Pick one] Configures an extract job.
   JobConfigurationExtract extract;
 
-  /// [Experimental] The labels associated with this job. You can use these to
-  /// organize and group your jobs. Label keys and values can be no longer than
-  /// 63 characters, can only contain lowercase letters, numeric characters,
+  /// [Optional] Job timeout in milliseconds. If this time limit is exceeded,
+  /// BigQuery may attempt to terminate the job.
+  core.String jobTimeoutMs;
+
+  /// The labels associated with this job. You can use these to organize and
+  /// group your jobs. Label keys and values can be no longer than 63
+  /// characters, can only contain lowercase letters, numeric characters,
   /// underscores and dashes. International characters are allowed. Label values
   /// are optional. Label keys must start with a letter and each label in the
   /// list must have a different key.
@@ -3018,6 +3132,9 @@
     if (_json.containsKey("extract")) {
       extract = new JobConfigurationExtract.fromJson(_json["extract"]);
     }
+    if (_json.containsKey("jobTimeoutMs")) {
+      jobTimeoutMs = _json["jobTimeoutMs"];
+    }
     if (_json.containsKey("labels")) {
       labels = _json["labels"];
     }
@@ -3041,6 +3158,9 @@
     if (extract != null) {
       _json["extract"] = (extract).toJson();
     }
+    if (jobTimeoutMs != null) {
+      _json["jobTimeoutMs"] = jobTimeoutMs;
+    }
     if (labels != null) {
       _json["labels"] = labels;
     }
@@ -3056,7 +3176,8 @@
 
 class JobConfigurationExtract {
   /// [Optional] The compression type to use for exported files. Possible values
-  /// include GZIP and NONE. The default value is NONE.
+  /// include GZIP, DEFLATE, SNAPPY, and NONE. The default value is NONE.
+  /// DEFLATE and SNAPPY are only supported for Avro.
   core.String compression;
 
   /// [Optional] The exported file format. Possible values include CSV,
@@ -3162,12 +3283,16 @@
   /// actions occur as one atomic update upon job completion.
   core.String createDisposition;
 
-  /// [Experimental] Custom encryption configuration (e.g., Cloud KMS keys).
+  /// Custom encryption configuration (e.g., Cloud KMS keys).
   EncryptionConfiguration destinationEncryptionConfiguration;
 
   /// [Required] The destination table to load the data into.
   TableReference destinationTable;
 
+  /// [Experimental] [Optional] Properties with which to create the destination
+  /// table if it is new.
+  DestinationTableProperties destinationTableProperties;
+
   /// [Optional] The character encoding of the data. The supported values are
   /// UTF-8 or ISO-8859-1. The default value is UTF-8. BigQuery decodes the data
   /// after the raw, binary data has been split using the values of the quote
@@ -3237,7 +3362,7 @@
   /// [Deprecated] The format of the schemaInline property.
   core.String schemaInlineFormat;
 
-  /// Allows the schema of the desitination table to be updated as a side effect
+  /// Allows the schema of the destination table to be updated as a side effect
   /// of the load job if a schema is autodetected or supplied in the job
   /// configuration. Schema update options are supported in two cases: when
   /// writeDisposition is WRITE_APPEND; when writeDisposition is WRITE_TRUNCATE
@@ -3256,8 +3381,8 @@
 
   /// [Optional] The format of the data files. For CSV files, specify "CSV". For
   /// datastore backups, specify "DATASTORE_BACKUP". For newline-delimited JSON,
-  /// specify "NEWLINE_DELIMITED_JSON". For Avro, specify "AVRO". The default
-  /// value is CSV.
+  /// specify "NEWLINE_DELIMITED_JSON". For Avro, specify "AVRO". For parquet,
+  /// specify "PARQUET". For orc, specify "ORC". The default value is CSV.
   core.String sourceFormat;
 
   /// [Required] The fully-qualified URIs that point to your data in Google
@@ -3307,6 +3432,10 @@
     if (_json.containsKey("destinationTable")) {
       destinationTable = new TableReference.fromJson(_json["destinationTable"]);
     }
+    if (_json.containsKey("destinationTableProperties")) {
+      destinationTableProperties = new DestinationTableProperties.fromJson(
+          _json["destinationTableProperties"]);
+    }
     if (_json.containsKey("encoding")) {
       encoding = _json["encoding"];
     }
@@ -3380,6 +3509,10 @@
     if (destinationTable != null) {
       _json["destinationTable"] = (destinationTable).toJson();
     }
+    if (destinationTableProperties != null) {
+      _json["destinationTableProperties"] =
+          (destinationTableProperties).toJson();
+    }
     if (encoding != null) {
       _json["encoding"] = encoding;
     }
@@ -3453,7 +3586,7 @@
   /// names in the query.
   DatasetReference defaultDataset;
 
-  /// [Experimental] Custom encryption configuration (e.g., Cloud KMS keys).
+  /// Custom encryption configuration (e.g., Cloud KMS keys).
   EncryptionConfiguration destinationEncryptionConfiguration;
 
   /// [Optional] Describes the table where the query results should be stored.
@@ -3704,7 +3837,7 @@
   /// actions occur as one atomic update upon job completion.
   core.String createDisposition;
 
-  /// [Experimental] Custom encryption configuration (e.g., Cloud KMS keys).
+  /// Custom encryption configuration (e.g., Cloud KMS keys).
   EncryptionConfiguration destinationEncryptionConfiguration;
 
   /// [Required] The destination table
@@ -3933,6 +4066,10 @@
   /// characters.
   core.String jobId;
 
+  /// [Experimental] The geographic location of the job. Required except for US
+  /// and EU.
+  core.String location;
+
   /// [Required] The ID of the project containing this job.
   core.String projectId;
 
@@ -3942,6 +4079,9 @@
     if (_json.containsKey("jobId")) {
       jobId = _json["jobId"];
     }
+    if (_json.containsKey("location")) {
+      location = _json["location"];
+    }
     if (_json.containsKey("projectId")) {
       projectId = _json["projectId"];
     }
@@ -3953,6 +4093,9 @@
     if (jobId != null) {
       _json["jobId"] = jobId;
     }
+    if (location != null) {
+      _json["location"] = location;
+    }
     if (projectId != null) {
       _json["projectId"] = projectId;
     }
@@ -3961,6 +4104,10 @@
 }
 
 class JobStatistics {
+  /// [Experimental] [Output-only] Job progress (0.0 -> 1.0) for LOAD and
+  /// EXTRACT jobs.
+  core.double completionRatio;
+
   /// [Output-only] Creation time of this job, in milliseconds since the epoch.
   /// This field will be present on all jobs.
   core.String creationTime;
@@ -3990,6 +4137,9 @@
   JobStatistics();
 
   JobStatistics.fromJson(core.Map _json) {
+    if (_json.containsKey("completionRatio")) {
+      completionRatio = _json["completionRatio"];
+    }
     if (_json.containsKey("creationTime")) {
       creationTime = _json["creationTime"];
     }
@@ -4016,6 +4166,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (completionRatio != null) {
+      _json["completionRatio"] = completionRatio;
+    }
     if (creationTime != null) {
       _json["creationTime"] = creationTime;
     }
@@ -4048,6 +4201,23 @@
   /// [Output-only] Whether the query result was fetched from the query cache.
   core.bool cacheHit;
 
+  /// [Output-only, Experimental] The DDL operation performed, possibly
+  /// dependent on the pre-existence of the DDL target. Possible values (new
+  /// values might be added in the future): "CREATE": The query created the DDL
+  /// target. "SKIP": No-op. Example cases: the query is CREATE TABLE IF NOT
+  /// EXISTS while the table already exists, or the query is DROP TABLE IF
+  /// EXISTS while the table does not exist. "REPLACE": The query replaced the
+  /// DDL target. Example case: the query is CREATE OR REPLACE TABLE, and the
+  /// table already exists. "DROP": The query deleted the DDL target.
+  core.String ddlOperationPerformed;
+
+  /// [Output-only, Experimental] The DDL target table. Present only for
+  /// 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;
@@ -4055,17 +4225,31 @@
   /// [Output-only] Describes execution plan for the query.
   core.List<ExplainQueryStage> queryPlan;
 
-  /// [Output-only, Experimental] Referenced tables for the job. Queries that
-  /// reference more than 50 tables will not have a complete list.
+  /// [Output-only] Referenced tables for the job. Queries that reference more
+  /// than 50 tables will not have a complete list.
   core.List<TableReference> referencedTables;
 
-  /// [Output-only, Experimental] The schema of the results. Present only for
-  /// successful dry run of non-legacy SQL queries.
+  /// [Output-only] The schema of the results. Present only for successful dry
+  /// run of non-legacy SQL queries.
   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] [Experimental] Describes a timeline of job execution.
+  core.List<QueryTimelineSample> timeline;
+
   /// [Output-only] Total bytes billed for the job.
   core.String totalBytesBilled;
 
@@ -4088,6 +4272,15 @@
     if (_json.containsKey("cacheHit")) {
       cacheHit = _json["cacheHit"];
     }
+    if (_json.containsKey("ddlOperationPerformed")) {
+      ddlOperationPerformed = _json["ddlOperationPerformed"];
+    }
+    if (_json.containsKey("ddlTargetTable")) {
+      ddlTargetTable = new TableReference.fromJson(_json["ddlTargetTable"]);
+    }
+    if (_json.containsKey("estimatedBytesProcessed")) {
+      estimatedBytesProcessed = _json["estimatedBytesProcessed"];
+    }
     if (_json.containsKey("numDmlAffectedRows")) {
       numDmlAffectedRows = _json["numDmlAffectedRows"];
     }
@@ -4107,6 +4300,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"];
     }
@@ -4132,6 +4330,15 @@
     if (cacheHit != null) {
       _json["cacheHit"] = cacheHit;
     }
+    if (ddlOperationPerformed != null) {
+      _json["ddlOperationPerformed"] = ddlOperationPerformed;
+    }
+    if (ddlTargetTable != null) {
+      _json["ddlTargetTable"] = (ddlTargetTable).toJson();
+    }
+    if (estimatedBytesProcessed != null) {
+      _json["estimatedBytesProcessed"] = estimatedBytesProcessed;
+    }
     if (numDmlAffectedRows != null) {
       _json["numDmlAffectedRows"] = numDmlAffectedRows;
     }
@@ -4148,6 +4355,9 @@
     if (statementType != null) {
       _json["statementType"] = statementType;
     }
+    if (timeline != null) {
+      _json["timeline"] = timeline.map((value) => (value).toJson()).toList();
+    }
     if (totalBytesBilled != null) {
       _json["totalBytesBilled"] = totalBytesBilled;
     }
@@ -4304,7 +4514,7 @@
 
   JsonObject();
 
-  JsonObject.fromJson(core.Map _json) {
+  JsonObject.fromJson(core.Map<core.String, core.dynamic> _json) {
     _json.forEach((core.String key, value) {
       this[key] = value;
     });
@@ -4667,6 +4877,10 @@
   /// The resource type of the request.
   core.String kind;
 
+  /// [Experimental] The geographic location where the job should run. Required
+  /// except for US and EU.
+  core.String location;
+
   /// [Optional] The maximum number of rows of data to return per page of
   /// results. Setting this flag to a small value such as 1000 and then paging
   /// through results might improve reliability when the query result set is
@@ -4723,6 +4937,9 @@
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
+    if (_json.containsKey("location")) {
+      location = _json["location"];
+    }
     if (_json.containsKey("maxResults")) {
       maxResults = _json["maxResults"];
     }
@@ -4763,6 +4980,9 @@
     if (kind != null) {
       _json["kind"] = kind;
     }
+    if (location != null) {
+      _json["location"] = location;
+    }
     if (maxResults != null) {
       _json["maxResults"] = maxResults;
     }
@@ -4923,6 +5143,65 @@
   }
 }
 
+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.String activeInputs;
+
+  /// Total parallel units of work completed by this query.
+  core.String completedInputs;
+
+  /// 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("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 (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.
@@ -4975,7 +5254,7 @@
   /// [Optional] A user-friendly description of this table.
   core.String description;
 
-  /// [Experimental] Custom encryption configuration (e.g., Cloud KMS keys).
+  /// Custom encryption configuration (e.g., Cloud KMS keys).
   EncryptionConfiguration encryptionConfiguration;
 
   /// [Output-only] A hash of this resource.
@@ -4983,7 +5262,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
@@ -5000,12 +5281,12 @@
   /// [Output-only] The type of the resource.
   core.String kind;
 
-  /// [Experimental] The labels associated with this table. You can use these to
-  /// organize and group your tables. Label keys and values can be no longer
-  /// than 63 characters, can only contain lowercase letters, numeric
-  /// characters, underscores and dashes. International characters are allowed.
-  /// Label values are optional. Label keys must start with a letter and each
-  /// label in the list must have a different key.
+  /// The labels associated with this table. You can use these to organize and
+  /// group your tables. Label keys and values can be no longer than 63
+  /// characters, can only contain lowercase letters, numeric characters,
+  /// underscores and dashes. International characters are allowed. Label values
+  /// are optional. Label keys must start with a letter and each label in the
+  /// list must have a different key.
   core.Map<core.String, core.String> labels;
 
   /// [Output-only] The time when this table was last modified, in milliseconds
@@ -5567,8 +5848,8 @@
   /// The resource type.
   core.String kind;
 
-  /// [Experimental] The labels associated with this table. You can use these to
-  /// organize and group your tables.
+  /// The labels associated with this table. You can use these to organize and
+  /// group your tables.
   core.Map<core.String, core.String> labels;
 
   /// A reference uniquely identifying the table.
@@ -5816,6 +6097,11 @@
   /// NULLABLE or REQUIRED.
   core.String field;
 
+  /// [Experimental] [Optional] If set to true, queries over this table require
+  /// a partition filter that can be used for partition elimination to be
+  /// specified.
+  core.bool requirePartitionFilter;
+
   /// [Required] The only type supported is DAY, which will generate one
   /// partition per day.
   core.String type;
@@ -5829,6 +6115,9 @@
     if (_json.containsKey("field")) {
       field = _json["field"];
     }
+    if (_json.containsKey("requirePartitionFilter")) {
+      requirePartitionFilter = _json["requirePartitionFilter"];
+    }
     if (_json.containsKey("type")) {
       type = _json["type"];
     }
@@ -5843,6 +6132,9 @@
     if (field != null) {
       _json["field"] = field;
     }
+    if (requirePartitionFilter != null) {
+      _json["requirePartitionFilter"] = requirePartitionFilter;
+    }
     if (type != null) {
       _json["type"] = type;
     }
diff --git a/googleapis/lib/bigquerydatatransfer/v1.dart b/googleapis/lib/bigquerydatatransfer/v1.dart
index b5a452b..7c78d75 100644
--- a/googleapis/lib/bigquerydatatransfer/v1.dart
+++ b/googleapis/lib/bigquerydatatransfer/v1.dart
@@ -172,9 +172,6 @@
   /// Must be in the form: `projects/{project_id}`
   /// Value must have pattern "^projects/[^/]+$".
   ///
-  /// [pageSize] - Page size. The default page size is the maximum value of 1000
-  /// results.
-  ///
   /// [pageToken] - Pagination token, which can be used to request a specific
   /// page
   /// of `ListDataSourcesRequest` list results. For multiple-page
@@ -182,6 +179,9 @@
   /// a `next_page` token, which can be used as the
   /// `page_token` value to request the next page of list results.
   ///
+  /// [pageSize] - Page size. The default page size is the maximum value of 1000
+  /// results.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -193,7 +193,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<ListDataSourcesResponse> 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;
@@ -204,12 +204,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];
     }
@@ -542,10 +542,8 @@
   /// [parent] - The BigQuery project id where the transfer configuration should
   /// be created.
   /// Must be in the format /projects/{project_id}/locations/{location_id}
-  /// or
-  /// /projects/{project_id}/locations/-
-  /// In case when '-' is specified as location_id, location is infered from
-  /// the destination dataset region.
+  /// If specified location and location of the destination bigquery dataset
+  /// do not match - the request will fail.
   /// Value must have pattern "^projects/[^/]+/locations/[^/]+$".
   ///
   /// [authorizationCode] - Optional OAuth2 authorization code to use with this
@@ -797,7 +795,7 @@
   /// [authorizationCode] - Optional OAuth2 authorization code to use with this
   /// transfer configuration.
   /// If it is provided, the transfer configuration will be associated with the
-  /// gaia id of the authorizing user.
+  /// authorizing user.
   /// In order to obtain authorization_code, please make a
   /// request to
   /// https://www.gstatic.com/bigquerydatatransfer/oauthz/auth?client_id=<datatransferapiclientid>&scope=<data_source_scopes>&redirect_uri=<redirect_uri>
@@ -862,7 +860,7 @@
     return _response.then((data) => new TransferConfig.fromJson(data));
   }
 
-  /// Creates transfer runs for a time range [range_start_time, range_end_time].
+  /// Creates transfer runs for a time range [start_time, end_time].
   /// For each date - or whatever granularity the data source supports - in the
   /// range, one transfer run is created.
   /// Note that runs are created per UTC time in the time range.
@@ -1035,17 +1033,6 @@
   /// Value must have pattern
   /// "^projects/[^/]+/locations/[^/]+/transferConfigs/[^/]+$".
   ///
-  /// [pageSize] - Page size. The default page size is the maximum value of 1000
-  /// results.
-  ///
-  /// [states] - When specified, only transfer runs with requested states are
-  /// returned.
-  ///
-  /// [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
@@ -1053,6 +1040,17 @@
   /// a `next_page` token, which can be used as the
   /// `page_token` value to request the next page of list results.
   ///
+  /// [states] - When specified, only transfer runs with requested states are
+  /// returned.
+  ///
+  /// [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.
   ///
@@ -1064,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.int pageSize,
+      {core.String pageToken,
       core.List<core.String> states,
+      core.int pageSize,
       core.String runAttempt,
-      core.String pageToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1079,18 +1077,18 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
     }
     if (states != null) {
       _queryParams["states"] = states;
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if (runAttempt != null) {
       _queryParams["runAttempt"] = [runAttempt];
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1209,10 +1207,8 @@
   /// [parent] - The BigQuery project id where the transfer configuration should
   /// be created.
   /// Must be in the format /projects/{project_id}/locations/{location_id}
-  /// or
-  /// /projects/{project_id}/locations/-
-  /// In case when '-' is specified as location_id, location is infered from
-  /// the destination dataset region.
+  /// If specified location and location of the destination bigquery dataset
+  /// do not match - the request will fail.
   /// Value must have pattern "^projects/[^/]+$".
   ///
   /// [authorizationCode] - Optional OAuth2 authorization code to use with this
@@ -1378,12 +1374,6 @@
   /// should be returned: `projects/{project_id}`.
   /// Value must have pattern "^projects/[^/]+$".
   ///
-  /// [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.
-  ///
   /// [pageToken] - Pagination token, which can be used to request a specific
   /// page
   /// of `ListTransfersRequest` list results. For multiple-page
@@ -1391,6 +1381,12 @@
   /// a `next_page` token, which can be used as the
   /// `page_token` value to request the next page of list results.
   ///
+  /// [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.
   ///
@@ -1402,9 +1398,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.int pageSize,
+      {core.String pageToken,
+      core.int pageSize,
       core.List<core.String> dataSourceIds,
-      core.String pageToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1416,15 +1412,15 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
     if (dataSourceIds != null) {
       _queryParams["dataSourceIds"] = dataSourceIds;
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1463,7 +1459,7 @@
   /// [authorizationCode] - Optional OAuth2 authorization code to use with this
   /// transfer configuration.
   /// If it is provided, the transfer configuration will be associated with the
-  /// gaia id of the authorizing user.
+  /// authorizing user.
   /// In order to obtain authorization_code, please make a
   /// request to
   /// https://www.gstatic.com/bigquerydatatransfer/oauthz/auth?client_id=<datatransferapiclientid>&scope=<data_source_scopes>&redirect_uri=<redirect_uri>
@@ -1526,7 +1522,7 @@
     return _response.then((data) => new TransferConfig.fromJson(data));
   }
 
-  /// Creates transfer runs for a time range [range_start_time, range_end_time].
+  /// Creates transfer runs for a time range [start_time, end_time].
   /// For each date - or whatever granularity the data source supports - in the
   /// range, one transfer run is created.
   /// Note that runs are created per UTC time in the time range.
@@ -1702,12 +1698,12 @@
   /// a `next_page` token, which can be used as the
   /// `page_token` value to request the next page of list results.
   ///
-  /// [pageSize] - Page size. The default page size is the maximum value of 1000
-  /// results.
-  ///
   /// [states] - When specified, only transfer runs with requested states are
   /// returned.
   ///
+  /// [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.
@@ -1725,8 +1721,8 @@
   /// this method will complete with the same error.
   async.Future<ListTransferRunsResponse> list(core.String parent,
       {core.String pageToken,
-      core.int pageSize,
       core.List<core.String> states,
+      core.int pageSize,
       core.String runAttempt,
       core.String $fields}) {
     var _url = null;
@@ -1742,12 +1738,12 @@
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (states != null) {
       _queryParams["states"] = states;
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if (runAttempt != null) {
       _queryParams["runAttempt"] = [runAttempt];
     }
@@ -1954,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.
@@ -2608,12 +2604,115 @@
   }
 }
 
+/// 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;
+  }
+}
+
 /// Represents a data transfer configuration. A transfer configuration
 /// contains all metadata needed to perform a data transfer. For example,
 /// `destination_dataset_id` specifies where data should be stored.
 /// When a new transfer configuration is created, the specified
 /// `destination_dataset_id` is created when needed and shared with the
 /// appropriate data source service account.
+/// Next id: 21
 class TransferConfig {
   /// The number of days to look back to automatically refresh the data.
   /// For example, if `data_refresh_window_days = 10`, then every day
@@ -2674,7 +2773,6 @@
   /// Output only. State of the most recently updated transfer run.
   /// Possible string values are:
   /// - "TRANSFER_STATE_UNSPECIFIED" : State placeholder.
-  /// - "INACTIVE" : Data transfer is inactive.
   /// - "PENDING" : Data transfer is scheduled and is waiting to be picked up by
   /// data transfer backend.
   /// - "RUNNING" : Data transfer is in progress.
@@ -2689,6 +2787,8 @@
   /// Output only. Unique ID of the user on whose behalf transfer is done.
   /// Applicable only to data sources that do not support service accounts.
   /// When set to 0, the data source service account credentials are used.
+  /// May be negative. Note, that this identifier is not stable.
+  /// It may change over time even for the same user.
   core.String userId;
 
   TransferConfig();
@@ -2828,27 +2928,28 @@
 }
 
 /// Represents a data transfer run.
+/// Next id: 27
 class TransferRun {
   /// Output only. Data source id.
   core.String dataSourceId;
 
-  /// Output only. Region in which BigQuery dataset is located.
-  core.String datasetRegion;
-
-  /// The BigQuery target dataset id.
+  /// Output only. The BigQuery target dataset id.
   core.String destinationDatasetId;
 
   /// Output only. Time when transfer run ended.
   /// Parameter ignored by server for input requests.
   core.String endTime;
 
+  /// Status of the transfer run.
+  Status errorStatus;
+
   /// The resource name of the transfer run.
   /// Transfer run names have the form
   /// `projects/{project_id}/locations/{location}/transferConfigs/{config_id}/runs/{run_id}`.
   /// The name is ignored when creating a transfer run.
   core.String name;
 
-  /// Data transfer specific parameters.
+  /// Output only. Data transfer specific parameters.
   ///
   /// The values for Object must be JSON objects. It can consist of `num`,
   /// `String`, `bool` and `null` as well as `Map` and `List` values.
@@ -2872,10 +2973,9 @@
   /// Parameter ignored by server for input requests.
   core.String startTime;
 
-  /// Output only. Data transfer run state. Ignored for input requests.
+  /// Data transfer run state. Ignored for input requests.
   /// Possible string values are:
   /// - "TRANSFER_STATE_UNSPECIFIED" : State placeholder.
-  /// - "INACTIVE" : Data transfer is inactive.
   /// - "PENDING" : Data transfer is scheduled and is waiting to be picked up by
   /// data transfer backend.
   /// - "RUNNING" : Data transfer is in progress.
@@ -2890,6 +2990,8 @@
   /// Output only. Unique ID of the user on whose behalf transfer is done.
   /// Applicable only to data sources that do not support service accounts.
   /// When set to 0, the data source service account credentials are used.
+  /// May be negative. Note, that this identifier is not stable.
+  /// It may change over time even for the same user.
   core.String userId;
 
   TransferRun();
@@ -2898,15 +3000,15 @@
     if (_json.containsKey("dataSourceId")) {
       dataSourceId = _json["dataSourceId"];
     }
-    if (_json.containsKey("datasetRegion")) {
-      datasetRegion = _json["datasetRegion"];
-    }
     if (_json.containsKey("destinationDatasetId")) {
       destinationDatasetId = _json["destinationDatasetId"];
     }
     if (_json.containsKey("endTime")) {
       endTime = _json["endTime"];
     }
+    if (_json.containsKey("errorStatus")) {
+      errorStatus = new Status.fromJson(_json["errorStatus"]);
+    }
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
@@ -2942,15 +3044,15 @@
     if (dataSourceId != null) {
       _json["dataSourceId"] = dataSourceId;
     }
-    if (datasetRegion != null) {
-      _json["datasetRegion"] = datasetRegion;
-    }
     if (destinationDatasetId != null) {
       _json["destinationDatasetId"] = destinationDatasetId;
     }
     if (endTime != null) {
       _json["endTime"] = endTime;
     }
+    if (errorStatus != null) {
+      _json["errorStatus"] = (errorStatus).toJson();
+    }
     if (name != null) {
       _json["name"] = name;
     }
diff --git a/googleapis/lib/books/v1.dart b/googleapis/lib/books/v1.dart
index f6fcfec..1e1ca2d 100644
--- a/googleapis/lib/books/v1.dart
+++ b/googleapis/lib/books/v1.dart
@@ -26,6 +26,8 @@
   CloudloadingResourceApi get cloudloading =>
       new CloudloadingResourceApi(_requester);
   DictionaryResourceApi get dictionary => new DictionaryResourceApi(_requester);
+  FamilysharingResourceApi get familysharing =>
+      new FamilysharingResourceApi(_requester);
   LayersResourceApi get layers => new LayersResourceApi(_requester);
   MyconfigResourceApi get myconfig => new MyconfigResourceApi(_requester);
   MylibraryResourceApi get mylibrary => new MylibraryResourceApi(_requester);
@@ -448,6 +450,169 @@
   }
 }
 
+class FamilysharingResourceApi {
+  final commons.ApiRequester _requester;
+
+  FamilysharingResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets information regarding the family that the user is part of.
+  ///
+  /// Request parameters:
+  ///
+  /// [source] - String to identify the originator of this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FamilyInfo].
+  ///
+  /// 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<FamilyInfo> getFamilyInfo(
+      {core.String source, 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 != null) {
+      _queryParams["source"] = [source];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'familysharing/getFamilyInfo';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new FamilyInfo.fromJson(data));
+  }
+
+  /// Initiates sharing of the content with the user's family. Empty response
+  /// indicates success.
+  ///
+  /// Request parameters:
+  ///
+  /// [docId] - The docid to share.
+  ///
+  /// [source] - String to identify the originator of this request.
+  ///
+  /// [volumeId] - The volume to share.
+  ///
+  /// [$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 share(
+      {core.String docId,
+      core.String source,
+      core.String volumeId,
+      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 (docId != null) {
+      _queryParams["docId"] = [docId];
+    }
+    if (source != null) {
+      _queryParams["source"] = [source];
+    }
+    if (volumeId != null) {
+      _queryParams["volumeId"] = [volumeId];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'familysharing/share';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Initiates revoking content that has already been shared with the user's
+  /// family. Empty response indicates success.
+  ///
+  /// Request parameters:
+  ///
+  /// [docId] - The docid to unshare.
+  ///
+  /// [source] - String to identify the originator of this request.
+  ///
+  /// [volumeId] - The volume to unshare.
+  ///
+  /// [$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 unshare(
+      {core.String docId,
+      core.String source,
+      core.String volumeId,
+      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 (docId != null) {
+      _queryParams["docId"] = [docId];
+    }
+    if (source != null) {
+      _queryParams["source"] = [source];
+    }
+    if (volumeId != null) {
+      _queryParams["volumeId"] = [volumeId];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'familysharing/unshare';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+}
+
 class LayersResourceApi {
   final commons.ApiRequester _requester;
 
@@ -5525,6 +5690,94 @@
   }
 }
 
+/// Family membership info of the user that made the request.
+class FamilyInfoMembership {
+  /// Restrictions on user buying and acquiring content.
+  core.String acquirePermission;
+
+  /// The age group of the user.
+  core.String ageGroup;
+
+  /// The maximum allowed maturity rating for the user.
+  core.String allowedMaturityRating;
+  core.bool isInFamily;
+
+  /// The role of the user in the family.
+  core.String role;
+
+  FamilyInfoMembership();
+
+  FamilyInfoMembership.fromJson(core.Map _json) {
+    if (_json.containsKey("acquirePermission")) {
+      acquirePermission = _json["acquirePermission"];
+    }
+    if (_json.containsKey("ageGroup")) {
+      ageGroup = _json["ageGroup"];
+    }
+    if (_json.containsKey("allowedMaturityRating")) {
+      allowedMaturityRating = _json["allowedMaturityRating"];
+    }
+    if (_json.containsKey("isInFamily")) {
+      isInFamily = _json["isInFamily"];
+    }
+    if (_json.containsKey("role")) {
+      role = _json["role"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (acquirePermission != null) {
+      _json["acquirePermission"] = acquirePermission;
+    }
+    if (ageGroup != null) {
+      _json["ageGroup"] = ageGroup;
+    }
+    if (allowedMaturityRating != null) {
+      _json["allowedMaturityRating"] = allowedMaturityRating;
+    }
+    if (isInFamily != null) {
+      _json["isInFamily"] = isInFamily;
+    }
+    if (role != null) {
+      _json["role"] = role;
+    }
+    return _json;
+  }
+}
+
+class FamilyInfo {
+  /// Resource type.
+  core.String kind;
+
+  /// Family membership info of the user that made the request.
+  FamilyInfoMembership membership;
+
+  FamilyInfo();
+
+  FamilyInfo.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("membership")) {
+      membership = new FamilyInfoMembership.fromJson(_json["membership"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (membership != null) {
+      _json["membership"] = (membership).toJson();
+    }
+    return _json;
+  }
+}
+
 class GeolayerdataCommon {
   /// The language of the information url and description.
   core.String lang;
@@ -6774,6 +7027,27 @@
   }
 }
 
+class UsersettingsNotificationMatchMyInterests {
+  core.String optedState;
+
+  UsersettingsNotificationMatchMyInterests();
+
+  UsersettingsNotificationMatchMyInterests.fromJson(core.Map _json) {
+    if (_json.containsKey("opted_state")) {
+      optedState = _json["opted_state"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (optedState != null) {
+      _json["opted_state"] = optedState;
+    }
+    return _json;
+  }
+}
+
 class UsersettingsNotificationMoreFromAuthors {
   core.String optedState;
 
@@ -6816,6 +7090,27 @@
   }
 }
 
+class UsersettingsNotificationPriceDrop {
+  core.String optedState;
+
+  UsersettingsNotificationPriceDrop();
+
+  UsersettingsNotificationPriceDrop.fromJson(core.Map _json) {
+    if (_json.containsKey("opted_state")) {
+      optedState = _json["opted_state"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (optedState != null) {
+      _json["opted_state"] = optedState;
+    }
+    return _json;
+  }
+}
+
 class UsersettingsNotificationRewardExpirations {
   core.String optedState;
 
@@ -6838,13 +7133,19 @@
 }
 
 class UsersettingsNotification {
+  UsersettingsNotificationMatchMyInterests matchMyInterests;
   UsersettingsNotificationMoreFromAuthors moreFromAuthors;
   UsersettingsNotificationMoreFromSeries moreFromSeries;
+  UsersettingsNotificationPriceDrop priceDrop;
   UsersettingsNotificationRewardExpirations rewardExpirations;
 
   UsersettingsNotification();
 
   UsersettingsNotification.fromJson(core.Map _json) {
+    if (_json.containsKey("matchMyInterests")) {
+      matchMyInterests = new UsersettingsNotificationMatchMyInterests.fromJson(
+          _json["matchMyInterests"]);
+    }
     if (_json.containsKey("moreFromAuthors")) {
       moreFromAuthors = new UsersettingsNotificationMoreFromAuthors.fromJson(
           _json["moreFromAuthors"]);
@@ -6853,6 +7154,10 @@
       moreFromSeries = new UsersettingsNotificationMoreFromSeries.fromJson(
           _json["moreFromSeries"]);
     }
+    if (_json.containsKey("priceDrop")) {
+      priceDrop =
+          new UsersettingsNotificationPriceDrop.fromJson(_json["priceDrop"]);
+    }
     if (_json.containsKey("rewardExpirations")) {
       rewardExpirations =
           new UsersettingsNotificationRewardExpirations.fromJson(
@@ -6863,12 +7168,18 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (matchMyInterests != null) {
+      _json["matchMyInterests"] = (matchMyInterests).toJson();
+    }
     if (moreFromAuthors != null) {
       _json["moreFromAuthors"] = (moreFromAuthors).toJson();
     }
     if (moreFromSeries != null) {
       _json["moreFromSeries"] = (moreFromSeries).toJson();
     }
+    if (priceDrop != null) {
+      _json["priceDrop"] = (priceDrop).toJson();
+    }
     if (rewardExpirations != null) {
       _json["rewardExpirations"] = (rewardExpirations).toJson();
     }
diff --git a/googleapis/lib/calendar/v3.dart b/googleapis/lib/calendar/v3.dart
index a7bb10b..7f2c951 100644
--- a/googleapis/lib/calendar/v3.dart
+++ b/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,460 @@
   }
 }
 
+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 a 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;
+
+  /// Additional properties related to a conference. An example would be a
+  /// solution-specific setting for enabling video streaming.
+  ConferenceParameters parameters;
+
+  /// 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 a 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("parameters")) {
+      parameters = new ConferenceParameters.fromJson(_json["parameters"]);
+    }
+    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 (parameters != null) {
+      _json["parameters"] = (parameters).toJson();
+    }
+    if (signature != null) {
+      _json["signature"] = signature;
+    }
+    return _json;
+  }
+}
+
+class ConferenceParameters {
+  /// Additional add-on specific data.
+  ConferenceParametersAddOnParameters addOnParameters;
+
+  ConferenceParameters();
+
+  ConferenceParameters.fromJson(core.Map _json) {
+    if (_json.containsKey("addOnParameters")) {
+      addOnParameters = new ConferenceParametersAddOnParameters.fromJson(
+          _json["addOnParameters"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (addOnParameters != null) {
+      _json["addOnParameters"] = (addOnParameters).toJson();
+    }
+    return _json;
+  }
+}
+
+class ConferenceParametersAddOnParameters {
+  core.Map<core.String, core.String> parameters;
+
+  ConferenceParametersAddOnParameters();
+
+  ConferenceParametersAddOnParameters.fromJson(core.Map _json) {
+    if (_json.containsKey("parameters")) {
+      parameters = _json["parameters"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (parameters != null) {
+      _json["parameters"] = parameters;
+    }
+    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.
+  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.
+  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 G Suite 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: 12345678@altostrat.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 +4421,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 +4606,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 +4728,9 @@
     if (colorId != null) {
       _json["colorId"] = colorId;
     }
+    if (conferenceData != null) {
+      _json["conferenceData"] = (conferenceData).toJson();
+    }
     if (created != null) {
       _json["created"] = (created).toIso8601String();
     }
diff --git a/googleapis/lib/classroom/v1.dart b/googleapis/lib/classroom/v1.dart
index 598e0dc..8753cfa 100644
--- a/googleapis/lib/classroom/v1.dart
+++ b/googleapis/lib/classroom/v1.dart
@@ -70,6 +70,10 @@
   static const ClassroomProfilePhotosScope =
       "https://www.googleapis.com/auth/classroom.profile.photos";
 
+  /// Receive notifications about your Google Classroom data
+  static const ClassroomPushNotificationsScope =
+      "https://www.googleapis.com/auth/classroom.push-notifications";
+
   /// Manage your Google Classroom class rosters
   static const ClassroomRostersScope =
       "https://www.googleapis.com/auth/classroom.rosters";
@@ -117,6 +121,8 @@
       new CoursesStudentsResourceApi(_requester);
   CoursesTeachersResourceApi get teachers =>
       new CoursesTeachersResourceApi(_requester);
+  CoursesTopicsResourceApi get topics =>
+      new CoursesTopicsResourceApi(_requester);
 
   CoursesResourceApi(commons.ApiRequester client) : _requester = client;
 
@@ -291,6 +297,18 @@
   ///
   /// Request parameters:
   ///
+  /// [teacherId] - Restricts returned courses to those having a teacher 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
+  ///
+  /// [courseStates] - Restricts returned courses to those in one of the
+  /// specified states
+  /// The default value is ACTIVE, ARCHIVED, PROVISIONED, DECLINED.
+  ///
   /// [studentId] - Restricts returned courses to those having a student with
   /// the specified
   /// identifier. The identifier can be one of the following:
@@ -313,18 +331,6 @@
   ///
   /// The server may return fewer than the specified number of results.
   ///
-  /// [courseStates] - Restricts returned courses to those in one of the
-  /// specified states
-  /// The default value is ACTIVE, ARCHIVED, PROVISIONED, DECLINED.
-  ///
-  /// [teacherId] - Restricts returned courses to those having a teacher 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.
   ///
@@ -336,11 +342,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<ListCoursesResponse> list(
-      {core.String studentId,
+      {core.String teacherId,
+      core.List<core.String> courseStates,
+      core.String studentId,
       core.String pageToken,
       core.int pageSize,
-      core.List<core.String> courseStates,
-      core.String teacherId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -349,6 +355,12 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
+    if (teacherId != null) {
+      _queryParams["teacherId"] = [teacherId];
+    }
+    if (courseStates != null) {
+      _queryParams["courseStates"] = courseStates;
+    }
     if (studentId != null) {
       _queryParams["studentId"] = [studentId];
     }
@@ -358,12 +370,6 @@
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (courseStates != null) {
-      _queryParams["courseStates"] = courseStates;
-    }
-    if (teacherId != null) {
-      _queryParams["teacherId"] = [teacherId];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -945,6 +951,13 @@
   /// This identifier can be either the Classroom-assigned identifier or an
   /// alias.
   ///
+  /// [orderBy] - Optional sort ordering for results. A comma-separated list of
+  /// fields with
+  /// an optional sort direction keyword. Supported field is `updateTime`.
+  /// Supported direction keywords are `asc` and `desc`.
+  /// If not specified, `updateTime desc` is the default behavior.
+  /// Examples: `updateTime asc`, `updateTime`
+  ///
   /// [pageToken] - nextPageToken
   /// value returned from a previous
   /// list call,
@@ -953,13 +966,6 @@
   /// The list request
   /// must be otherwise identical to the one that resulted in this token.
   ///
-  /// [orderBy] - Optional sort ordering for results. A comma-separated list of
-  /// fields with
-  /// an optional sort direction keyword. Supported field is `updateTime`.
-  /// Supported direction keywords are `asc` and `desc`.
-  /// If not specified, `updateTime desc` is the default behavior.
-  /// Examples: `updateTime asc`, `updateTime`
-  ///
   /// [pageSize] - Maximum number of items to return. Zero or unspecified
   /// indicates that the
   /// server may assign a maximum.
@@ -981,8 +987,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<ListAnnouncementsResponse> list(core.String courseId,
-      {core.String pageToken,
-      core.String orderBy,
+      {core.String orderBy,
+      core.String pageToken,
       core.int pageSize,
       core.List<core.String> announcementStates,
       core.String $fields}) {
@@ -996,12 +1002,12 @@
     if (courseId == null) {
       throw new core.ArgumentError("Parameter courseId is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (orderBy != null) {
       _queryParams["orderBy"] = [orderBy];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
@@ -1412,6 +1418,13 @@
   /// This identifier can be either the Classroom-assigned identifier or an
   /// alias.
   ///
+  /// [orderBy] - Optional sort ordering for results. A comma-separated list of
+  /// fields with
+  /// an optional sort direction keyword. Supported fields are `updateTime`
+  /// and `dueDate`. Supported direction keywords are `asc` and `desc`.
+  /// If not specified, `updateTime desc` is the default behavior.
+  /// Examples: `dueDate asc,updateTime desc`, `updateTime,dueDate desc`
+  ///
   /// [pageToken] - nextPageToken
   /// value returned from a previous
   /// list call,
@@ -1420,13 +1433,6 @@
   /// The list request
   /// must be otherwise identical to the one that resulted in this token.
   ///
-  /// [orderBy] - Optional sort ordering for results. A comma-separated list of
-  /// fields with
-  /// an optional sort direction keyword. Supported fields are `updateTime`
-  /// and `dueDate`. Supported direction keywords are `asc` and `desc`.
-  /// If not specified, `updateTime desc` is the default behavior.
-  /// Examples: `dueDate asc,updateTime desc`, `updateTime,dueDate desc`
-  ///
   /// [pageSize] - Maximum number of items to return. Zero or unspecified
   /// indicates that the
   /// server may assign a maximum.
@@ -1449,8 +1455,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<ListCourseWorkResponse> list(core.String courseId,
-      {core.String pageToken,
-      core.String orderBy,
+      {core.String orderBy,
+      core.String pageToken,
       core.int pageSize,
       core.List<core.String> courseWorkStates,
       core.String $fields}) {
@@ -1464,12 +1470,12 @@
     if (courseId == null) {
       throw new core.ArgumentError("Parameter courseId is required.");
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (orderBy != null) {
       _queryParams["orderBy"] = [orderBy];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
@@ -1770,6 +1776,24 @@
   /// This may be set to the string literal `"-"` to request student work for
   /// all course work in the specified course.
   ///
+  /// [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.
+  ///
+  /// [states] - Requested submission states. If specified, returned student
+  /// submissions
+  /// match one of the specified submission states.
+  ///
+  /// [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.
+  ///
   /// [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
@@ -1788,24 +1812,6 @@
   /// - "LATE_ONLY" : A LATE_ONLY.
   /// - "NOT_LATE_ONLY" : A NOT_LATE_ONLY.
   ///
-  /// [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.
-  ///
-  /// [states] - Requested submission states. If specified, returned student
-  /// submissions
-  /// match one of the specified submission states.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1818,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 pageToken,
-      core.int pageSize,
+      {core.String pageToken,
       core.List<core.String> states,
+      core.int pageSize,
+      core.String userId,
+      core.String late,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1837,21 +1843,21 @@
     if (courseWorkId == null) {
       throw new core.ArgumentError("Parameter courseWorkId is required.");
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (states != null) {
+      _queryParams["states"] = states;
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if (userId != null) {
       _queryParams["userId"] = [userId];
     }
     if (late != null) {
       _queryParams["late"] = [late];
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
-    if (states != null) {
-      _queryParams["states"] = states;
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2882,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;
 
@@ -3105,14 +3249,6 @@
   ///
   /// Request parameters:
   ///
-  /// [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.
-  ///
   /// [userId] - Restricts returned invitations to those for a specific user.
   /// The identifier
   /// can be one of the following:
@@ -3121,6 +3257,14 @@
   /// * the email address of the user
   /// * the string literal `"me"`, indicating the requesting user
   ///
+  /// [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 means no maximum.
   ///
   /// The server may return fewer than the specified number of results.
@@ -3140,8 +3284,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<ListInvitationsResponse> list(
-      {core.String pageToken,
-      core.String userId,
+      {core.String userId,
+      core.String pageToken,
       core.int pageSize,
       core.String courseId,
       core.String $fields}) {
@@ -3152,12 +3296,12 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (userId != null) {
       _queryParams["userId"] = [userId];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
@@ -3562,19 +3706,19 @@
   /// 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.
+  /// [invitedEmailAddress] - If specified, only results with the specified
+  /// `invited_email_address`
+  /// will be returned.
   ///
   /// [states] - If specified, only results with the specified `state` values
   /// will be
   /// returned. Otherwise, results with a `state` of `PENDING` will be returned.
   ///
-  /// [invitedEmailAddress] - If specified, only results with the specified
-  /// `invited_email_address`
-  /// will be returned.
+  /// [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.
@@ -3588,9 +3732,9 @@
   /// this method will complete with the same error.
   async.Future<ListGuardianInvitationsResponse> list(core.String studentId,
       {core.String pageToken,
-      core.int pageSize,
-      core.List<core.String> states,
       core.String invitedEmailAddress,
+      core.List<core.String> states,
+      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -3605,14 +3749,14 @@
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
+    if (invitedEmailAddress != null) {
+      _queryParams["invitedEmailAddress"] = [invitedEmailAddress];
     }
     if (states != null) {
       _queryParams["states"] = states;
     }
-    if (invitedEmailAddress != null) {
-      _queryParams["invitedEmailAddress"] = [invitedEmailAddress];
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
     }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
@@ -3914,17 +4058,17 @@
   /// 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.
+  /// This filter can only be used by domain administrators.
+  ///
   /// [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.
   ///
-  /// [invitedEmailAddress] - Filter results by the email address that the
-  /// original invitation was sent
-  /// to, resulting in this guardian link.
-  /// This filter can only be used by domain administrators.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -3937,8 +4081,8 @@
   /// this method will complete with the same error.
   async.Future<ListGuardiansResponse> list(core.String studentId,
       {core.String pageToken,
-      core.int pageSize,
       core.String invitedEmailAddress,
+      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -3953,12 +4097,12 @@
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (invitedEmailAddress != null) {
       _queryParams["invitedEmailAddress"] = [invitedEmailAddress];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -5984,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.
@@ -6918,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/googleapis/lib/cloudbilling/v1.dart b/googleapis/lib/cloudbilling/v1.dart
index e3f5104..8cbf241 100644
--- a/googleapis/lib/cloudbilling/v1.dart
+++ b/googleapis/lib/cloudbilling/v1.dart
@@ -95,15 +95,15 @@
   ///
   /// Request parameters:
   ///
-  /// [pageSize] - Requested page size. The maximum page size is 100; this is
-  /// also the
-  /// default.
-  ///
   /// [pageToken] - A token identifying a page of results to return. This should
   /// be a
   /// `next_page_token` value returned from a previous `ListBillingAccounts`
   /// call. If unspecified, the first page of results is returned.
   ///
+  /// [pageSize] - Requested page size. The maximum page size is 100; this is
+  /// also the
+  /// default.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -115,7 +115,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<ListBillingAccountsResponse> list(
-      {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;
@@ -123,12 +123,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];
     }
@@ -153,8 +153,9 @@
       : _requester = client;
 
   /// Lists the projects associated with a billing account. The current
-  /// authenticated user must be an [owner of the billing
-  /// account](https://support.google.com/cloud/answer/4430947).
+  /// authenticated user must have the "billing.resourceAssociations.list" IAM
+  /// permission, which is often given to billing account
+  /// [viewers](https://support.google.com/cloud/answer/4430947).
   ///
   /// Request parameters:
   ///
@@ -163,15 +164,15 @@
   /// you want to list. For example, `billingAccounts/012345-567890-ABCDEF`.
   /// Value must have pattern "^billingAccounts/[^/]+$".
   ///
-  /// [pageSize] - Requested page size. The maximum page size is 100; this is
-  /// also the
-  /// default.
-  ///
   /// [pageToken] - A token identifying a page of results to be returned. This
   /// should be a
   /// `next_page_token` value returned from a previous `ListProjectBillingInfo`
   /// call. If unspecified, the first page of results is returned.
   ///
+  /// [pageSize] - Requested page size. The maximum page size is 100; this is
+  /// also the
+  /// default.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -183,7 +184,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<ListProjectBillingInfoResponse> list(core.String name,
-      {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;
@@ -194,12 +195,12 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name 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];
     }
@@ -368,13 +369,13 @@
   ///
   /// Request parameters:
   ///
-  /// [pageSize] - Requested page size. Defaults to 5000.
-  ///
   /// [pageToken] - A token identifying a page of results to return. This should
   /// be a
   /// `next_page_token` value returned from a previous `ListServices`
   /// call. If unspecified, the first page of results is returned.
   ///
+  /// [pageSize] - Requested page size. Defaults to 5000.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -386,7 +387,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<ListServicesResponse> list(
-      {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;
@@ -394,12 +395,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];
     }
@@ -437,24 +438,26 @@
   /// [endTime] - Optional exclusive end time of the time range for which the
   /// pricing
   /// versions will be returned. Timestamps in the future are not allowed.
-  /// Maximum allowable time range is 1 month (31 days). Time range as a whole
-  /// is optional. If not specified, the latest pricing will be returned (up to
-  /// 12 hours old at most).
-  ///
-  /// [pageSize] - Requested page size. Defaults to 5000.
-  ///
-  /// [startTime] - Optional inclusive start time of the time range for which
-  /// the pricing
-  /// versions will be returned. Timestamps in the future are not allowed.
-  /// Maximum allowable time range is 1 month (31 days). Time range as a whole
-  /// is optional. If not specified, the latest pricing will be returned (up to
-  /// 12 hours old at most).
+  /// The time range has to be within a single calendar month in
+  /// America/Los_Angeles timezone. Time range as a whole is optional. If not
+  /// specified, the latest pricing will be returned (up to 12 hours old at
+  /// most).
   ///
   /// [pageToken] - A token identifying a page of results to return. This should
   /// be a
   /// `next_page_token` value returned from a previous `ListSkus`
   /// call. If unspecified, the first page of results is returned.
   ///
+  /// [startTime] - Optional inclusive start time of the time range for which
+  /// the pricing
+  /// versions will be returned. Timestamps in the future are not allowed.
+  /// The time range has to be within a single calendar month in
+  /// America/Los_Angeles timezone. Time range as a whole is optional. If not
+  /// specified, the latest pricing will be returned (up to 12 hours old at
+  /// most).
+  ///
+  /// [pageSize] - Requested page size. Defaults to 5000.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -468,9 +471,9 @@
   async.Future<ListSkusResponse> list(core.String parent,
       {core.String currencyCode,
       core.String endTime,
-      core.int pageSize,
-      core.String startTime,
       core.String pageToken,
+      core.String startTime,
+      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -488,14 +491,14 @@
     if (endTime != null) {
       _queryParams["endTime"] = [endTime];
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
     }
     if (startTime != null) {
       _queryParams["startTime"] = [startTime];
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
     }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
@@ -973,13 +976,20 @@
   /// doesn't require aggregation.
   AggregationInfo aggregationInfo;
 
-  /// Conversion rate for currency conversion, from USD to the currency
-  /// specified
-  /// in the request. If the currency is not specified this defaults to 1.0.
+  /// Conversion rate used for currency conversion, from USD to the currency
+  /// specified in the request. This includes any surcharge collected for
+  /// billing
+  /// in non USD currency. If a currency is not specified in the request this
+  /// defaults to 1.0.
   /// Example: USD * currency_conversion_rate = JPY
   core.double currencyConversionRate;
 
-  /// The timestamp from which this pricing was effective.
+  /// The timestamp from which this pricing was effective within the requested
+  /// time range. This is guaranteed to be greater than or equal to the
+  /// start_time field in the request and less than the end_time field in the
+  /// request. If a time range was not specified in the request this field will
+  /// be equivalent to a time within the last 12 hours, indicating the latest
+  /// pricing info.
   core.String effectiveTime;
 
   /// Expresses the pricing formula. See `PricingExpression` for an example.
diff --git a/googleapis/lib/cloudbuild/v1.dart b/googleapis/lib/cloudbuild/v1.dart
index 23ea6f2..a7ac5e6 100644
--- a/googleapis/lib/cloudbuild/v1.dart
+++ b/googleapis/lib/cloudbuild/v1.dart
@@ -157,12 +157,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.
   ///
@@ -174,9 +174,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.String filter,
+      core.String pageToken,
       core.int pageSize,
-      core.String filter,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -188,15 +188,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];
     }
@@ -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 filter,
-      core.String pageToken,
+      {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];
     }
@@ -460,6 +460,92 @@
         downloadOptions: _downloadOptions);
     return _response.then((data) => new ListBuildsResponse.fromJson(data));
   }
+
+  /// Creates a new build based on the given build.
+  ///
+  /// This API creates a new build using the original build request,  which may
+  /// or may not result in an identical build.
+  ///
+  /// For triggered builds:
+  ///
+  /// * Triggered builds resolve to a precise revision, so a retry of a
+  /// triggered
+  /// build will result in a build that uses the same revision.
+  ///
+  /// For non-triggered builds that specify RepoSource:
+  ///
+  /// * If the original build built from the tip of a branch, the retried build
+  /// will build from the tip of that branch, which may not be the same revision
+  /// as the original build.
+  /// * If the original build specified a commit sha or revision ID, the retried
+  /// build will use the identical source.
+  ///
+  /// For builds that specify StorageSource:
+  ///
+  /// * If the original build pulled source from Cloud Storage without
+  /// specifying
+  /// the generation of the object, the new build will use the current object,
+  /// which may be different from the original build source.
+  /// * If the original build pulled source from Cloud Storage and specified the
+  /// generation of the object, the new build will attempt to use the same
+  /// object, which may or may not be available depending on the bucket's
+  /// lifecycle management settings.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [projectId] - ID of the project.
+  ///
+  /// [id] - Build ID of the original build.
+  ///
+  /// [$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> retry(
+      RetryBuildRequest request, core.String projectId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' +
+        commons.Escaper.ecapeVariable('$projectId') +
+        '/builds/' +
+        commons.Escaper.ecapeVariable('$id') +
+        ':retry';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
 }
 
 class ProjectsTriggersResourceApi {
@@ -732,6 +818,64 @@
         downloadOptions: _downloadOptions);
     return _response.then((data) => new BuildTrigger.fromJson(data));
   }
+
+  /// Runs a BuildTrigger at a particular source revision.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [projectId] - ID of the project.
+  ///
+  /// [triggerId] - ID of the trigger.
+  ///
+  /// [$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> run(
+      RepoSource request, core.String projectId, core.String triggerId,
+      {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 (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (triggerId == null) {
+      throw new core.ArgumentError("Parameter triggerId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' +
+        commons.Escaper.ecapeVariable('$projectId') +
+        '/triggers/' +
+        commons.Escaper.ecapeVariable('$triggerId') +
+        ':run';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
 }
 
 /// A build resource in the Container Builder API.
@@ -783,7 +927,7 @@
   /// If any of the images fail to be pushed, the build is marked FAILURE.
   core.List<core.String> images;
 
-  /// URL to logs for this build in Google Cloud Logging.
+  /// URL to logs for this build in Google Cloud Console.
   /// @OutputOnly
   core.String logUrl;
 
@@ -852,6 +996,17 @@
   /// 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.
+  /// @OutputOnly
+  core.Map<core.String, TimeSpan> timing;
+
   Build();
 
   Build.fromJson(core.Map _json) {
@@ -918,6 +1073,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() {
@@ -983,6 +1144,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;
   }
 }
@@ -1012,6 +1178,34 @@
 
 /// Optional arguments to enable specific features of builds.
 class BuildOptions {
+  /// Requested disk size for the VM that runs the build. Note that this is
+  /// *NOT*
+  /// "disk free"; some of the space will be used by the operating system and
+  /// build utilities. Also note that this is the minimum disk size that will be
+  /// allocated for the build -- the build may run with a larger disk than
+  /// requested. At present, the maximum disk size is 1000GB; builds that
+  /// request
+  /// more than the maximum are rejected with an error.
+  core.String diskSizeGb;
+
+  /// LogStreamingOption to define build log streaming behavior to Google Cloud
+  /// Storage.
+  /// Possible string values are:
+  /// - "STREAM_DEFAULT" : Service may automatically determine build log
+  /// streaming behavior.
+  /// - "STREAM_ON" : Build logs should be streamed to Google Cloud Storage.
+  /// - "STREAM_OFF" : Build logs should not be streamed to Google Cloud
+  /// Storage; they will be
+  /// written when the build is completed.
+  core.String logStreamingOption;
+
+  /// Compute Engine machine type on which to run the build.
+  /// Possible string values are:
+  /// - "UNSPECIFIED" : Standard machine type.
+  /// - "N1_HIGHCPU_8" : Highcpu machine with 8 CPUs.
+  /// - "N1_HIGHCPU_32" : Highcpu machine with 32 CPUs.
+  core.String machineType;
+
   /// Requested verifiability options.
   /// Possible string values are:
   /// - "NOT_VERIFIED" : Not a verifiable build. (default)
@@ -1032,6 +1226,15 @@
   BuildOptions();
 
   BuildOptions.fromJson(core.Map _json) {
+    if (_json.containsKey("diskSizeGb")) {
+      diskSizeGb = _json["diskSizeGb"];
+    }
+    if (_json.containsKey("logStreamingOption")) {
+      logStreamingOption = _json["logStreamingOption"];
+    }
+    if (_json.containsKey("machineType")) {
+      machineType = _json["machineType"];
+    }
     if (_json.containsKey("requestedVerifyOption")) {
       requestedVerifyOption = _json["requestedVerifyOption"];
     }
@@ -1046,6 +1249,15 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (diskSizeGb != null) {
+      _json["diskSizeGb"] = diskSizeGb;
+    }
+    if (logStreamingOption != null) {
+      _json["logStreamingOption"] = logStreamingOption;
+    }
+    if (machineType != null) {
+      _json["machineType"] = machineType;
+    }
     if (requestedVerifyOption != null) {
       _json["requestedVerifyOption"] = requestedVerifyOption;
     }
@@ -1070,8 +1282,17 @@
   /// and the remainder will be used as arguments.
   core.List<core.String> args;
 
-  /// Working directory (relative to project source root) to use when running
-  /// this operation's container.
+  /// Working directory to use when running this step's container.
+  ///
+  /// If this value is a relative path, it is relative to the build's working
+  /// directory. If this value is absolute, it may be outside the build's
+  /// working
+  /// directory, in which case the contents of the path may not be persisted
+  /// across build step executions, unless a volume for that path is specified.
+  ///
+  /// If the build specifies a RepoSource with dir and a step with a dir which
+  /// specifies an absolute path, the RepoSource dir is ignored for the step's
+  /// execution.
   core.String dir;
 
   /// Optional entrypoint to be used instead of the build step image's default
@@ -1113,6 +1334,10 @@
   /// 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.
+  /// @OutputOnly
+  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
@@ -1154,6 +1379,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();
@@ -1187,6 +1415,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();
     }
@@ -1302,6 +1533,10 @@
   /// presented to `docker push`.
   core.String name;
 
+  /// Stores timing information for pushing the specified image.
+  /// @OutputOnly
+  TimeSpan pushTiming;
+
   BuiltImage();
 
   BuiltImage.fromJson(core.Map _json) {
@@ -1311,6 +1546,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() {
@@ -1322,6 +1560,9 @@
     if (name != null) {
       _json["name"] = name;
     }
+    if (pushTiming != null) {
+      _json["pushTiming"] = (pushTiming).toJson();
+    }
     return _json;
   }
 }
@@ -1624,6 +1865,12 @@
   /// Explicit commit SHA to build.
   core.String commitSha;
 
+  /// Directory, relative to the source root, in which to run the build.
+  ///
+  /// This must be a relative path. If a step's dir is specified and is an
+  /// absolute path, this value is ignored for that step's execution.
+  core.String dir;
+
   /// ID of the project that owns the repo. If omitted, the project ID
   /// requesting
   /// the build is assumed.
@@ -1644,6 +1891,9 @@
     if (_json.containsKey("commitSha")) {
       commitSha = _json["commitSha"];
     }
+    if (_json.containsKey("dir")) {
+      dir = _json["dir"];
+    }
     if (_json.containsKey("projectId")) {
       projectId = _json["projectId"];
     }
@@ -1664,6 +1914,9 @@
     if (commitSha != null) {
       _json["commitSha"] = commitSha;
     }
+    if (dir != null) {
+      _json["dir"] = dir;
+    }
     if (projectId != null) {
       _json["projectId"] = projectId;
     }
@@ -1711,6 +1964,19 @@
   }
 }
 
+/// RetryBuildRequest specifies a build to retry.
+class RetryBuildRequest {
+  RetryBuildRequest();
+
+  RetryBuildRequest.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;
+  }
+}
+
 /// Secret pairs a set of secret environment variables containing encrypted
 /// values with the Cloud KMS key to use to decrypt the value.
 class Secret {
@@ -1994,6 +2260,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/googleapis/lib/clouddebugger/v2.dart b/googleapis/lib/clouddebugger/v2.dart
index 9a08490..17b4660 100644
--- a/googleapis/lib/clouddebugger/v2.dart
+++ b/googleapis/lib/clouddebugger/v2.dart
@@ -21,7 +21,7 @@
   static const CloudPlatformScope =
       "https://www.googleapis.com/auth/cloud-platform";
 
-  /// Manage cloud debugger
+  /// Use Stackdriver Debugger
   static const CloudDebuggerScope =
       "https://www.googleapis.com/auth/cloud_debugger";
 
@@ -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,10 +472,6 @@
   ///
   /// [debuggeeId] - ID of the debuggee whose breakpoints to list.
   ///
-  /// [stripResults] - This field is deprecated. The following fields are always
-  /// 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
@@ -500,6 +496,10 @@
   /// inactive
   /// breakpoints. Otherwise, it includes only active breakpoints.
   ///
+  /// [stripResults] - This field is deprecated. The following fields are always
+  /// stripped out of
+  /// the result: `stack_frames`, `evaluated_expressions` and `variable_table`.
+  ///
   /// [$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.bool stripResults,
-      core.String waitToken,
+      {core.String waitToken,
       core.String clientVersion,
       core.String action_value,
       core.bool includeAllUsers,
       core.bool includeInactive,
+      core.bool stripResults,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -528,9 +528,6 @@
     if (debuggeeId == null) {
       throw new core.ArgumentError("Parameter debuggeeId is required.");
     }
-    if (stripResults != null) {
-      _queryParams["stripResults"] = ["${stripResults}"];
-    }
     if (waitToken != null) {
       _queryParams["waitToken"] = [waitToken];
     }
@@ -546,6 +543,9 @@
     if (includeInactive != null) {
       _queryParams["includeInactive"] = ["${includeInactive}"];
     }
+    if (stripResults != null) {
+      _queryParams["stripResults"] = ["${stripResults}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1022,8 +1022,6 @@
 
   /// References to the locations and revisions of the source code used in the
   /// deployed application.
-  ///
-  /// NOTE: this field is experimental and can be ignored.
   core.List<ExtendedSourceContext> extSourceContexts;
 
   /// Unique identifier for the debuggee generated by the controller service.
diff --git a/googleapis/lib/cloudfunctions/v1.dart b/googleapis/lib/cloudfunctions/v1.dart
index 2ca7ef6..04c6aa7 100644
--- a/googleapis/lib/cloudfunctions/v1.dart
+++ b/googleapis/lib/cloudfunctions/v1.dart
@@ -99,10 +99,10 @@
   ///
   /// [filter] - The standard list filter.
   ///
-  /// [pageToken] - The standard list page token.
-  ///
   /// [name] - The name of the operation's parent resource.
   ///
+  /// [pageToken] - The standard list page token.
+  ///
   /// [pageSize] - The standard list page size.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -117,8 +117,8 @@
   /// this method will complete with the same error.
   async.Future<ListOperationsResponse> list(
       {core.String filter,
-      core.String pageToken,
       core.String name,
+      core.String pageToken,
       core.int pageSize,
       core.String $fields}) {
     var _url = null;
@@ -131,12 +131,12 @@
     if (filter != null) {
       _queryParams["filter"] = [filter];
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (name != null) {
       _queryParams["name"] = [name];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
@@ -181,12 +181,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.
   ///
@@ -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 pageToken,
-      core.int pageSize,
+      {core.int pageSize,
       core.String filter,
+      core.String pageToken,
       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 (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];
     }
@@ -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.
@@ -972,7 +982,7 @@
   ///
   /// If no string is provided, the default service implementing the API will
   /// be used. For example, `storage.googleapis.com` is the default for all
-  /// event types in the 'google.storage` namespace.
+  /// event types in the `google.storage` namespace.
   core.String service;
 
   EventTrigger();
@@ -1408,6 +1418,9 @@
   /// - "DELETE_FUNCTION" : Triggered by DeleteFunction call.
   core.String type;
 
+  /// The last update timestamp of the operation.
+  core.String updateTime;
+
   /// Version id of the function created or updated by an API call.
   /// This field is only pupulated for Create and Update operations.
   core.String versionId;
@@ -1424,6 +1437,9 @@
     if (_json.containsKey("type")) {
       type = _json["type"];
     }
+    if (_json.containsKey("updateTime")) {
+      updateTime = _json["updateTime"];
+    }
     if (_json.containsKey("versionId")) {
       versionId = _json["versionId"];
     }
@@ -1441,6 +1457,9 @@
     if (type != null) {
       _json["type"] = type;
     }
+    if (updateTime != null) {
+      _json["updateTime"] = updateTime;
+    }
     if (versionId != null) {
       _json["versionId"] = versionId;
     }
@@ -1468,6 +1487,9 @@
   /// - "DELETE_FUNCTION" : Triggered by DeleteFunction call.
   core.String type;
 
+  /// The last update timestamp of the operation.
+  core.String updateTime;
+
   /// Version id of the function created or updated by an API call.
   /// This field is only pupulated for Create and Update operations.
   core.String versionId;
@@ -1484,6 +1506,9 @@
     if (_json.containsKey("type")) {
       type = _json["type"];
     }
+    if (_json.containsKey("updateTime")) {
+      updateTime = _json["updateTime"];
+    }
     if (_json.containsKey("versionId")) {
       versionId = _json["versionId"];
     }
@@ -1501,6 +1526,9 @@
     if (type != null) {
       _json["type"] = type;
     }
+    if (updateTime != null) {
+      _json["updateTime"] = updateTime;
+    }
     if (versionId != null) {
       _json["versionId"] = versionId;
     }
diff --git a/googleapis/lib/cloudiot/v1.dart b/googleapis/lib/cloudiot/v1.dart
index edcea0a..9a6c6c5 100644
--- a/googleapis/lib/cloudiot/v1.dart
+++ b/googleapis/lib/cloudiot/v1.dart
@@ -272,17 +272,17 @@
   /// `projects/example-project/locations/us-central1`.
   /// Value must have pattern "^projects/[^/]+/locations/[^/]+$".
   ///
+  /// [pageToken] - The value returned by the last
+  /// `ListDeviceRegistriesResponse`; indicates
+  /// that this is a continuation of a prior `ListDeviceRegistries` call, and
+  /// that the system should return the next page of data.
+  ///
   /// [pageSize] - The maximum number of registries to return in the response.
   /// If this value
   /// is zero, the service will select a default size. A call may return fewer
   /// objects than requested, but if there is a non-empty `page_token`, it
   /// indicates that more entries are available.
   ///
-  /// [pageToken] - The value returned by the last
-  /// `ListDeviceRegistriesResponse`; indicates
-  /// that this is a continuation of a prior `ListDeviceRegistries` call, and
-  /// that the system should return the next page of data.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -294,7 +294,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<ListDeviceRegistriesResponse> 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;
@@ -305,12 +305,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];
     }
@@ -344,8 +344,8 @@
   /// mask.
   /// The field mask must not be empty, and it must not contain fields that
   /// are immutable or only set by the server.
-  /// Mutable top-level fields: `event_notification_config`, `mqtt_config`, and
-  /// `state_notification_config`.
+  /// Mutable top-level fields: `event_notification_config`, `http_config`,
+  /// `mqtt_config`, and `state_notification_config`.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -630,6 +630,10 @@
   /// Value must have pattern
   /// "^projects/[^/]+/locations/[^/]+/registries/[^/]+/devices/[^/]+$".
   ///
+  /// [fieldMask] - The fields of the `Device` resource to be returned in the
+  /// response. If the
+  /// field mask is unset or empty, all fields are returned.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -640,7 +644,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<Device> get(core.String name, {core.String $fields}) {
+  async.Future<Device> get(core.String name,
+      {core.String fieldMask, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -651,6 +656,9 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
+    if (fieldMask != null) {
+      _queryParams["fieldMask"] = [fieldMask];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -675,10 +683,6 @@
   /// Value must have pattern
   /// "^projects/[^/]+/locations/[^/]+/registries/[^/]+$".
   ///
-  /// [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
@@ -700,6 +704,10 @@
   /// 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.
   ///
@@ -711,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> 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();
@@ -727,9 +735,6 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent is required.");
     }
-    if (deviceNumIds != null) {
-      _queryParams["deviceNumIds"] = deviceNumIds;
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
@@ -742,6 +747,9 @@
     if (deviceIds != null) {
       _queryParams["deviceIds"] = deviceIds;
     }
+    if (deviceNumIds != null) {
+      _queryParams["deviceNumIds"] = deviceNumIds;
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1021,7 +1029,7 @@
 /// If there are AuditConfigs for both `allServices` and a specific service,
 /// the union of the two AuditConfigs is used for that service: the log_types
 /// specified in each AuditConfig are enabled, and the exempted_members in each
-/// AuditConfig are exempted.
+/// AuditLogConfig are exempted.
 ///
 /// Example Policy with multiple AuditConfigs:
 ///
@@ -1068,7 +1076,6 @@
   /// The configuration for logging of each type of permission.
   /// Next ID: 4
   core.List<AuditLogConfig> auditLogConfigs;
-  core.List<core.String> exemptedMembers;
 
   /// Specifies a service that will be enabled for audit logging.
   /// For example, `storage.googleapis.com`, `cloudsql.googleapis.com`.
@@ -1083,9 +1090,6 @@
           .map((value) => new AuditLogConfig.fromJson(value))
           .toList();
     }
-    if (_json.containsKey("exemptedMembers")) {
-      exemptedMembers = _json["exemptedMembers"];
-    }
     if (_json.containsKey("service")) {
       service = _json["service"];
     }
@@ -1098,9 +1102,6 @@
       _json["auditLogConfigs"] =
           auditLogConfigs.map((value) => (value).toJson()).toList();
     }
-    if (exemptedMembers != null) {
-      _json["exemptedMembers"] = exemptedMembers;
-    }
     if (service != null) {
       _json["service"] = service;
     }
@@ -1167,13 +1168,6 @@
 
 /// Associates `members` with a `role`.
 class Binding {
-  /// The condition that is associated with this binding.
-  /// NOTE: an unsatisfied condition will not allow user access via current
-  /// binding. Different bindings, including their conditions, are examined
-  /// independently.
-  /// This field is GOOGLE_INTERNAL.
-  Expr condition;
-
   /// Specifies the identities requesting access for a Cloud Platform resource.
   /// `members` can have the following values:
   ///
@@ -1206,9 +1200,6 @@
   Binding();
 
   Binding.fromJson(core.Map _json) {
-    if (_json.containsKey("condition")) {
-      condition = new Expr.fromJson(_json["condition"]);
-    }
     if (_json.containsKey("members")) {
       members = _json["members"];
     }
@@ -1220,9 +1211,6 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
-    if (condition != null) {
-      _json["condition"] = (condition).toJson();
-    }
     if (members != null) {
       _json["members"] = members;
     }
@@ -1289,9 +1277,11 @@
   /// minutes.
   core.String lastEventTime;
 
-  /// [Output only] The last time a heartbeat was received. Timestamps are
-  /// periodically collected and written to storage; they may be stale by a few
-  /// minutes. This field is only for devices connecting through MQTT.
+  /// [Output only] The last time an MQTT `PINGREQ` was received. This field
+  /// applies only to devices connecting through MQTT. MQTT clients usually only
+  /// send `PINGREQ` messages if the connection is idle, and no other messages
+  /// have been sent. Timestamps are periodically collected and written to
+  /// storage; they may be stale by a few minutes.
   core.String lastHeartbeatTime;
 
   /// [Output only] The last time a state event was received. Timestamps are
@@ -1568,7 +1558,11 @@
   /// The configuration for notification of telemetry events received from the
   /// device. All telemetry events that were successfully published by the
   /// device and acknowledged by Cloud IoT Core are guaranteed to be
-  /// delivered to Cloud Pub/Sub. Only the first configuration is used.
+  /// delivered to Cloud Pub/Sub. Only the first configuration is used. If you
+  /// try to publish a device telemetry event using MQTT without specifying a
+  /// Cloud Pub/Sub topic for the device's registry, the connection closes
+  /// automatically. If you try to do so using an HTTP connection, an error
+  /// is returned.
   core.List<EventNotificationConfig> eventNotificationConfigs;
 
   /// The DeviceService (HTTP) configuration for this device registry.
@@ -1720,6 +1714,7 @@
   /// A Cloud Pub/Sub topic name. For example,
   /// `projects/myProject/topics/deviceEvents`.
   core.String pubsubTopicName;
+  core.String subfolderMatches;
 
   EventNotificationConfig();
 
@@ -1727,6 +1722,9 @@
     if (_json.containsKey("pubsubTopicName")) {
       pubsubTopicName = _json["pubsubTopicName"];
     }
+    if (_json.containsKey("subfolderMatches")) {
+      subfolderMatches = _json["subfolderMatches"];
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -1735,67 +1733,8 @@
     if (pubsubTopicName != null) {
       _json["pubsubTopicName"] = pubsubTopicName;
     }
-    return _json;
-  }
-}
-
-/// 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;
+    if (subfolderMatches != null) {
+      _json["subfolderMatches"] = subfolderMatches;
     }
     return _json;
   }
@@ -2076,7 +2015,7 @@
 ///     }
 ///
 /// For a description of IAM and its features, see the
-/// [IAM developer's guide](https://cloud.google.com/iam).
+/// [IAM developer's guide](https://cloud.google.com/iam/docs).
 class Policy {
   /// Specifies cloud audit logging configuration for this policy.
   core.List<AuditConfig> auditConfigs;
@@ -2106,9 +2045,7 @@
         convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
   }
 
-  core.bool iamOwned;
-
-  /// Version of the `Policy`. The default version is 0.
+  /// Deprecated.
   core.int version;
 
   Policy();
@@ -2127,9 +2064,6 @@
     if (_json.containsKey("etag")) {
       etag = _json["etag"];
     }
-    if (_json.containsKey("iamOwned")) {
-      iamOwned = _json["iamOwned"];
-    }
     if (_json.containsKey("version")) {
       version = _json["version"];
     }
@@ -2148,9 +2082,6 @@
     if (etag != null) {
       _json["etag"] = etag;
     }
-    if (iamOwned != null) {
-      _json["iamOwned"] = iamOwned;
-    }
     if (version != null) {
       _json["version"] = version;
     }
diff --git a/googleapis/lib/cloudkms/v1.dart b/googleapis/lib/cloudkms/v1.dart
index cec9f41..dda8d86 100644
--- a/googleapis/lib/cloudkms/v1.dart
+++ b/googleapis/lib/cloudkms/v1.dart
@@ -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.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;
@@ -809,12 +809,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];
     }
@@ -1241,15 +1241,15 @@
   /// Value must have pattern
   /// "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$".
   ///
-  /// [pageToken] - Optional pagination token, returned earlier via
-  /// ListCryptoKeyVersionsResponse.next_page_token.
-  ///
   /// [pageSize] - Optional limit on the number of CryptoKeyVersions to
   /// include in the response. Further CryptoKeyVersions can
   /// subsequently be obtained by including the
   /// ListCryptoKeyVersionsResponse.next_page_token in a subsequent request.
   /// If unspecified, the server will pick an appropriate default.
   ///
+  /// [pageToken] - Optional pagination token, returned earlier via
+  /// ListCryptoKeyVersionsResponse.next_page_token.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1261,7 +1261,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<ListCryptoKeyVersionsResponse> 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;
@@ -1272,12 +1272,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];
     }
@@ -1427,7 +1427,7 @@
 /// If there are AuditConfigs for both `allServices` and a specific service,
 /// the union of the two AuditConfigs is used for that service: the log_types
 /// specified in each AuditConfig are enabled, and the exempted_members in each
-/// AuditConfig are exempted.
+/// AuditLogConfig are exempted.
 ///
 /// Example Policy with multiple AuditConfigs:
 ///
@@ -1474,7 +1474,6 @@
   /// The configuration for logging of each type of permission.
   /// Next ID: 4
   core.List<AuditLogConfig> auditLogConfigs;
-  core.List<core.String> exemptedMembers;
 
   /// Specifies a service that will be enabled for audit logging.
   /// For example, `storage.googleapis.com`, `cloudsql.googleapis.com`.
@@ -1489,9 +1488,6 @@
           .map((value) => new AuditLogConfig.fromJson(value))
           .toList();
     }
-    if (_json.containsKey("exemptedMembers")) {
-      exemptedMembers = _json["exemptedMembers"];
-    }
     if (_json.containsKey("service")) {
       service = _json["service"];
     }
@@ -1504,9 +1500,6 @@
       _json["auditLogConfigs"] =
           auditLogConfigs.map((value) => (value).toJson()).toList();
     }
-    if (exemptedMembers != null) {
-      _json["exemptedMembers"] = exemptedMembers;
-    }
     if (service != null) {
       _json["service"] = service;
     }
@@ -1573,13 +1566,6 @@
 
 /// Associates `members` with a `role`.
 class Binding {
-  /// The condition that is associated with this binding.
-  /// NOTE: an unsatisfied condition will not allow user access via current
-  /// binding. Different bindings, including their conditions, are examined
-  /// independently.
-  /// This field is GOOGLE_INTERNAL.
-  Expr condition;
-
   /// Specifies the identities requesting access for a Cloud Platform resource.
   /// `members` can have the following values:
   ///
@@ -1612,9 +1598,6 @@
   Binding();
 
   Binding.fromJson(core.Map _json) {
-    if (_json.containsKey("condition")) {
-      condition = new Expr.fromJson(_json["condition"]);
-    }
     if (_json.containsKey("members")) {
       members = _json["members"];
     }
@@ -1626,9 +1609,6 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
-    if (condition != null) {
-      _json["condition"] = (condition).toJson();
-    }
     if (members != null) {
       _json["members"] = members;
     }
@@ -1648,7 +1628,8 @@
   /// Output only. The time at which this CryptoKey was created.
   core.String createTime;
 
-  /// Labels with user defined metadata.
+  /// Labels with user-defined metadata. For more information, see
+  /// [Labeling Keys](/kms/docs/labeling-keys).
   core.Map<core.String, core.String> labels;
 
   /// Output only. The resource name for this CryptoKey in the format
@@ -2017,68 +1998,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;
-  }
-}
-
 /// A KeyRing is a toplevel logical grouping of CryptoKeys.
 class KeyRing {
   /// Output only. The time at which this KeyRing was created.
@@ -2371,7 +2290,7 @@
 ///     }
 ///
 /// For a description of IAM and its features, see the
-/// [IAM developer's guide](https://cloud.google.com/iam).
+/// [IAM developer's guide](https://cloud.google.com/iam/docs).
 class Policy {
   /// Specifies cloud audit logging configuration for this policy.
   core.List<AuditConfig> auditConfigs;
@@ -2401,9 +2320,7 @@
         convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
   }
 
-  core.bool iamOwned;
-
-  /// Version of the `Policy`. The default version is 0.
+  /// Deprecated.
   core.int version;
 
   Policy();
@@ -2422,9 +2339,6 @@
     if (_json.containsKey("etag")) {
       etag = _json["etag"];
     }
-    if (_json.containsKey("iamOwned")) {
-      iamOwned = _json["iamOwned"];
-    }
     if (_json.containsKey("version")) {
       version = _json["version"];
     }
@@ -2443,9 +2357,6 @@
     if (etag != null) {
       _json["etag"] = etag;
     }
-    if (iamOwned != null) {
-      _json["iamOwned"] = iamOwned;
-    }
     if (version != null) {
       _json["version"] = version;
     }
diff --git a/googleapis/lib/cloudresourcemanager/v1.dart b/googleapis/lib/cloudresourcemanager/v1.dart
index ae92ea1..88f4749 100644
--- a/googleapis/lib/cloudresourcemanager/v1.dart
+++ b/googleapis/lib/cloudresourcemanager/v1.dart
@@ -483,15 +483,15 @@
   ///
   /// Request parameters:
   ///
+  /// [parent] - The name of the resource to list all attached Liens.
+  /// For example, `projects/1234`.
+  ///
   /// [pageToken] - The `next_page_token` value returned from a previous List
   /// request, if any.
   ///
   /// [pageSize] - The maximum number of items to return. This is a suggestion
   /// for the server.
   ///
-  /// [parent] - The name of the resource to list all attached Liens.
-  /// For example, `projects/1234`.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -503,9 +503,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<ListLiensResponse> list(
-      {core.String pageToken,
+      {core.String parent,
+      core.String pageToken,
       core.int pageSize,
-      core.String parent,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -514,15 +514,15 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
+    if (parent != null) {
+      _queryParams["parent"] = [parent];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
-    if (parent != null) {
-      _queryParams["parent"] = [parent];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1538,7 +1538,10 @@
   /// Permission is denied if the policy or the resource does not exist.
   ///
   /// Authorization requires the Google IAM permission
-  /// `resourcemanager.projects.getIamPolicy` on the project
+  /// `resourcemanager.projects.getIamPolicy` on the project.
+  ///
+  /// For additional information about resource structure and identification,
+  /// see [Resource Names](/apis/design/resource_names).
   ///
   /// [request] - The metadata request object.
   ///
@@ -1650,10 +1653,26 @@
 
   /// 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:
@@ -1687,18 +1706,6 @@
   ///
   /// 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 +1717,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 filter,
-      core.String pageToken,
+      {core.String pageToken,
       core.int pageSize,
+      core.String filter,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1721,15 +1728,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 +1859,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 +1892,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
@@ -2203,7 +2211,7 @@
 /// If there are AuditConfigs for both `allServices` and a specific service,
 /// the union of the two AuditConfigs is used for that service: the log_types
 /// specified in each AuditConfig are enabled, and the exempted_members in each
-/// AuditConfig are exempted.
+/// AuditLogConfig are exempted.
 ///
 /// Example Policy with multiple AuditConfigs:
 ///
@@ -3549,9 +3557,10 @@
   /// @OutputOnly
   core.String creationTime;
 
-  /// A friendly string to be used to refer to the Organization in the UI.
-  /// Assigned by the server, set to the primary domain of the G Suite
-  /// customer that owns the organization.
+  /// A human-readable string that refers to the Organization in the
+  /// GCP Console UI. This string is set by the server and cannot be
+  /// changed. The string will be set to the primary domain (for example,
+  /// "google.com") of the G Suite customer that owns the organization.
   /// @OutputOnly
   core.String displayName;
 
@@ -3676,7 +3685,7 @@
 ///     }
 ///
 /// For a description of IAM and its features, see the
-/// [IAM developer's guide](https://cloud.google.com/iam).
+/// [IAM developer's guide](https://cloud.google.com/iam/docs).
 class Policy {
   /// Specifies cloud audit logging configuration for this policy.
   core.List<AuditConfig> auditConfigs;
@@ -3706,7 +3715,7 @@
         convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
   }
 
-  /// Version of the `Policy`. The default version is 0.
+  /// Deprecated.
   core.int version;
 
   Policy();
@@ -3805,8 +3814,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/googleapis/lib/cloudresourcemanager/v2beta1.dart b/googleapis/lib/cloudresourcemanager/v2beta1.dart
index 483c68c..e192646 100644
--- a/googleapis/lib/cloudresourcemanager/v2beta1.dart
+++ b/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,10 @@
   ///
   /// Request parameters:
   ///
+  /// [showDeleted] - Controls whether Folders in the
+  /// DELETE_REQUESTED
+  /// state should be returned. Defaults to false. This field is optional.
+  ///
   /// [pageToken] - A pagination token returned from a previous call to
   /// `ListFolders`
   /// that indicates where this listing should continue from.
@@ -296,10 +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.
-  ///
   /// [$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.String pageToken,
+      {core.bool showDeleted,
+      core.String pageToken,
       core.int pageSize,
       core.String parent,
-      core.bool showDeleted,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -323,6 +326,9 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
+    if (showDeleted != null) {
+      _queryParams["showDeleted"] = ["${showDeleted}"];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
@@ -332,9 +338,6 @@
     if (parent != null) {
       _queryParams["parent"] = [parent];
     }
-    if (showDeleted != null) {
-      _queryParams["showDeleted"] = ["${showDeleted}"];
-    }
     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.
   ///
@@ -718,7 +725,7 @@
 /// If there are AuditConfigs for both `allServices` and a specific service,
 /// the union of the two AuditConfigs is used for that service: the log_types
 /// specified in each AuditConfig are enabled, and the exempted_members in each
-/// AuditConfig are exempted.
+/// AuditLogConfig are exempted.
 ///
 /// Example Policy with multiple AuditConfigs:
 ///
@@ -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();
@@ -1275,7 +1284,7 @@
 ///     }
 ///
 /// For a description of IAM and its features, see the
-/// [IAM developer's guide](https://cloud.google.com/iam).
+/// [IAM developer's guide](https://cloud.google.com/iam/docs).
 class Policy {
   /// Specifies cloud audit logging configuration for this policy.
   core.List<AuditConfig> auditConfigs;
@@ -1305,7 +1314,7 @@
         convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
   }
 
-  /// Version of the `Policy`. The default version is 0.
+  /// Deprecated.
   core.int version;
 
   Policy();
@@ -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/googleapis/lib/cloudshell/v1.dart b/googleapis/lib/cloudshell/v1.dart
new file mode 100644
index 0000000..0f5ad91
--- /dev/null
+++ b/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$".
+  ///
+  /// [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.
+  ///
+  /// 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 filter,
+      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 (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 ($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/googleapis/lib/cloudtrace/v1.dart b/googleapis/lib/cloudtrace/v1.dart
index c86285c..3863162 100644
--- a/googleapis/lib/cloudtrace/v1.dart
+++ b/googleapis/lib/cloudtrace/v1.dart
@@ -14,10 +14,9 @@
 
 const core.String USER_AGENT = 'dart-api-client cloudtrace/v1';
 
-/// Send and retrieve trace data from Stackdriver Trace. Data is generated and
-/// available by default for all App Engine applications. Data from other
-/// applications can be written to Stackdriver Trace for display, reporting, and
-/// analysis.
+/// 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.
 class CloudtraceApi {
   /// View and manage your data across Google Cloud Platform services
   static const CloudPlatformScope =
@@ -170,34 +169,6 @@
   ///
   /// [projectId] - ID of the Cloud project where the trace data is stored.
   ///
-  /// [pageSize] - Maximum number of traces to return. If not specified or <= 0,
-  /// the
-  /// implementation selects a reasonable value.  The implementation may
-  /// return fewer traces than the requested page size. Optional.
-  ///
-  /// [view] - Type of data returned for traces in the list. Optional. Default
-  /// is
-  /// `MINIMAL`.
-  /// Possible string values are:
-  /// - "VIEW_TYPE_UNSPECIFIED" : A VIEW_TYPE_UNSPECIFIED.
-  /// - "MINIMAL" : A MINIMAL.
-  /// - "ROOTSPAN" : A ROOTSPAN.
-  /// - "COMPLETE" : A COMPLETE.
-  ///
-  /// [orderBy] - Field used to sort the returned traces. Optional.
-  /// Can be one of the following:
-  ///
-  /// *   `trace_id`
-  /// *   `name` (`name` field of root span in the trace)
-  /// *   `duration` (difference between `end_time` and `start_time` fields of
-  ///      the root span)
-  /// *   `start` (`start_time` field of the root span)
-  ///
-  /// Descending order can be specified by appending `desc` to the sort field
-  /// (for example, `name desc`).
-  ///
-  /// Only one sort field is permitted.
-  ///
   /// [filter] - An optional filter against labels for the request.
   ///
   /// By default, searches use prefix matching. To specify exact match, prepend
@@ -233,13 +204,41 @@
   /// data was
   /// collected from the application.
   ///
+  /// [startTime] - Start of the time interval (inclusive) during which the
+  /// trace data was
+  /// collected from the application.
+  ///
   /// [pageToken] - Token identifying the page of results to return. If
   /// provided, use the
   /// value of the `next_page_token` field from a previous request. Optional.
   ///
-  /// [startTime] - Start of the time interval (inclusive) during which the
-  /// trace data was
-  /// collected from the application.
+  /// [pageSize] - Maximum number of traces to return. If not specified or <= 0,
+  /// the
+  /// implementation selects a reasonable value.  The implementation may
+  /// return fewer traces than the requested page size. Optional.
+  ///
+  /// [view] - Type of data returned for traces in the list. Optional. Default
+  /// is
+  /// `MINIMAL`.
+  /// Possible string values are:
+  /// - "VIEW_TYPE_UNSPECIFIED" : A VIEW_TYPE_UNSPECIFIED.
+  /// - "MINIMAL" : A MINIMAL.
+  /// - "ROOTSPAN" : A ROOTSPAN.
+  /// - "COMPLETE" : A COMPLETE.
+  ///
+  /// [orderBy] - Field used to sort the returned traces. Optional.
+  /// Can be one of the following:
+  ///
+  /// *   `trace_id`
+  /// *   `name` (`name` field of root span in the trace)
+  /// *   `duration` (difference between `end_time` and `start_time` fields of
+  ///      the root span)
+  /// *   `start` (`start_time` field of the root span)
+  ///
+  /// Descending order can be specified by appending `desc` to the sort field
+  /// (for example, `name desc`).
+  ///
+  /// Only one sort field is permitted.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -252,13 +251,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<ListTracesResponse> list(core.String projectId,
-      {core.int pageSize,
+      {core.String filter,
+      core.String endTime,
+      core.String startTime,
+      core.String pageToken,
+      core.int pageSize,
       core.String view,
       core.String orderBy,
-      core.String filter,
-      core.String endTime,
-      core.String pageToken,
-      core.String startTime,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -270,6 +269,18 @@
     if (projectId == null) {
       throw new core.ArgumentError("Parameter projectId is required.");
     }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
+    if (endTime != null) {
+      _queryParams["endTime"] = [endTime];
+    }
+    if (startTime != null) {
+      _queryParams["startTime"] = [startTime];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
@@ -279,18 +290,6 @@
     if (orderBy != null) {
       _queryParams["orderBy"] = [orderBy];
     }
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
-    if (endTime != null) {
-      _queryParams["endTime"] = [endTime];
-    }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
-    if (startTime != null) {
-      _queryParams["startTime"] = [startTime];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/googleapis/lib/cloudtrace/v2.dart b/googleapis/lib/cloudtrace/v2.dart
index 96a8426..1393d50 100644
--- a/googleapis/lib/cloudtrace/v2.dart
+++ b/googleapis/lib/cloudtrace/v2.dart
@@ -14,10 +14,9 @@
 
 const core.String USER_AGENT = 'dart-api-client cloudtrace/v2';
 
-/// Send and retrieve trace data from Stackdriver Trace. Data is generated and
-/// available by default for all App Engine applications. Data from other
-/// applications can be written to Stackdriver Trace for display, reporting, and
-/// analysis.
+/// 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.
 class CloudtraceApi {
   /// View and manage your data across Google Cloud Platform services
   static const CloudPlatformScope =
@@ -55,19 +54,16 @@
 
   ProjectsTracesResourceApi(commons.ApiRequester client) : _requester = client;
 
-  /// Sends new spans to Stackdriver Trace or updates existing traces. If the
-  /// name of a trace that you send matches that of an existing trace, new spans
-  /// are added to the existing trace. Attempt to update existing spans results
-  /// undefined behavior. If the name does not match, a new trace is created
-  /// with given set of spans.
+  /// Sends new spans to new or existing traces. You cannot update
+  /// existing spans.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [name] - Required. Name of the project where the spans belong. The format
-  /// is
-  /// `projects/PROJECT_ID`.
+  /// [name] - Required. The name of the project where the spans belong. The
+  /// format is
+  /// `projects/[PROJECT_ID]`.
   /// Value must have pattern "^projects/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -120,7 +116,7 @@
   ProjectsTracesSpansResourceApi(commons.ApiRequester client)
       : _requester = client;
 
-  /// Creates a new Span.
+  /// Creates a new span.
   ///
   /// [request] - The metadata request object.
   ///
@@ -129,9 +125,11 @@
   /// [name] - The resource name of the span in the following format:
   ///
   /// projects/[PROJECT_ID]/traces/[TRACE_ID]/spans/SPAN_ID is a unique
-  /// identifier for a trace within a project.
-  /// [SPAN_ID] is a unique identifier for a span within a trace,
-  /// assigned when the span is created.
+  /// identifier for a trace within a project;
+  /// it is a 32-character hexadecimal encoding of a 16-byte array.
+  ///
+  /// [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/[^/]+/spans/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -144,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();
@@ -165,7 +163,7 @@
 
     _url = 'v2/' + commons.Escaper.ecapeVariableReserved('$name');
 
-    var _response = _requester.request(_url, "PUT",
+    var _response = _requester.request(_url, "POST",
         body: _body,
         queryParams: _queryParams,
         uploadOptions: _uploadOptions,
@@ -177,7 +175,7 @@
 
 /// Text annotation with a set of attributes.
 class Annotation {
-  /// A set of attributes on the annotation. There is a limit of 4 attributes
+  /// A set of attributes on the annotation. You can have up to 4 attributes
   /// per Annotation.
   Attributes attributes;
 
@@ -299,7 +297,8 @@
 
 /// The request message for the `BatchWriteSpans` method.
 class BatchWriteSpansRequest {
-  /// A collection of spans.
+  /// A list of new spans. The span names must not match existing
+  /// spans, or the results are undefined.
   core.List<Span> spans;
 
   BatchWriteSpansRequest();
@@ -346,14 +345,14 @@
 /// where a single batch handler processes multiple requests from different
 /// traces or when the handler receives a request from a different project.
 class Link {
-  /// A set of attributes on the link. There is a limit of 32 attributes per
+  /// A set of attributes on the link. You have have up to  32 attributes per
   /// link.
   Attributes attributes;
 
-  /// `SPAN_ID` identifies a span within a trace.
+  /// The [SPAN_ID] for a span within a trace.
   core.String spanId;
 
-  /// `TRACE_ID` identifies a trace within a project.
+  /// The [TRACE_ID] for a trace within a project.
   core.String traceId;
 
   /// The relationship of the current span relative to the linked span.
@@ -532,7 +531,7 @@
 /// or none at all. Spans do not need to be contiguous&mdash;there may be
 /// gaps or overlaps between spans in a trace.
 class Span {
-  /// A set of attributes on the span. There is a limit of 32 attributes per
+  /// A set of attributes on the span. You can have up to 32 attributes per
   /// span.
   Attributes attributes;
 
@@ -555,24 +554,27 @@
   /// is the time when the server application handler stops running.
   core.String endTime;
 
-  /// A maximum of 128 links are allowed per Span.
+  /// Links associated with the span. You can have up to 128 links per Span.
   Links links;
 
   /// The resource name of the span in the following format:
   ///
   /// projects/[PROJECT_ID]/traces/[TRACE_ID]/spans/SPAN_ID is a unique
-  /// identifier for a trace within a project.
-  /// [SPAN_ID] is a unique identifier for a span within a trace,
-  /// assigned when the span is created.
+  /// identifier for a trace within a project;
+  /// it is a 32-character hexadecimal encoding of a 16-byte array.
+  ///
+  /// [SPAN_ID] is a unique identifier for a span within a trace; it
+  /// is a 16-character hexadecimal encoding of an 8-byte array.
   core.String name;
 
   /// The [SPAN_ID] of this span's parent span. If this is a root span,
   /// then this field must be empty.
   core.String parentSpanId;
 
-  /// A highly recommended but not required flag that identifies when a trace
-  /// crosses a process boundary. True when the parent_span belongs to the
-  /// same process as the current span.
+  /// (Optional) Set this parameter to indicate whether this span is in
+  /// the same process as its parent. If you do not set this parameter,
+  /// Stackdriver Trace is unable to take advantage of this helpful
+  /// information.
   core.bool sameProcessAsParentSpan;
 
   /// The [SPAN_ID] portion of the span's resource name.
@@ -590,8 +592,7 @@
   /// An optional final status for this span.
   Status status;
 
-  /// The included time events. There can be up to 32 annotations and 128
-  /// message
+  /// A set of time events. You can have up to 32 annotations and 128 message
   /// events per span.
   TimeEvents timeEvents;
 
@@ -1040,12 +1041,13 @@
   /// value is 0, then the string was not shortened.
   core.int truncatedByteCount;
 
-  /// The shortened string. For example, if the original string was 500
-  /// bytes long and the limit of the string was 128 bytes, then this
-  /// value contains the first 128 bytes of the 500-byte string. Note that
-  /// truncation always happens on the character boundary, to ensure that
-  /// truncated string is still valid UTF8. In case of multi-byte characters,
-  /// size of truncated string can be less than truncation limit.
+  /// The shortened string. For example, if the original string is 500
+  /// bytes long and the limit of the string is 128 bytes, then
+  /// `value` contains the first 128 bytes of the 500-byte string.
+  ///
+  /// Truncation always happens on a UTF8 character boundary. If there
+  /// are multi-byte characters in the string, then the length of the
+  /// shortened string might be less than the size limit.
   core.String value;
 
   TruncatableString();
diff --git a/googleapis/lib/compute/v1.dart b/googleapis/lib/compute/v1.dart
index df1852f..1872a21 100644
--- a/googleapis/lib/compute/v1.dart
+++ b/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.
   ///
@@ -3976,7 +3977,7 @@
   }
 
   /// Updates the specified firewall rule with the data included in the request.
-  /// Using PUT method, can only update following fields of firewall rule:
+  /// The PUT method can only update the following fields of firewall rule:
   /// allowed, description, sourceRanges, sourceTags, targetTags.
   ///
   /// [request] - The metadata request object.
@@ -7320,8 +7321,8 @@
     return _response.then((data) => new Operation.fromJson(data));
   }
 
-  /// Retrieves the list of private images available to the specified project.
-  /// Private images are images you create that belong to your project. This
+  /// Retrieves the list of custom images available to the specified project.
+  /// Custom images are images you create that belong to your project. This
   /// method does not get any images that belong to other projects, including
   /// publicly-available images, like Debian 8. If you want to get a list of
   /// publicly-available images, use this method to make a request to the
@@ -9474,11 +9475,9 @@
   InstanceTemplatesResourceApi(commons.ApiRequester client)
       : _requester = client;
 
-  /// Deletes the specified instance template. If you delete an instance
-  /// template that is being referenced from another instance group, the
-  /// instance group will not be able to create or recreate virtual machine
-  /// instances. Deleting an instance template is permanent and cannot be
-  /// undone.
+  /// Deletes the specified instance template. Deleting an instance template is
+  /// permanent and cannot be undone. It's not possible to delete templates
+  /// which are in use by an instance group.
   ///
   /// Request parameters:
   ///
@@ -10672,6 +10671,133 @@
     return _response.then((data) => new InstanceList.fromJson(data));
   }
 
+  /// Retrieves the list of referrers to instances contained within the
+  /// specified zone.
+  ///
+  /// Request parameters:
+  ///
+  /// [project] - Project ID for this request.
+  /// Value must have pattern
+  /// "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+  ///
+  /// [zone] - The name of the zone for this request.
+  /// Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+  ///
+  /// [instance] - Name of the target instance scoping this request, or '-' if
+  /// the request should span over all instances in the container.
+  /// Value must have pattern "-|[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+  ///
+  /// [filter] - Sets a filter {expression} for filtering listed resources. Your
+  /// {expression} must be in the format: field_name comparison_string
+  /// literal_string.
+  ///
+  /// The field_name is the name of the field you want to compare. Only atomic
+  /// field types are supported (string, number, boolean). The comparison_string
+  /// must be either eq (equals) or ne (not equals). The literal_string is the
+  /// string value to filter to. The literal value must be valid for the type of
+  /// field you are filtering by (string, number, boolean). For string fields,
+  /// the literal value is interpreted as a regular expression using RE2 syntax.
+  /// The literal value must match the entire field.
+  ///
+  /// For example, to filter for instances that do not have a name of
+  /// example-instance, you would use name ne example-instance.
+  ///
+  /// You can filter on nested fields. For example, you could filter on
+  /// instances that have set the scheduling.automaticRestart field to true. Use
+  /// filtering on nested fields to take advantage of labels to organize and
+  /// search for results based on label values.
+  ///
+  /// To filter on multiple expressions, provide each separate expression within
+  /// parentheses. For example, (scheduling.automaticRestart eq true) (zone eq
+  /// us-central1-f). Multiple expressions are treated as AND expressions,
+  /// meaning that resources must match all expressions to pass the filters.
+  ///
+  /// [maxResults] - The maximum number of results per page that should be
+  /// returned. If the number of available results is larger than maxResults,
+  /// Compute Engine returns a nextPageToken that can be used to get the next
+  /// page of results in subsequent list requests. Acceptable values are 0 to
+  /// 500, inclusive. (Default: 500)
+  ///
+  /// [orderBy] - Sorts list results by a certain order. By default, results are
+  /// returned in alphanumerical order based on the resource name.
+  ///
+  /// You can also sort results in descending order based on the creation
+  /// timestamp using orderBy="creationTimestamp desc". This sorts results based
+  /// on the creationTimestamp field in reverse chronological order (newest
+  /// result first). Use this to sort resources like operations so that the
+  /// newest operation is returned first.
+  ///
+  /// Currently, only sorting by name or creationTimestamp desc is supported.
+  ///
+  /// [pageToken] - Specifies a page token to use. Set pageToken to the
+  /// nextPageToken returned by a previous list request to get the next page of
+  /// results.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [InstanceListReferrers].
+  ///
+  /// 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<InstanceListReferrers> listReferrers(
+      core.String project, core.String zone, core.String instance,
+      {core.String filter,
+      core.int maxResults,
+      core.String orderBy,
+      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 (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instance == null) {
+      throw new core.ArgumentError("Parameter instance is required.");
+    }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (orderBy != null) {
+      _queryParams["orderBy"] = [orderBy];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = commons.Escaper.ecapeVariable('$project') +
+        '/zones/' +
+        commons.Escaper.ecapeVariable('$zone') +
+        '/instances/' +
+        commons.Escaper.ecapeVariable('$instance') +
+        '/referrers';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new InstanceListReferrers.fromJson(data));
+  }
+
   /// Performs a reset on the instance. For more information, see Resetting an
   /// instance.
   ///
@@ -11880,6 +12006,104 @@
         downloadOptions: _downloadOptions);
     return _response.then((data) => new Operation.fromJson(data));
   }
+
+  /// Updates the specified access config from an instance's network interface
+  /// with the data included in the request. This method supports PATCH
+  /// semantics and uses the JSON merge patch format and processing rules.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [project] - Project ID for this request.
+  /// Value must have pattern
+  /// "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+  ///
+  /// [zone] - The name of the zone for this request.
+  /// Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+  ///
+  /// [instance] - The instance name for this request.
+  /// Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+  ///
+  /// [networkInterface] - The name of the network interface where the access
+  /// config is attached.
+  ///
+  /// [requestId] - An optional request ID to identify requests. Specify a
+  /// unique request ID so that if you must retry your request, the server will
+  /// know to ignore the request if it has already been completed.
+  ///
+  /// For example, consider a situation where you make an initial request and
+  /// the request times out. If you make the request again with the same request
+  /// ID, the server can check if original operation with the same request ID
+  /// was received, and if so, will ignore the second request. This prevents
+  /// clients from accidentally creating duplicate commitments.
+  ///
+  /// The request ID must be a valid UUID with the exception that zero UUID is
+  /// not supported (00000000-0000-0000-0000-000000000000).
+  ///
+  /// [$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> updateAccessConfig(
+      AccessConfig request,
+      core.String project,
+      core.String zone,
+      core.String instance,
+      core.String networkInterface,
+      {core.String requestId,
+      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 (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instance == null) {
+      throw new core.ArgumentError("Parameter instance is required.");
+    }
+    if (networkInterface == null) {
+      throw new core.ArgumentError("Parameter networkInterface is required.");
+    }
+    _queryParams["networkInterface"] = [networkInterface];
+    if (requestId != null) {
+      _queryParams["requestId"] = [requestId];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = commons.Escaper.ecapeVariable('$project') +
+        '/zones/' +
+        commons.Escaper.ecapeVariable('$zone') +
+        '/instances/' +
+        commons.Escaper.ecapeVariable('$instance') +
+        '/updateAccessConfig';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
 }
 
 class InterconnectAttachmentsResourceApi {
@@ -13621,7 +13845,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.
   ///
@@ -15283,8 +15508,8 @@
   /// [region] - Name of the region scoping this request.
   /// Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
   ///
-  /// [backendService] - Name of the BackendService resource to which the
-  /// queried instance belongs.
+  /// [backendService] - Name of the BackendService resource for which to get
+  /// health.
   /// Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -25394,8 +25619,9 @@
   /// The number of the guest accelerator cards exposed to this instance.
   core.int acceleratorCount;
 
-  /// Full or partial URL of the accelerator type resource to expose to this
-  /// instance.
+  /// Full or partial URL of the accelerator type resource to attach to this
+  /// instance. If you are creating an instance template, specify only the
+  /// accelerator name.
   core.String acceleratorType;
 
   AcceleratorConfig();
@@ -25422,7 +25648,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;
@@ -25452,7 +25679,8 @@
   core.String selfLink;
 
   /// [Output Only] The name of the zone where the accelerator type resides,
-  /// such as us-central1-a.
+  /// such as us-central1-a. You must specify this field as part of the HTTP
+  /// request URL. It is not settable as a field in the request body.
   core.String zone;
 
   AcceleratorType();
@@ -26055,6 +26283,14 @@
   /// the zone of the instance.
   core.String natIP;
 
+  /// The DNS domain name for the public PTR record. This field can only be set
+  /// when the set_public_ptr field is enabled.
+  core.String publicPtrDomainName;
+
+  /// Specifies whether a public DNS ?PTR? record should be created to map the
+  /// external IP address of the instance to a DNS domain name.
+  core.bool setPublicPtr;
+
   /// The type of configuration. The default and only option is ONE_TO_ONE_NAT.
   /// Possible string values are:
   /// - "ONE_TO_ONE_NAT"
@@ -26072,6 +26308,12 @@
     if (_json.containsKey("natIP")) {
       natIP = _json["natIP"];
     }
+    if (_json.containsKey("publicPtrDomainName")) {
+      publicPtrDomainName = _json["publicPtrDomainName"];
+    }
+    if (_json.containsKey("setPublicPtr")) {
+      setPublicPtr = _json["setPublicPtr"];
+    }
     if (_json.containsKey("type")) {
       type = _json["type"];
     }
@@ -26089,6 +26331,12 @@
     if (natIP != null) {
       _json["natIP"] = natIP;
     }
+    if (publicPtrDomainName != null) {
+      _json["publicPtrDomainName"] = publicPtrDomainName;
+    }
+    if (setPublicPtr != null) {
+      _json["setPublicPtr"] = setPublicPtr;
+    }
     if (type != null) {
       _json["type"] = type;
     }
@@ -26096,12 +26344,15 @@
   }
 }
 
-/// 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;
 
-  /// The type of address to reserve. If unspecified, defaults to EXTERNAL.
+  /// The type of address to reserve, either INTERNAL or EXTERNAL. If
+  /// unspecified, defaults to EXTERNAL.
   /// Possible string values are:
   /// - "EXTERNAL"
   /// - "INTERNAL"
@@ -26140,7 +26391,9 @@
   core.String name;
 
   /// [Output Only] URL of the region where the regional address resides. This
-  /// field is not applicable to global addresses.
+  /// field is not applicable to global addresses. You must specify this field
+  /// as part of the HTTP request URL. You cannot set this field in the request
+  /// body.
   core.String region;
 
   /// [Output Only] Server-defined URL for the resource.
@@ -26156,10 +26409,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.
@@ -26999,9 +27252,9 @@
 
   /// Specifies the disk type to use to create the instance. If not specified,
   /// the default is pd-standard, specified using the full URL. For example:
-  ///
   /// https://www.googleapis.com/compute/v1/projects/project/zones/zone/diskTypes/pd-standard
   ///
+  ///
   /// Other values include pd-ssd and local-ssd. If you define this field, you
   /// can provide either the full or partial URL. For example, the following are
   /// valid values:
@@ -27012,6 +27265,11 @@
   /// the name of the disk type, not URL.
   core.String diskType;
 
+  /// Labels to apply to this disk. These can be later modified by the
+  /// disks.setLabels method. This field is only applicable for persistent
+  /// disks.
+  core.Map<core.String, core.String> labels;
+
   /// The source image to create this disk. When creating a new instance, one of
   /// initializeParams.sourceImage or disks.source is required except for local
   /// SSD.
@@ -27019,23 +27277,23 @@
   /// To create a disk with one of the public operating system images, specify
   /// the image by its family name. For example, specify family/debian-8 to use
   /// the latest Debian 8 image:
-  ///
   /// projects/debian-cloud/global/images/family/debian-8
   ///
-  /// Alternatively, use a specific version of a public operating system image:
   ///
+  /// Alternatively, use a specific version of a public operating system image:
   /// projects/debian-cloud/global/images/debian-8-jessie-vYYYYMMDD
   ///
-  /// To create a disk with a private image that you created, specify the image
+  ///
+  /// To create a disk with a custom image that you created, specify the image
   /// name in the following format:
+  /// global/images/my-custom-image
   ///
-  /// global/images/my-private-image
   ///
-  /// You can also specify a private image by its image family, which returns
-  /// the latest version of the image in that family. Replace the image name
-  /// with family/family-name:
+  /// You can also specify a custom image by its image family, which returns the
+  /// latest version of the image in that family. Replace the image name with
+  /// family/family-name:
+  /// global/images/family/my-image-family
   ///
-  /// global/images/family/my-private-family
   ///
   /// If the source image is deleted later, this field will not be set.
   core.String sourceImage;
@@ -27060,6 +27318,9 @@
     if (_json.containsKey("diskType")) {
       diskType = _json["diskType"];
     }
+    if (_json.containsKey("labels")) {
+      labels = _json["labels"];
+    }
     if (_json.containsKey("sourceImage")) {
       sourceImage = _json["sourceImage"];
     }
@@ -27081,6 +27342,9 @@
     if (diskType != null) {
       _json["diskType"] = diskType;
     }
+    if (labels != null) {
+      _json["labels"] = labels;
+    }
     if (sourceImage != null) {
       _json["sourceImage"] = sourceImage;
     }
@@ -27094,7 +27358,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,
@@ -28423,7 +28689,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
@@ -28532,7 +28799,9 @@
   core.String protocol;
 
   /// [Output Only] URL of the region where the regional backend service
-  /// resides. This field is not applicable to global backend services.
+  /// resides. This field is not applicable to global backend services. You must
+  /// specify this field as part of the HTTP request URL. It is not settable as
+  /// a field in the request body.
   core.String region;
 
   /// [Output Only] Server-defined URL for the resource.
@@ -29423,7 +29692,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;
@@ -30257,7 +30527,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;
@@ -30347,23 +30618,22 @@
   /// To create a disk with one of the public operating system images, specify
   /// the image by its family name. For example, specify family/debian-8 to use
   /// the latest Debian 8 image:
-  ///
   /// projects/debian-cloud/global/images/family/debian-8
   ///
-  /// Alternatively, use a specific version of a public operating system image:
   ///
+  /// Alternatively, use a specific version of a public operating system image:
   /// projects/debian-cloud/global/images/debian-8-jessie-vYYYYMMDD
   ///
-  /// To create a disk with a private image that you created, specify the image
+  ///
+  /// To create a disk with a custom image that you created, specify the image
   /// name in the following format:
+  /// global/images/my-custom-image
   ///
-  /// global/images/my-private-image
   ///
-  /// You can also specify a private image by its image family, which returns
-  /// the latest version of the image in that family. Replace the image name
-  /// with family/family-name:
-  ///
-  /// global/images/family/my-private-family
+  /// You can also specify a custom image by its image family, which returns the
+  /// latest version of the image in that family. Replace the image name with
+  /// family/family-name:
+  /// global/images/family/my-image-family
   core.String sourceImage;
 
   /// The customer-supplied encryption key of the source image. Required if the
@@ -30407,14 +30677,17 @@
   core.String status;
 
   /// URL of the disk type resource describing which disk type to use to create
-  /// the disk. Provide this when creating the disk.
+  /// the disk. Provide this when creating the disk. For example:
+  /// project/zones/zone/diskTypes/pd-standard or pd-ssd
   core.String type;
 
   /// [Output Only] Links to the users of the disk (attached instances) in form:
   /// project/zones/zone/instances/instance
   core.List<core.String> users;
 
-  /// [Output Only] URL of the zone where the disk resides.
+  /// [Output Only] URL of the zone where the disk resides. You must specify
+  /// this field as part of the HTTP request URL. It is not settable as a field
+  /// in the request body.
   core.String zone;
 
   Disk();
@@ -30982,7 +31255,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;
@@ -31014,7 +31288,9 @@
   /// as "10GB-10TB".
   core.String validDiskSize;
 
-  /// [Output Only] URL of the zone where the disk type resides.
+  /// [Output Only] URL of the zone where the disk type resides. You must
+  /// specify this field as part of the HTTP request URL. It is not settable as
+  /// a field in the request body.
   core.String zone;
 
   DiskType();
@@ -31846,7 +32122,7 @@
   core.String creationTimestamp;
 
   /// The list of DENY rules specified by this firewall. Each rule specifies a
-  /// protocol and port-range tuple that describes a permitted connection.
+  /// protocol and port-range tuple that describes a denied connection.
   core.List<FirewallDenied> denied;
 
   /// An optional description of this resource. Provide this property when you
@@ -32256,7 +32532,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.
   ///
@@ -32370,11 +32650,10 @@
   /// - TargetHttpProxy: 80, 8080
   /// - TargetHttpsProxy: 443
   /// - TargetTcpProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995,
-  /// 1883, 5222
+  /// 1688, 1883, 5222
   /// - TargetSslProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995,
-  /// 1883, 5222
+  /// 1688, 1883, 5222
   /// - TargetVpnGateway: 500, 4500
-  /// -
   core.String portRange;
 
   /// This field is used along with the backend_service field for internal load
@@ -32389,7 +32668,9 @@
   core.List<core.String> ports;
 
   /// [Output Only] URL of the region where the regional forwarding rule
-  /// resides. This field is not applicable to global forwarding rules.
+  /// resides. This field is not applicable to global forwarding rules. You must
+  /// specify this field as part of the HTTP request URL. It is not settable as
+  /// a field in the request body.
   core.String region;
 
   /// [Output Only] Server-defined URL for the resource.
@@ -32410,8 +32691,6 @@
   /// forwarding rule. For global forwarding rules, this target must be a global
   /// load balancing resource. The forwarded traffic must be of a type
   /// appropriate to the target object.
-  ///
-  /// This field is not used for internal load balancing.
   core.String target;
 
   ForwardingRule();
@@ -33092,11 +33371,11 @@
 
 /// 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"
+  /// - "MULTI_IP_SUBNET"
   /// - "VIRTIO_SCSI_MULTIQUEUE"
   /// - "WINDOWS"
   core.String type;
@@ -34430,7 +34709,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).
@@ -34455,15 +34735,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
@@ -34918,7 +35192,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
@@ -34978,17 +35253,17 @@
   /// in the format: zones/zone/machineTypes/machine-type. This is provided by
   /// the client when the instance is created. For example, the following is a
   /// valid partial url to a predefined machine type:
-  ///
   /// zones/us-central1-f/machineTypes/n1-standard-1
   ///
+  ///
   /// To create a custom machine type, provide a URL to a machine type in the
   /// following format, where CPUS is 1 or an even number up to 32 (2, 4, 6, ...
   /// 24, etc), and MEMORY is the total memory for this instance. Memory must be
   /// a multiple of 256 MB and must be supplied in MB (e.g. 5 GB of memory is
   /// 5120 MB):
-  ///
   /// zones/zone/machineTypes/custom-CPUS-MEMORY
   ///
+  ///
   /// For example: zones/us-central1-f/machineTypes/custom-4-5120
   ///
   /// For a full list of restrictions, read the Specifications for custom
@@ -35060,7 +35335,9 @@
   /// method. Each tag within the list must comply with RFC1035.
   Tags tags;
 
-  /// [Output Only] URL of the zone where the instance resides.
+  /// [Output Only] URL of the zone where the instance resides. You must specify
+  /// this field as part of the HTTP request URL. It is not settable as a field
+  /// in the request body.
   core.String zone;
 
   Instance();
@@ -35415,6 +35692,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.
@@ -35944,7 +36224,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
@@ -37554,6 +37837,187 @@
   }
 }
 
+class InstanceListReferrersWarningData {
+  /// [Output Only] A key that provides more detail on the warning being
+  /// returned. For example, for warnings where there are no results in a list
+  /// request for a particular zone, this key might be scope and the key value
+  /// might be the zone name. Other examples might be a key indicating a
+  /// deprecated resource and a suggested replacement, or a warning about
+  /// invalid network settings (for example, if an instance attempts to perform
+  /// IP forwarding but is not enabled for IP forwarding).
+  core.String key;
+
+  /// [Output Only] A warning data value corresponding to the key.
+  core.String value;
+
+  InstanceListReferrersWarningData();
+
+  InstanceListReferrersWarningData.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;
+  }
+}
+
+/// [Output Only] Informational warning message.
+class InstanceListReferrersWarning {
+  /// [Output Only] A warning code, if applicable. For example, Compute Engine
+  /// returns NO_RESULTS_ON_PAGE if there are no results in the response.
+  /// Possible string values are:
+  /// - "CLEANUP_FAILED"
+  /// - "DEPRECATED_RESOURCE_USED"
+  /// - "DEPRECATED_TYPE_USED"
+  /// - "DISK_SIZE_LARGER_THAN_IMAGE_SIZE"
+  /// - "EXPERIMENTAL_TYPE_USED"
+  /// - "EXTERNAL_API_WARNING"
+  /// - "FIELD_VALUE_OVERRIDEN"
+  /// - "INJECTED_KERNELS_DEPRECATED"
+  /// - "MISSING_TYPE_DEPENDENCY"
+  /// - "NEXT_HOP_ADDRESS_NOT_ASSIGNED"
+  /// - "NEXT_HOP_CANNOT_IP_FORWARD"
+  /// - "NEXT_HOP_INSTANCE_NOT_FOUND"
+  /// - "NEXT_HOP_INSTANCE_NOT_ON_NETWORK"
+  /// - "NEXT_HOP_NOT_RUNNING"
+  /// - "NOT_CRITICAL_ERROR"
+  /// - "NO_RESULTS_ON_PAGE"
+  /// - "REQUIRED_TOS_AGREEMENT"
+  /// - "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
+  /// - "RESOURCE_NOT_DELETED"
+  /// - "SCHEMA_VALIDATION_IGNORED"
+  /// - "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
+  /// - "UNDECLARED_PROPERTIES"
+  /// - "UNREACHABLE"
+  core.String code;
+
+  /// [Output Only] Metadata about this warning in key: value format. For
+  /// example:
+  /// "data": [ { "key": "scope", "value": "zones/us-east1-d" }
+  core.List<InstanceListReferrersWarningData> data;
+
+  /// [Output Only] A human-readable description of the warning code.
+  core.String message;
+
+  InstanceListReferrersWarning();
+
+  InstanceListReferrersWarning.fromJson(core.Map _json) {
+    if (_json.containsKey("code")) {
+      code = _json["code"];
+    }
+    if (_json.containsKey("data")) {
+      data = _json["data"]
+          .map((value) => new InstanceListReferrersWarningData.fromJson(value))
+          .toList();
+    }
+    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 (data != null) {
+      _json["data"] = data.map((value) => (value).toJson()).toList();
+    }
+    if (message != null) {
+      _json["message"] = message;
+    }
+    return _json;
+  }
+}
+
+/// Contains a list of instance referrers.
+class InstanceListReferrers {
+  /// [Output Only] Unique identifier for the resource; defined by the server.
+  core.String id;
+
+  /// A list of Reference resources.
+  core.List<Reference> items;
+
+  /// [Output Only] Type of resource. Always compute#instanceListReferrers for
+  /// lists of Instance referrers.
+  core.String kind;
+
+  /// [Output Only] This token allows you to get the next page of results for
+  /// list requests. If the number of results is larger than maxResults, use the
+  /// nextPageToken as a value for the query parameter pageToken in the next
+  /// list request. Subsequent list requests will have their own nextPageToken
+  /// to continue paging through the results.
+  core.String nextPageToken;
+
+  /// [Output Only] Server-defined URL for this resource.
+  core.String selfLink;
+
+  /// [Output Only] Informational warning message.
+  InstanceListReferrersWarning warning;
+
+  InstanceListReferrers();
+
+  InstanceListReferrers.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("items")) {
+      items =
+          _json["items"].map((value) => new Reference.fromJson(value)).toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("selfLink")) {
+      selfLink = _json["selfLink"];
+    }
+    if (_json.containsKey("warning")) {
+      warning = new InstanceListReferrersWarning.fromJson(_json["warning"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (items != null) {
+      _json["items"] = items.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (selfLink != null) {
+      _json["selfLink"] = selfLink;
+    }
+    if (warning != null) {
+      _json["warning"] = (warning).toJson();
+    }
+    return _json;
+  }
+}
+
 class InstanceMoveRequest {
   /// The URL of the destination zone to move the instance. This can be a full
   /// or partial URL. For example, the following are all valid URLs to a zone:
@@ -37769,7 +38233,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.
@@ -38407,14 +38872,15 @@
   }
 }
 
-/// Protocol definitions for Mixer API to support Interconnect. Next available
-/// tag: 25
+/// 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. (== 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 may carry traffic (assuming there are
-  /// functional InterconnectAttachments and other requirements are satisfied).
-  /// When set to ?false?, no packets will be carried over this Interconnect and
-  /// no BGP routes will be exchanged over it. By default, it is set to ?true?.
+  /// Administrative status of the interconnect. When this is set to true, the
+  /// Interconnect is functional and can carry traffic. When set to false, no
+  /// packets can be carried over the interconnect and no BGP routes are
+  /// exchanged over it. By default, the status is set to true.
   core.bool adminEnabled;
 
   /// [Output Only] List of CircuitInfo objects, that describe the individual
@@ -38451,7 +38917,8 @@
   /// to use this Interconnect.
   core.List<core.String> interconnectAttachments;
 
-  ///
+  /// Type of interconnect. Note that "IT_PRIVATE" has been deprecated in favor
+  /// of "DEDICATED"
   /// Possible string values are:
   /// - "DEDICATED"
   /// - "IT_PRIVATE"
@@ -38461,7 +38928,9 @@
   /// interconnects.
   core.String kind;
 
-  ///
+  /// Type of link requested. This field indicates speed of each of the links in
+  /// the bundle, not the entire bundle. Only 10G per link is allowed for a
+  /// dedicated interconnect. Options: Ethernet_10G_LR
   /// Possible string values are:
   /// - "LINK_TYPE_ETHERNET_10G_LR"
   core.String linkType;
@@ -38488,10 +38957,8 @@
   /// [Output Only] The current status of whether or not this Interconnect is
   /// functional.
   /// Possible string values are:
-  /// - "ACTIVE"
   /// - "OS_ACTIVE"
   /// - "OS_UNPROVISIONED"
-  /// - "UNPROVISIONED"
   core.String operationalStatus;
 
   /// [Output Only] IP address configured on the customer side of the
@@ -38653,8 +39120,10 @@
   }
 }
 
-/// Protocol definitions for Mixer API to support InterconnectAttachment. Next
-/// available tag: 23
+/// Represents an InterconnectAttachment (VLAN attachment) resource. For more
+/// 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.
@@ -38667,8 +39136,7 @@
   /// customer router subinterface for this interconnect attachment.
   core.String customerRouterIpAddress;
 
-  /// An optional description of this resource. Provide this property when you
-  /// create the resource.
+  /// An optional description of this resource.
   core.String description;
 
   /// [Output Only] Google reference ID, to be used when raising support tickets
@@ -38699,19 +39167,18 @@
   /// [Output Only] The current status of whether or not this interconnect
   /// attachment is functional.
   /// Possible string values are:
-  /// - "ACTIVE"
   /// - "OS_ACTIVE"
   /// - "OS_UNPROVISIONED"
-  /// - "UNPROVISIONED"
   core.String operationalStatus;
 
-  /// [Output Only] Information specific to a Private InterconnectAttachment.
-  /// Only populated if the interconnect that this is attached is of type
-  /// IT_PRIVATE.
+  /// [Output Only] Information specific to an InterconnectAttachment. This
+  /// property is populated if the interconnect that this is attached to is of
+  /// type DEDICATED.
   InterconnectAttachmentPrivateInfo privateInterconnectInfo;
 
   /// [Output Only] URL of the region where the regional interconnect attachment
-  /// resides.
+  /// resides. You must specify this field as part of the HTTP request URL. It
+  /// is not settable as a field in the request body.
   core.String region;
 
   /// URL of the cloud router to be used for dynamic routing. This router must
@@ -39194,8 +39661,8 @@
   }
 }
 
-/// Private information for an interconnect attachment when this belongs to an
-/// interconnect of type IT_PRIVATE.
+/// Information for an interconnect attachment when this belongs to an
+/// interconnect of type DEDICATED.
 class InterconnectAttachmentPrivateInfo {
   /// [Output Only] 802.1q encapsulation tag to be used for traffic between
   /// Google and the customer, going to and from this network and region.
@@ -39368,8 +39835,7 @@
 /// CircuitInfo objects are created by Google, so all fields are output only.
 /// Next id: 4
 class InterconnectCircuitInfo {
-  /// Customer-side demarc ID for this circuit. This will only be set if it was
-  /// provided by the Customer to Google during circuit turn-up.
+  /// Customer-side demarc ID for this circuit.
   core.String customerDemarcId;
 
   /// Google-assigned unique ID for this circuit. Assigned at circuit turn-up.
@@ -39591,24 +40057,25 @@
   }
 }
 
-/// Protocol definitions for Mixer API to support InterconnectLocation.
+/// Represents an InterconnectLocations resource. The InterconnectLocations
+/// resource describes the locations where you can connect to Google's networks.
+/// For more information, see  Colocation Facilities.
 class InterconnectLocation {
   /// [Output Only] The postal address of the Point of Presence, each line in
   /// the address is separated by a newline character.
   core.String address;
 
-  /// Availability zone for this location. Within a city, maintenance will not
-  /// be simultaneously scheduled in more than one availability zone. Example:
-  /// "zone1" or "zone2".
+  /// [Output Only] Availability zone for this location. Within a metropolitan
+  /// area (metro), maintenance will not be simultaneously scheduled in more
+  /// than one availability zone. Example: "zone1" or "zone2".
   core.String availabilityZone;
 
-  /// City designator used by the Interconnect UI to locate this
-  /// InterconnectLocation within the Continent. For example: "Chicago, IL",
-  /// "Amsterdam, Netherlands".
+  /// [Output Only] Metropolitan area designator that indicates which city an
+  /// interconnect is located. For example: "Chicago, IL", "Amsterdam,
+  /// Netherlands".
   core.String city;
 
-  /// Continent for this location. Used by the location picker in the
-  /// Interconnect UI.
+  /// [Output Only] Continent for this location.
   /// Possible string values are:
   /// - "AFRICA"
   /// - "ASIA_PAC"
@@ -39995,11 +40462,14 @@
   /// that will be affected.
   core.List<core.String> affectedCircuits;
 
-  /// Short user-visible description of the purpose of the outage.
+  /// A description about the purpose of the outage.
   core.String description;
+
+  /// Scheduled end time for the outage (milliseconds since Unix epoch).
   core.String endTime;
 
-  ///
+  /// Form this outage is expected to take. Note that the "IT_" versions of this
+  /// enum have been deprecated in favor of the unprefixed values.
   /// Possible string values are:
   /// - "IT_OUTAGE"
   /// - "IT_PARTIAL_OUTAGE"
@@ -40010,17 +40480,18 @@
   /// Unique identifier for this outage notification.
   core.String name;
 
-  ///
+  /// The party that generated this notification. Note that "NSRC_GOOGLE" has
+  /// been deprecated in favor of "GOOGLE"
   /// Possible string values are:
   /// - "GOOGLE"
   /// - "NSRC_GOOGLE"
   core.String source;
 
-  /// Scheduled start and end times for the outage (milliseconds since Unix
-  /// epoch).
+  /// Scheduled start time for the outage (milliseconds since Unix epoch).
   core.String startTime;
 
-  ///
+  /// State of this notification. Note that the "NS_" versions of this enum have
+  /// been deprecated in favor of the unprefixed values.
   /// Possible string values are:
   /// - "ACTIVE"
   /// - "CANCELLED"
@@ -40162,7 +40633,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;
@@ -40854,6 +41326,8 @@
   /// - REFRESHING The managed instance group is applying configuration changes
   /// to the instance without stopping it. For example, the group can update the
   /// target pool list for an instance without stopping that instance.
+  /// - VERIFYING The managed instance group has created the instance and it is
+  /// in the process of being verified.
   /// Possible string values are:
   /// - "ABANDONING"
   /// - "CREATING"
@@ -41152,7 +41626,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
@@ -41935,7 +42410,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;
@@ -41991,7 +42470,9 @@
   core.int progress;
 
   /// [Output Only] The URL of the region where the operation resides. Only
-  /// available when performing regional operations.
+  /// available when performing regional operations. You must specify this field
+  /// as part of the HTTP request URL. It is not settable as a field in the
+  /// request body.
   core.String region;
 
   /// [Output Only] Server-defined URL for the resource.
@@ -42031,7 +42512,9 @@
   core.List<OperationWarnings> warnings;
 
   /// [Output Only] The URL of the zone where the operation resides. Only
-  /// available when performing per-zone operations.
+  /// available when performing per-zone operations. You must specify this field
+  /// as part of the HTTP request URL. It is not settable as a field in the
+  /// request body.
   core.String zone;
 
   Operation();
@@ -42796,9 +43279,9 @@
   }
 }
 
-/// 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.
+/// A Project resource. For an overview of projects, see  Cloud Platform
+/// Resource Hierarchy. (== 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.
@@ -43070,6 +43553,8 @@
   /// - "INSTANCE_GROUPS"
   /// - "INSTANCE_GROUP_MANAGERS"
   /// - "INSTANCE_TEMPLATES"
+  /// - "INTERCONNECTS"
+  /// - "INTERNAL_ADDRESSES"
   /// - "IN_USE_ADDRESSES"
   /// - "LOCAL_SSD_TOTAL_GB"
   /// - "NETWORKS"
@@ -43077,6 +43562,8 @@
   /// - "NVIDIA_P100_GPUS"
   /// - "PREEMPTIBLE_CPUS"
   /// - "PREEMPTIBLE_LOCAL_SSD_GB"
+  /// - "PREEMPTIBLE_NVIDIA_K80_GPUS"
+  /// - "PREEMPTIBLE_NVIDIA_P100_GPUS"
   /// - "REGIONAL_AUTOSCALERS"
   /// - "REGIONAL_INSTANCE_GROUP_MANAGERS"
   /// - "ROUTERS"
@@ -43132,7 +43619,61 @@
   }
 }
 
-/// Region resource.
+/// Represents a reference to a resource.
+class Reference {
+  /// [Output Only] Type of the resource. Always compute#reference for
+  /// references.
+  core.String kind;
+
+  /// A description of the reference type with no implied semantics. Possible
+  /// values include:
+  /// - MEMBER_OF
+  core.String referenceType;
+
+  /// URL of the resource which refers to the target.
+  core.String referrer;
+
+  /// URL of the resource to which this reference points.
+  core.String target;
+
+  Reference();
+
+  Reference.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("referenceType")) {
+      referenceType = _json["referenceType"];
+    }
+    if (_json.containsKey("referrer")) {
+      referrer = _json["referrer"];
+    }
+    if (_json.containsKey("target")) {
+      target = _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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (referenceType != null) {
+      _json["referenceType"] = referenceType;
+    }
+    if (referrer != null) {
+      _json["referrer"] = referrer;
+    }
+    if (target != null) {
+      _json["target"] = target;
+    }
+    return _json;
+  }
+}
+
+/// Region resource. (== resource_for beta.regions ==) (== resource_for
+/// v1.regions ==)
 class Region {
   /// [Output Only] Creation timestamp in RFC3339 text format.
   core.String creationTimestamp;
@@ -44582,7 +45123,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;
@@ -44992,7 +45533,9 @@
   /// URI of the network to which this router belongs.
   core.String network;
 
-  /// [Output Only] URI of the region where the router resides.
+  /// [Output Only] URI of the region where the router resides. You must specify
+  /// this field as part of the HTTP request URL. It is not settable as a field
+  /// in the request body.
   core.String region;
 
   /// [Output Only] Server-defined URL for the resource.
@@ -46179,7 +46722,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;
@@ -46587,7 +47131,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
@@ -46866,7 +47411,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;
@@ -46876,8 +47422,7 @@
   core.String description;
 
   /// [Output Only] The gateway address for default routes to reach destination
-  /// addresses outside this subnetwork. This field can be set only at resource
-  /// creation time.
+  /// addresses outside this subnetwork.
   core.String gatewayAddress;
 
   /// [Output Only] The unique identifier for the resource. This identifier is
@@ -47723,7 +48268,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;
@@ -48016,7 +48563,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;
@@ -48302,7 +48851,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;
@@ -48347,7 +48897,9 @@
   /// [Output Only] Server-defined URL for the resource.
   core.String selfLink;
 
-  /// [Output Only] URL of the zone where the target instance resides.
+  /// [Output Only] URL of the zone where the target instance resides. You must
+  /// specify this field as part of the HTTP request URL. It is not settable as
+  /// a field in the request body.
   core.String zone;
 
   TargetInstance();
@@ -48928,7 +49480,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
@@ -49846,7 +50399,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;
@@ -50184,7 +50739,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;
@@ -50464,7 +51021,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;
@@ -50499,7 +51057,9 @@
   /// client when the VPN gateway is created.
   core.String network;
 
-  /// [Output Only] URL of the region where the target VPN gateway resides.
+  /// [Output Only] URL of the region where the target VPN gateway resides. You
+  /// must specify this field as part of the HTTP request URL. It is not
+  /// settable as a field in the request body.
   core.String region;
 
   /// [Output Only] Server-defined URL for the resource.
@@ -51205,8 +51765,9 @@
   /// [Output Only] Server-defined URL for the resource.
   core.String selfLink;
 
-  /// The list of expected URL mappings. Request to update this UrlMap will
-  /// succeed only if all of the test cases pass.
+  /// The list of expected URL mapping tests. Request to update this UrlMap will
+  /// succeed only if all of the test cases pass. You can specify a maximum of
+  /// 100 tests per UrlMap.
   core.List<UrlMapTest> tests;
 
   UrlMap();
@@ -51682,6 +52243,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;
@@ -51721,7 +52284,9 @@
   /// IP address of the peer VPN gateway. Only IPv4 is supported.
   core.String peerIp;
 
-  /// [Output Only] URL of the region where the VPN tunnel resides.
+  /// [Output Only] URL of the region where the VPN tunnel resides. You must
+  /// specify this field as part of the HTTP request URL. It is not settable as
+  /// a field in the request body.
   core.String region;
 
   /// Remote traffic selectors to use when establishing the VPN tunnel with peer
@@ -51758,8 +52323,8 @@
   /// - "WAITING_FOR_FULL_CONFIG"
   core.String status;
 
-  /// URL of the VPN gateway with which this VPN tunnel is associated. Provided
-  /// by the client when the VPN tunnel is created.
+  /// URL of the Target VPN gateway with which this VPN tunnel is associated.
+  /// Provided by the client when the VPN tunnel is created.
   core.String targetVpnGateway;
 
   VpnTunnel();
@@ -52601,7 +53166,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/googleapis/lib/consumersurveys/v2.dart b/googleapis/lib/consumersurveys/v2.dart
deleted file mode 100644
index c18fff7..0000000
--- a/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/googleapis/lib/container/v1.dart b/googleapis/lib/container/v1.dart
index 0454c31..31cc62b 100644
--- a/googleapis/lib/container/v1.dart
+++ b/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;
@@ -2395,9 +2395,7 @@
   /// auto-generated name. Do not use this and a node_pool at the same time.
   core.int initialNodeCount;
 
-  /// [Output only] The resource URLs of [instance
-  /// groups](/compute/docs/instance-groups/) associated with this
-  /// cluster.
+  /// Deprecated. Use node_pools.instance_group_urls.
   core.List<core.String> instanceGroupUrls;
 
   /// Configuration for cluster IP allocation.
@@ -3644,8 +3642,16 @@
   /// Keys must conform to the regexp [a-zA-Z0-9-_]+ and be less than 128 bytes
   /// in length. These are reflected as part of a URL in the metadata server.
   /// Additionally, to avoid ambiguity, keys must not conflict with any other
-  /// metadata keys for the project or be one of the four reserved keys:
-  /// "instance-template", "kube-env", "startup-script", and "user-data"
+  /// metadata keys for the project or be one of the reserved keys:
+  ///  "cluster-name"
+  ///  "cluster-uid"
+  ///  "configure-sh"
+  ///  "gci-update-strategy"
+  ///  "gci-ensure-gke-docker"
+  ///  "instance-template"
+  ///  "kube-env"
+  ///  "startup-script"
+  ///  "user-data"
   ///
   /// Values are free-form strings, and only have meaning as interpreted by
   /// the image running in the instance. The only restriction placed on them is
@@ -3849,9 +3855,9 @@
   /// firewall and routes quota.
   core.int initialNodeCount;
 
-  /// [Output only] The resource URLs of [instance
-  /// groups](/compute/docs/instance-groups/) associated with this
-  /// node pool.
+  /// [Output only] The resource URLs of the [managed instance
+  /// groups](/compute/docs/instance-groups/creating-groups-of-managed-instances)
+  /// associated with this node pool.
   core.List<core.String> instanceGroupUrls;
 
   /// NodeManagement configuration for this NodePool.
@@ -3890,7 +3896,7 @@
   /// node pool instance, if available.
   core.String statusMessage;
 
-  /// [Output only] The version of the Kubernetes of this node.
+  /// The version of the Kubernetes of this node.
   core.String version;
 
   NodePool();
@@ -4157,7 +4163,7 @@
   }
 }
 
-/// Container Engine service configuration.
+/// Kubernetes Engine service configuration.
 class ServerConfig {
   /// Version of Kubernetes the service deploys by default.
   core.String defaultClusterVersion;
@@ -4246,7 +4252,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.
@@ -4586,10 +4592,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/googleapis/lib/content/v2.dart b/googleapis/lib/content/v2.dart
index 297a6ed..cf849c0 100644
--- a/googleapis/lib/content/v2.dart
+++ b/googleapis/lib/content/v2.dart
@@ -87,14 +87,13 @@
         .then((data) => new AccountsAuthInfoResponse.fromJson(data));
   }
 
-  /// Claims the website of a Merchant Center sub-account. This method can only
-  /// be called for accounts to which the managing account has access: either
-  /// the managing account itself for any Merchant Center account, or any
-  /// sub-account when the managing account is a multi-client account.
+  /// Claims the website of a Merchant Center sub-account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. If this parameter is not
+  /// the same as accountId, then this account must be a multi-client account
+  /// and accountId must be the ID of a sub-account of this account.
   ///
   /// [accountId] - The ID of the account whose website is claimed.
   ///
@@ -202,12 +201,12 @@
         .then((data) => new AccountsCustomBatchResponse.fromJson(data));
   }
 
-  /// Deletes a Merchant Center sub-account. This method can only be called for
-  /// multi-client accounts.
+  /// Deletes a Merchant Center sub-account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. This must be a multi-client
+  /// account, and accountId must be the ID of a sub-account of this account.
   ///
   /// [accountId] - The ID of the account.
   ///
@@ -264,14 +263,13 @@
     return _response.then((data) => null);
   }
 
-  /// Retrieves a Merchant Center account. This method can only be called for
-  /// accounts to which the managing account has access: either the managing
-  /// account itself for any Merchant Center account, or any sub-account when
-  /// the managing account is a multi-client account.
+  /// Retrieves a Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. If this parameter is not
+  /// the same as accountId, then this account must be a multi-client account
+  /// and accountId must be the ID of a sub-account of this account.
   ///
   /// [accountId] - The ID of the account.
   ///
@@ -317,14 +315,14 @@
     return _response.then((data) => new Account.fromJson(data));
   }
 
-  /// Creates a Merchant Center sub-account. This method can only be called for
-  /// multi-client accounts.
+  /// Creates a Merchant Center sub-account.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. This must be a multi-client
+  /// account.
   ///
   /// [dryRun] - Flag to run the request in dry-run mode.
   ///
@@ -371,12 +369,12 @@
     return _response.then((data) => new Account.fromJson(data));
   }
 
-  /// Lists the sub-accounts in your Merchant Center account. This method can
-  /// only be called for multi-client accounts.
+  /// Lists the sub-accounts in your Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. This must be a multi-client
+  /// account.
   ///
   /// [maxResults] - The maximum number of accounts to return in the response,
   /// used for paging.
@@ -426,17 +424,15 @@
     return _response.then((data) => new AccountsListResponse.fromJson(data));
   }
 
-  /// Updates a Merchant Center account. This method can only be called for
-  /// accounts to which the managing account has access: either the managing
-  /// account itself for any Merchant Center account, or any sub-account when
-  /// the managing account is a multi-client account. This method supports patch
-  /// semantics.
+  /// Updates a Merchant Center account. This method supports patch semantics.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. If this parameter is not
+  /// the same as accountId, then this account must be a multi-client account
+  /// and accountId must be the ID of a sub-account of this account.
   ///
   /// [accountId] - The ID of the account.
   ///
@@ -491,16 +487,15 @@
     return _response.then((data) => new Account.fromJson(data));
   }
 
-  /// Updates a Merchant Center account. This method can only be called for
-  /// accounts to which the managing account has access: either the managing
-  /// account itself for any Merchant Center account, or any sub-account when
-  /// the managing account is a multi-client account.
+  /// Updates a Merchant Center account.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. If this parameter is not
+  /// the same as accountId, then this account must be a multi-client account
+  /// and accountId must be the ID of a sub-account of this account.
   ///
   /// [accountId] - The ID of the account.
   ///
@@ -604,14 +599,13 @@
         .then((data) => new AccountstatusesCustomBatchResponse.fromJson(data));
   }
 
-  /// Retrieves the status of a Merchant Center account. This method can only be
-  /// called for accounts to which the managing account has access: either the
-  /// managing account itself for any Merchant Center account, or any
-  /// sub-account when the managing account is a multi-client account.
+  /// Retrieves the status of a Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. If this parameter is not
+  /// the same as accountId, then this account must be a multi-client account
+  /// and accountId must be the ID of a sub-account of this account.
   ///
   /// [accountId] - The ID of the account.
   ///
@@ -658,11 +652,11 @@
   }
 
   /// Lists the statuses of the sub-accounts in your Merchant Center account.
-  /// This method can only be called for multi-client accounts.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. This must be a multi-client
+  /// account.
   ///
   /// [maxResults] - The maximum number of account statuses to return in the
   /// response, used for paging.
@@ -771,14 +765,13 @@
         .then((data) => new AccounttaxCustomBatchResponse.fromJson(data));
   }
 
-  /// Retrieves the tax settings of the account. This method can only be called
-  /// for accounts to which the managing account has access: either the managing
-  /// account itself for any Merchant Center account, or any sub-account when
-  /// the managing account is a multi-client account.
+  /// Retrieves the tax settings of the account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. If this parameter is not
+  /// the same as accountId, then this account must be a multi-client account
+  /// and accountId must be the ID of a sub-account of this account.
   ///
   /// [accountId] - The ID of the account for which to get/update account tax
   /// settings.
@@ -826,11 +819,12 @@
   }
 
   /// Lists the tax settings of the sub-accounts in your Merchant Center
-  /// account. This method can only be called for multi-client accounts.
+  /// account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. This must be a multi-client
+  /// account.
   ///
   /// [maxResults] - The maximum number of tax settings to return in the
   /// response, used for paging.
@@ -880,17 +874,16 @@
     return _response.then((data) => new AccounttaxListResponse.fromJson(data));
   }
 
-  /// Updates the tax settings of the account. This method can only be called
-  /// for accounts to which the managing account has access: either the managing
-  /// account itself for any Merchant Center account, or any sub-account when
-  /// the managing account is a multi-client account. This method supports patch
+  /// Updates the tax settings of the account. This method supports patch
   /// semantics.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. If this parameter is not
+  /// the same as accountId, then this account must be a multi-client account
+  /// and accountId must be the ID of a sub-account of this account.
   ///
   /// [accountId] - The ID of the account for which to get/update account tax
   /// settings.
@@ -946,16 +939,15 @@
     return _response.then((data) => new AccountTax.fromJson(data));
   }
 
-  /// Updates the tax settings of the account. This method can only be called
-  /// for accounts to which the managing account has access: either the managing
-  /// account itself for any Merchant Center account, or any sub-account when
-  /// the managing account is a multi-client account.
+  /// Updates the tax settings of the account.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. If this parameter is not
+  /// the same as accountId, then this account must be a multi-client account
+  /// and accountId must be the ID of a sub-account of this account.
   ///
   /// [accountId] - The ID of the account for which to get/update account tax
   /// settings.
@@ -1066,14 +1058,14 @@
         .then((data) => new DatafeedsCustomBatchResponse.fromJson(data));
   }
 
-  /// Deletes a datafeed configuration from your Merchant Center account. This
-  /// method can only be called for non-multi-client accounts.
+  /// Deletes a datafeed configuration from your Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - null
+  /// [merchantId] - The ID of the account that manages the datafeed. This
+  /// account cannot be a multi-client account.
   ///
-  /// [datafeedId] - null
+  /// [datafeedId] - The ID of the datafeed.
   ///
   /// [dryRun] - Flag to run the request in dry-run mode.
   ///
@@ -1122,14 +1114,14 @@
     return _response.then((data) => null);
   }
 
-  /// Retrieves a datafeed configuration from your Merchant Center account. This
-  /// method can only be called for non-multi-client accounts.
+  /// Retrieves a datafeed configuration from your Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - null
+  /// [merchantId] - The ID of the account that manages the datafeed. This
+  /// account cannot be a multi-client account.
   ///
-  /// [datafeedId] - null
+  /// [datafeedId] - The ID of the datafeed.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1173,14 +1165,14 @@
     return _response.then((data) => new Datafeed.fromJson(data));
   }
 
-  /// Registers a datafeed configuration with your Merchant Center account. This
-  /// method can only be called for non-multi-client accounts.
+  /// Registers a datafeed configuration with your Merchant Center account.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - null
+  /// [merchantId] - The ID of the account that manages the datafeed. This
+  /// account cannot be a multi-client account.
   ///
   /// [dryRun] - Flag to run the request in dry-run mode.
   ///
@@ -1227,12 +1219,12 @@
     return _response.then((data) => new Datafeed.fromJson(data));
   }
 
-  /// Lists the datafeeds in your Merchant Center account. This method can only
-  /// be called for non-multi-client accounts.
+  /// Lists the configurations for datafeeds in your Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the datafeeds. This
+  /// account cannot be a multi-client account.
   ///
   /// [maxResults] - The maximum number of products to return in the response,
   /// used for paging.
@@ -1283,16 +1275,16 @@
   }
 
   /// Updates a datafeed configuration of your Merchant Center account. This
-  /// method can only be called for non-multi-client accounts. This method
-  /// supports patch semantics.
+  /// method supports patch semantics.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - null
+  /// [merchantId] - The ID of the account that manages the datafeed. This
+  /// account cannot be a multi-client account.
   ///
-  /// [datafeedId] - null
+  /// [datafeedId] - The ID of the datafeed.
   ///
   /// [dryRun] - Flag to run the request in dry-run mode.
   ///
@@ -1345,16 +1337,16 @@
     return _response.then((data) => new Datafeed.fromJson(data));
   }
 
-  /// Updates a datafeed configuration of your Merchant Center account. This
-  /// method can only be called for non-multi-client accounts.
+  /// Updates a datafeed configuration of your Merchant Center account.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - null
+  /// [merchantId] - The ID of the account that manages the datafeed. This
+  /// account cannot be a multi-client account.
   ///
-  /// [datafeedId] - null
+  /// [datafeedId] - The ID of the datafeed.
   ///
   /// [dryRun] - Flag to run the request in dry-run mode.
   ///
@@ -1457,14 +1449,14 @@
         .then((data) => new DatafeedstatusesCustomBatchResponse.fromJson(data));
   }
 
-  /// Retrieves the status of a datafeed from your Merchant Center account. This
-  /// method can only be called for non-multi-client accounts.
+  /// Retrieves the status of a datafeed from your Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - null
+  /// [merchantId] - The ID of the account that manages the datafeed. This
+  /// account cannot be a multi-client account.
   ///
-  /// [datafeedId] - null
+  /// [datafeedId] - The ID of the datafeed.
   ///
   /// [country] - The country for which to get the datafeed status. If this
   /// parameter is provided then language must also be provided. Note that this
@@ -1525,12 +1517,12 @@
     return _response.then((data) => new DatafeedStatus.fromJson(data));
   }
 
-  /// Lists the statuses of the datafeeds in your Merchant Center account. This
-  /// method can only be called for non-multi-client accounts.
+  /// Lists the statuses of the datafeeds in your Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the datafeeds. This
+  /// account cannot be a multi-client account.
   ///
   /// [maxResults] - The maximum number of products to return in the response,
   /// used for paging.
@@ -1589,7 +1581,7 @@
 
   /// Updates price and availability for multiple products or stores in a single
   /// request. This operation does not update the expiration date of the
-  /// products. This method can only be called for non-multi-client accounts.
+  /// products.
   ///
   /// [request] - The metadata request object.
   ///
@@ -1641,20 +1633,20 @@
   }
 
   /// Updates price and availability of a product in your Merchant Center
-  /// account. This operation does not update the expiration date of the
-  /// product. This method can only be called for non-multi-client accounts.
+  /// account.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that contains the product. This
+  /// account cannot be a multi-client account.
   ///
   /// [storeCode] - The code of the store for which to update price and
   /// availability. Use online to update price and availability of an online
   /// product.
   ///
-  /// [productId] - The ID of the product for which to update price and
+  /// [productId] - The REST id of the product for which to update price and
   /// availability.
   ///
   /// [dryRun] - Flag to run the request in dry-run mode.
@@ -1719,14 +1711,14 @@
 
   OrdersResourceApi(commons.ApiRequester client) : _requester = client;
 
-  /// Marks an order as acknowledged. This method can only be called for
-  /// non-multi-client accounts.
+  /// Marks an order as acknowledged.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the order.
   ///
@@ -1781,12 +1773,12 @@
   }
 
   /// Sandbox only. Moves a test order from state "inProgress" to state
-  /// "pendingShipment". This method can only be called for non-multi-client
-  /// accounts.
+  /// "pendingShipment".
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the test order to modify.
   ///
@@ -1835,14 +1827,14 @@
         .then((data) => new OrdersAdvanceTestOrderResponse.fromJson(data));
   }
 
-  /// Cancels all line items in an order, making a full refund. This method can
-  /// only be called for non-multi-client accounts.
+  /// Cancels all line items in an order, making a full refund.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the order to cancel.
   ///
@@ -1893,14 +1885,14 @@
     return _response.then((data) => new OrdersCancelResponse.fromJson(data));
   }
 
-  /// Cancels a line item, making a full refund. This method can only be called
-  /// for non-multi-client accounts.
+  /// Cancels a line item, making a full refund.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the order.
   ///
@@ -1954,14 +1946,14 @@
         .then((data) => new OrdersCancelLineItemResponse.fromJson(data));
   }
 
-  /// Sandbox only. Creates a test order. This method can only be called for
-  /// non-multi-client accounts.
+  /// Sandbox only. Creates a test order.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that should manage the order. This
+  /// cannot be a multi-client account.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -2005,8 +1997,7 @@
         .then((data) => new OrdersCreateTestOrderResponse.fromJson(data));
   }
 
-  /// Retrieves or modifies multiple orders in a single request. This method can
-  /// only be called for non-multi-client accounts.
+  /// Retrieves or modifies multiple orders in a single request.
   ///
   /// [request] - The metadata request object.
   ///
@@ -2051,12 +2042,12 @@
         .then((data) => new OrdersCustomBatchResponse.fromJson(data));
   }
 
-  /// Retrieves an order from your Merchant Center account. This method can only
-  /// be called for non-multi-client accounts.
+  /// Retrieves an order from your Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the order.
   ///
@@ -2102,12 +2093,12 @@
     return _response.then((data) => new Order.fromJson(data));
   }
 
-  /// Retrieves an order using merchant order id. This method can only be called
-  /// for non-multi-client accounts.
+  /// Retrieves an order using merchant order id.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [merchantOrderId] - The merchant order id to be looked for.
   ///
@@ -2156,12 +2147,12 @@
   }
 
   /// Sandbox only. Retrieves an order template that can be used to quickly
-  /// create a new order in sandbox. This method can only be called for
-  /// non-multi-client accounts.
+  /// create a new order in sandbox.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that should manage the order. This
+  /// cannot be a multi-client account.
   ///
   /// [templateName] - The name of the template to retrieve.
   /// Possible string values are:
@@ -2214,12 +2205,73 @@
         .then((data) => new OrdersGetTestOrderTemplateResponse.fromJson(data));
   }
 
-  /// Lists the orders in your Merchant Center account. This method can only be
-  /// called for non-multi-client accounts.
+  /// Notifies that item return and refund was handled directly in store.
+  ///
+  /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [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 [OrdersInStoreRefundLineItemResponse].
+  ///
+  /// 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<OrdersInStoreRefundLineItemResponse> instorerefundlineitem(
+      OrdersInStoreRefundLineItemRequest 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') +
+        '/inStoreRefundLineItem';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new OrdersInStoreRefundLineItemResponse.fromJson(data));
+  }
+
+  /// Lists the orders in your Merchant Center account.
+  ///
+  /// Request parameters:
+  ///
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [acknowledged] - Obtains orders that match the acknowledgement status.
   /// When set to true, obtains orders that have been acknowledged. When false,
@@ -2322,14 +2374,14 @@
     return _response.then((data) => new OrdersListResponse.fromJson(data));
   }
 
-  /// Refund a portion of the order, up to the full amount paid. This method can
-  /// only be called for non-multi-client accounts.
+  /// Refund a portion of the order, up to the full amount paid.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the order to refund.
   ///
@@ -2380,14 +2432,75 @@
     return _response.then((data) => new OrdersRefundResponse.fromJson(data));
   }
 
-  /// Returns a line item. This method can only be called for non-multi-client
-  /// accounts.
+  /// Rejects return on an line item.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [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 [OrdersRejectReturnLineItemResponse].
+  ///
+  /// 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<OrdersRejectReturnLineItemResponse> rejectreturnlineitem(
+      OrdersRejectReturnLineItemRequest 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') +
+        '/rejectReturnLineItem';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new OrdersRejectReturnLineItemResponse.fromJson(data));
+  }
+
+  /// Returns 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.
   ///
@@ -2441,14 +2554,137 @@
         .then((data) => new OrdersReturnLineItemResponse.fromJson(data));
   }
 
-  /// Marks line item(s) as shipped. This method can only be called for
-  /// non-multi-client accounts.
+  /// Returns and refunds a line item. Note that this method can only be called
+  /// on fully shipped orders.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [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 [OrdersReturnRefundLineItemResponse].
+  ///
+  /// 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<OrdersReturnRefundLineItemResponse> returnrefundlineitem(
+      OrdersReturnRefundLineItemRequest 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') +
+        '/returnRefundLineItem';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new OrdersReturnRefundLineItemResponse.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.
+  ///
+  /// 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.
   ///
@@ -2502,14 +2738,76 @@
         .then((data) => new OrdersShipLineItemsResponse.fromJson(data));
   }
 
-  /// Updates the merchant order ID for a given order. This method can only be
-  /// called for non-multi-client accounts.
+  /// Updates ship by and delivery by dates for a line item.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [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.
+  ///
+  /// 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.
   ///
@@ -2563,14 +2861,14 @@
         .then((data) => new OrdersUpdateMerchantOrderIdResponse.fromJson(data));
   }
 
-  /// Updates a shipment's status, carrier, and/or tracking ID. This method can
-  /// only be called for non-multi-client accounts.
+  /// Updates a shipment's status, carrier, and/or tracking ID.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the order.
   ///
@@ -2631,7 +2929,6 @@
   ProductsResourceApi(commons.ApiRequester client) : _requester = client;
 
   /// Retrieves, inserts, and deletes multiple products in a single request.
-  /// This method can only be called for non-multi-client accounts.
   ///
   /// [request] - The metadata request object.
   ///
@@ -2682,14 +2979,14 @@
         .then((data) => new ProductsCustomBatchResponse.fromJson(data));
   }
 
-  /// Deletes a product from your Merchant Center account. This method can only
-  /// be called for non-multi-client accounts.
+  /// Deletes a product from your Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that contains the product. This
+  /// account cannot be a multi-client account.
   ///
-  /// [productId] - The ID of the product.
+  /// [productId] - The REST id of the product.
   ///
   /// [dryRun] - Flag to run the request in dry-run mode.
   ///
@@ -2738,14 +3035,14 @@
     return _response.then((data) => null);
   }
 
-  /// Retrieves a product from your Merchant Center account. This method can
-  /// only be called for non-multi-client accounts.
+  /// Retrieves a product from your Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that contains the product. This
+  /// account cannot be a multi-client account.
   ///
-  /// [productId] - The ID of the product.
+  /// [productId] - The REST id of the product.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -2791,14 +3088,14 @@
 
   /// Uploads a product to your Merchant Center account. If an item with the
   /// same channel, contentLanguage, offerId, and targetCountry already exists,
-  /// this method updates that entry. This method can only be called for
-  /// non-multi-client accounts.
+  /// this method updates that entry.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that contains the product. This
+  /// account cannot be a multi-client account.
   ///
   /// [dryRun] - Flag to run the request in dry-run mode.
   ///
@@ -2845,12 +3142,12 @@
     return _response.then((data) => new Product.fromJson(data));
   }
 
-  /// Lists the products in your Merchant Center account. This method can only
-  /// be called for non-multi-client accounts.
+  /// Lists the products in your Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that contains the products. This
+  /// account cannot be a multi-client account.
   ///
   /// [includeInvalidInsertedItems] - Flag to include the invalid inserted items
   /// in the result of the list request. By default the invalid items are not
@@ -2918,8 +3215,7 @@
 
   ProductstatusesResourceApi(commons.ApiRequester client) : _requester = client;
 
-  /// Gets the statuses of multiple products in a single request. This method
-  /// can only be called for non-multi-client accounts.
+  /// Gets the statuses of multiple products in a single request.
   ///
   /// [request] - The metadata request object.
   ///
@@ -2971,14 +3267,14 @@
         .then((data) => new ProductstatusesCustomBatchResponse.fromJson(data));
   }
 
-  /// Gets the status of a product from your Merchant Center account. This
-  /// method can only be called for non-multi-client accounts.
+  /// Gets the status of a product from your Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that contains the product. This
+  /// account cannot be a multi-client account.
   ///
-  /// [productId] - The ID of the product.
+  /// [productId] - The REST id of the product.
   ///
   /// [includeAttributes] - Flag to include full product data in the result of
   /// this get request. The default value is false.
@@ -3028,12 +3324,12 @@
     return _response.then((data) => new ProductStatus.fromJson(data));
   }
 
-  /// Lists the statuses of the products in your Merchant Center account. This
-  /// method can only be called for non-multi-client accounts.
+  /// Lists the statuses of the products in your Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that contains the products. This
+  /// account cannot be a multi-client account.
   ///
   /// [includeAttributes] - Flag to include full product data in the results of
   /// the list request. The default value is false.
@@ -3162,14 +3458,13 @@
         .then((data) => new ShippingsettingsCustomBatchResponse.fromJson(data));
   }
 
-  /// Retrieves the shipping settings of the account. This method can only be
-  /// called for accounts to which the managing account has access: either the
-  /// managing account itself for any Merchant Center account, or any
-  /// sub-account when the managing account is a multi-client account.
+  /// Retrieves the shipping settings of the account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. If this parameter is not
+  /// the same as accountId, then this account must be a multi-client account
+  /// and accountId must be the ID of a sub-account of this account.
   ///
   /// [accountId] - The ID of the account for which to get/update shipping
   /// settings.
@@ -3262,12 +3557,58 @@
         new ShippingsettingsGetSupportedCarriersResponse.fromJson(data));
   }
 
-  /// Lists the shipping settings of the sub-accounts in your Merchant Center
-  /// account. This method can only be called for multi-client accounts.
+  /// Retrieves supported holidays for an account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account for which to retrieve the supported
+  /// holidays.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ShippingsettingsGetSupportedHolidaysResponse].
+  ///
+  /// 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<ShippingsettingsGetSupportedHolidaysResponse>
+      getsupportedholidays(core.String merchantId, {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 (merchantId == null) {
+      throw new core.ArgumentError("Parameter merchantId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = commons.Escaper.ecapeVariable('$merchantId') + '/supportedHolidays';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) =>
+        new ShippingsettingsGetSupportedHolidaysResponse.fromJson(data));
+  }
+
+  /// Lists the shipping settings of the sub-accounts in your Merchant Center
+  /// account.
+  ///
+  /// Request parameters:
+  ///
+  /// [merchantId] - The ID of the managing account. This must be a multi-client
+  /// account.
   ///
   /// [maxResults] - The maximum number of shipping settings to return in the
   /// response, used for paging.
@@ -3318,17 +3659,16 @@
         .then((data) => new ShippingsettingsListResponse.fromJson(data));
   }
 
-  /// Updates the shipping settings of the account. This method can only be
-  /// called for accounts to which the managing account has access: either the
-  /// managing account itself for any Merchant Center account, or any
-  /// sub-account when the managing account is a multi-client account. This
-  /// method supports patch semantics.
+  /// Updates the shipping settings of the account. This method supports patch
+  /// semantics.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. If this parameter is not
+  /// the same as accountId, then this account must be a multi-client account
+  /// and accountId must be the ID of a sub-account of this account.
   ///
   /// [accountId] - The ID of the account for which to get/update shipping
   /// settings.
@@ -3384,16 +3724,15 @@
     return _response.then((data) => new ShippingSettings.fromJson(data));
   }
 
-  /// Updates the shipping settings of the account. This method can only be
-  /// called for accounts to which the managing account has access: either the
-  /// managing account itself for any Merchant Center account, or any
-  /// sub-account when the managing account is a multi-client account.
+  /// Updates the shipping settings of the account.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the managing account. If this parameter is not
+  /// the same as accountId, then this account must be a multi-client account
+  /// and accountId must be the ID of a sub-account of this account.
   ///
   /// [accountId] - The ID of the account for which to get/update shipping
   /// settings.
@@ -3462,6 +3801,10 @@
   /// or to cancel a link request, remove it from the list.
   core.List<AccountAdwordsLink> adwordsLinks;
 
+  /// The GMB account which is linked or in the process of being linked with the
+  /// Merchant Center accounnt.
+  AccountGoogleMyBusinessLink googleMyBusinessLink;
+
   /// Merchant Center account ID.
   core.String id;
 
@@ -3503,6 +3846,10 @@
           .map((value) => new AccountAdwordsLink.fromJson(value))
           .toList();
     }
+    if (_json.containsKey("googleMyBusinessLink")) {
+      googleMyBusinessLink = new AccountGoogleMyBusinessLink.fromJson(
+          _json["googleMyBusinessLink"]);
+    }
     if (_json.containsKey("id")) {
       id = _json["id"];
     }
@@ -3543,6 +3890,9 @@
       _json["adwordsLinks"] =
           adwordsLinks.map((value) => (value).toJson()).toList();
     }
+    if (googleMyBusinessLink != null) {
+      _json["googleMyBusinessLink"] = (googleMyBusinessLink).toJson();
+    }
     if (id != null) {
       _json["id"] = id;
     }
@@ -3612,6 +3962,38 @@
   }
 }
 
+class AccountGoogleMyBusinessLink {
+  /// The GMB email address.
+  core.String gmbEmail;
+
+  /// Status of the link between this Merchant Center account and the GMB
+  /// account.
+  core.String status;
+
+  AccountGoogleMyBusinessLink();
+
+  AccountGoogleMyBusinessLink.fromJson(core.Map _json) {
+    if (_json.containsKey("gmbEmail")) {
+      gmbEmail = _json["gmbEmail"];
+    }
+    if (_json.containsKey("status")) {
+      status = _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 (gmbEmail != null) {
+      _json["gmbEmail"] = gmbEmail;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    return _json;
+  }
+}
+
 class AccountIdentifier {
   /// The aggregator ID, set for aggregators and subaccounts (in that case, it
   /// represents the aggregator of the subaccount).
@@ -5870,6 +6252,10 @@
 }
 
 class DeliveryTime {
+  /// Holiday cutoff definitions. If configured, they specify order cutoff times
+  /// for holiday-specific shipping.
+  core.List<HolidayCutoff> holidayCutoffs;
+
   /// Maximum number of business days that is spent in transit. 0 means same day
   /// delivery, 1 means next day delivery. Must be greater than or equal to
   /// minTransitTimeInDays. Required.
@@ -5882,6 +6268,11 @@
   DeliveryTime();
 
   DeliveryTime.fromJson(core.Map _json) {
+    if (_json.containsKey("holidayCutoffs")) {
+      holidayCutoffs = _json["holidayCutoffs"]
+          .map((value) => new HolidayCutoff.fromJson(value))
+          .toList();
+    }
     if (_json.containsKey("maxTransitTimeInDays")) {
       maxTransitTimeInDays = _json["maxTransitTimeInDays"];
     }
@@ -5893,6 +6284,10 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (holidayCutoffs != null) {
+      _json["holidayCutoffs"] =
+          holidayCutoffs.map((value) => (value).toJson()).toList();
+    }
     if (maxTransitTimeInDays != null) {
       _json["maxTransitTimeInDays"] = maxTransitTimeInDays;
     }
@@ -6066,6 +6461,143 @@
   }
 }
 
+class HolidayCutoff {
+  /// Date of the order deadline, in ISO 8601 format. E.g. "2016-11-29" for 29th
+  /// November 2016. Required.
+  core.String deadlineDate;
+
+  /// Hour of the day on the deadline date until which the order has to be
+  /// placed to qualify for the delivery guarantee. Possible values are: 0
+  /// (midnight), 1, ..., 12 (noon), 13, ..., 23. Required.
+  core.int deadlineHour;
+
+  /// Timezone identifier for the deadline hour. A list of identifiers can be
+  /// found in  the AdWords API documentation. E.g. "Europe/Zurich". Required.
+  core.String deadlineTimezone;
+
+  /// Unique identifier for the holiday. Required.
+  core.String holidayId;
+
+  /// Date on which the deadline will become visible to consumers in ISO 8601
+  /// format. E.g. "2016-10-31" for 31st October 2016. Required.
+  core.String visibleFromDate;
+
+  HolidayCutoff();
+
+  HolidayCutoff.fromJson(core.Map _json) {
+    if (_json.containsKey("deadlineDate")) {
+      deadlineDate = _json["deadlineDate"];
+    }
+    if (_json.containsKey("deadlineHour")) {
+      deadlineHour = _json["deadlineHour"];
+    }
+    if (_json.containsKey("deadlineTimezone")) {
+      deadlineTimezone = _json["deadlineTimezone"];
+    }
+    if (_json.containsKey("holidayId")) {
+      holidayId = _json["holidayId"];
+    }
+    if (_json.containsKey("visibleFromDate")) {
+      visibleFromDate = _json["visibleFromDate"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (deadlineDate != null) {
+      _json["deadlineDate"] = deadlineDate;
+    }
+    if (deadlineHour != null) {
+      _json["deadlineHour"] = deadlineHour;
+    }
+    if (deadlineTimezone != null) {
+      _json["deadlineTimezone"] = deadlineTimezone;
+    }
+    if (holidayId != null) {
+      _json["holidayId"] = holidayId;
+    }
+    if (visibleFromDate != null) {
+      _json["visibleFromDate"] = visibleFromDate;
+    }
+    return _json;
+  }
+}
+
+class HolidaysHoliday {
+  /// The CLDR territory code of the country in which the holiday is available.
+  /// E.g. "US", "DE", "GB". A holiday cutoff can only be configured in a
+  /// shipping settings service with matching delivery country. Always present.
+  core.String countryCode;
+
+  /// Date of the holiday, in ISO 8601 format. E.g. "2016-12-25" for Christmas
+  /// 2016. Always present.
+  core.String date;
+
+  /// Date on which the order has to arrive at the customer's, in ISO 8601
+  /// format. E.g. "2016-12-24" for 24th December 2016. Always present.
+  core.String deliveryGuaranteeDate;
+
+  /// Hour of the day in the delivery location's timezone on the guaranteed
+  /// delivery date by which the order has to arrive at the customer's. Possible
+  /// values are: 0 (midnight), 1, ..., 12 (noon), 13, ..., 23. Always present.
+  core.String deliveryGuaranteeHour;
+
+  /// Unique identifier for the holiday to be used when configuring holiday
+  /// cutoffs. Always present.
+  core.String id;
+
+  /// The holiday type. Always present.
+  core.String type;
+
+  HolidaysHoliday();
+
+  HolidaysHoliday.fromJson(core.Map _json) {
+    if (_json.containsKey("countryCode")) {
+      countryCode = _json["countryCode"];
+    }
+    if (_json.containsKey("date")) {
+      date = _json["date"];
+    }
+    if (_json.containsKey("deliveryGuaranteeDate")) {
+      deliveryGuaranteeDate = _json["deliveryGuaranteeDate"];
+    }
+    if (_json.containsKey("deliveryGuaranteeHour")) {
+      deliveryGuaranteeHour = _json["deliveryGuaranteeHour"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    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 (countryCode != null) {
+      _json["countryCode"] = countryCode;
+    }
+    if (date != null) {
+      _json["date"] = date;
+    }
+    if (deliveryGuaranteeDate != null) {
+      _json["deliveryGuaranteeDate"] = deliveryGuaranteeDate;
+    }
+    if (deliveryGuaranteeHour != null) {
+      _json["deliveryGuaranteeHour"] = deliveryGuaranteeHour;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
 class Installment {
   /// The amount the buyer has to pay per month.
   Price amount;
@@ -7026,12 +7558,12 @@
 }
 
 class OrderLineItem {
+  /// Annotations that are attached to the line item.
+  core.List<OrderMerchantProvidedAnnotation> annotations;
+
   /// Cancellations of the line item.
   core.List<OrderCancellation> cancellations;
 
-  /// The channel type of the order: "purchaseOnGoogle" or "googleExpress".
-  core.String channelType;
-
   /// The id of the line item.
   core.String id;
 
@@ -7077,14 +7609,16 @@
   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))
           .toList();
     }
-    if (_json.containsKey("channelType")) {
-      channelType = _json["channelType"];
-    }
     if (_json.containsKey("id")) {
       id = _json["id"];
     }
@@ -7132,13 +7666,14 @@
   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();
     }
-    if (channelType != null) {
-      _json["channelType"] = channelType;
-    }
     if (id != null) {
       _json["id"] = id;
     }
@@ -7497,6 +8032,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;
@@ -7842,26 +8410,20 @@
   /// Acceptable values are:
   /// - "gsx"
   /// - "ups"
-  /// - "united parcel service"
   /// - "usps"
-  /// - "united states postal service"
   /// - "fedex"
   /// - "dhl"
   /// - "ecourier"
   /// - "cxt"
   /// - "google"
-  /// - "on trac"
   /// - "ontrac"
-  /// - "on-trac"
-  /// - "on_trac"
-  /// - "delvic"
+  /// - "emsy"
+  /// - "ont"
+  /// - "deliv"
   /// - "dynamex"
   /// - "lasership"
-  /// - "smartpost"
-  /// - "fedex smartpost"
   /// - "mpx"
   /// - "uds"
-  /// - "united delivery service"
   core.String carrier;
 
   /// Date on which the shipment has been created, in ISO 8601 format.
@@ -7940,9 +8502,14 @@
 }
 
 class OrderShipmentLineItemShipment {
-  /// The id of the line item that is shipped.
+  /// The id of the line item that is shipped. Either lineItemId or productId is
+  /// required.
   core.String lineItemId;
 
+  /// The ID of the product to ship. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
   /// The quantity that is shipped.
   core.int quantity;
 
@@ -7952,6 +8519,9 @@
     if (_json.containsKey("lineItemId")) {
       lineItemId = _json["lineItemId"];
     }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
     if (_json.containsKey("quantity")) {
       quantity = _json["quantity"];
     }
@@ -7963,6 +8533,9 @@
     if (lineItemId != null) {
       _json["lineItemId"] = lineItemId;
     }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
     if (quantity != null) {
       _json["quantity"] = quantity;
     }
@@ -8053,12 +8626,25 @@
   /// The amount must not be larger than the net amount left on the order.
   Price amount;
 
-  /// The ID of the line item to cancel.
+  /// Amount to refund for the cancelation. Optional. If not set, Google will
+  /// calculate the default based on the price and tax of the items involved.
+  /// The amount must not be larger than the net amount left on the order.
+  Price amountPretax;
+
+  /// Tax amount that correspond to cancellation amount in amountPretax.
+  Price amountTax;
+
+  /// The ID of the line item to cancel. 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 cancel. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
   /// The quantity to cancel.
   core.int quantity;
 
@@ -8074,12 +8660,21 @@
     if (_json.containsKey("amount")) {
       amount = new Price.fromJson(_json["amount"]);
     }
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
     if (_json.containsKey("lineItemId")) {
       lineItemId = _json["lineItemId"];
     }
     if (_json.containsKey("operationId")) {
       operationId = _json["operationId"];
     }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
     if (_json.containsKey("quantity")) {
       quantity = _json["quantity"];
     }
@@ -8097,12 +8692,21 @@
     if (amount != null) {
       _json["amount"] = (amount).toJson();
     }
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
     if (lineItemId != null) {
       _json["lineItemId"] = lineItemId;
     }
     if (operationId != null) {
       _json["operationId"] = operationId;
     }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
     if (quantity != null) {
       _json["quantity"] = quantity;
     }
@@ -8319,6 +8923,9 @@
   /// Required for cancelLineItem method.
   OrdersCustomBatchRequestEntryCancelLineItem cancelLineItem;
 
+  /// Required for inStoreReturnLineItem method.
+  OrdersCustomBatchRequestEntryInStoreRefundLineItem inStoreRefundLineItem;
+
   /// The ID of the managing account.
   core.String merchantId;
 
@@ -8339,12 +8946,25 @@
   /// Required for refund method.
   OrdersCustomBatchRequestEntryRefund refund;
 
+  /// Required for rejectReturnLineItem method.
+  OrdersCustomBatchRequestEntryRejectReturnLineItem rejectReturnLineItem;
+
   /// Required for returnLineItem method.
   OrdersCustomBatchRequestEntryReturnLineItem returnLineItem;
 
+  /// Required for returnRefundLineItem method.
+  OrdersCustomBatchRequestEntryReturnRefundLineItem returnRefundLineItem;
+
+  /// Required for setLineItemMetadata method.
+  OrdersCustomBatchRequestEntrySetLineItemMetadata setLineItemMetadata;
+
   /// Required for shipLineItems method.
   OrdersCustomBatchRequestEntryShipLineItems shipLineItems;
 
+  /// Required for updateLineItemShippingDate method.
+  OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails
+      updateLineItemShippingDetails;
+
   /// Required for updateShipment method.
   OrdersCustomBatchRequestEntryUpdateShipment updateShipment;
 
@@ -8362,6 +8982,11 @@
       cancelLineItem = new OrdersCustomBatchRequestEntryCancelLineItem.fromJson(
           _json["cancelLineItem"]);
     }
+    if (_json.containsKey("inStoreRefundLineItem")) {
+      inStoreRefundLineItem =
+          new OrdersCustomBatchRequestEntryInStoreRefundLineItem.fromJson(
+              _json["inStoreRefundLineItem"]);
+    }
     if (_json.containsKey("merchantId")) {
       merchantId = _json["merchantId"];
     }
@@ -8381,14 +9006,34 @@
       refund =
           new OrdersCustomBatchRequestEntryRefund.fromJson(_json["refund"]);
     }
+    if (_json.containsKey("rejectReturnLineItem")) {
+      rejectReturnLineItem =
+          new OrdersCustomBatchRequestEntryRejectReturnLineItem.fromJson(
+              _json["rejectReturnLineItem"]);
+    }
     if (_json.containsKey("returnLineItem")) {
       returnLineItem = new OrdersCustomBatchRequestEntryReturnLineItem.fromJson(
           _json["returnLineItem"]);
     }
+    if (_json.containsKey("returnRefundLineItem")) {
+      returnRefundLineItem =
+          new OrdersCustomBatchRequestEntryReturnRefundLineItem.fromJson(
+              _json["returnRefundLineItem"]);
+    }
+    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"]);
@@ -8407,6 +9052,9 @@
     if (cancelLineItem != null) {
       _json["cancelLineItem"] = (cancelLineItem).toJson();
     }
+    if (inStoreRefundLineItem != null) {
+      _json["inStoreRefundLineItem"] = (inStoreRefundLineItem).toJson();
+    }
     if (merchantId != null) {
       _json["merchantId"] = merchantId;
     }
@@ -8425,12 +9073,25 @@
     if (refund != null) {
       _json["refund"] = (refund).toJson();
     }
+    if (rejectReturnLineItem != null) {
+      _json["rejectReturnLineItem"] = (rejectReturnLineItem).toJson();
+    }
     if (returnLineItem != null) {
       _json["returnLineItem"] = (returnLineItem).toJson();
     }
+    if (returnRefundLineItem != null) {
+      _json["returnRefundLineItem"] = (returnRefundLineItem).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();
     }
@@ -8475,9 +9136,22 @@
   /// The amount must not be larger than the net amount left on the order.
   Price amount;
 
-  /// The ID of the line item to cancel.
+  /// Amount to refund for the cancelation. Optional. If not set, Google will
+  /// calculate the default based on the price and tax of the items involved.
+  /// The amount must not be larger than the net amount left on the order.
+  Price amountPretax;
+
+  /// Tax amount that correspond to cancellation amount in amountPretax.
+  Price amountTax;
+
+  /// The ID of the line item to cancel. Either lineItemId or productId is
+  /// required.
   core.String lineItemId;
 
+  /// The ID of the product to cancel. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
   /// The quantity to cancel.
   core.int quantity;
 
@@ -8493,9 +9167,18 @@
     if (_json.containsKey("amount")) {
       amount = new Price.fromJson(_json["amount"]);
     }
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
     if (_json.containsKey("lineItemId")) {
       lineItemId = _json["lineItemId"];
     }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
     if (_json.containsKey("quantity")) {
       quantity = _json["quantity"];
     }
@@ -8513,9 +9196,96 @@
     if (amount != null) {
       _json["amount"] = (amount).toJson();
     }
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
     if (lineItemId != null) {
       _json["lineItemId"] = lineItemId;
     }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (quantity != null) {
+      _json["quantity"] = quantity;
+    }
+    if (reason != null) {
+      _json["reason"] = reason;
+    }
+    if (reasonText != null) {
+      _json["reasonText"] = reasonText;
+    }
+    return _json;
+  }
+}
+
+class OrdersCustomBatchRequestEntryInStoreRefundLineItem {
+  /// The amount that is refunded. Required.
+  Price amountPretax;
+
+  /// Tax amount that correspond to refund amount in amountPretax. Required.
+  Price amountTax;
+
+  /// The ID of the line item to return. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the product to return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return and refund.
+  core.int quantity;
+
+  /// The reason for the return.
+  core.String reason;
+
+  /// The explanation of the reason.
+  core.String reasonText;
+
+  OrdersCustomBatchRequestEntryInStoreRefundLineItem();
+
+  OrdersCustomBatchRequestEntryInStoreRefundLineItem.fromJson(core.Map _json) {
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("quantity")) {
+      quantity = _json["quantity"];
+    }
+    if (_json.containsKey("reason")) {
+      reason = _json["reason"];
+    }
+    if (_json.containsKey("reasonText")) {
+      reasonText = _json["reasonText"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
     if (quantity != null) {
       _json["quantity"] = quantity;
     }
@@ -8533,6 +9303,13 @@
   /// The amount that is refunded.
   Price amount;
 
+  /// The amount that is refunded. Either amount or amountPretax and amountTax
+  /// should be filled.
+  Price amountPretax;
+
+  /// Tax amount that correspond to refund amount in amountPretax.
+  Price amountTax;
+
   /// The reason for the refund.
   core.String reason;
 
@@ -8545,6 +9322,12 @@
     if (_json.containsKey("amount")) {
       amount = new Price.fromJson(_json["amount"]);
     }
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
     if (_json.containsKey("reason")) {
       reason = _json["reason"];
     }
@@ -8559,6 +9342,12 @@
     if (amount != null) {
       _json["amount"] = (amount).toJson();
     }
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
     if (reason != null) {
       _json["reason"] = reason;
     }
@@ -8569,11 +9358,16 @@
   }
 }
 
-class OrdersCustomBatchRequestEntryReturnLineItem {
-  /// The ID of the line item to return.
+class OrdersCustomBatchRequestEntryRejectReturnLineItem {
+  /// The ID of the line item to return. Either lineItemId or productId is
+  /// required.
   core.String lineItemId;
 
-  /// The quantity to return.
+  /// The ID of the product to return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return and refund.
   core.int quantity;
 
   /// The reason for the return.
@@ -8582,12 +9376,15 @@
   /// The explanation of the reason.
   core.String reasonText;
 
-  OrdersCustomBatchRequestEntryReturnLineItem();
+  OrdersCustomBatchRequestEntryRejectReturnLineItem();
 
-  OrdersCustomBatchRequestEntryReturnLineItem.fromJson(core.Map _json) {
+  OrdersCustomBatchRequestEntryRejectReturnLineItem.fromJson(core.Map _json) {
     if (_json.containsKey("lineItemId")) {
       lineItemId = _json["lineItemId"];
     }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
     if (_json.containsKey("quantity")) {
       quantity = _json["quantity"];
     }
@@ -8605,6 +9402,9 @@
     if (lineItemId != null) {
       _json["lineItemId"] = lineItemId;
     }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
     if (quantity != null) {
       _json["quantity"] = quantity;
     }
@@ -8618,6 +9418,189 @@
   }
 }
 
+class OrdersCustomBatchRequestEntryReturnLineItem {
+  /// The ID of the line item to return. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the product to return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return.
+  core.int quantity;
+
+  /// The reason for the return.
+  core.String reason;
+
+  /// The explanation of the reason.
+  core.String reasonText;
+
+  OrdersCustomBatchRequestEntryReturnLineItem();
+
+  OrdersCustomBatchRequestEntryReturnLineItem.fromJson(core.Map _json) {
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("quantity")) {
+      quantity = _json["quantity"];
+    }
+    if (_json.containsKey("reason")) {
+      reason = _json["reason"];
+    }
+    if (_json.containsKey("reasonText")) {
+      reasonText = _json["reasonText"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (quantity != null) {
+      _json["quantity"] = quantity;
+    }
+    if (reason != null) {
+      _json["reason"] = reason;
+    }
+    if (reasonText != null) {
+      _json["reasonText"] = reasonText;
+    }
+    return _json;
+  }
+}
+
+class OrdersCustomBatchRequestEntryReturnRefundLineItem {
+  /// The amount that is refunded. Optional, but if filled then both
+  /// amountPretax and amountTax must be set.
+  Price amountPretax;
+
+  /// Tax amount that correspond to refund amount in amountPretax.
+  Price amountTax;
+
+  /// The ID of the line item to return. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the product to return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return and refund.
+  core.int quantity;
+
+  /// The reason for the return.
+  core.String reason;
+
+  /// The explanation of the reason.
+  core.String reasonText;
+
+  OrdersCustomBatchRequestEntryReturnRefundLineItem();
+
+  OrdersCustomBatchRequestEntryReturnRefundLineItem.fromJson(core.Map _json) {
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("quantity")) {
+      quantity = _json["quantity"];
+    }
+    if (_json.containsKey("reason")) {
+      reason = _json["reason"];
+    }
+    if (_json.containsKey("reasonText")) {
+      reasonText = _json["reasonText"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (quantity != null) {
+      _json["quantity"] = quantity;
+    }
+    if (reason != null) {
+      _json["reason"] = reason;
+    }
+    if (reasonText != null) {
+      _json["reasonText"] = reasonText;
+    }
+    return _json;
+  }
+}
+
+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
@@ -8730,6 +9713,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
@@ -8940,6 +9977,125 @@
   }
 }
 
+class OrdersInStoreRefundLineItemRequest {
+  /// The amount that is refunded. Required.
+  Price amountPretax;
+
+  /// Tax amount that correspond to refund amount in amountPretax. Required.
+  Price amountTax;
+
+  /// The ID of the line item to return. 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 return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return and refund.
+  core.int quantity;
+
+  /// The reason for the return.
+  core.String reason;
+
+  /// The explanation of the reason.
+  core.String reasonText;
+
+  OrdersInStoreRefundLineItemRequest();
+
+  OrdersInStoreRefundLineItemRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("operationId")) {
+      operationId = _json["operationId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("quantity")) {
+      quantity = _json["quantity"];
+    }
+    if (_json.containsKey("reason")) {
+      reason = _json["reason"];
+    }
+    if (_json.containsKey("reasonText")) {
+      reasonText = _json["reasonText"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (operationId != null) {
+      _json["operationId"] = operationId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (quantity != null) {
+      _json["quantity"] = quantity;
+    }
+    if (reason != null) {
+      _json["reason"] = reason;
+    }
+    if (reasonText != null) {
+      _json["reasonText"] = reasonText;
+    }
+    return _json;
+  }
+}
+
+class OrdersInStoreRefundLineItemResponse {
+  /// The status of the execution.
+  core.String executionStatus;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "content#ordersInStoreRefundLineItemResponse".
+  core.String kind;
+
+  OrdersInStoreRefundLineItemResponse();
+
+  OrdersInStoreRefundLineItemResponse.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 OrdersListResponse {
   /// Identifies what kind of resource this is. Value: the fixed string
   /// "content#ordersListResponse".
@@ -8984,6 +10140,13 @@
   /// The amount that is refunded.
   Price amount;
 
+  /// The amount that is refunded. Either amount or amountPretax and amountTax
+  /// should be filled.
+  Price amountPretax;
+
+  /// Tax amount that correspond to refund amount in amountPretax.
+  Price amountTax;
+
   /// The ID of the operation. Unique across all operations for a given order.
   core.String operationId;
 
@@ -8999,6 +10162,12 @@
     if (_json.containsKey("amount")) {
       amount = new Price.fromJson(_json["amount"]);
     }
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
     if (_json.containsKey("operationId")) {
       operationId = _json["operationId"];
     }
@@ -9016,6 +10185,12 @@
     if (amount != null) {
       _json["amount"] = (amount).toJson();
     }
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
     if (operationId != null) {
       _json["operationId"] = operationId;
     }
@@ -9061,14 +10236,19 @@
   }
 }
 
-class OrdersReturnLineItemRequest {
-  /// The ID of the line item to return.
+class OrdersRejectReturnLineItemRequest {
+  /// The ID of the line item to return. 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 quantity to return.
+  /// The ID of the product to return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return and refund.
   core.int quantity;
 
   /// The reason for the return.
@@ -9077,15 +10257,18 @@
   /// The explanation of the reason.
   core.String reasonText;
 
-  OrdersReturnLineItemRequest();
+  OrdersRejectReturnLineItemRequest();
 
-  OrdersReturnLineItemRequest.fromJson(core.Map _json) {
+  OrdersRejectReturnLineItemRequest.fromJson(core.Map _json) {
     if (_json.containsKey("lineItemId")) {
       lineItemId = _json["lineItemId"];
     }
     if (_json.containsKey("operationId")) {
       operationId = _json["operationId"];
     }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
     if (_json.containsKey("quantity")) {
       quantity = _json["quantity"];
     }
@@ -9106,6 +10289,110 @@
     if (operationId != null) {
       _json["operationId"] = operationId;
     }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (quantity != null) {
+      _json["quantity"] = quantity;
+    }
+    if (reason != null) {
+      _json["reason"] = reason;
+    }
+    if (reasonText != null) {
+      _json["reasonText"] = reasonText;
+    }
+    return _json;
+  }
+}
+
+class OrdersRejectReturnLineItemResponse {
+  /// The status of the execution.
+  core.String executionStatus;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "content#ordersRejectReturnLineItemResponse".
+  core.String kind;
+
+  OrdersRejectReturnLineItemResponse();
+
+  OrdersRejectReturnLineItemResponse.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 OrdersReturnLineItemRequest {
+  /// The ID of the line item to return. 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 return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return.
+  core.int quantity;
+
+  /// The reason for the return.
+  core.String reason;
+
+  /// The explanation of the reason.
+  core.String reasonText;
+
+  OrdersReturnLineItemRequest();
+
+  OrdersReturnLineItemRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("operationId")) {
+      operationId = _json["operationId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("quantity")) {
+      quantity = _json["quantity"];
+    }
+    if (_json.containsKey("reason")) {
+      reason = _json["reason"];
+    }
+    if (_json.containsKey("reasonText")) {
+      reasonText = _json["reasonText"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (operationId != null) {
+      _json["operationId"] = operationId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
     if (quantity != null) {
       _json["quantity"] = quantity;
     }
@@ -9151,6 +10438,211 @@
   }
 }
 
+class OrdersReturnRefundLineItemRequest {
+  /// The amount that is refunded. Optional, but if filled then both
+  /// amountPretax and amountTax must be set.
+  Price amountPretax;
+
+  /// Tax amount that correspond to refund amount in amountPretax.
+  Price amountTax;
+
+  /// The ID of the line item to return. 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 return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return and refund.
+  core.int quantity;
+
+  /// The reason for the return.
+  core.String reason;
+
+  /// The explanation of the reason.
+  core.String reasonText;
+
+  OrdersReturnRefundLineItemRequest();
+
+  OrdersReturnRefundLineItemRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("operationId")) {
+      operationId = _json["operationId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("quantity")) {
+      quantity = _json["quantity"];
+    }
+    if (_json.containsKey("reason")) {
+      reason = _json["reason"];
+    }
+    if (_json.containsKey("reasonText")) {
+      reasonText = _json["reasonText"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (operationId != null) {
+      _json["operationId"] = operationId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (quantity != null) {
+      _json["quantity"] = quantity;
+    }
+    if (reason != null) {
+      _json["reason"] = reason;
+    }
+    if (reasonText != null) {
+      _json["reasonText"] = reasonText;
+    }
+    return _json;
+  }
+}
+
+class OrdersReturnRefundLineItemResponse {
+  /// The status of the execution.
+  core.String executionStatus;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "content#ordersReturnRefundLineItemResponse".
+  core.String kind;
+
+  OrdersReturnRefundLineItemResponse();
+
+  OrdersReturnRefundLineItemResponse.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 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
@@ -9262,6 +10754,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.
@@ -9647,7 +11233,10 @@
   /// Global Trade Item Number (GTIN) of the item.
   core.String gtin;
 
-  /// The REST id of the product.
+  /// The REST id of the product. Content API methods that operate on products
+  /// take this as their productId parameter.
+  /// The REST id for a product is of the form
+  /// channel:contentLanguage:targetCountry:offerId.
   core.String id;
 
   /// False when the item does not have unique product identifiers appropriate
@@ -9697,10 +11286,12 @@
   /// The number of identical products in a merchant-defined multipack.
   core.String multipack;
 
-  /// An identifier of the item. Leading and trailing whitespaces are stripped
-  /// and multiple whitespaces are replaced by a single whitespace upon
+  /// A unique identifier for the item. Leading and trailing whitespaces are
+  /// stripped and multiple whitespaces are replaced by a single whitespace upon
   /// submission. Only valid unicode characters are accepted. See the products
   /// feed specification for details.
+  /// Note: Content API methods that operate on products take the REST id of the
+  /// product, not this identifier.
   core.String offerId;
 
   /// Whether an item is available for purchase only online.
@@ -10574,6 +12165,9 @@
   /// Date on which the item expires in Google Shopping, in ISO 8601 format.
   core.String googleExpirationDate;
 
+  /// A list of all issues associated with the product.
+  core.List<ProductStatusItemLevelIssue> itemLevelIssues;
+
   /// Identifies what kind of resource this is. Value: the fixed string
   /// "content#productStatus".
   core.String kind;
@@ -10612,6 +12206,11 @@
     if (_json.containsKey("googleExpirationDate")) {
       googleExpirationDate = _json["googleExpirationDate"];
     }
+    if (_json.containsKey("itemLevelIssues")) {
+      itemLevelIssues = _json["itemLevelIssues"]
+          .map((value) => new ProductStatusItemLevelIssue.fromJson(value))
+          .toList();
+    }
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
@@ -10649,6 +12248,10 @@
     if (googleExpirationDate != null) {
       _json["googleExpirationDate"] = googleExpirationDate;
     }
+    if (itemLevelIssues != null) {
+      _json["itemLevelIssues"] =
+          itemLevelIssues.map((value) => (value).toJson()).toList();
+    }
     if (kind != null) {
       _json["kind"] = kind;
     }
@@ -10757,19 +12360,24 @@
 }
 
 class ProductStatusDestinationStatus {
+  /// Whether the approval status might change due to further processing.
+  core.bool approvalPending;
+
   /// The destination's approval status.
   core.String approvalStatus;
 
   /// The name of the destination
   core.String destination;
 
-  /// Whether the destination is required, excluded, selected by default or
-  /// should be validated.
+  /// Provided for backward compatibility only. Always set to "required".
   core.String intention;
 
   ProductStatusDestinationStatus();
 
   ProductStatusDestinationStatus.fromJson(core.Map _json) {
+    if (_json.containsKey("approvalPending")) {
+      approvalPending = _json["approvalPending"];
+    }
     if (_json.containsKey("approvalStatus")) {
       approvalStatus = _json["approvalStatus"];
     }
@@ -10784,6 +12392,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (approvalPending != null) {
+      _json["approvalPending"] = approvalPending;
+    }
     if (approvalStatus != null) {
       _json["approvalStatus"] = approvalStatus;
     }
@@ -10797,6 +12408,64 @@
   }
 }
 
+class ProductStatusItemLevelIssue {
+  /// The attribute's name, if the issue is caused by a single attribute.
+  core.String attributeName;
+
+  /// The error code of the issue.
+  core.String code;
+
+  /// The destination the issue applies to.
+  core.String destination;
+
+  /// Whether the issue can be resolved by the merchant.
+  core.String resolution;
+
+  /// How this issue affects serving of the offer.
+  core.String servability;
+
+  ProductStatusItemLevelIssue();
+
+  ProductStatusItemLevelIssue.fromJson(core.Map _json) {
+    if (_json.containsKey("attributeName")) {
+      attributeName = _json["attributeName"];
+    }
+    if (_json.containsKey("code")) {
+      code = _json["code"];
+    }
+    if (_json.containsKey("destination")) {
+      destination = _json["destination"];
+    }
+    if (_json.containsKey("resolution")) {
+      resolution = _json["resolution"];
+    }
+    if (_json.containsKey("servability")) {
+      servability = _json["servability"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (attributeName != null) {
+      _json["attributeName"] = attributeName;
+    }
+    if (code != null) {
+      _json["code"] = code;
+    }
+    if (destination != null) {
+      _json["destination"] = destination;
+    }
+    if (resolution != null) {
+      _json["resolution"] = resolution;
+    }
+    if (servability != null) {
+      _json["servability"] = servability;
+    }
+    return _json;
+  }
+}
+
 class ProductTax {
   /// The country within which the item is taxed, specified as a CLDR territory
   /// code.
@@ -11780,6 +13449,40 @@
   }
 }
 
+class ShippingsettingsGetSupportedHolidaysResponse {
+  /// A list of holidays applicable for delivery guarantees. May be empty.
+  core.List<HolidaysHoliday> holidays;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "content#shippingsettingsGetSupportedHolidaysResponse".
+  core.String kind;
+
+  ShippingsettingsGetSupportedHolidaysResponse();
+
+  ShippingsettingsGetSupportedHolidaysResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("holidays")) {
+      holidays = _json["holidays"]
+          .map((value) => new HolidaysHoliday.fromJson(value))
+          .toList();
+    }
+    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 (holidays != null) {
+      _json["holidays"] = holidays.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
 class ShippingsettingsListResponse {
   /// Identifies what kind of resource this is. Value: the fixed string
   /// "content#shippingsettingsListResponse".
@@ -11883,6 +13586,10 @@
   /// Line items that are ordered. At least one line item must be provided.
   core.List<TestOrderLineItem> lineItems;
 
+  /// Determines if test order must be pulled by merchant or pushed to merchant
+  /// via push integration.
+  core.String notificationMode;
+
   /// The details of the payment method.
   TestOrderPaymentMethod paymentMethod;
 
@@ -11916,6 +13623,9 @@
           .map((value) => new TestOrderLineItem.fromJson(value))
           .toList();
     }
+    if (_json.containsKey("notificationMode")) {
+      notificationMode = _json["notificationMode"];
+    }
     if (_json.containsKey("paymentMethod")) {
       paymentMethod =
           new TestOrderPaymentMethod.fromJson(_json["paymentMethod"]);
@@ -11951,6 +13661,9 @@
     if (lineItems != null) {
       _json["lineItems"] = lineItems.map((value) => (value).toJson()).toList();
     }
+    if (notificationMode != null) {
+      _json["notificationMode"] = notificationMode;
+    }
     if (paymentMethod != null) {
       _json["paymentMethod"] = (paymentMethod).toJson();
     }
diff --git a/googleapis/lib/content/v2sandbox.dart b/googleapis/lib/content/v2sandbox.dart
index 3deb7a7..cadbdac 100644
--- a/googleapis/lib/content/v2sandbox.dart
+++ b/googleapis/lib/content/v2sandbox.dart
@@ -36,14 +36,14 @@
 
   OrdersResourceApi(commons.ApiRequester client) : _requester = client;
 
-  /// Marks an order as acknowledged. This method can only be called for
-  /// non-multi-client accounts.
+  /// Marks an order as acknowledged.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the order.
   ///
@@ -98,12 +98,12 @@
   }
 
   /// Sandbox only. Moves a test order from state "inProgress" to state
-  /// "pendingShipment". This method can only be called for non-multi-client
-  /// accounts.
+  /// "pendingShipment".
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the test order to modify.
   ///
@@ -152,14 +152,14 @@
         .then((data) => new OrdersAdvanceTestOrderResponse.fromJson(data));
   }
 
-  /// Cancels all line items in an order, making a full refund. This method can
-  /// only be called for non-multi-client accounts.
+  /// Cancels all line items in an order, making a full refund.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the order to cancel.
   ///
@@ -210,14 +210,14 @@
     return _response.then((data) => new OrdersCancelResponse.fromJson(data));
   }
 
-  /// Cancels a line item, making a full refund. This method can only be called
-  /// for non-multi-client accounts.
+  /// Cancels a line item, making a full refund.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the order.
   ///
@@ -271,14 +271,14 @@
         .then((data) => new OrdersCancelLineItemResponse.fromJson(data));
   }
 
-  /// Sandbox only. Creates a test order. This method can only be called for
-  /// non-multi-client accounts.
+  /// Sandbox only. Creates a test order.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that should manage the order. This
+  /// cannot be a multi-client account.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -322,8 +322,7 @@
         .then((data) => new OrdersCreateTestOrderResponse.fromJson(data));
   }
 
-  /// Retrieves or modifies multiple orders in a single request. This method can
-  /// only be called for non-multi-client accounts.
+  /// Retrieves or modifies multiple orders in a single request.
   ///
   /// [request] - The metadata request object.
   ///
@@ -368,12 +367,12 @@
         .then((data) => new OrdersCustomBatchResponse.fromJson(data));
   }
 
-  /// Retrieves an order from your Merchant Center account. This method can only
-  /// be called for non-multi-client accounts.
+  /// Retrieves an order from your Merchant Center account.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the order.
   ///
@@ -419,12 +418,12 @@
     return _response.then((data) => new Order.fromJson(data));
   }
 
-  /// Retrieves an order using merchant order id. This method can only be called
-  /// for non-multi-client accounts.
+  /// Retrieves an order using merchant order id.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [merchantOrderId] - The merchant order id to be looked for.
   ///
@@ -473,12 +472,12 @@
   }
 
   /// Sandbox only. Retrieves an order template that can be used to quickly
-  /// create a new order in sandbox. This method can only be called for
-  /// non-multi-client accounts.
+  /// create a new order in sandbox.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that should manage the order. This
+  /// cannot be a multi-client account.
   ///
   /// [templateName] - The name of the template to retrieve.
   /// Possible string values are:
@@ -531,12 +530,73 @@
         .then((data) => new OrdersGetTestOrderTemplateResponse.fromJson(data));
   }
 
-  /// Lists the orders in your Merchant Center account. This method can only be
-  /// called for non-multi-client accounts.
+  /// Notifies that item return and refund was handled directly in store.
+  ///
+  /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [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 [OrdersInStoreRefundLineItemResponse].
+  ///
+  /// 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<OrdersInStoreRefundLineItemResponse> instorerefundlineitem(
+      OrdersInStoreRefundLineItemRequest 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') +
+        '/inStoreRefundLineItem';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new OrdersInStoreRefundLineItemResponse.fromJson(data));
+  }
+
+  /// Lists the orders in your Merchant Center account.
+  ///
+  /// Request parameters:
+  ///
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [acknowledged] - Obtains orders that match the acknowledgement status.
   /// When set to true, obtains orders that have been acknowledged. When false,
@@ -639,14 +699,14 @@
     return _response.then((data) => new OrdersListResponse.fromJson(data));
   }
 
-  /// Refund a portion of the order, up to the full amount paid. This method can
-  /// only be called for non-multi-client accounts.
+  /// Refund a portion of the order, up to the full amount paid.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the order to refund.
   ///
@@ -697,14 +757,75 @@
     return _response.then((data) => new OrdersRefundResponse.fromJson(data));
   }
 
-  /// Returns a line item. This method can only be called for non-multi-client
-  /// accounts.
+  /// Rejects return on an line item.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [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 [OrdersRejectReturnLineItemResponse].
+  ///
+  /// 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<OrdersRejectReturnLineItemResponse> rejectreturnlineitem(
+      OrdersRejectReturnLineItemRequest 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') +
+        '/rejectReturnLineItem';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new OrdersRejectReturnLineItemResponse.fromJson(data));
+  }
+
+  /// Returns 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.
   ///
@@ -758,14 +879,137 @@
         .then((data) => new OrdersReturnLineItemResponse.fromJson(data));
   }
 
-  /// Marks line item(s) as shipped. This method can only be called for
-  /// non-multi-client accounts.
+  /// Returns and refunds a line item. Note that this method can only be called
+  /// on fully shipped orders.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [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 [OrdersReturnRefundLineItemResponse].
+  ///
+  /// 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<OrdersReturnRefundLineItemResponse> returnrefundlineitem(
+      OrdersReturnRefundLineItemRequest 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') +
+        '/returnRefundLineItem';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new OrdersReturnRefundLineItemResponse.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.
+  ///
+  /// 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.
   ///
@@ -819,14 +1063,76 @@
         .then((data) => new OrdersShipLineItemsResponse.fromJson(data));
   }
 
-  /// Updates the merchant order ID for a given order. This method can only be
-  /// called for non-multi-client accounts.
+  /// Updates ship by and delivery by dates for a line item.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [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.
+  ///
+  /// 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.
   ///
@@ -880,14 +1186,14 @@
         .then((data) => new OrdersUpdateMerchantOrderIdResponse.fromJson(data));
   }
 
-  /// Updates a shipment's status, carrier, and/or tracking ID. This method can
-  /// only be called for non-multi-client accounts.
+  /// Updates a shipment's status, carrier, and/or tracking ID.
   ///
   /// [request] - The metadata request object.
   ///
   /// Request parameters:
   ///
-  /// [merchantId] - The ID of the managing account.
+  /// [merchantId] - The ID of the account that manages the order. This cannot
+  /// be a multi-client account.
   ///
   /// [orderId] - The ID of the order.
   ///
@@ -1457,12 +1763,12 @@
 }
 
 class OrderLineItem {
+  /// Annotations that are attached to the line item.
+  core.List<OrderMerchantProvidedAnnotation> annotations;
+
   /// Cancellations of the line item.
   core.List<OrderCancellation> cancellations;
 
-  /// The channel type of the order: "purchaseOnGoogle" or "googleExpress".
-  core.String channelType;
-
   /// The id of the line item.
   core.String id;
 
@@ -1508,14 +1814,16 @@
   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))
           .toList();
     }
-    if (_json.containsKey("channelType")) {
-      channelType = _json["channelType"];
-    }
     if (_json.containsKey("id")) {
       id = _json["id"];
     }
@@ -1563,13 +1871,14 @@
   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();
     }
-    if (channelType != null) {
-      _json["channelType"] = channelType;
-    }
     if (id != null) {
       _json["id"] = id;
     }
@@ -1928,6 +2237,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;
@@ -2273,26 +2615,20 @@
   /// Acceptable values are:
   /// - "gsx"
   /// - "ups"
-  /// - "united parcel service"
   /// - "usps"
-  /// - "united states postal service"
   /// - "fedex"
   /// - "dhl"
   /// - "ecourier"
   /// - "cxt"
   /// - "google"
-  /// - "on trac"
   /// - "ontrac"
-  /// - "on-trac"
-  /// - "on_trac"
-  /// - "delvic"
+  /// - "emsy"
+  /// - "ont"
+  /// - "deliv"
   /// - "dynamex"
   /// - "lasership"
-  /// - "smartpost"
-  /// - "fedex smartpost"
   /// - "mpx"
   /// - "uds"
-  /// - "united delivery service"
   core.String carrier;
 
   /// Date on which the shipment has been created, in ISO 8601 format.
@@ -2371,9 +2707,14 @@
 }
 
 class OrderShipmentLineItemShipment {
-  /// The id of the line item that is shipped.
+  /// The id of the line item that is shipped. Either lineItemId or productId is
+  /// required.
   core.String lineItemId;
 
+  /// The ID of the product to ship. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
   /// The quantity that is shipped.
   core.int quantity;
 
@@ -2383,6 +2724,9 @@
     if (_json.containsKey("lineItemId")) {
       lineItemId = _json["lineItemId"];
     }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
     if (_json.containsKey("quantity")) {
       quantity = _json["quantity"];
     }
@@ -2394,6 +2738,9 @@
     if (lineItemId != null) {
       _json["lineItemId"] = lineItemId;
     }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
     if (quantity != null) {
       _json["quantity"] = quantity;
     }
@@ -2484,12 +2831,25 @@
   /// The amount must not be larger than the net amount left on the order.
   Price amount;
 
-  /// The ID of the line item to cancel.
+  /// Amount to refund for the cancelation. Optional. If not set, Google will
+  /// calculate the default based on the price and tax of the items involved.
+  /// The amount must not be larger than the net amount left on the order.
+  Price amountPretax;
+
+  /// Tax amount that correspond to cancellation amount in amountPretax.
+  Price amountTax;
+
+  /// The ID of the line item to cancel. 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 cancel. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
   /// The quantity to cancel.
   core.int quantity;
 
@@ -2505,12 +2865,21 @@
     if (_json.containsKey("amount")) {
       amount = new Price.fromJson(_json["amount"]);
     }
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
     if (_json.containsKey("lineItemId")) {
       lineItemId = _json["lineItemId"];
     }
     if (_json.containsKey("operationId")) {
       operationId = _json["operationId"];
     }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
     if (_json.containsKey("quantity")) {
       quantity = _json["quantity"];
     }
@@ -2528,12 +2897,21 @@
     if (amount != null) {
       _json["amount"] = (amount).toJson();
     }
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
     if (lineItemId != null) {
       _json["lineItemId"] = lineItemId;
     }
     if (operationId != null) {
       _json["operationId"] = operationId;
     }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
     if (quantity != null) {
       _json["quantity"] = quantity;
     }
@@ -2750,6 +3128,9 @@
   /// Required for cancelLineItem method.
   OrdersCustomBatchRequestEntryCancelLineItem cancelLineItem;
 
+  /// Required for inStoreReturnLineItem method.
+  OrdersCustomBatchRequestEntryInStoreRefundLineItem inStoreRefundLineItem;
+
   /// The ID of the managing account.
   core.String merchantId;
 
@@ -2770,12 +3151,25 @@
   /// Required for refund method.
   OrdersCustomBatchRequestEntryRefund refund;
 
+  /// Required for rejectReturnLineItem method.
+  OrdersCustomBatchRequestEntryRejectReturnLineItem rejectReturnLineItem;
+
   /// Required for returnLineItem method.
   OrdersCustomBatchRequestEntryReturnLineItem returnLineItem;
 
+  /// Required for returnRefundLineItem method.
+  OrdersCustomBatchRequestEntryReturnRefundLineItem returnRefundLineItem;
+
+  /// Required for setLineItemMetadata method.
+  OrdersCustomBatchRequestEntrySetLineItemMetadata setLineItemMetadata;
+
   /// Required for shipLineItems method.
   OrdersCustomBatchRequestEntryShipLineItems shipLineItems;
 
+  /// Required for updateLineItemShippingDate method.
+  OrdersCustomBatchRequestEntryUpdateLineItemShippingDetails
+      updateLineItemShippingDetails;
+
   /// Required for updateShipment method.
   OrdersCustomBatchRequestEntryUpdateShipment updateShipment;
 
@@ -2793,6 +3187,11 @@
       cancelLineItem = new OrdersCustomBatchRequestEntryCancelLineItem.fromJson(
           _json["cancelLineItem"]);
     }
+    if (_json.containsKey("inStoreRefundLineItem")) {
+      inStoreRefundLineItem =
+          new OrdersCustomBatchRequestEntryInStoreRefundLineItem.fromJson(
+              _json["inStoreRefundLineItem"]);
+    }
     if (_json.containsKey("merchantId")) {
       merchantId = _json["merchantId"];
     }
@@ -2812,14 +3211,34 @@
       refund =
           new OrdersCustomBatchRequestEntryRefund.fromJson(_json["refund"]);
     }
+    if (_json.containsKey("rejectReturnLineItem")) {
+      rejectReturnLineItem =
+          new OrdersCustomBatchRequestEntryRejectReturnLineItem.fromJson(
+              _json["rejectReturnLineItem"]);
+    }
     if (_json.containsKey("returnLineItem")) {
       returnLineItem = new OrdersCustomBatchRequestEntryReturnLineItem.fromJson(
           _json["returnLineItem"]);
     }
+    if (_json.containsKey("returnRefundLineItem")) {
+      returnRefundLineItem =
+          new OrdersCustomBatchRequestEntryReturnRefundLineItem.fromJson(
+              _json["returnRefundLineItem"]);
+    }
+    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"]);
@@ -2838,6 +3257,9 @@
     if (cancelLineItem != null) {
       _json["cancelLineItem"] = (cancelLineItem).toJson();
     }
+    if (inStoreRefundLineItem != null) {
+      _json["inStoreRefundLineItem"] = (inStoreRefundLineItem).toJson();
+    }
     if (merchantId != null) {
       _json["merchantId"] = merchantId;
     }
@@ -2856,12 +3278,25 @@
     if (refund != null) {
       _json["refund"] = (refund).toJson();
     }
+    if (rejectReturnLineItem != null) {
+      _json["rejectReturnLineItem"] = (rejectReturnLineItem).toJson();
+    }
     if (returnLineItem != null) {
       _json["returnLineItem"] = (returnLineItem).toJson();
     }
+    if (returnRefundLineItem != null) {
+      _json["returnRefundLineItem"] = (returnRefundLineItem).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();
     }
@@ -2906,9 +3341,22 @@
   /// The amount must not be larger than the net amount left on the order.
   Price amount;
 
-  /// The ID of the line item to cancel.
+  /// Amount to refund for the cancelation. Optional. If not set, Google will
+  /// calculate the default based on the price and tax of the items involved.
+  /// The amount must not be larger than the net amount left on the order.
+  Price amountPretax;
+
+  /// Tax amount that correspond to cancellation amount in amountPretax.
+  Price amountTax;
+
+  /// The ID of the line item to cancel. Either lineItemId or productId is
+  /// required.
   core.String lineItemId;
 
+  /// The ID of the product to cancel. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
   /// The quantity to cancel.
   core.int quantity;
 
@@ -2924,9 +3372,18 @@
     if (_json.containsKey("amount")) {
       amount = new Price.fromJson(_json["amount"]);
     }
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
     if (_json.containsKey("lineItemId")) {
       lineItemId = _json["lineItemId"];
     }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
     if (_json.containsKey("quantity")) {
       quantity = _json["quantity"];
     }
@@ -2944,9 +3401,96 @@
     if (amount != null) {
       _json["amount"] = (amount).toJson();
     }
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
     if (lineItemId != null) {
       _json["lineItemId"] = lineItemId;
     }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (quantity != null) {
+      _json["quantity"] = quantity;
+    }
+    if (reason != null) {
+      _json["reason"] = reason;
+    }
+    if (reasonText != null) {
+      _json["reasonText"] = reasonText;
+    }
+    return _json;
+  }
+}
+
+class OrdersCustomBatchRequestEntryInStoreRefundLineItem {
+  /// The amount that is refunded. Required.
+  Price amountPretax;
+
+  /// Tax amount that correspond to refund amount in amountPretax. Required.
+  Price amountTax;
+
+  /// The ID of the line item to return. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the product to return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return and refund.
+  core.int quantity;
+
+  /// The reason for the return.
+  core.String reason;
+
+  /// The explanation of the reason.
+  core.String reasonText;
+
+  OrdersCustomBatchRequestEntryInStoreRefundLineItem();
+
+  OrdersCustomBatchRequestEntryInStoreRefundLineItem.fromJson(core.Map _json) {
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("quantity")) {
+      quantity = _json["quantity"];
+    }
+    if (_json.containsKey("reason")) {
+      reason = _json["reason"];
+    }
+    if (_json.containsKey("reasonText")) {
+      reasonText = _json["reasonText"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
     if (quantity != null) {
       _json["quantity"] = quantity;
     }
@@ -2964,6 +3508,13 @@
   /// The amount that is refunded.
   Price amount;
 
+  /// The amount that is refunded. Either amount or amountPretax and amountTax
+  /// should be filled.
+  Price amountPretax;
+
+  /// Tax amount that correspond to refund amount in amountPretax.
+  Price amountTax;
+
   /// The reason for the refund.
   core.String reason;
 
@@ -2976,6 +3527,12 @@
     if (_json.containsKey("amount")) {
       amount = new Price.fromJson(_json["amount"]);
     }
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
     if (_json.containsKey("reason")) {
       reason = _json["reason"];
     }
@@ -2990,6 +3547,12 @@
     if (amount != null) {
       _json["amount"] = (amount).toJson();
     }
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
     if (reason != null) {
       _json["reason"] = reason;
     }
@@ -3000,11 +3563,16 @@
   }
 }
 
-class OrdersCustomBatchRequestEntryReturnLineItem {
-  /// The ID of the line item to return.
+class OrdersCustomBatchRequestEntryRejectReturnLineItem {
+  /// The ID of the line item to return. Either lineItemId or productId is
+  /// required.
   core.String lineItemId;
 
-  /// The quantity to return.
+  /// The ID of the product to return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return and refund.
   core.int quantity;
 
   /// The reason for the return.
@@ -3013,12 +3581,15 @@
   /// The explanation of the reason.
   core.String reasonText;
 
-  OrdersCustomBatchRequestEntryReturnLineItem();
+  OrdersCustomBatchRequestEntryRejectReturnLineItem();
 
-  OrdersCustomBatchRequestEntryReturnLineItem.fromJson(core.Map _json) {
+  OrdersCustomBatchRequestEntryRejectReturnLineItem.fromJson(core.Map _json) {
     if (_json.containsKey("lineItemId")) {
       lineItemId = _json["lineItemId"];
     }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
     if (_json.containsKey("quantity")) {
       quantity = _json["quantity"];
     }
@@ -3036,6 +3607,9 @@
     if (lineItemId != null) {
       _json["lineItemId"] = lineItemId;
     }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
     if (quantity != null) {
       _json["quantity"] = quantity;
     }
@@ -3049,6 +3623,189 @@
   }
 }
 
+class OrdersCustomBatchRequestEntryReturnLineItem {
+  /// The ID of the line item to return. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the product to return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return.
+  core.int quantity;
+
+  /// The reason for the return.
+  core.String reason;
+
+  /// The explanation of the reason.
+  core.String reasonText;
+
+  OrdersCustomBatchRequestEntryReturnLineItem();
+
+  OrdersCustomBatchRequestEntryReturnLineItem.fromJson(core.Map _json) {
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("quantity")) {
+      quantity = _json["quantity"];
+    }
+    if (_json.containsKey("reason")) {
+      reason = _json["reason"];
+    }
+    if (_json.containsKey("reasonText")) {
+      reasonText = _json["reasonText"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (quantity != null) {
+      _json["quantity"] = quantity;
+    }
+    if (reason != null) {
+      _json["reason"] = reason;
+    }
+    if (reasonText != null) {
+      _json["reasonText"] = reasonText;
+    }
+    return _json;
+  }
+}
+
+class OrdersCustomBatchRequestEntryReturnRefundLineItem {
+  /// The amount that is refunded. Optional, but if filled then both
+  /// amountPretax and amountTax must be set.
+  Price amountPretax;
+
+  /// Tax amount that correspond to refund amount in amountPretax.
+  Price amountTax;
+
+  /// The ID of the line item to return. Either lineItemId or productId is
+  /// required.
+  core.String lineItemId;
+
+  /// The ID of the product to return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return and refund.
+  core.int quantity;
+
+  /// The reason for the return.
+  core.String reason;
+
+  /// The explanation of the reason.
+  core.String reasonText;
+
+  OrdersCustomBatchRequestEntryReturnRefundLineItem();
+
+  OrdersCustomBatchRequestEntryReturnRefundLineItem.fromJson(core.Map _json) {
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("quantity")) {
+      quantity = _json["quantity"];
+    }
+    if (_json.containsKey("reason")) {
+      reason = _json["reason"];
+    }
+    if (_json.containsKey("reasonText")) {
+      reasonText = _json["reasonText"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (quantity != null) {
+      _json["quantity"] = quantity;
+    }
+    if (reason != null) {
+      _json["reason"] = reason;
+    }
+    if (reasonText != null) {
+      _json["reasonText"] = reasonText;
+    }
+    return _json;
+  }
+}
+
+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
@@ -3161,6 +3918,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
@@ -3371,6 +4182,125 @@
   }
 }
 
+class OrdersInStoreRefundLineItemRequest {
+  /// The amount that is refunded. Required.
+  Price amountPretax;
+
+  /// Tax amount that correspond to refund amount in amountPretax. Required.
+  Price amountTax;
+
+  /// The ID of the line item to return. 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 return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return and refund.
+  core.int quantity;
+
+  /// The reason for the return.
+  core.String reason;
+
+  /// The explanation of the reason.
+  core.String reasonText;
+
+  OrdersInStoreRefundLineItemRequest();
+
+  OrdersInStoreRefundLineItemRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("operationId")) {
+      operationId = _json["operationId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("quantity")) {
+      quantity = _json["quantity"];
+    }
+    if (_json.containsKey("reason")) {
+      reason = _json["reason"];
+    }
+    if (_json.containsKey("reasonText")) {
+      reasonText = _json["reasonText"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (operationId != null) {
+      _json["operationId"] = operationId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (quantity != null) {
+      _json["quantity"] = quantity;
+    }
+    if (reason != null) {
+      _json["reason"] = reason;
+    }
+    if (reasonText != null) {
+      _json["reasonText"] = reasonText;
+    }
+    return _json;
+  }
+}
+
+class OrdersInStoreRefundLineItemResponse {
+  /// The status of the execution.
+  core.String executionStatus;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "content#ordersInStoreRefundLineItemResponse".
+  core.String kind;
+
+  OrdersInStoreRefundLineItemResponse();
+
+  OrdersInStoreRefundLineItemResponse.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 OrdersListResponse {
   /// Identifies what kind of resource this is. Value: the fixed string
   /// "content#ordersListResponse".
@@ -3415,6 +4345,13 @@
   /// The amount that is refunded.
   Price amount;
 
+  /// The amount that is refunded. Either amount or amountPretax and amountTax
+  /// should be filled.
+  Price amountPretax;
+
+  /// Tax amount that correspond to refund amount in amountPretax.
+  Price amountTax;
+
   /// The ID of the operation. Unique across all operations for a given order.
   core.String operationId;
 
@@ -3430,6 +4367,12 @@
     if (_json.containsKey("amount")) {
       amount = new Price.fromJson(_json["amount"]);
     }
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
     if (_json.containsKey("operationId")) {
       operationId = _json["operationId"];
     }
@@ -3447,6 +4390,12 @@
     if (amount != null) {
       _json["amount"] = (amount).toJson();
     }
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
     if (operationId != null) {
       _json["operationId"] = operationId;
     }
@@ -3492,14 +4441,19 @@
   }
 }
 
-class OrdersReturnLineItemRequest {
-  /// The ID of the line item to return.
+class OrdersRejectReturnLineItemRequest {
+  /// The ID of the line item to return. 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 quantity to return.
+  /// The ID of the product to return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return and refund.
   core.int quantity;
 
   /// The reason for the return.
@@ -3508,15 +4462,18 @@
   /// The explanation of the reason.
   core.String reasonText;
 
-  OrdersReturnLineItemRequest();
+  OrdersRejectReturnLineItemRequest();
 
-  OrdersReturnLineItemRequest.fromJson(core.Map _json) {
+  OrdersRejectReturnLineItemRequest.fromJson(core.Map _json) {
     if (_json.containsKey("lineItemId")) {
       lineItemId = _json["lineItemId"];
     }
     if (_json.containsKey("operationId")) {
       operationId = _json["operationId"];
     }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
     if (_json.containsKey("quantity")) {
       quantity = _json["quantity"];
     }
@@ -3537,6 +4494,110 @@
     if (operationId != null) {
       _json["operationId"] = operationId;
     }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (quantity != null) {
+      _json["quantity"] = quantity;
+    }
+    if (reason != null) {
+      _json["reason"] = reason;
+    }
+    if (reasonText != null) {
+      _json["reasonText"] = reasonText;
+    }
+    return _json;
+  }
+}
+
+class OrdersRejectReturnLineItemResponse {
+  /// The status of the execution.
+  core.String executionStatus;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "content#ordersRejectReturnLineItemResponse".
+  core.String kind;
+
+  OrdersRejectReturnLineItemResponse();
+
+  OrdersRejectReturnLineItemResponse.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 OrdersReturnLineItemRequest {
+  /// The ID of the line item to return. 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 return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return.
+  core.int quantity;
+
+  /// The reason for the return.
+  core.String reason;
+
+  /// The explanation of the reason.
+  core.String reasonText;
+
+  OrdersReturnLineItemRequest();
+
+  OrdersReturnLineItemRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("operationId")) {
+      operationId = _json["operationId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("quantity")) {
+      quantity = _json["quantity"];
+    }
+    if (_json.containsKey("reason")) {
+      reason = _json["reason"];
+    }
+    if (_json.containsKey("reasonText")) {
+      reasonText = _json["reasonText"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (operationId != null) {
+      _json["operationId"] = operationId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
     if (quantity != null) {
       _json["quantity"] = quantity;
     }
@@ -3582,6 +4643,211 @@
   }
 }
 
+class OrdersReturnRefundLineItemRequest {
+  /// The amount that is refunded. Optional, but if filled then both
+  /// amountPretax and amountTax must be set.
+  Price amountPretax;
+
+  /// Tax amount that correspond to refund amount in amountPretax.
+  Price amountTax;
+
+  /// The ID of the line item to return. 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 return. This is the REST ID used in the products
+  /// service. Either lineItemId or productId is required.
+  core.String productId;
+
+  /// The quantity to return and refund.
+  core.int quantity;
+
+  /// The reason for the return.
+  core.String reason;
+
+  /// The explanation of the reason.
+  core.String reasonText;
+
+  OrdersReturnRefundLineItemRequest();
+
+  OrdersReturnRefundLineItemRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("amountPretax")) {
+      amountPretax = new Price.fromJson(_json["amountPretax"]);
+    }
+    if (_json.containsKey("amountTax")) {
+      amountTax = new Price.fromJson(_json["amountTax"]);
+    }
+    if (_json.containsKey("lineItemId")) {
+      lineItemId = _json["lineItemId"];
+    }
+    if (_json.containsKey("operationId")) {
+      operationId = _json["operationId"];
+    }
+    if (_json.containsKey("productId")) {
+      productId = _json["productId"];
+    }
+    if (_json.containsKey("quantity")) {
+      quantity = _json["quantity"];
+    }
+    if (_json.containsKey("reason")) {
+      reason = _json["reason"];
+    }
+    if (_json.containsKey("reasonText")) {
+      reasonText = _json["reasonText"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (amountPretax != null) {
+      _json["amountPretax"] = (amountPretax).toJson();
+    }
+    if (amountTax != null) {
+      _json["amountTax"] = (amountTax).toJson();
+    }
+    if (lineItemId != null) {
+      _json["lineItemId"] = lineItemId;
+    }
+    if (operationId != null) {
+      _json["operationId"] = operationId;
+    }
+    if (productId != null) {
+      _json["productId"] = productId;
+    }
+    if (quantity != null) {
+      _json["quantity"] = quantity;
+    }
+    if (reason != null) {
+      _json["reason"] = reason;
+    }
+    if (reasonText != null) {
+      _json["reasonText"] = reasonText;
+    }
+    return _json;
+  }
+}
+
+class OrdersReturnRefundLineItemResponse {
+  /// The status of the execution.
+  core.String executionStatus;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "content#ordersReturnRefundLineItemResponse".
+  core.String kind;
+
+  OrdersReturnRefundLineItemResponse();
+
+  OrdersReturnRefundLineItemResponse.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 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
@@ -3693,6 +4959,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.
@@ -3891,6 +5251,10 @@
   /// Line items that are ordered. At least one line item must be provided.
   core.List<TestOrderLineItem> lineItems;
 
+  /// Determines if test order must be pulled by merchant or pushed to merchant
+  /// via push integration.
+  core.String notificationMode;
+
   /// The details of the payment method.
   TestOrderPaymentMethod paymentMethod;
 
@@ -3924,6 +5288,9 @@
           .map((value) => new TestOrderLineItem.fromJson(value))
           .toList();
     }
+    if (_json.containsKey("notificationMode")) {
+      notificationMode = _json["notificationMode"];
+    }
     if (_json.containsKey("paymentMethod")) {
       paymentMethod =
           new TestOrderPaymentMethod.fromJson(_json["paymentMethod"]);
@@ -3959,6 +5326,9 @@
     if (lineItems != null) {
       _json["lineItems"] = lineItems.map((value) => (value).toJson()).toList();
     }
+    if (notificationMode != null) {
+      _json["notificationMode"] = notificationMode;
+    }
     if (paymentMethod != null) {
       _json["paymentMethod"] = (paymentMethod).toJson();
     }
diff --git a/googleapis/lib/customsearch/v1.dart b/googleapis/lib/customsearch/v1.dart
index f4b89d4..2ee68b5 100644
--- a/googleapis/lib/customsearch/v1.dart
+++ b/googleapis/lib/customsearch/v1.dart
@@ -4,7 +4,6 @@
 
 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;
diff --git a/googleapis/lib/dataproc/v1.dart b/googleapis/lib/dataproc/v1.dart
index fddba07..83c97e9 100644
--- a/googleapis/lib/dataproc/v1.dart
+++ b/googleapis/lib/dataproc/v1.dart
@@ -131,6 +131,9 @@
   ///
   /// [clusterName] - Required. The cluster name.
   ///
+  /// [clusterUuid] - Optional. Specifying the cluster_uuid means the RPC should
+  /// fail (with error NOT_FOUND) if cluster with specified UUID does not exist.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -143,7 +146,7 @@
   /// this method will complete with the same error.
   async.Future<Operation> delete(
       core.String projectId, core.String region, core.String clusterName,
-      {core.String $fields}) {
+      {core.String clusterUuid, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -160,6 +163,9 @@
     if (clusterName == null) {
       throw new core.ArgumentError("Parameter clusterName is required.");
     }
+    if (clusterUuid != null) {
+      _queryParams["clusterUuid"] = [clusterUuid];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -406,6 +412,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 +465,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 +487,11 @@
     if (clusterName == null) {
       throw new core.ArgumentError("Parameter clusterName is required.");
     }
+    if (gracefulDecommissionTimeout != null) {
+      _queryParams["gracefulDecommissionTimeout"] = [
+        gracefulDecommissionTimeout
+      ];
+    }
     if (updateMask != null) {
       _queryParams["updateMask"] = [updateMask];
     }
@@ -703,22 +724,6 @@
   /// [region] - Required. The Cloud Dataproc region in which to handle the
   /// request.
   ///
-  /// [filter] - Optional. A filter constraining the jobs to list. Filters are
-  /// case-sensitive and have the following syntax:field = value AND field =
-  /// value ...where field is status.state or labels.[KEY], and [KEY] is a label
-  /// key. value can be * to match all values. status.state can be either ACTIVE
-  /// or INACTIVE. Only the logical AND operator is supported; space-separated
-  /// items are treated as having an implicit AND operator.Example
-  /// filter:status.state = ACTIVE AND labels.env = staging AND labels.starred =
-  /// *
-  ///
-  /// [jobStateMatcher] - Optional. Specifies enumerated categories of jobs to
-  /// list (default = match ALL jobs).
-  /// Possible string values are:
-  /// - "ALL" : A ALL.
-  /// - "ACTIVE" : A ACTIVE.
-  /// - "NON_ACTIVE" : A NON_ACTIVE.
-  ///
   /// [pageToken] - Optional. The page token, returned by a previous call, to
   /// request the next page of results.
   ///
@@ -727,6 +732,23 @@
   /// [clusterName] - Optional. If set, the returned jobs list includes only
   /// jobs that were submitted to the named cluster.
   ///
+  /// [filter] - Optional. A filter constraining the jobs to list. Filters are
+  /// case-sensitive and have the following syntax:field = value AND field =
+  /// value ...where field is status.state or labels.[KEY], and [KEY] is a label
+  /// key. value can be * to match all values. status.state can be either ACTIVE
+  /// or NON_ACTIVE. Only the logical AND operator is supported; space-separated
+  /// items are treated as having an implicit AND operator.Example
+  /// filter:status.state = ACTIVE AND labels.env = staging AND labels.starred =
+  /// *
+  ///
+  /// [jobStateMatcher] - Optional. Specifies enumerated categories of jobs to
+  /// list. (default = match ALL jobs).If filter is provided, jobStateMatcher
+  /// will be ignored.
+  /// Possible string values are:
+  /// - "ALL" : A ALL.
+  /// - "ACTIVE" : A ACTIVE.
+  /// - "NON_ACTIVE" : A NON_ACTIVE.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -738,11 +760,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<ListJobsResponse> list(core.String projectId, core.String region,
-      {core.String filter,
-      core.String jobStateMatcher,
-      core.String pageToken,
+      {core.String pageToken,
       core.int pageSize,
       core.String clusterName,
+      core.String filter,
+      core.String jobStateMatcher,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -757,12 +779,6 @@
     if (region == null) {
       throw new core.ArgumentError("Parameter region is required.");
     }
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
-    if (jobStateMatcher != null) {
-      _queryParams["jobStateMatcher"] = [jobStateMatcher];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
@@ -772,6 +788,12 @@
     if (clusterName != null) {
       _queryParams["clusterName"] = [clusterName];
     }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
+    if (jobStateMatcher != null) {
+      _queryParams["jobStateMatcher"] = [jobStateMatcher];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1205,7 +1227,7 @@
   /// Names of deleted clusters can be reused.
   core.String clusterName;
 
-  /// Output-only. A cluster UUID (Unique Universal Identifier). Cloud Dataproc
+  /// Output only. A cluster UUID (Unique Universal Identifier). Cloud Dataproc
   /// generates this value when it creates the cluster.
   core.String clusterUuid;
 
@@ -1230,10 +1252,10 @@
   /// to.
   core.String projectId;
 
-  /// Output-only. Cluster status.
+  /// Output only. Cluster status.
   ClusterStatus status;
 
-  /// Output-only. The previous cluster status.
+  /// Output only. The previous cluster status.
   core.List<ClusterStatus> statusHistory;
 
   Cluster();
@@ -1436,28 +1458,28 @@
 
 /// Metadata describing the operation.
 class ClusterOperationMetadata {
-  /// Output-only. Name of the cluster for the operation.
+  /// Output only. Name of the cluster for the operation.
   core.String clusterName;
 
-  /// Output-only. Cluster UUID for the operation.
+  /// Output only. Cluster UUID for the operation.
   core.String clusterUuid;
 
-  /// Output-only. Short description of operation.
+  /// Output only. Short description of operation.
   core.String description;
 
-  /// Output-only. Labels associated with the operation
+  /// Output only. Labels associated with the operation
   core.Map<core.String, core.String> labels;
 
-  /// Output-only. The operation type.
+  /// Output only. The operation type.
   core.String operationType;
 
-  /// Output-only. Current operation status.
+  /// Output only. Current operation status.
   ClusterOperationStatus status;
 
-  /// Output-only. The previous operation status.
+  /// Output only. The previous operation status.
   core.List<ClusterOperationStatus> statusHistory;
 
-  /// Output-only. Errors encountered during operation execution.
+  /// Output only. Errors encountered during operation execution.
   core.List<core.String> warnings;
 
   ClusterOperationMetadata();
@@ -1525,13 +1547,13 @@
 
 /// The status of the operation.
 class ClusterOperationStatus {
-  /// Output-only.A message containing any operation metadata details.
+  /// Output only. A message containing any operation metadata details.
   core.String details;
 
-  /// Output-only. A message containing the detailed operation state.
+  /// Output only. A message containing the detailed operation state.
   core.String innerState;
 
-  /// Output-only. A message containing the operation state.
+  /// Output only. A message containing the operation state.
   /// Possible string values are:
   /// - "UNKNOWN" : Unused.
   /// - "PENDING" : The operation has been created.
@@ -1539,7 +1561,7 @@
   /// - "DONE" : The operation is done; either cancelled or completed.
   core.String state;
 
-  /// Output-only. The time this state was entered.
+  /// Output only. The time this state was entered.
   core.String stateStartTime;
 
   ClusterOperationStatus();
@@ -1580,10 +1602,10 @@
 
 /// The status of a cluster and its instances.
 class ClusterStatus {
-  /// Output-only. Optional details of cluster's state.
+  /// Output only. Optional details of cluster's state.
   core.String detail;
 
-  /// Output-only. The cluster's state.
+  /// Output only. The cluster's state.
   /// Possible string values are:
   /// - "UNKNOWN" : The cluster state is unknown.
   /// - "CREATING" : The cluster is being created and set up. It is not ready
@@ -1596,13 +1618,13 @@
   /// process jobs.
   core.String state;
 
-  /// Output-only. Time when this state was entered.
+  /// Output only. Time when this state was entered.
   core.String stateStartTime;
 
-  /// Output-only. Additional state information that includes status reported by
+  /// Output only. Additional state information that includes status reported by
   /// the agent.
   /// Possible string values are:
-  /// - "UNSPECIFIED"
+  /// - "UNSPECIFIED" : The cluster substate is unknown.
   /// - "UNHEALTHY" : The cluster is known to be in an unhealthy state (for
   /// example, critical daemons are not running or HDFS capacity is
   /// exhausted).Applies to RUNNING state.
@@ -1661,7 +1683,7 @@
 
 /// The location of diagnostic output.
 class DiagnoseClusterResults {
-  /// Output-only. The Google Cloud Storage URI of the diagnostic output. The
+  /// Output only. The Google Cloud Storage URI of the diagnostic output. The
   /// output report is a plain text file with a summary of collected
   /// diagnostics.
   core.String outputUri;
@@ -2062,7 +2084,7 @@
   /// Optional. Disk option config settings.
   DiskConfig diskConfig;
 
-  /// Output-only. The Google Compute Engine image resource used for cluster
+  /// Output only. The Google Compute Engine image resource used for cluster
   /// instances. Inferred from SoftwareConfig.image_version.
   core.String imageUri;
 
@@ -2082,7 +2104,7 @@
   /// n1-standard-2
   core.String machineTypeUri;
 
-  /// Output-only. The config for Google Compute Engine Instance Group Manager
+  /// Output only. The config for Google Compute Engine Instance Group Manager
   /// that manages this group. This is only used for preemptible instance
   /// groups.
   ManagedGroupConfig managedGroupConfig;
@@ -2157,12 +2179,12 @@
 
 /// A Cloud Dataproc job resource.
 class Job {
-  /// Output-only. If present, the location of miscellaneous control files which
+  /// Output only. If present, the location of miscellaneous control files which
   /// may be used as part of job setup and handling. If not present, control
   /// files may be placed in the same location as driver_output_uri.
   core.String driverControlFilesUri;
 
-  /// Output-only. A URI pointing to the location of the stdout of the job's
+  /// Output only. A URI pointing to the location of the stdout of the job's
   /// driver program.
   core.String driverOutputResourceUri;
 
@@ -2204,15 +2226,15 @@
   /// Job is a SparkSql job.
   SparkSqlJob sparkSqlJob;
 
-  /// Output-only. The job status. Additional application-specific status
+  /// Output only. The job status. Additional application-specific status
   /// information may be contained in the <code>type_job</code> and
   /// <code>yarn_applications</code> fields.
   JobStatus status;
 
-  /// Output-only. The previous job status.
+  /// Output only. The previous job status.
   core.List<JobStatus> statusHistory;
 
-  /// Output-only. The collection of YARN applications spun up by this job.Beta
+  /// Output only. The collection of YARN applications spun up by this job.Beta
   /// Feature: This report is available for testing purposes only. It may be
   /// changed before final release.
   core.List<YarnApplication> yarnApplications;
@@ -2330,7 +2352,7 @@
   /// Required. The name of the cluster where the job will be submitted.
   core.String clusterName;
 
-  /// Output-only. A cluster UUID generated by the Cloud Dataproc service when
+  /// Output only. A cluster UUID generated by the Cloud Dataproc service when
   /// the job is submitted.
   core.String clusterUuid;
 
@@ -2395,8 +2417,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
@@ -2424,11 +2445,11 @@
 
 /// Cloud Dataproc job status.
 class JobStatus {
-  /// Output-only. Optional job state details, such as an error description if
+  /// Output only. Optional job state details, such as an error description if
   /// the state is <code>ERROR</code>.
   core.String details;
 
-  /// Output-only. A state message specifying the overall job state.
+  /// Output only. A state message specifying the overall job state.
   /// Possible string values are:
   /// - "STATE_UNSPECIFIED" : The job state is unknown.
   /// - "PENDING" : The job is pending; it has been submitted, but is not yet
@@ -2447,13 +2468,13 @@
   /// failure details for this attempt.Applies to restartable jobs only.
   core.String state;
 
-  /// Output-only. The time when this state was entered.
+  /// Output only. The time when this state was entered.
   core.String stateStartTime;
 
-  /// Output-only. Additional state information, which includes status reported
+  /// Output only. Additional state information, which includes status reported
   /// by the agent.
   /// Possible string values are:
-  /// - "UNSPECIFIED"
+  /// - "UNSPECIFIED" : The job substate is unknown.
   /// - "SUBMITTED" : The Job is submitted to the agent.Applies to RUNNING
   /// state.
   /// - "QUEUED" : The Job has been received and is awaiting execution (it may
@@ -2503,10 +2524,10 @@
 
 /// The list of all clusters in a project.
 class ListClustersResponse {
-  /// Output-only. The clusters in the project.
+  /// Output only. The clusters in the project.
   core.List<Cluster> clusters;
 
-  /// Output-only. This token is included in the response if there are more
+  /// Output only. This token is included in the response if there are more
   /// results to fetch. To fetch additional results, provide this value as the
   /// page_token in a subsequent ListClustersRequest.
   core.String nextPageToken;
@@ -2539,7 +2560,7 @@
 
 /// A list of jobs in a project.
 class ListJobsResponse {
-  /// Output-only. Jobs list.
+  /// Output only. Jobs list.
   core.List<Job> jobs;
 
   /// Optional. This token is included in the response if there are more results
@@ -2633,10 +2654,10 @@
 
 /// Specifies the resources used to actively manage an instance group.
 class ManagedGroupConfig {
-  /// Output-only. The name of the Instance Group Manager for this group.
+  /// Output only. The name of the Instance Group Manager for this group.
   core.String instanceGroupManagerName;
 
-  /// Output-only. The name of the Instance Template used for the Managed
+  /// Output only. The name of the Instance Template used for the Managed
   /// Instance Group.
   core.String instanceTemplateName;
 
diff --git a/googleapis/lib/datastore/v1.dart b/googleapis/lib/datastore/v1.dart
index 4eabcfd..b37b15f 100644
--- a/googleapis/lib/datastore/v1.dart
+++ b/googleapis/lib/datastore/v1.dart
@@ -574,12 +574,12 @@
   /// [name] - The name of the operation's parent resource.
   /// 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.
   ///
@@ -591,9 +591,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<GoogleLongrunningListOperationsResponse> 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();
@@ -605,15 +605,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];
     }
@@ -1715,40 +1715,6 @@
 /// specified otherwise, this must conform to the
 /// <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
 /// standard</a>. Values must be within normalized ranges.
-///
-/// Example of normalization code in Python:
-///
-///     def NormalizeLongitude(longitude):
-///       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
-///       q, r = divmod(longitude, 360.0)
-///       if r > 180.0 or (r == 180.0 and q <= -1.0):
-///         return r - 360.0
-///       return r
-///
-///     def NormalizeLatLng(latitude, longitude):
-///       """Wraps decimal degrees latitude and longitude to
-///       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
-///       r = latitude % 360.0
-///       if r <= 90.0:
-///         return r, NormalizeLongitude(longitude)
-///       elif r >= 270.0:
-///         return r - 360, NormalizeLongitude(longitude)
-///       else:
-///         return 180 - r, NormalizeLongitude(longitude + 180.0)
-///
-///     assert 180.0 == NormalizeLongitude(180.0)
-///     assert -180.0 == NormalizeLongitude(-180.0)
-///     assert -179.0 == NormalizeLongitude(181.0)
-///     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
-///     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
-///     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
-///     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
-///     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
-///     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
-///     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
-///     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
-///     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
-///     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
 class LatLng {
   /// The latitude in degrees. It must be in the range [-90.0, +90.0].
   core.double latitude;
diff --git a/googleapis/lib/deploymentmanager/v2.dart b/googleapis/lib/deploymentmanager/v2.dart
index 737d015..e387940 100644
--- a/googleapis/lib/deploymentmanager/v2.dart
+++ b/googleapis/lib/deploymentmanager/v2.dart
@@ -1479,7 +1479,7 @@
 /// If there are AuditConfigs for both `allServices` and a specific service, the
 /// union of the two AuditConfigs is used for that service: the log_types
 /// specified in each AuditConfig are enabled, and the exempted_members in each
-/// AuditConfig are exempted.
+/// AuditLogConfig are exempted.
 ///
 /// Example Policy with multiple AuditConfigs:
 ///
@@ -1603,7 +1603,7 @@
   /// The condition that is associated with this binding. NOTE: an unsatisfied
   /// condition will not allow user access via current binding. Different
   /// bindings, including their conditions, are examined independently. This
-  /// field is GOOGLE_INTERNAL.
+  /// field is only visible as GOOGLE_INTERNAL or CONDITION_TRUSTED_TESTER.
   Expr condition;
 
   /// Specifies the identities requesting access for a Cloud Platform resource.
@@ -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;
@@ -2695,7 +2699,9 @@
   core.int progress;
 
   /// [Output Only] The URL of the region where the operation resides. Only
-  /// available when performing regional operations.
+  /// available when performing regional operations. You must specify this field
+  /// as part of the HTTP request URL. It is not settable as a field in the
+  /// request body.
   core.String region;
 
   /// [Output Only] Server-defined URL for the resource.
@@ -2731,7 +2737,9 @@
   core.List<OperationWarnings> warnings;
 
   /// [Output Only] The URL of the zone where the operation resides. Only
-  /// available when performing per-zone operations.
+  /// available when performing per-zone operations. You must specify this field
+  /// as part of the HTTP request URL. It is not settable as a field in the
+  /// request body.
   core.String zone;
 
   Operation();
@@ -2940,7 +2948,7 @@
 /// "roles/viewer", "members": ["user:sean@example.com"] } ] }
 ///
 /// For a description of IAM and its features, see the [IAM developer's
-/// guide](https://cloud.google.com/iam).
+/// guide](https://cloud.google.com/iam/docs).
 class Policy {
   /// Specifies cloud audit logging configuration for this policy.
   core.List<AuditConfig> auditConfigs;
@@ -2981,7 +2989,7 @@
   /// rule applies, permission is denied.
   core.List<Rule> rules;
 
-  /// Version of the `Policy`. The default version is 0.
+  /// Deprecated.
   core.int version;
 
   Policy();
diff --git a/googleapis/lib/dfareporting/v2_8.dart b/googleapis/lib/dfareporting/v2_8.dart
index 1e0cb9f..945371d 100644
--- a/googleapis/lib/dfareporting/v2_8.dart
+++ b/googleapis/lib/dfareporting/v2_8.dart
@@ -13928,6 +13928,7 @@
   /// - "47" for BGN
   /// - "48" for HRK
   /// - "49" for MXN
+  /// - "50" for NGN
   core.String currencyId;
 
   /// Default placement dimensions for this account.
@@ -17742,7 +17743,7 @@
   core.String backgroundColor;
 
   /// Click-through URL for backup image. Applicable to the following creative
-  /// types: FLASH_INPAGE and HTML5_BANNER. Applicable to DISPLAY when the
+  /// types: FLASH_INPAGE, and HTML5_BANNER. Applicable to DISPLAY when the
   /// primary asset type is not HTML_IMAGE.
   core.String backupImageClickThroughUrl;
 
@@ -21049,6 +21050,7 @@
   /// - "47" for BGN
   /// - "48" for HRK
   /// - "49" for MXN
+  /// - "50" for NGN
   core.String currencyId;
 
   /// Description of this directory site. This is a read-only field.
@@ -22213,7 +22215,8 @@
 
 /// Floodlight Activity GenerateTag Response
 class FloodlightActivitiesGenerateTagResponse {
-  /// Generated tag for this floodlight activity.
+  /// Generated tag for this Floodlight activity. For global site tags, this is
+  /// the event snippet.
   core.String floodlightActivityTag;
 
   /// Identifies what kind of resource this is. Value: the fixed string
@@ -22409,8 +22412,8 @@
   /// - "XHTML"
   core.String tagFormat;
 
-  /// Value of the cat= paramter in the floodlight tag, which the ad servers use
-  /// to identify the activity. This is optional: if empty, a new tag string
+  /// Value of the cat= parameter in the floodlight tag, which the ad servers
+  /// use to identify the activity. This is optional: if empty, a new tag string
   /// will be generated for you. This string must be 1 to 8 characters long,
   /// with valid characters being [a-z][A-Z][0-9][-][ _ ]. This tag string must
   /// also be unique among activities of the same activity group. This field is
@@ -28400,7 +28403,7 @@
 
   /// Whether to enable all reach dimension combinations in the report. Defaults
   /// to false. If enabled, the date range of the report should be within the
-  /// last three months.
+  /// last 42 days.
   core.bool enableAllDimensionCombinations;
 
   /// The list of names of metrics the report should include.
diff --git a/googleapis/lib/dfareporting/v3_0.dart b/googleapis/lib/dfareporting/v3_0.dart
new file mode 100644
index 0000000..34e8191
--- /dev/null
+++ b/googleapis/lib/dfareporting/v3_0.dart
@@ -0,0 +1,31453 @@
+// This is a generated file (see the discoveryapis_generator project).
+
+library googleapis.dfareporting.v3_0;
+
+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 dfareporting/v3.0';
+
+/// Manages your DoubleClick Campaign Manager ad campaigns and reports.
+class DfareportingApi {
+  /// Manage DoubleClick Digital Marketing conversions
+  static const DdmconversionsScope =
+      "https://www.googleapis.com/auth/ddmconversions";
+
+  /// View and manage DoubleClick for Advertisers reports
+  static const DfareportingScope =
+      "https://www.googleapis.com/auth/dfareporting";
+
+  /// View and manage your DoubleClick Campaign Manager's (DCM) display ad
+  /// campaigns
+  static const DfatraffickingScope =
+      "https://www.googleapis.com/auth/dfatrafficking";
+
+  final commons.ApiRequester _requester;
+
+  AccountActiveAdSummariesResourceApi get accountActiveAdSummaries =>
+      new AccountActiveAdSummariesResourceApi(_requester);
+  AccountPermissionGroupsResourceApi get accountPermissionGroups =>
+      new AccountPermissionGroupsResourceApi(_requester);
+  AccountPermissionsResourceApi get accountPermissions =>
+      new AccountPermissionsResourceApi(_requester);
+  AccountUserProfilesResourceApi get accountUserProfiles =>
+      new AccountUserProfilesResourceApi(_requester);
+  AccountsResourceApi get accounts => new AccountsResourceApi(_requester);
+  AdsResourceApi get ads => new AdsResourceApi(_requester);
+  AdvertiserGroupsResourceApi get advertiserGroups =>
+      new AdvertiserGroupsResourceApi(_requester);
+  AdvertiserLandingPagesResourceApi get advertiserLandingPages =>
+      new AdvertiserLandingPagesResourceApi(_requester);
+  AdvertisersResourceApi get advertisers =>
+      new AdvertisersResourceApi(_requester);
+  BrowsersResourceApi get browsers => new BrowsersResourceApi(_requester);
+  CampaignCreativeAssociationsResourceApi get campaignCreativeAssociations =>
+      new CampaignCreativeAssociationsResourceApi(_requester);
+  CampaignsResourceApi get campaigns => new CampaignsResourceApi(_requester);
+  ChangeLogsResourceApi get changeLogs => new ChangeLogsResourceApi(_requester);
+  CitiesResourceApi get cities => new CitiesResourceApi(_requester);
+  ConnectionTypesResourceApi get connectionTypes =>
+      new ConnectionTypesResourceApi(_requester);
+  ContentCategoriesResourceApi get contentCategories =>
+      new ContentCategoriesResourceApi(_requester);
+  ConversionsResourceApi get conversions =>
+      new ConversionsResourceApi(_requester);
+  CountriesResourceApi get countries => new CountriesResourceApi(_requester);
+  CreativeAssetsResourceApi get creativeAssets =>
+      new CreativeAssetsResourceApi(_requester);
+  CreativeFieldValuesResourceApi get creativeFieldValues =>
+      new CreativeFieldValuesResourceApi(_requester);
+  CreativeFieldsResourceApi get creativeFields =>
+      new CreativeFieldsResourceApi(_requester);
+  CreativeGroupsResourceApi get creativeGroups =>
+      new CreativeGroupsResourceApi(_requester);
+  CreativesResourceApi get creatives => new CreativesResourceApi(_requester);
+  DimensionValuesResourceApi get dimensionValues =>
+      new DimensionValuesResourceApi(_requester);
+  DirectorySiteContactsResourceApi get directorySiteContacts =>
+      new DirectorySiteContactsResourceApi(_requester);
+  DirectorySitesResourceApi get directorySites =>
+      new DirectorySitesResourceApi(_requester);
+  DynamicTargetingKeysResourceApi get dynamicTargetingKeys =>
+      new DynamicTargetingKeysResourceApi(_requester);
+  EventTagsResourceApi get eventTags => new EventTagsResourceApi(_requester);
+  FilesResourceApi get files => new FilesResourceApi(_requester);
+  FloodlightActivitiesResourceApi get floodlightActivities =>
+      new FloodlightActivitiesResourceApi(_requester);
+  FloodlightActivityGroupsResourceApi get floodlightActivityGroups =>
+      new FloodlightActivityGroupsResourceApi(_requester);
+  FloodlightConfigurationsResourceApi get floodlightConfigurations =>
+      new FloodlightConfigurationsResourceApi(_requester);
+  InventoryItemsResourceApi get inventoryItems =>
+      new InventoryItemsResourceApi(_requester);
+  LanguagesResourceApi get languages => new LanguagesResourceApi(_requester);
+  MetrosResourceApi get metros => new MetrosResourceApi(_requester);
+  MobileCarriersResourceApi get mobileCarriers =>
+      new MobileCarriersResourceApi(_requester);
+  OperatingSystemVersionsResourceApi get operatingSystemVersions =>
+      new OperatingSystemVersionsResourceApi(_requester);
+  OperatingSystemsResourceApi get operatingSystems =>
+      new OperatingSystemsResourceApi(_requester);
+  OrderDocumentsResourceApi get orderDocuments =>
+      new OrderDocumentsResourceApi(_requester);
+  OrdersResourceApi get orders => new OrdersResourceApi(_requester);
+  PlacementGroupsResourceApi get placementGroups =>
+      new PlacementGroupsResourceApi(_requester);
+  PlacementStrategiesResourceApi get placementStrategies =>
+      new PlacementStrategiesResourceApi(_requester);
+  PlacementsResourceApi get placements => new PlacementsResourceApi(_requester);
+  PlatformTypesResourceApi get platformTypes =>
+      new PlatformTypesResourceApi(_requester);
+  PostalCodesResourceApi get postalCodes =>
+      new PostalCodesResourceApi(_requester);
+  ProjectsResourceApi get projects => new ProjectsResourceApi(_requester);
+  RegionsResourceApi get regions => new RegionsResourceApi(_requester);
+  RemarketingListSharesResourceApi get remarketingListShares =>
+      new RemarketingListSharesResourceApi(_requester);
+  RemarketingListsResourceApi get remarketingLists =>
+      new RemarketingListsResourceApi(_requester);
+  ReportsResourceApi get reports => new ReportsResourceApi(_requester);
+  SitesResourceApi get sites => new SitesResourceApi(_requester);
+  SizesResourceApi get sizes => new SizesResourceApi(_requester);
+  SubaccountsResourceApi get subaccounts =>
+      new SubaccountsResourceApi(_requester);
+  TargetableRemarketingListsResourceApi get targetableRemarketingLists =>
+      new TargetableRemarketingListsResourceApi(_requester);
+  TargetingTemplatesResourceApi get targetingTemplates =>
+      new TargetingTemplatesResourceApi(_requester);
+  UserProfilesResourceApi get userProfiles =>
+      new UserProfilesResourceApi(_requester);
+  UserRolePermissionGroupsResourceApi get userRolePermissionGroups =>
+      new UserRolePermissionGroupsResourceApi(_requester);
+  UserRolePermissionsResourceApi get userRolePermissions =>
+      new UserRolePermissionsResourceApi(_requester);
+  UserRolesResourceApi get userRoles => new UserRolesResourceApi(_requester);
+  VideoFormatsResourceApi get videoFormats =>
+      new VideoFormatsResourceApi(_requester);
+
+  DfareportingApi(http.Client client,
+      {core.String rootUrl: "https://www.googleapis.com/",
+      core.String servicePath: "dfareporting/v3.0/"})
+      : _requester =
+            new commons.ApiRequester(client, rootUrl, servicePath, USER_AGENT);
+}
+
+class AccountActiveAdSummariesResourceApi {
+  final commons.ApiRequester _requester;
+
+  AccountActiveAdSummariesResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets the account's active ad summary by account ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [summaryAccountId] - Account ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AccountActiveAdSummary].
+  ///
+  /// 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<AccountActiveAdSummary> get(
+      core.String profileId, core.String summaryAccountId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (summaryAccountId == null) {
+      throw new core.ArgumentError("Parameter summaryAccountId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accountActiveAdSummaries/' +
+        commons.Escaper.ecapeVariable('$summaryAccountId');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new AccountActiveAdSummary.fromJson(data));
+  }
+}
+
+class AccountPermissionGroupsResourceApi {
+  final commons.ApiRequester _requester;
+
+  AccountPermissionGroupsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one account permission group by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Account permission group ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AccountPermissionGroup].
+  ///
+  /// 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<AccountPermissionGroup> get(
+      core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accountPermissionGroups/' +
+        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 AccountPermissionGroup.fromJson(data));
+  }
+
+  /// Retrieves the list of account permission groups.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AccountPermissionGroupsListResponse].
+  ///
+  /// 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<AccountPermissionGroupsListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accountPermissionGroups';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new AccountPermissionGroupsListResponse.fromJson(data));
+  }
+}
+
+class AccountPermissionsResourceApi {
+  final commons.ApiRequester _requester;
+
+  AccountPermissionsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one account permission by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Account permission ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AccountPermission].
+  ///
+  /// 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<AccountPermission> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accountPermissions/' +
+        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 AccountPermission.fromJson(data));
+  }
+
+  /// Retrieves the list of account permissions.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AccountPermissionsListResponse].
+  ///
+  /// 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<AccountPermissionsListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accountPermissions';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new AccountPermissionsListResponse.fromJson(data));
+  }
+}
+
+class AccountUserProfilesResourceApi {
+  final commons.ApiRequester _requester;
+
+  AccountUserProfilesResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one account user profile by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - User profile ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AccountUserProfile].
+  ///
+  /// 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<AccountUserProfile> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accountUserProfiles/' +
+        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 AccountUserProfile.fromJson(data));
+  }
+
+  /// Inserts a new account user profile.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AccountUserProfile].
+  ///
+  /// 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<AccountUserProfile> insert(
+      AccountUserProfile request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accountUserProfiles';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new AccountUserProfile.fromJson(data));
+  }
+
+  /// Retrieves a list of account user profiles, possibly filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [active] - Select only active user profiles.
+  ///
+  /// [ids] - Select only user profiles with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for objects by name, ID or email.
+  /// Wildcards (*) are allowed. For example, "user profile*2015" will return
+  /// objects with names like "user profile June 2015", "user profile April
+  /// 2015", or simply "user profile 2015". Most of the searches also add
+  /// wildcards implicitly at the start and the end of the search string. For
+  /// example, a search string of "user profile" will match objects with name
+  /// "my user profile", "user profile 2015", or simply "user profile".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [subaccountId] - Select only user profiles with the specified subaccount
+  /// ID.
+  ///
+  /// [userRoleId] - Select only user profiles with the specified user role ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AccountUserProfilesListResponse].
+  ///
+  /// 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<AccountUserProfilesListResponse> list(core.String profileId,
+      {core.bool active,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      core.String subaccountId,
+      core.String userRoleId,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (active != null) {
+      _queryParams["active"] = ["${active}"];
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if (subaccountId != null) {
+      _queryParams["subaccountId"] = [subaccountId];
+    }
+    if (userRoleId != null) {
+      _queryParams["userRoleId"] = [userRoleId];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accountUserProfiles';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new AccountUserProfilesListResponse.fromJson(data));
+  }
+
+  /// Updates an existing account user profile. This method supports patch
+  /// semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - User profile ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AccountUserProfile].
+  ///
+  /// 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<AccountUserProfile> patch(
+      AccountUserProfile request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accountUserProfiles';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new AccountUserProfile.fromJson(data));
+  }
+
+  /// Updates an existing account user profile.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AccountUserProfile].
+  ///
+  /// 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<AccountUserProfile> update(
+      AccountUserProfile request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accountUserProfiles';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new AccountUserProfile.fromJson(data));
+  }
+}
+
+class AccountsResourceApi {
+  final commons.ApiRequester _requester;
+
+  AccountsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one account by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Account ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Account].
+  ///
+  /// 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<Account> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accounts/' +
+        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 Account.fromJson(data));
+  }
+
+  /// Retrieves the list of accounts, possibly filtered. This method supports
+  /// paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [active] - Select only active accounts. Don't set this field to select
+  /// both active and non-active accounts.
+  ///
+  /// [ids] - Select only accounts with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for objects by name or ID. Wildcards (*)
+  /// are allowed. For example, "account*2015" will return objects with names
+  /// like "account June 2015", "account April 2015", or simply "account 2015".
+  /// Most of the searches also add wildcards implicitly at the start and the
+  /// end of the search string. For example, a search string of "account" will
+  /// match objects with name "my account", "account 2015", or simply "account".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AccountsListResponse].
+  ///
+  /// 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<AccountsListResponse> list(core.String profileId,
+      {core.bool active,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (active != null) {
+      _queryParams["active"] = ["${active}"];
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accounts';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new AccountsListResponse.fromJson(data));
+  }
+
+  /// Updates an existing account. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Account ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Account].
+  ///
+  /// 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<Account> patch(
+      Account request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accounts';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Account.fromJson(data));
+  }
+
+  /// Updates an existing account.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Account].
+  ///
+  /// 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<Account> update(Account request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/accounts';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Account.fromJson(data));
+  }
+}
+
+class AdsResourceApi {
+  final commons.ApiRequester _requester;
+
+  AdsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one ad by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Ad ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Ad].
+  ///
+  /// 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<Ad> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/ads/' +
+        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 Ad.fromJson(data));
+  }
+
+  /// Inserts a new ad.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Ad].
+  ///
+  /// 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<Ad> insert(Ad request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url =
+        'userprofiles/' + commons.Escaper.ecapeVariable('$profileId') + '/ads';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Ad.fromJson(data));
+  }
+
+  /// Retrieves a list of ads, possibly filtered. This method supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [active] - Select only active ads.
+  ///
+  /// [advertiserId] - Select only ads with this advertiser ID.
+  ///
+  /// [archived] - Select only archived ads.
+  ///
+  /// [audienceSegmentIds] - Select only ads with these audience segment IDs.
+  ///
+  /// [campaignIds] - Select only ads with these campaign IDs.
+  ///
+  /// [compatibility] - Select default ads with the specified compatibility.
+  /// Applicable when type is AD_SERVING_DEFAULT_AD. DISPLAY and
+  /// DISPLAY_INTERSTITIAL refer to rendering either on desktop or on mobile
+  /// devices for regular or interstitial ads, respectively. APP and
+  /// APP_INTERSTITIAL are for rendering in mobile apps. IN_STREAM_VIDEO refers
+  /// to rendering an in-stream video ads developed with the VAST standard.
+  /// Possible string values are:
+  /// - "APP"
+  /// - "APP_INTERSTITIAL"
+  /// - "DISPLAY"
+  /// - "DISPLAY_INTERSTITIAL"
+  /// - "IN_STREAM_VIDEO"
+  ///
+  /// [creativeIds] - Select only ads with these creative IDs assigned.
+  ///
+  /// [creativeOptimizationConfigurationIds] - Select only ads with these
+  /// creative optimization configuration IDs.
+  ///
+  /// [dynamicClickTracker] - Select only dynamic click trackers. Applicable
+  /// when type is AD_SERVING_CLICK_TRACKER. If true, select dynamic click
+  /// trackers. If false, select static click trackers. Leave unset to select
+  /// both.
+  ///
+  /// [ids] - Select only ads with these IDs.
+  ///
+  /// [landingPageIds] - Select only ads with these landing page IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [overriddenEventTagId] - Select only ads with this event tag override ID.
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [placementIds] - Select only ads with these placement IDs assigned.
+  ///
+  /// [remarketingListIds] - Select only ads whose list targeting expression use
+  /// these remarketing list IDs.
+  ///
+  /// [searchString] - Allows searching for objects by name or ID. Wildcards (*)
+  /// are allowed. For example, "ad*2015" will return objects with names like
+  /// "ad June 2015", "ad April 2015", or simply "ad 2015". Most of the searches
+  /// also add wildcards implicitly at the start and the end of the search
+  /// string. For example, a search string of "ad" will match objects with name
+  /// "my ad", "ad 2015", or simply "ad".
+  ///
+  /// [sizeIds] - Select only ads with these size IDs.
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [sslCompliant] - Select only ads that are SSL-compliant.
+  ///
+  /// [sslRequired] - Select only ads that require SSL.
+  ///
+  /// [type] - Select only ads with these types.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AdsListResponse].
+  ///
+  /// 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<AdsListResponse> list(core.String profileId,
+      {core.bool active,
+      core.String advertiserId,
+      core.bool archived,
+      core.List<core.String> audienceSegmentIds,
+      core.List<core.String> campaignIds,
+      core.String compatibility,
+      core.List<core.String> creativeIds,
+      core.List<core.String> creativeOptimizationConfigurationIds,
+      core.bool dynamicClickTracker,
+      core.List<core.String> ids,
+      core.List<core.String> landingPageIds,
+      core.int maxResults,
+      core.String overriddenEventTagId,
+      core.String pageToken,
+      core.List<core.String> placementIds,
+      core.List<core.String> remarketingListIds,
+      core.String searchString,
+      core.List<core.String> sizeIds,
+      core.String sortField,
+      core.String sortOrder,
+      core.bool sslCompliant,
+      core.bool sslRequired,
+      core.List<core.String> type,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (active != null) {
+      _queryParams["active"] = ["${active}"];
+    }
+    if (advertiserId != null) {
+      _queryParams["advertiserId"] = [advertiserId];
+    }
+    if (archived != null) {
+      _queryParams["archived"] = ["${archived}"];
+    }
+    if (audienceSegmentIds != null) {
+      _queryParams["audienceSegmentIds"] = audienceSegmentIds;
+    }
+    if (campaignIds != null) {
+      _queryParams["campaignIds"] = campaignIds;
+    }
+    if (compatibility != null) {
+      _queryParams["compatibility"] = [compatibility];
+    }
+    if (creativeIds != null) {
+      _queryParams["creativeIds"] = creativeIds;
+    }
+    if (creativeOptimizationConfigurationIds != null) {
+      _queryParams["creativeOptimizationConfigurationIds"] =
+          creativeOptimizationConfigurationIds;
+    }
+    if (dynamicClickTracker != null) {
+      _queryParams["dynamicClickTracker"] = ["${dynamicClickTracker}"];
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (landingPageIds != null) {
+      _queryParams["landingPageIds"] = landingPageIds;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (overriddenEventTagId != null) {
+      _queryParams["overriddenEventTagId"] = [overriddenEventTagId];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (placementIds != null) {
+      _queryParams["placementIds"] = placementIds;
+    }
+    if (remarketingListIds != null) {
+      _queryParams["remarketingListIds"] = remarketingListIds;
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sizeIds != null) {
+      _queryParams["sizeIds"] = sizeIds;
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if (sslCompliant != null) {
+      _queryParams["sslCompliant"] = ["${sslCompliant}"];
+    }
+    if (sslRequired != null) {
+      _queryParams["sslRequired"] = ["${sslRequired}"];
+    }
+    if (type != null) {
+      _queryParams["type"] = type;
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url =
+        'userprofiles/' + commons.Escaper.ecapeVariable('$profileId') + '/ads';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new AdsListResponse.fromJson(data));
+  }
+
+  /// Updates an existing ad. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Ad ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Ad].
+  ///
+  /// 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<Ad> patch(Ad request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url =
+        'userprofiles/' + commons.Escaper.ecapeVariable('$profileId') + '/ads';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Ad.fromJson(data));
+  }
+
+  /// Updates an existing ad.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Ad].
+  ///
+  /// 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<Ad> update(Ad request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url =
+        'userprofiles/' + commons.Escaper.ecapeVariable('$profileId') + '/ads';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Ad.fromJson(data));
+  }
+}
+
+class AdvertiserGroupsResourceApi {
+  final commons.ApiRequester _requester;
+
+  AdvertiserGroupsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Deletes an existing advertiser group.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Advertiser group ID.
+  ///
+  /// [$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 profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertiserGroups/' +
+        commons.Escaper.ecapeVariable('$id');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Gets one advertiser group by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Advertiser group ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AdvertiserGroup].
+  ///
+  /// 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<AdvertiserGroup> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertiserGroups/' +
+        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 AdvertiserGroup.fromJson(data));
+  }
+
+  /// Inserts a new advertiser group.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AdvertiserGroup].
+  ///
+  /// 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<AdvertiserGroup> insert(
+      AdvertiserGroup request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertiserGroups';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new AdvertiserGroup.fromJson(data));
+  }
+
+  /// Retrieves a list of advertiser groups, possibly filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [ids] - Select only advertiser groups with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for objects by name or ID. Wildcards (*)
+  /// are allowed. For example, "advertiser*2015" will return objects with names
+  /// like "advertiser group June 2015", "advertiser group April 2015", or
+  /// simply "advertiser group 2015". Most of the searches also add wildcards
+  /// implicitly at the start and the end of the search string. For example, a
+  /// search string of "advertisergroup" will match objects with name "my
+  /// advertisergroup", "advertisergroup 2015", or simply "advertisergroup".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AdvertiserGroupsListResponse].
+  ///
+  /// 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<AdvertiserGroupsListResponse> list(core.String profileId,
+      {core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertiserGroups';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new AdvertiserGroupsListResponse.fromJson(data));
+  }
+
+  /// Updates an existing advertiser group. This method supports patch
+  /// semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Advertiser group ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AdvertiserGroup].
+  ///
+  /// 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<AdvertiserGroup> patch(
+      AdvertiserGroup request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertiserGroups';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new AdvertiserGroup.fromJson(data));
+  }
+
+  /// Updates an existing advertiser group.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AdvertiserGroup].
+  ///
+  /// 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<AdvertiserGroup> update(
+      AdvertiserGroup request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertiserGroups';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new AdvertiserGroup.fromJson(data));
+  }
+}
+
+class AdvertiserLandingPagesResourceApi {
+  final commons.ApiRequester _requester;
+
+  AdvertiserLandingPagesResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one landing page by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Landing page ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [LandingPage].
+  ///
+  /// 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<LandingPage> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertiserLandingPages/' +
+        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 LandingPage.fromJson(data));
+  }
+
+  /// Inserts a new landing page.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [LandingPage].
+  ///
+  /// 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<LandingPage> insert(LandingPage request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertiserLandingPages';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new LandingPage.fromJson(data));
+  }
+
+  /// Retrieves a list of landing pages.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserIds] - Select only landing pages that belong to these
+  /// advertisers.
+  ///
+  /// [archived] - Select only archived landing pages. Don't set this field to
+  /// select both archived and non-archived landing pages.
+  ///
+  /// [ids] - Select only landing pages with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for landing pages by name or ID.
+  /// Wildcards (*) are allowed. For example, "landingpage*2017" will return
+  /// landing pages with names like "landingpage July 2017", "landingpage March
+  /// 2017", or simply "landingpage 2017". Most of the searches also add
+  /// wildcards implicitly at the start and the end of the search string. For
+  /// example, a search string of "landingpage" will match campaigns with name
+  /// "my landingpage", "landingpage 2015", or simply "landingpage".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [subaccountId] - Select only landing pages that belong to this subaccount.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AdvertiserLandingPagesListResponse].
+  ///
+  /// 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<AdvertiserLandingPagesListResponse> list(core.String profileId,
+      {core.List<core.String> advertiserIds,
+      core.bool archived,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      core.String subaccountId,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserIds != null) {
+      _queryParams["advertiserIds"] = advertiserIds;
+    }
+    if (archived != null) {
+      _queryParams["archived"] = ["${archived}"];
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if (subaccountId != null) {
+      _queryParams["subaccountId"] = [subaccountId];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertiserLandingPages';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new AdvertiserLandingPagesListResponse.fromJson(data));
+  }
+
+  /// Updates an existing landing page. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Landing page ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [LandingPage].
+  ///
+  /// 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<LandingPage> patch(
+      LandingPage request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertiserLandingPages';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new LandingPage.fromJson(data));
+  }
+
+  /// Updates an existing landing page.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [LandingPage].
+  ///
+  /// 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<LandingPage> update(LandingPage request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertiserLandingPages';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new LandingPage.fromJson(data));
+  }
+}
+
+class AdvertisersResourceApi {
+  final commons.ApiRequester _requester;
+
+  AdvertisersResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one advertiser by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Advertiser ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Advertiser].
+  ///
+  /// 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<Advertiser> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertisers/' +
+        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 Advertiser.fromJson(data));
+  }
+
+  /// Inserts a new advertiser.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Advertiser].
+  ///
+  /// 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<Advertiser> insert(Advertiser request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertisers';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Advertiser.fromJson(data));
+  }
+
+  /// Retrieves a list of advertisers, possibly filtered. This method supports
+  /// paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserGroupIds] - Select only advertisers with these advertiser group
+  /// IDs.
+  ///
+  /// [floodlightConfigurationIds] - Select only advertisers with these
+  /// floodlight configuration IDs.
+  ///
+  /// [ids] - Select only advertisers with these IDs.
+  ///
+  /// [includeAdvertisersWithoutGroupsOnly] - Select only advertisers which do
+  /// not belong to any advertiser group.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [onlyParent] - Select only advertisers which use another advertiser's
+  /// floodlight configuration.
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for objects by name or ID. Wildcards (*)
+  /// are allowed. For example, "advertiser*2015" will return objects with names
+  /// like "advertiser June 2015", "advertiser April 2015", or simply
+  /// "advertiser 2015". Most of the searches also add wildcards implicitly at
+  /// the start and the end of the search string. For example, a search string
+  /// of "advertiser" will match objects with name "my advertiser", "advertiser
+  /// 2015", or simply "advertiser".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [status] - Select only advertisers with the specified status.
+  /// Possible string values are:
+  /// - "APPROVED"
+  /// - "ON_HOLD"
+  ///
+  /// [subaccountId] - Select only advertisers with these subaccount IDs.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [AdvertisersListResponse].
+  ///
+  /// 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<AdvertisersListResponse> list(core.String profileId,
+      {core.List<core.String> advertiserGroupIds,
+      core.List<core.String> floodlightConfigurationIds,
+      core.List<core.String> ids,
+      core.bool includeAdvertisersWithoutGroupsOnly,
+      core.int maxResults,
+      core.bool onlyParent,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      core.String status,
+      core.String subaccountId,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserGroupIds != null) {
+      _queryParams["advertiserGroupIds"] = advertiserGroupIds;
+    }
+    if (floodlightConfigurationIds != null) {
+      _queryParams["floodlightConfigurationIds"] = floodlightConfigurationIds;
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (includeAdvertisersWithoutGroupsOnly != null) {
+      _queryParams["includeAdvertisersWithoutGroupsOnly"] = [
+        "${includeAdvertisersWithoutGroupsOnly}"
+      ];
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (onlyParent != null) {
+      _queryParams["onlyParent"] = ["${onlyParent}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if (status != null) {
+      _queryParams["status"] = [status];
+    }
+    if (subaccountId != null) {
+      _queryParams["subaccountId"] = [subaccountId];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertisers';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new AdvertisersListResponse.fromJson(data));
+  }
+
+  /// Updates an existing advertiser. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Advertiser ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Advertiser].
+  ///
+  /// 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<Advertiser> patch(
+      Advertiser request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertisers';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Advertiser.fromJson(data));
+  }
+
+  /// Updates an existing advertiser.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Advertiser].
+  ///
+  /// 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<Advertiser> update(Advertiser request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/advertisers';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Advertiser.fromJson(data));
+  }
+}
+
+class BrowsersResourceApi {
+  final commons.ApiRequester _requester;
+
+  BrowsersResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Retrieves a list of browsers.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [BrowsersListResponse].
+  ///
+  /// 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<BrowsersListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/browsers';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new BrowsersListResponse.fromJson(data));
+  }
+}
+
+class CampaignCreativeAssociationsResourceApi {
+  final commons.ApiRequester _requester;
+
+  CampaignCreativeAssociationsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Associates a creative with the specified campaign. This method creates a
+  /// default ad with dimensions matching the creative in the campaign if such a
+  /// default ad does not exist already.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [campaignId] - Campaign ID in this association.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CampaignCreativeAssociation].
+  ///
+  /// 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<CampaignCreativeAssociation> insert(
+      CampaignCreativeAssociation request,
+      core.String profileId,
+      core.String campaignId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (campaignId == null) {
+      throw new core.ArgumentError("Parameter campaignId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/campaigns/' +
+        commons.Escaper.ecapeVariable('$campaignId') +
+        '/campaignCreativeAssociations';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new CampaignCreativeAssociation.fromJson(data));
+  }
+
+  /// Retrieves the list of creative IDs associated with the specified campaign.
+  /// This method supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [campaignId] - Campaign ID in this association.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CampaignCreativeAssociationsListResponse].
+  ///
+  /// 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<CampaignCreativeAssociationsListResponse> list(
+      core.String profileId, core.String campaignId,
+      {core.int maxResults,
+      core.String pageToken,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (campaignId == null) {
+      throw new core.ArgumentError("Parameter campaignId is required.");
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/campaigns/' +
+        commons.Escaper.ecapeVariable('$campaignId') +
+        '/campaignCreativeAssociations';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then(
+        (data) => new CampaignCreativeAssociationsListResponse.fromJson(data));
+  }
+}
+
+class CampaignsResourceApi {
+  final commons.ApiRequester _requester;
+
+  CampaignsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one campaign by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Campaign ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Campaign].
+  ///
+  /// 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<Campaign> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/campaigns/' +
+        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 Campaign.fromJson(data));
+  }
+
+  /// Inserts a new campaign.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Campaign].
+  ///
+  /// 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<Campaign> insert(Campaign request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/campaigns';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Campaign.fromJson(data));
+  }
+
+  /// Retrieves a list of campaigns, possibly filtered. This method supports
+  /// paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserGroupIds] - Select only campaigns whose advertisers belong to
+  /// these advertiser groups.
+  ///
+  /// [advertiserIds] - Select only campaigns that belong to these advertisers.
+  ///
+  /// [archived] - Select only archived campaigns. Don't set this field to
+  /// select both archived and non-archived campaigns.
+  ///
+  /// [atLeastOneOptimizationActivity] - Select only campaigns that have at
+  /// least one optimization activity.
+  ///
+  /// [excludedIds] - Exclude campaigns with these IDs.
+  ///
+  /// [ids] - Select only campaigns with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [overriddenEventTagId] - Select only campaigns that have overridden this
+  /// event tag ID.
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for campaigns by name or ID. Wildcards
+  /// (*) are allowed. For example, "campaign*2015" will return campaigns with
+  /// names like "campaign June 2015", "campaign April 2015", or simply
+  /// "campaign 2015". Most of the searches also add wildcards implicitly at the
+  /// start and the end of the search string. For example, a search string of
+  /// "campaign" will match campaigns with name "my campaign", "campaign 2015",
+  /// or simply "campaign".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [subaccountId] - Select only campaigns that belong to this subaccount.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CampaignsListResponse].
+  ///
+  /// 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<CampaignsListResponse> list(core.String profileId,
+      {core.List<core.String> advertiserGroupIds,
+      core.List<core.String> advertiserIds,
+      core.bool archived,
+      core.bool atLeastOneOptimizationActivity,
+      core.List<core.String> excludedIds,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String overriddenEventTagId,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      core.String subaccountId,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserGroupIds != null) {
+      _queryParams["advertiserGroupIds"] = advertiserGroupIds;
+    }
+    if (advertiserIds != null) {
+      _queryParams["advertiserIds"] = advertiserIds;
+    }
+    if (archived != null) {
+      _queryParams["archived"] = ["${archived}"];
+    }
+    if (atLeastOneOptimizationActivity != null) {
+      _queryParams["atLeastOneOptimizationActivity"] = [
+        "${atLeastOneOptimizationActivity}"
+      ];
+    }
+    if (excludedIds != null) {
+      _queryParams["excludedIds"] = excludedIds;
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (overriddenEventTagId != null) {
+      _queryParams["overriddenEventTagId"] = [overriddenEventTagId];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if (subaccountId != null) {
+      _queryParams["subaccountId"] = [subaccountId];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/campaigns';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CampaignsListResponse.fromJson(data));
+  }
+
+  /// Updates an existing campaign. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Campaign ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Campaign].
+  ///
+  /// 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<Campaign> patch(
+      Campaign request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/campaigns';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Campaign.fromJson(data));
+  }
+
+  /// Updates an existing campaign.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Campaign].
+  ///
+  /// 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<Campaign> update(Campaign request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/campaigns';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Campaign.fromJson(data));
+  }
+}
+
+class ChangeLogsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ChangeLogsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one change log by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Change log ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ChangeLog].
+  ///
+  /// 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<ChangeLog> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/changeLogs/' +
+        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 ChangeLog.fromJson(data));
+  }
+
+  /// Retrieves a list of change logs. This method supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [action] - Select only change logs with the specified action.
+  /// Possible string values are:
+  /// - "ACTION_ADD"
+  /// - "ACTION_ASSIGN"
+  /// - "ACTION_ASSOCIATE"
+  /// - "ACTION_CREATE"
+  /// - "ACTION_DELETE"
+  /// - "ACTION_DISABLE"
+  /// - "ACTION_EMAIL_TAGS"
+  /// - "ACTION_ENABLE"
+  /// - "ACTION_LINK"
+  /// - "ACTION_MARK_AS_DEFAULT"
+  /// - "ACTION_PUSH"
+  /// - "ACTION_REMOVE"
+  /// - "ACTION_SEND"
+  /// - "ACTION_SHARE"
+  /// - "ACTION_UNASSIGN"
+  /// - "ACTION_UNLINK"
+  /// - "ACTION_UPDATE"
+  ///
+  /// [ids] - Select only change logs with these IDs.
+  ///
+  /// [maxChangeTime] - Select only change logs whose change time is before the
+  /// specified maxChangeTime.The time should be formatted as an RFC3339
+  /// date/time string. For example, for 10:54 PM on July 18th, 2015, in the
+  /// America/New York time zone, the format is "2015-07-18T22:54:00-04:00". In
+  /// other words, the year, month, day, the letter T, the hour (24-hour clock
+  /// system), minute, second, and then the time zone offset.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [minChangeTime] - Select only change logs whose change time is before the
+  /// specified minChangeTime.The time should be formatted as an RFC3339
+  /// date/time string. For example, for 10:54 PM on July 18th, 2015, in the
+  /// America/New York time zone, the format is "2015-07-18T22:54:00-04:00". In
+  /// other words, the year, month, day, the letter T, the hour (24-hour clock
+  /// system), minute, second, and then the time zone offset.
+  ///
+  /// [objectIds] - Select only change logs with these object IDs.
+  ///
+  /// [objectType] - Select only change logs with the specified object type.
+  /// Possible string values are:
+  /// - "OBJECT_ACCOUNT"
+  /// - "OBJECT_ACCOUNT_BILLING_FEATURE"
+  /// - "OBJECT_AD"
+  /// - "OBJECT_ADVERTISER"
+  /// - "OBJECT_ADVERTISER_GROUP"
+  /// - "OBJECT_BILLING_ACCOUNT_GROUP"
+  /// - "OBJECT_BILLING_FEATURE"
+  /// - "OBJECT_BILLING_MINIMUM_FEE"
+  /// - "OBJECT_BILLING_PROFILE"
+  /// - "OBJECT_CAMPAIGN"
+  /// - "OBJECT_CONTENT_CATEGORY"
+  /// - "OBJECT_CREATIVE"
+  /// - "OBJECT_CREATIVE_ASSET"
+  /// - "OBJECT_CREATIVE_BUNDLE"
+  /// - "OBJECT_CREATIVE_FIELD"
+  /// - "OBJECT_CREATIVE_GROUP"
+  /// - "OBJECT_DFA_SITE"
+  /// - "OBJECT_EVENT_TAG"
+  /// - "OBJECT_FLOODLIGHT_ACTIVITY_GROUP"
+  /// - "OBJECT_FLOODLIGHT_ACTVITY"
+  /// - "OBJECT_FLOODLIGHT_CONFIGURATION"
+  /// - "OBJECT_INSTREAM_CREATIVE"
+  /// - "OBJECT_LANDING_PAGE"
+  /// - "OBJECT_MEDIA_ORDER"
+  /// - "OBJECT_PLACEMENT"
+  /// - "OBJECT_PLACEMENT_STRATEGY"
+  /// - "OBJECT_PLAYSTORE_LINK"
+  /// - "OBJECT_PROVIDED_LIST_CLIENT"
+  /// - "OBJECT_RATE_CARD"
+  /// - "OBJECT_REMARKETING_LIST"
+  /// - "OBJECT_RICHMEDIA_CREATIVE"
+  /// - "OBJECT_SD_SITE"
+  /// - "OBJECT_SEARCH_LIFT_STUDY"
+  /// - "OBJECT_SIZE"
+  /// - "OBJECT_SUBACCOUNT"
+  /// - "OBJECT_TARGETING_TEMPLATE"
+  /// - "OBJECT_USER_PROFILE"
+  /// - "OBJECT_USER_PROFILE_FILTER"
+  /// - "OBJECT_USER_ROLE"
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Select only change logs whose object ID, user name, old
+  /// or new values match the search string.
+  ///
+  /// [userProfileIds] - Select only change logs with these user profile IDs.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ChangeLogsListResponse].
+  ///
+  /// 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<ChangeLogsListResponse> list(core.String profileId,
+      {core.String action,
+      core.List<core.String> ids,
+      core.String maxChangeTime,
+      core.int maxResults,
+      core.String minChangeTime,
+      core.List<core.String> objectIds,
+      core.String objectType,
+      core.String pageToken,
+      core.String searchString,
+      core.List<core.String> userProfileIds,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (action != null) {
+      _queryParams["action"] = [action];
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxChangeTime != null) {
+      _queryParams["maxChangeTime"] = [maxChangeTime];
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (minChangeTime != null) {
+      _queryParams["minChangeTime"] = [minChangeTime];
+    }
+    if (objectIds != null) {
+      _queryParams["objectIds"] = objectIds;
+    }
+    if (objectType != null) {
+      _queryParams["objectType"] = [objectType];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (userProfileIds != null) {
+      _queryParams["userProfileIds"] = userProfileIds;
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/changeLogs';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ChangeLogsListResponse.fromJson(data));
+  }
+}
+
+class CitiesResourceApi {
+  final commons.ApiRequester _requester;
+
+  CitiesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Retrieves a list of cities, possibly filtered.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [countryDartIds] - Select only cities from these countries.
+  ///
+  /// [dartIds] - Select only cities with these DART IDs.
+  ///
+  /// [namePrefix] - Select only cities with names starting with this prefix.
+  ///
+  /// [regionDartIds] - Select only cities from these regions.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CitiesListResponse].
+  ///
+  /// 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<CitiesListResponse> list(core.String profileId,
+      {core.List<core.String> countryDartIds,
+      core.List<core.String> dartIds,
+      core.String namePrefix,
+      core.List<core.String> regionDartIds,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (countryDartIds != null) {
+      _queryParams["countryDartIds"] = countryDartIds;
+    }
+    if (dartIds != null) {
+      _queryParams["dartIds"] = dartIds;
+    }
+    if (namePrefix != null) {
+      _queryParams["namePrefix"] = [namePrefix];
+    }
+    if (regionDartIds != null) {
+      _queryParams["regionDartIds"] = regionDartIds;
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/cities';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CitiesListResponse.fromJson(data));
+  }
+}
+
+class ConnectionTypesResourceApi {
+  final commons.ApiRequester _requester;
+
+  ConnectionTypesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one connection type by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Connection type ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ConnectionType].
+  ///
+  /// 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<ConnectionType> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/connectionTypes/' +
+        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 ConnectionType.fromJson(data));
+  }
+
+  /// Retrieves a list of connection types.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ConnectionTypesListResponse].
+  ///
+  /// 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<ConnectionTypesListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/connectionTypes';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new ConnectionTypesListResponse.fromJson(data));
+  }
+}
+
+class ContentCategoriesResourceApi {
+  final commons.ApiRequester _requester;
+
+  ContentCategoriesResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Deletes an existing content category.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Content category ID.
+  ///
+  /// [$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 profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/contentCategories/' +
+        commons.Escaper.ecapeVariable('$id');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Gets one content category by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Content category ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ContentCategory].
+  ///
+  /// 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<ContentCategory> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/contentCategories/' +
+        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 ContentCategory.fromJson(data));
+  }
+
+  /// Inserts a new content category.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ContentCategory].
+  ///
+  /// 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<ContentCategory> insert(
+      ContentCategory request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/contentCategories';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ContentCategory.fromJson(data));
+  }
+
+  /// Retrieves a list of content categories, possibly filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [ids] - Select only content categories with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for objects by name or ID. Wildcards (*)
+  /// are allowed. For example, "contentcategory*2015" will return objects with
+  /// names like "contentcategory June 2015", "contentcategory April 2015", or
+  /// simply "contentcategory 2015". Most of the searches also add wildcards
+  /// implicitly at the start and the end of the search string. For example, a
+  /// search string of "contentcategory" will match objects with name "my
+  /// contentcategory", "contentcategory 2015", or simply "contentcategory".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ContentCategoriesListResponse].
+  ///
+  /// 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<ContentCategoriesListResponse> list(core.String profileId,
+      {core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/contentCategories';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new ContentCategoriesListResponse.fromJson(data));
+  }
+
+  /// Updates an existing content category. This method supports patch
+  /// semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Content category ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ContentCategory].
+  ///
+  /// 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<ContentCategory> patch(
+      ContentCategory request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/contentCategories';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ContentCategory.fromJson(data));
+  }
+
+  /// Updates an existing content category.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ContentCategory].
+  ///
+  /// 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<ContentCategory> update(
+      ContentCategory request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/contentCategories';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ContentCategory.fromJson(data));
+  }
+}
+
+class ConversionsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ConversionsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Inserts conversions.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ConversionsBatchInsertResponse].
+  ///
+  /// 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<ConversionsBatchInsertResponse> batchinsert(
+      ConversionsBatchInsertRequest request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/conversions/batchinsert';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new ConversionsBatchInsertResponse.fromJson(data));
+  }
+
+  /// Updates existing conversions.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ConversionsBatchUpdateResponse].
+  ///
+  /// 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<ConversionsBatchUpdateResponse> batchupdate(
+      ConversionsBatchUpdateRequest request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/conversions/batchupdate';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new ConversionsBatchUpdateResponse.fromJson(data));
+  }
+}
+
+class CountriesResourceApi {
+  final commons.ApiRequester _requester;
+
+  CountriesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one country by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [dartId] - Country DART ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Country].
+  ///
+  /// 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<Country> get(core.String profileId, core.String dartId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (dartId == null) {
+      throw new core.ArgumentError("Parameter dartId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/countries/' +
+        commons.Escaper.ecapeVariable('$dartId');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Country.fromJson(data));
+  }
+
+  /// Retrieves a list of countries.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CountriesListResponse].
+  ///
+  /// 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<CountriesListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/countries';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CountriesListResponse.fromJson(data));
+  }
+}
+
+class CreativeAssetsResourceApi {
+  final commons.ApiRequester _requester;
+
+  CreativeAssetsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Inserts a new creative asset.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserId] - Advertiser ID of this creative. This is a required field.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// [uploadMedia] - The media to upload.
+  ///
+  /// [uploadOptions] - Options for the media upload. Streaming Media without
+  /// the length being known ahead of time is only supported via resumable
+  /// uploads.
+  ///
+  /// Completes with a [CreativeAssetMetadata].
+  ///
+  /// 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<CreativeAssetMetadata> insert(CreativeAssetMetadata request,
+      core.String profileId, core.String advertiserId,
+      {core.String $fields,
+      commons.UploadOptions uploadOptions: commons.UploadOptions.Default,
+      commons.Media uploadMedia}) {
+    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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserId == null) {
+      throw new core.ArgumentError("Parameter advertiserId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _uploadMedia = uploadMedia;
+    _uploadOptions = uploadOptions;
+
+    if (_uploadMedia == null) {
+      _url = 'userprofiles/' +
+          commons.Escaper.ecapeVariable('$profileId') +
+          '/creativeAssets/' +
+          commons.Escaper.ecapeVariable('$advertiserId') +
+          '/creativeAssets';
+    } else if (_uploadOptions is commons.ResumableUploadOptions) {
+      _url = '/resumable/upload/dfareporting/v3.0/userprofiles/' +
+          commons.Escaper.ecapeVariable('$profileId') +
+          '/creativeAssets/' +
+          commons.Escaper.ecapeVariable('$advertiserId') +
+          '/creativeAssets';
+    } else {
+      _url = '/upload/dfareporting/v3.0/userprofiles/' +
+          commons.Escaper.ecapeVariable('$profileId') +
+          '/creativeAssets/' +
+          commons.Escaper.ecapeVariable('$advertiserId') +
+          '/creativeAssets';
+    }
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CreativeAssetMetadata.fromJson(data));
+  }
+}
+
+class CreativeFieldValuesResourceApi {
+  final commons.ApiRequester _requester;
+
+  CreativeFieldValuesResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Deletes an existing creative field value.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [creativeFieldId] - Creative field ID for this creative field value.
+  ///
+  /// [id] - Creative Field Value ID
+  ///
+  /// [$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 profileId, core.String creativeFieldId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (creativeFieldId == null) {
+      throw new core.ArgumentError("Parameter creativeFieldId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeFields/' +
+        commons.Escaper.ecapeVariable('$creativeFieldId') +
+        '/creativeFieldValues/' +
+        commons.Escaper.ecapeVariable('$id');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Gets one creative field value by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [creativeFieldId] - Creative field ID for this creative field value.
+  ///
+  /// [id] - Creative Field Value ID
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeFieldValue].
+  ///
+  /// 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<CreativeFieldValue> get(
+      core.String profileId, core.String creativeFieldId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (creativeFieldId == null) {
+      throw new core.ArgumentError("Parameter creativeFieldId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeFields/' +
+        commons.Escaper.ecapeVariable('$creativeFieldId') +
+        '/creativeFieldValues/' +
+        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 CreativeFieldValue.fromJson(data));
+  }
+
+  /// Inserts a new creative field value.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [creativeFieldId] - Creative field ID for this creative field value.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeFieldValue].
+  ///
+  /// 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<CreativeFieldValue> insert(CreativeFieldValue request,
+      core.String profileId, core.String creativeFieldId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (creativeFieldId == null) {
+      throw new core.ArgumentError("Parameter creativeFieldId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeFields/' +
+        commons.Escaper.ecapeVariable('$creativeFieldId') +
+        '/creativeFieldValues';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CreativeFieldValue.fromJson(data));
+  }
+
+  /// Retrieves a list of creative field values, possibly filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [creativeFieldId] - Creative field ID for this creative field value.
+  ///
+  /// [ids] - Select only creative field values with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for creative field values by their
+  /// values. Wildcards (e.g. *) are not allowed.
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "VALUE"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeFieldValuesListResponse].
+  ///
+  /// 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<CreativeFieldValuesListResponse> list(
+      core.String profileId, core.String creativeFieldId,
+      {core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (creativeFieldId == null) {
+      throw new core.ArgumentError("Parameter creativeFieldId is required.");
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeFields/' +
+        commons.Escaper.ecapeVariable('$creativeFieldId') +
+        '/creativeFieldValues';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new CreativeFieldValuesListResponse.fromJson(data));
+  }
+
+  /// Updates an existing creative field value. This method supports patch
+  /// semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [creativeFieldId] - Creative field ID for this creative field value.
+  ///
+  /// [id] - Creative Field Value ID
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeFieldValue].
+  ///
+  /// 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<CreativeFieldValue> patch(CreativeFieldValue request,
+      core.String profileId, core.String creativeFieldId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (creativeFieldId == null) {
+      throw new core.ArgumentError("Parameter creativeFieldId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeFields/' +
+        commons.Escaper.ecapeVariable('$creativeFieldId') +
+        '/creativeFieldValues';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CreativeFieldValue.fromJson(data));
+  }
+
+  /// Updates an existing creative field value.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [creativeFieldId] - Creative field ID for this creative field value.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeFieldValue].
+  ///
+  /// 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<CreativeFieldValue> update(CreativeFieldValue request,
+      core.String profileId, core.String creativeFieldId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (creativeFieldId == null) {
+      throw new core.ArgumentError("Parameter creativeFieldId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeFields/' +
+        commons.Escaper.ecapeVariable('$creativeFieldId') +
+        '/creativeFieldValues';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CreativeFieldValue.fromJson(data));
+  }
+}
+
+class CreativeFieldsResourceApi {
+  final commons.ApiRequester _requester;
+
+  CreativeFieldsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Deletes an existing creative field.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Creative Field ID
+  ///
+  /// [$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 profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeFields/' +
+        commons.Escaper.ecapeVariable('$id');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Gets one creative field by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Creative Field ID
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeField].
+  ///
+  /// 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<CreativeField> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeFields/' +
+        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 CreativeField.fromJson(data));
+  }
+
+  /// Inserts a new creative field.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeField].
+  ///
+  /// 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<CreativeField> insert(
+      CreativeField request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeFields';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CreativeField.fromJson(data));
+  }
+
+  /// Retrieves a list of creative fields, possibly filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserIds] - Select only creative fields that belong to these
+  /// advertisers.
+  ///
+  /// [ids] - Select only creative fields with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for creative fields by name or ID.
+  /// Wildcards (*) are allowed. For example, "creativefield*2015" will return
+  /// creative fields with names like "creativefield June 2015", "creativefield
+  /// April 2015", or simply "creativefield 2015". Most of the searches also add
+  /// wild-cards implicitly at the start and the end of the search string. For
+  /// example, a search string of "creativefield" will match creative fields
+  /// with the name "my creativefield", "creativefield 2015", or simply
+  /// "creativefield".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeFieldsListResponse].
+  ///
+  /// 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<CreativeFieldsListResponse> list(core.String profileId,
+      {core.List<core.String> advertiserIds,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserIds != null) {
+      _queryParams["advertiserIds"] = advertiserIds;
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeFields';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new CreativeFieldsListResponse.fromJson(data));
+  }
+
+  /// Updates an existing creative field. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Creative Field ID
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeField].
+  ///
+  /// 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<CreativeField> patch(
+      CreativeField request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeFields';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CreativeField.fromJson(data));
+  }
+
+  /// Updates an existing creative field.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeField].
+  ///
+  /// 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<CreativeField> update(
+      CreativeField request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeFields';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CreativeField.fromJson(data));
+  }
+}
+
+class CreativeGroupsResourceApi {
+  final commons.ApiRequester _requester;
+
+  CreativeGroupsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one creative group by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Creative group ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeGroup].
+  ///
+  /// 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<CreativeGroup> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeGroups/' +
+        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 CreativeGroup.fromJson(data));
+  }
+
+  /// Inserts a new creative group.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeGroup].
+  ///
+  /// 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<CreativeGroup> insert(
+      CreativeGroup request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeGroups';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CreativeGroup.fromJson(data));
+  }
+
+  /// Retrieves a list of creative groups, possibly filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserIds] - Select only creative groups that belong to these
+  /// advertisers.
+  ///
+  /// [groupNumber] - Select only creative groups that belong to this subgroup.
+  /// Value must be between "1" and "2".
+  ///
+  /// [ids] - Select only creative groups with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for creative groups by name or ID.
+  /// Wildcards (*) are allowed. For example, "creativegroup*2015" will return
+  /// creative groups with names like "creativegroup June 2015", "creativegroup
+  /// April 2015", or simply "creativegroup 2015". Most of the searches also add
+  /// wild-cards implicitly at the start and the end of the search string. For
+  /// example, a search string of "creativegroup" will match creative groups
+  /// with the name "my creativegroup", "creativegroup 2015", or simply
+  /// "creativegroup".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeGroupsListResponse].
+  ///
+  /// 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<CreativeGroupsListResponse> list(core.String profileId,
+      {core.List<core.String> advertiserIds,
+      core.int groupNumber,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserIds != null) {
+      _queryParams["advertiserIds"] = advertiserIds;
+    }
+    if (groupNumber != null) {
+      _queryParams["groupNumber"] = ["${groupNumber}"];
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeGroups';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new CreativeGroupsListResponse.fromJson(data));
+  }
+
+  /// Updates an existing creative group. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Creative group ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeGroup].
+  ///
+  /// 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<CreativeGroup> patch(
+      CreativeGroup request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeGroups';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CreativeGroup.fromJson(data));
+  }
+
+  /// Updates an existing creative group.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativeGroup].
+  ///
+  /// 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<CreativeGroup> update(
+      CreativeGroup request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creativeGroups';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CreativeGroup.fromJson(data));
+  }
+}
+
+class CreativesResourceApi {
+  final commons.ApiRequester _requester;
+
+  CreativesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one creative by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Creative ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Creative].
+  ///
+  /// 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<Creative> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creatives/' +
+        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 Creative.fromJson(data));
+  }
+
+  /// Inserts a new creative.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Creative].
+  ///
+  /// 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<Creative> insert(Creative request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creatives';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Creative.fromJson(data));
+  }
+
+  /// Retrieves a list of creatives, possibly filtered. This method supports
+  /// paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [active] - Select only active creatives. Leave blank to select active and
+  /// inactive creatives.
+  ///
+  /// [advertiserId] - Select only creatives with this advertiser ID.
+  ///
+  /// [archived] - Select only archived creatives. Leave blank to select
+  /// archived and unarchived creatives.
+  ///
+  /// [campaignId] - Select only creatives with this campaign ID.
+  ///
+  /// [companionCreativeIds] - Select only in-stream video creatives with these
+  /// companion IDs.
+  ///
+  /// [creativeFieldIds] - Select only creatives with these creative field IDs.
+  ///
+  /// [ids] - Select only creatives with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [renderingIds] - Select only creatives with these rendering IDs.
+  ///
+  /// [searchString] - Allows searching for objects by name or ID. Wildcards (*)
+  /// are allowed. For example, "creative*2015" will return objects with names
+  /// like "creative June 2015", "creative April 2015", or simply "creative
+  /// 2015". Most of the searches also add wildcards implicitly at the start and
+  /// the end of the search string. For example, a search string of "creative"
+  /// will match objects with name "my creative", "creative 2015", or simply
+  /// "creative".
+  ///
+  /// [sizeIds] - Select only creatives with these size IDs.
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [studioCreativeId] - Select only creatives corresponding to this Studio
+  /// creative ID.
+  ///
+  /// [types] - Select only creatives with these creative types.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CreativesListResponse].
+  ///
+  /// 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<CreativesListResponse> list(core.String profileId,
+      {core.bool active,
+      core.String advertiserId,
+      core.bool archived,
+      core.String campaignId,
+      core.List<core.String> companionCreativeIds,
+      core.List<core.String> creativeFieldIds,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.List<core.String> renderingIds,
+      core.String searchString,
+      core.List<core.String> sizeIds,
+      core.String sortField,
+      core.String sortOrder,
+      core.String studioCreativeId,
+      core.List<core.String> types,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (active != null) {
+      _queryParams["active"] = ["${active}"];
+    }
+    if (advertiserId != null) {
+      _queryParams["advertiserId"] = [advertiserId];
+    }
+    if (archived != null) {
+      _queryParams["archived"] = ["${archived}"];
+    }
+    if (campaignId != null) {
+      _queryParams["campaignId"] = [campaignId];
+    }
+    if (companionCreativeIds != null) {
+      _queryParams["companionCreativeIds"] = companionCreativeIds;
+    }
+    if (creativeFieldIds != null) {
+      _queryParams["creativeFieldIds"] = creativeFieldIds;
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (renderingIds != null) {
+      _queryParams["renderingIds"] = renderingIds;
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sizeIds != null) {
+      _queryParams["sizeIds"] = sizeIds;
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if (studioCreativeId != null) {
+      _queryParams["studioCreativeId"] = [studioCreativeId];
+    }
+    if (types != null) {
+      _queryParams["types"] = types;
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creatives';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CreativesListResponse.fromJson(data));
+  }
+
+  /// Updates an existing creative. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Creative ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Creative].
+  ///
+  /// 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<Creative> patch(
+      Creative request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creatives';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Creative.fromJson(data));
+  }
+
+  /// Updates an existing creative.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Creative].
+  ///
+  /// 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<Creative> update(Creative request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/creatives';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Creative.fromJson(data));
+  }
+}
+
+class DimensionValuesResourceApi {
+  final commons.ApiRequester _requester;
+
+  DimensionValuesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Retrieves list of report dimension values for a list of filters.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - The DFA user profile ID.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "100".
+  ///
+  /// [pageToken] - The value of the nextToken from the previous result page.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [DimensionValueList].
+  ///
+  /// 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<DimensionValueList> query(
+      DimensionValueRequest request, core.String profileId,
+      {core.int maxResults, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/dimensionvalues/query';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new DimensionValueList.fromJson(data));
+  }
+}
+
+class DirectorySiteContactsResourceApi {
+  final commons.ApiRequester _requester;
+
+  DirectorySiteContactsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one directory site contact by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Directory site contact ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [DirectorySiteContact].
+  ///
+  /// 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<DirectorySiteContact> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/directorySiteContacts/' +
+        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 DirectorySiteContact.fromJson(data));
+  }
+
+  /// Retrieves a list of directory site contacts, possibly filtered. This
+  /// method supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [directorySiteIds] - Select only directory site contacts with these
+  /// directory site IDs. This is a required field.
+  ///
+  /// [ids] - Select only directory site contacts with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for objects by name, ID or email.
+  /// Wildcards (*) are allowed. For example, "directory site contact*2015" will
+  /// return objects with names like "directory site contact June 2015",
+  /// "directory site contact April 2015", or simply "directory site contact
+  /// 2015". Most of the searches also add wildcards implicitly at the start and
+  /// the end of the search string. For example, a search string of "directory
+  /// site contact" will match objects with name "my directory site contact",
+  /// "directory site contact 2015", or simply "directory site contact".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [DirectorySiteContactsListResponse].
+  ///
+  /// 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<DirectorySiteContactsListResponse> list(core.String profileId,
+      {core.List<core.String> directorySiteIds,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (directorySiteIds != null) {
+      _queryParams["directorySiteIds"] = directorySiteIds;
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/directorySiteContacts';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new DirectorySiteContactsListResponse.fromJson(data));
+  }
+}
+
+class DirectorySitesResourceApi {
+  final commons.ApiRequester _requester;
+
+  DirectorySitesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one directory site by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Directory site ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [DirectorySite].
+  ///
+  /// 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<DirectorySite> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/directorySites/' +
+        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 DirectorySite.fromJson(data));
+  }
+
+  /// Inserts a new directory site.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [DirectorySite].
+  ///
+  /// 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<DirectorySite> insert(
+      DirectorySite request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/directorySites';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new DirectorySite.fromJson(data));
+  }
+
+  /// Retrieves a list of directory sites, possibly filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [acceptsInStreamVideoPlacements] - This search filter is no longer
+  /// supported and will have no effect on the results returned.
+  ///
+  /// [acceptsInterstitialPlacements] - This search filter is no longer
+  /// supported and will have no effect on the results returned.
+  ///
+  /// [acceptsPublisherPaidPlacements] - Select only directory sites that accept
+  /// publisher paid placements. This field can be left blank.
+  ///
+  /// [active] - Select only active directory sites. Leave blank to retrieve
+  /// both active and inactive directory sites.
+  ///
+  /// [countryId] - Select only directory sites with this country ID.
+  ///
+  /// [dfpNetworkCode] - Select only directory sites with this DFP network code.
+  ///
+  /// [ids] - Select only directory sites with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [parentId] - Select only directory sites with this parent ID.
+  ///
+  /// [searchString] - Allows searching for objects by name, ID or URL.
+  /// Wildcards (*) are allowed. For example, "directory site*2015" will return
+  /// objects with names like "directory site June 2015", "directory site April
+  /// 2015", or simply "directory site 2015". Most of the searches also add
+  /// wildcards implicitly at the start and the end of the search string. For
+  /// example, a search string of "directory site" will match objects with name
+  /// "my directory site", "directory site 2015" or simply, "directory site".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [DirectorySitesListResponse].
+  ///
+  /// 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<DirectorySitesListResponse> list(core.String profileId,
+      {core.bool acceptsInStreamVideoPlacements,
+      core.bool acceptsInterstitialPlacements,
+      core.bool acceptsPublisherPaidPlacements,
+      core.bool active,
+      core.String countryId,
+      core.String dfpNetworkCode,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String parentId,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (acceptsInStreamVideoPlacements != null) {
+      _queryParams["acceptsInStreamVideoPlacements"] = [
+        "${acceptsInStreamVideoPlacements}"
+      ];
+    }
+    if (acceptsInterstitialPlacements != null) {
+      _queryParams["acceptsInterstitialPlacements"] = [
+        "${acceptsInterstitialPlacements}"
+      ];
+    }
+    if (acceptsPublisherPaidPlacements != null) {
+      _queryParams["acceptsPublisherPaidPlacements"] = [
+        "${acceptsPublisherPaidPlacements}"
+      ];
+    }
+    if (active != null) {
+      _queryParams["active"] = ["${active}"];
+    }
+    if (countryId != null) {
+      _queryParams["countryId"] = [countryId];
+    }
+    if (dfpNetworkCode != null) {
+      _queryParams["dfpNetworkCode"] = [dfpNetworkCode];
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (parentId != null) {
+      _queryParams["parentId"] = [parentId];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/directorySites';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new DirectorySitesListResponse.fromJson(data));
+  }
+}
+
+class DynamicTargetingKeysResourceApi {
+  final commons.ApiRequester _requester;
+
+  DynamicTargetingKeysResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Deletes an existing dynamic targeting key.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [objectId] - ID of the object of this dynamic targeting key. This is a
+  /// required field.
+  ///
+  /// [name] - Name of this dynamic targeting key. This is a required field.
+  /// Must be less than 256 characters long and cannot contain commas. All
+  /// characters are converted to lowercase.
+  ///
+  /// [objectType] - Type of the object of this dynamic targeting key. This is a
+  /// required field.
+  /// Possible string values are:
+  /// - "OBJECT_AD"
+  /// - "OBJECT_ADVERTISER"
+  /// - "OBJECT_CREATIVE"
+  /// - "OBJECT_PLACEMENT"
+  ///
+  /// [$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 profileId, core.String objectId,
+      core.String name, core.String objectType,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (objectId == null) {
+      throw new core.ArgumentError("Parameter objectId is required.");
+    }
+    if (name == null) {
+      throw new core.ArgumentError("Parameter name is required.");
+    }
+    _queryParams["name"] = [name];
+    if (objectType == null) {
+      throw new core.ArgumentError("Parameter objectType is required.");
+    }
+    _queryParams["objectType"] = [objectType];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/dynamicTargetingKeys/' +
+        commons.Escaper.ecapeVariable('$objectId');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Inserts a new dynamic targeting key. Keys must be created at the
+  /// advertiser level before being assigned to the advertiser's ads, creatives,
+  /// or placements. There is a maximum of 1000 keys per advertiser, out of
+  /// which a maximum of 20 keys can be assigned per ad, creative, or placement.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [DynamicTargetingKey].
+  ///
+  /// 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<DynamicTargetingKey> insert(
+      DynamicTargetingKey request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/dynamicTargetingKeys';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new DynamicTargetingKey.fromJson(data));
+  }
+
+  /// Retrieves a list of dynamic targeting keys.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserId] - Select only dynamic targeting keys whose object has this
+  /// advertiser ID.
+  ///
+  /// [names] - Select only dynamic targeting keys exactly matching these names.
+  ///
+  /// [objectId] - Select only dynamic targeting keys with this object ID.
+  ///
+  /// [objectType] - Select only dynamic targeting keys with this object type.
+  /// Possible string values are:
+  /// - "OBJECT_AD"
+  /// - "OBJECT_ADVERTISER"
+  /// - "OBJECT_CREATIVE"
+  /// - "OBJECT_PLACEMENT"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [DynamicTargetingKeysListResponse].
+  ///
+  /// 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<DynamicTargetingKeysListResponse> list(core.String profileId,
+      {core.String advertiserId,
+      core.List<core.String> names,
+      core.String objectId,
+      core.String objectType,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserId != null) {
+      _queryParams["advertiserId"] = [advertiserId];
+    }
+    if (names != null) {
+      _queryParams["names"] = names;
+    }
+    if (objectId != null) {
+      _queryParams["objectId"] = [objectId];
+    }
+    if (objectType != null) {
+      _queryParams["objectType"] = [objectType];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/dynamicTargetingKeys';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new DynamicTargetingKeysListResponse.fromJson(data));
+  }
+}
+
+class EventTagsResourceApi {
+  final commons.ApiRequester _requester;
+
+  EventTagsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Deletes an existing event tag.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Event tag ID.
+  ///
+  /// [$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 profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/eventTags/' +
+        commons.Escaper.ecapeVariable('$id');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Gets one event tag by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Event tag ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [EventTag].
+  ///
+  /// 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<EventTag> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/eventTags/' +
+        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 EventTag.fromJson(data));
+  }
+
+  /// Inserts a new event tag.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [EventTag].
+  ///
+  /// 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<EventTag> insert(EventTag request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/eventTags';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new EventTag.fromJson(data));
+  }
+
+  /// Retrieves a list of event tags, possibly filtered.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [adId] - Select only event tags that belong to this ad.
+  ///
+  /// [advertiserId] - Select only event tags that belong to this advertiser.
+  ///
+  /// [campaignId] - Select only event tags that belong to this campaign.
+  ///
+  /// [definitionsOnly] - Examine only the specified campaign or advertiser's
+  /// event tags for matching selector criteria. When set to false, the parent
+  /// advertiser and parent campaign of the specified ad or campaign is examined
+  /// as well. In addition, when set to false, the status field is examined as
+  /// well, along with the enabledByDefault field. This parameter can not be set
+  /// to true when adId is specified as ads do not define their own even tags.
+  ///
+  /// [enabled] - Select only enabled event tags. What is considered enabled or
+  /// disabled depends on the definitionsOnly parameter. When definitionsOnly is
+  /// set to true, only the specified advertiser or campaign's event tags'
+  /// enabledByDefault field is examined. When definitionsOnly is set to false,
+  /// the specified ad or specified campaign's parent advertiser's or parent
+  /// campaign's event tags' enabledByDefault and status fields are examined as
+  /// well.
+  ///
+  /// [eventTagTypes] - Select only event tags with the specified event tag
+  /// types. Event tag types can be used to specify whether to use a third-party
+  /// pixel, a third-party JavaScript URL, or a third-party click-through URL
+  /// for either impression or click tracking.
+  ///
+  /// [ids] - Select only event tags with these IDs.
+  ///
+  /// [searchString] - Allows searching for objects by name or ID. Wildcards (*)
+  /// are allowed. For example, "eventtag*2015" will return objects with names
+  /// like "eventtag June 2015", "eventtag April 2015", or simply "eventtag
+  /// 2015". Most of the searches also add wildcards implicitly at the start and
+  /// the end of the search string. For example, a search string of "eventtag"
+  /// will match objects with name "my eventtag", "eventtag 2015", or simply
+  /// "eventtag".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [EventTagsListResponse].
+  ///
+  /// 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<EventTagsListResponse> list(core.String profileId,
+      {core.String adId,
+      core.String advertiserId,
+      core.String campaignId,
+      core.bool definitionsOnly,
+      core.bool enabled,
+      core.List<core.String> eventTagTypes,
+      core.List<core.String> ids,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (adId != null) {
+      _queryParams["adId"] = [adId];
+    }
+    if (advertiserId != null) {
+      _queryParams["advertiserId"] = [advertiserId];
+    }
+    if (campaignId != null) {
+      _queryParams["campaignId"] = [campaignId];
+    }
+    if (definitionsOnly != null) {
+      _queryParams["definitionsOnly"] = ["${definitionsOnly}"];
+    }
+    if (enabled != null) {
+      _queryParams["enabled"] = ["${enabled}"];
+    }
+    if (eventTagTypes != null) {
+      _queryParams["eventTagTypes"] = eventTagTypes;
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/eventTags';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new EventTagsListResponse.fromJson(data));
+  }
+
+  /// Updates an existing event tag. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Event tag ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [EventTag].
+  ///
+  /// 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<EventTag> patch(
+      EventTag request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/eventTags';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new EventTag.fromJson(data));
+  }
+
+  /// Updates an existing event tag.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [EventTag].
+  ///
+  /// 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<EventTag> update(EventTag request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/eventTags';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new EventTag.fromJson(data));
+  }
+}
+
+class FilesResourceApi {
+  final commons.ApiRequester _requester;
+
+  FilesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Retrieves a report file by its report ID and file ID. This method supports
+  /// media download.
+  ///
+  /// Request parameters:
+  ///
+  /// [reportId] - The ID of the report.
+  ///
+  /// [fileId] - The ID of the report file.
+  ///
+  /// [$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
+  ///
+  /// - [File] 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(core.String reportId, core.String fileId,
+      {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 (reportId == null) {
+      throw new core.ArgumentError("Parameter reportId is required.");
+    }
+    if (fileId == null) {
+      throw new core.ArgumentError("Parameter fileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = downloadOptions;
+
+    _url = 'reports/' +
+        commons.Escaper.ecapeVariable('$reportId') +
+        '/files/' +
+        commons.Escaper.ecapeVariable('$fileId');
+
+    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 File.fromJson(data));
+    } else {
+      return _response;
+    }
+  }
+
+  /// Lists files for a user profile.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - The DFA profile ID.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "10".
+  ///
+  /// [pageToken] - The value of the nextToken from the previous result page.
+  ///
+  /// [scope] - The scope that defines which results are returned.
+  /// Possible string values are:
+  /// - "ALL" : All files in account.
+  /// - "MINE" : My files.
+  /// - "SHARED_WITH_ME" : Files shared with me.
+  ///
+  /// [sortField] - The field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID" : Sort by file ID.
+  /// - "LAST_MODIFIED_TIME" : Sort by 'lastmodifiedAt' field.
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING" : Ascending order.
+  /// - "DESCENDING" : Descending order.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FileList].
+  ///
+  /// 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<FileList> list(core.String profileId,
+      {core.int maxResults,
+      core.String pageToken,
+      core.String scope,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (scope != null) {
+      _queryParams["scope"] = [scope];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/files';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new FileList.fromJson(data));
+  }
+}
+
+class FloodlightActivitiesResourceApi {
+  final commons.ApiRequester _requester;
+
+  FloodlightActivitiesResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Deletes an existing floodlight activity.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Floodlight activity ID.
+  ///
+  /// [$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 profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightActivities/' +
+        commons.Escaper.ecapeVariable('$id');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Generates a tag for a floodlight activity.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [floodlightActivityId] - Floodlight activity ID for which we want to
+  /// generate a tag.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightActivitiesGenerateTagResponse].
+  ///
+  /// 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<FloodlightActivitiesGenerateTagResponse> generatetag(
+      core.String profileId,
+      {core.String floodlightActivityId,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (floodlightActivityId != null) {
+      _queryParams["floodlightActivityId"] = [floodlightActivityId];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightActivities/generatetag';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then(
+        (data) => new FloodlightActivitiesGenerateTagResponse.fromJson(data));
+  }
+
+  /// Gets one floodlight activity by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Floodlight activity ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightActivity].
+  ///
+  /// 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<FloodlightActivity> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightActivities/' +
+        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 FloodlightActivity.fromJson(data));
+  }
+
+  /// Inserts a new floodlight activity.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightActivity].
+  ///
+  /// 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<FloodlightActivity> insert(
+      FloodlightActivity request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightActivities';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new FloodlightActivity.fromJson(data));
+  }
+
+  /// Retrieves a list of floodlight activities, possibly filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserId] - Select only floodlight activities for the specified
+  /// advertiser ID. Must specify either ids, advertiserId, or
+  /// floodlightConfigurationId for a non-empty result.
+  ///
+  /// [floodlightActivityGroupIds] - Select only floodlight activities with the
+  /// specified floodlight activity group IDs.
+  ///
+  /// [floodlightActivityGroupName] - Select only floodlight activities with the
+  /// specified floodlight activity group name.
+  ///
+  /// [floodlightActivityGroupTagString] - Select only floodlight activities
+  /// with the specified floodlight activity group tag string.
+  ///
+  /// [floodlightActivityGroupType] - Select only floodlight activities with the
+  /// specified floodlight activity group type.
+  /// Possible string values are:
+  /// - "COUNTER"
+  /// - "SALE"
+  ///
+  /// [floodlightConfigurationId] - Select only floodlight activities for the
+  /// specified floodlight configuration ID. Must specify either ids,
+  /// advertiserId, or floodlightConfigurationId for a non-empty result.
+  ///
+  /// [ids] - Select only floodlight activities with the specified IDs. Must
+  /// specify either ids, advertiserId, or floodlightConfigurationId for a
+  /// non-empty result.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for objects by name or ID. Wildcards (*)
+  /// are allowed. For example, "floodlightactivity*2015" will return objects
+  /// with names like "floodlightactivity June 2015", "floodlightactivity April
+  /// 2015", or simply "floodlightactivity 2015". Most of the searches also add
+  /// wildcards implicitly at the start and the end of the search string. For
+  /// example, a search string of "floodlightactivity" will match objects with
+  /// name "my floodlightactivity activity", "floodlightactivity 2015", or
+  /// simply "floodlightactivity".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [tagString] - Select only floodlight activities with the specified tag
+  /// string.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightActivitiesListResponse].
+  ///
+  /// 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<FloodlightActivitiesListResponse> list(core.String profileId,
+      {core.String advertiserId,
+      core.List<core.String> floodlightActivityGroupIds,
+      core.String floodlightActivityGroupName,
+      core.String floodlightActivityGroupTagString,
+      core.String floodlightActivityGroupType,
+      core.String floodlightConfigurationId,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      core.String tagString,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserId != null) {
+      _queryParams["advertiserId"] = [advertiserId];
+    }
+    if (floodlightActivityGroupIds != null) {
+      _queryParams["floodlightActivityGroupIds"] = floodlightActivityGroupIds;
+    }
+    if (floodlightActivityGroupName != null) {
+      _queryParams["floodlightActivityGroupName"] = [
+        floodlightActivityGroupName
+      ];
+    }
+    if (floodlightActivityGroupTagString != null) {
+      _queryParams["floodlightActivityGroupTagString"] = [
+        floodlightActivityGroupTagString
+      ];
+    }
+    if (floodlightActivityGroupType != null) {
+      _queryParams["floodlightActivityGroupType"] = [
+        floodlightActivityGroupType
+      ];
+    }
+    if (floodlightConfigurationId != null) {
+      _queryParams["floodlightConfigurationId"] = [floodlightConfigurationId];
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if (tagString != null) {
+      _queryParams["tagString"] = [tagString];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightActivities';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new FloodlightActivitiesListResponse.fromJson(data));
+  }
+
+  /// Updates an existing floodlight activity. This method supports patch
+  /// semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Floodlight activity ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightActivity].
+  ///
+  /// 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<FloodlightActivity> patch(
+      FloodlightActivity request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightActivities';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new FloodlightActivity.fromJson(data));
+  }
+
+  /// Updates an existing floodlight activity.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightActivity].
+  ///
+  /// 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<FloodlightActivity> update(
+      FloodlightActivity request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightActivities';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new FloodlightActivity.fromJson(data));
+  }
+}
+
+class FloodlightActivityGroupsResourceApi {
+  final commons.ApiRequester _requester;
+
+  FloodlightActivityGroupsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one floodlight activity group by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Floodlight activity Group ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightActivityGroup].
+  ///
+  /// 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<FloodlightActivityGroup> get(
+      core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightActivityGroups/' +
+        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 FloodlightActivityGroup.fromJson(data));
+  }
+
+  /// Inserts a new floodlight activity group.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightActivityGroup].
+  ///
+  /// 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<FloodlightActivityGroup> insert(
+      FloodlightActivityGroup request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightActivityGroups';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new FloodlightActivityGroup.fromJson(data));
+  }
+
+  /// Retrieves a list of floodlight activity groups, possibly filtered. This
+  /// method supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserId] - Select only floodlight activity groups with the specified
+  /// advertiser ID. Must specify either advertiserId or
+  /// floodlightConfigurationId for a non-empty result.
+  ///
+  /// [floodlightConfigurationId] - Select only floodlight activity groups with
+  /// the specified floodlight configuration ID. Must specify either
+  /// advertiserId, or floodlightConfigurationId for a non-empty result.
+  ///
+  /// [ids] - Select only floodlight activity groups with the specified IDs.
+  /// Must specify either advertiserId or floodlightConfigurationId for a
+  /// non-empty result.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for objects by name or ID. Wildcards (*)
+  /// are allowed. For example, "floodlightactivitygroup*2015" will return
+  /// objects with names like "floodlightactivitygroup June 2015",
+  /// "floodlightactivitygroup April 2015", or simply "floodlightactivitygroup
+  /// 2015". Most of the searches also add wildcards implicitly at the start and
+  /// the end of the search string. For example, a search string of
+  /// "floodlightactivitygroup" will match objects with name "my
+  /// floodlightactivitygroup activity", "floodlightactivitygroup 2015", or
+  /// simply "floodlightactivitygroup".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [type] - Select only floodlight activity groups with the specified
+  /// floodlight activity group type.
+  /// Possible string values are:
+  /// - "COUNTER"
+  /// - "SALE"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightActivityGroupsListResponse].
+  ///
+  /// 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<FloodlightActivityGroupsListResponse> list(core.String profileId,
+      {core.String advertiserId,
+      core.String floodlightConfigurationId,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      core.String type,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserId != null) {
+      _queryParams["advertiserId"] = [advertiserId];
+    }
+    if (floodlightConfigurationId != null) {
+      _queryParams["floodlightConfigurationId"] = [floodlightConfigurationId];
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if (type != null) {
+      _queryParams["type"] = [type];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightActivityGroups';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then(
+        (data) => new FloodlightActivityGroupsListResponse.fromJson(data));
+  }
+
+  /// Updates an existing floodlight activity group. This method supports patch
+  /// semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Floodlight activity Group ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightActivityGroup].
+  ///
+  /// 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<FloodlightActivityGroup> patch(
+      FloodlightActivityGroup request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightActivityGroups';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new FloodlightActivityGroup.fromJson(data));
+  }
+
+  /// Updates an existing floodlight activity group.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightActivityGroup].
+  ///
+  /// 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<FloodlightActivityGroup> update(
+      FloodlightActivityGroup request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightActivityGroups';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new FloodlightActivityGroup.fromJson(data));
+  }
+}
+
+class FloodlightConfigurationsResourceApi {
+  final commons.ApiRequester _requester;
+
+  FloodlightConfigurationsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one floodlight configuration by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Floodlight configuration ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightConfiguration].
+  ///
+  /// 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<FloodlightConfiguration> get(
+      core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightConfigurations/' +
+        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 FloodlightConfiguration.fromJson(data));
+  }
+
+  /// Retrieves a list of floodlight configurations, possibly filtered.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [ids] - Set of IDs of floodlight configurations to retrieve. Required
+  /// field; otherwise an empty list will be returned.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightConfigurationsListResponse].
+  ///
+  /// 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<FloodlightConfigurationsListResponse> list(core.String profileId,
+      {core.List<core.String> ids, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightConfigurations';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then(
+        (data) => new FloodlightConfigurationsListResponse.fromJson(data));
+  }
+
+  /// Updates an existing floodlight configuration. This method supports patch
+  /// semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Floodlight configuration ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightConfiguration].
+  ///
+  /// 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<FloodlightConfiguration> patch(
+      FloodlightConfiguration request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightConfigurations';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new FloodlightConfiguration.fromJson(data));
+  }
+
+  /// Updates an existing floodlight configuration.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FloodlightConfiguration].
+  ///
+  /// 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<FloodlightConfiguration> update(
+      FloodlightConfiguration request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/floodlightConfigurations';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new FloodlightConfiguration.fromJson(data));
+  }
+}
+
+class InventoryItemsResourceApi {
+  final commons.ApiRequester _requester;
+
+  InventoryItemsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one inventory item by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [projectId] - Project ID for order documents.
+  ///
+  /// [id] - Inventory item ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [InventoryItem].
+  ///
+  /// 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<InventoryItem> get(
+      core.String profileId, core.String projectId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/projects/' +
+        commons.Escaper.ecapeVariable('$projectId') +
+        '/inventoryItems/' +
+        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 InventoryItem.fromJson(data));
+  }
+
+  /// Retrieves a list of inventory items, possibly filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [projectId] - Project ID for order documents.
+  ///
+  /// [ids] - Select only inventory items with these IDs.
+  ///
+  /// [inPlan] - Select only inventory items that are in plan.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [orderId] - Select only inventory items that belong to specified orders.
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [siteId] - Select only inventory items that are associated with these
+  /// sites.
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [type] - Select only inventory items with this type.
+  /// Possible string values are:
+  /// - "PLANNING_PLACEMENT_TYPE_CREDIT"
+  /// - "PLANNING_PLACEMENT_TYPE_REGULAR"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [InventoryItemsListResponse].
+  ///
+  /// 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<InventoryItemsListResponse> list(
+      core.String profileId, core.String projectId,
+      {core.List<core.String> ids,
+      core.bool inPlan,
+      core.int maxResults,
+      core.List<core.String> orderId,
+      core.String pageToken,
+      core.List<core.String> siteId,
+      core.String sortField,
+      core.String sortOrder,
+      core.String type,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (inPlan != null) {
+      _queryParams["inPlan"] = ["${inPlan}"];
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (orderId != null) {
+      _queryParams["orderId"] = orderId;
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (siteId != null) {
+      _queryParams["siteId"] = siteId;
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if (type != null) {
+      _queryParams["type"] = [type];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/projects/' +
+        commons.Escaper.ecapeVariable('$projectId') +
+        '/inventoryItems';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new InventoryItemsListResponse.fromJson(data));
+  }
+}
+
+class LanguagesResourceApi {
+  final commons.ApiRequester _requester;
+
+  LanguagesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Retrieves a list of languages.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [LanguagesListResponse].
+  ///
+  /// 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<LanguagesListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/languages';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new LanguagesListResponse.fromJson(data));
+  }
+}
+
+class MetrosResourceApi {
+  final commons.ApiRequester _requester;
+
+  MetrosResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Retrieves a list of metros.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [MetrosListResponse].
+  ///
+  /// 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<MetrosListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/metros';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new MetrosListResponse.fromJson(data));
+  }
+}
+
+class MobileCarriersResourceApi {
+  final commons.ApiRequester _requester;
+
+  MobileCarriersResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one mobile carrier by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Mobile carrier ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [MobileCarrier].
+  ///
+  /// 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<MobileCarrier> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/mobileCarriers/' +
+        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 MobileCarrier.fromJson(data));
+  }
+
+  /// Retrieves a list of mobile carriers.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [MobileCarriersListResponse].
+  ///
+  /// 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<MobileCarriersListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/mobileCarriers';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new MobileCarriersListResponse.fromJson(data));
+  }
+}
+
+class OperatingSystemVersionsResourceApi {
+  final commons.ApiRequester _requester;
+
+  OperatingSystemVersionsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one operating system version by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Operating system version ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [OperatingSystemVersion].
+  ///
+  /// 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<OperatingSystemVersion> get(
+      core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/operatingSystemVersions/' +
+        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 OperatingSystemVersion.fromJson(data));
+  }
+
+  /// Retrieves a list of operating system versions.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [OperatingSystemVersionsListResponse].
+  ///
+  /// 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<OperatingSystemVersionsListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/operatingSystemVersions';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new OperatingSystemVersionsListResponse.fromJson(data));
+  }
+}
+
+class OperatingSystemsResourceApi {
+  final commons.ApiRequester _requester;
+
+  OperatingSystemsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one operating system by DART ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [dartId] - Operating system DART ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [OperatingSystem].
+  ///
+  /// 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<OperatingSystem> get(core.String profileId, core.String dartId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (dartId == null) {
+      throw new core.ArgumentError("Parameter dartId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/operatingSystems/' +
+        commons.Escaper.ecapeVariable('$dartId');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new OperatingSystem.fromJson(data));
+  }
+
+  /// Retrieves a list of operating systems.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [OperatingSystemsListResponse].
+  ///
+  /// 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<OperatingSystemsListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/operatingSystems';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new OperatingSystemsListResponse.fromJson(data));
+  }
+}
+
+class OrderDocumentsResourceApi {
+  final commons.ApiRequester _requester;
+
+  OrderDocumentsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one order document by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [projectId] - Project ID for order documents.
+  ///
+  /// [id] - Order document ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [OrderDocument].
+  ///
+  /// 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<OrderDocument> get(
+      core.String profileId, core.String projectId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/projects/' +
+        commons.Escaper.ecapeVariable('$projectId') +
+        '/orderDocuments/' +
+        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 OrderDocument.fromJson(data));
+  }
+
+  /// Retrieves a list of order documents, possibly filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [projectId] - Project ID for order documents.
+  ///
+  /// [approved] - Select only order documents that have been approved by at
+  /// least one user.
+  ///
+  /// [ids] - Select only order documents with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [orderId] - Select only order documents for specified orders.
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for order documents by name or ID.
+  /// Wildcards (*) are allowed. For example, "orderdocument*2015" will return
+  /// order documents with names like "orderdocument June 2015", "orderdocument
+  /// April 2015", or simply "orderdocument 2015". Most of the searches also add
+  /// wildcards implicitly at the start and the end of the search string. For
+  /// example, a search string of "orderdocument" will match order documents
+  /// with name "my orderdocument", "orderdocument 2015", or simply
+  /// "orderdocument".
+  ///
+  /// [siteId] - Select only order documents that are associated with these
+  /// sites.
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [OrderDocumentsListResponse].
+  ///
+  /// 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<OrderDocumentsListResponse> list(
+      core.String profileId, core.String projectId,
+      {core.bool approved,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.List<core.String> orderId,
+      core.String pageToken,
+      core.String searchString,
+      core.List<core.String> siteId,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (approved != null) {
+      _queryParams["approved"] = ["${approved}"];
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (orderId != null) {
+      _queryParams["orderId"] = orderId;
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (siteId != null) {
+      _queryParams["siteId"] = siteId;
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/projects/' +
+        commons.Escaper.ecapeVariable('$projectId') +
+        '/orderDocuments';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new OrderDocumentsListResponse.fromJson(data));
+  }
+}
+
+class OrdersResourceApi {
+  final commons.ApiRequester _requester;
+
+  OrdersResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one order by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [projectId] - Project ID for orders.
+  ///
+  /// [id] - Order ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Order].
+  ///
+  /// 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<Order> get(
+      core.String profileId, core.String projectId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/projects/' +
+        commons.Escaper.ecapeVariable('$projectId') +
+        '/orders/' +
+        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 Order.fromJson(data));
+  }
+
+  /// Retrieves a list of orders, possibly filtered. This method supports
+  /// paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [projectId] - Project ID for orders.
+  ///
+  /// [ids] - Select only orders with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for orders by name or ID. Wildcards (*)
+  /// are allowed. For example, "order*2015" will return orders with names like
+  /// "order June 2015", "order April 2015", or simply "order 2015". Most of the
+  /// searches also add wildcards implicitly at the start and the end of the
+  /// search string. For example, a search string of "order" will match orders
+  /// with name "my order", "order 2015", or simply "order".
+  ///
+  /// [siteId] - Select only orders that are associated with these site IDs.
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [OrdersListResponse].
+  ///
+  /// 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<OrdersListResponse> list(
+      core.String profileId, core.String projectId,
+      {core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.List<core.String> siteId,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (siteId != null) {
+      _queryParams["siteId"] = siteId;
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/projects/' +
+        commons.Escaper.ecapeVariable('$projectId') +
+        '/orders';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new OrdersListResponse.fromJson(data));
+  }
+}
+
+class PlacementGroupsResourceApi {
+  final commons.ApiRequester _requester;
+
+  PlacementGroupsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one placement group by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Placement group ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlacementGroup].
+  ///
+  /// 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<PlacementGroup> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placementGroups/' +
+        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 PlacementGroup.fromJson(data));
+  }
+
+  /// Inserts a new placement group.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlacementGroup].
+  ///
+  /// 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<PlacementGroup> insert(
+      PlacementGroup request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placementGroups';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new PlacementGroup.fromJson(data));
+  }
+
+  /// Retrieves a list of placement groups, possibly filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserIds] - Select only placement groups that belong to these
+  /// advertisers.
+  ///
+  /// [archived] - Select only archived placements. Don't set this field to
+  /// select both archived and non-archived placements.
+  ///
+  /// [campaignIds] - Select only placement groups that belong to these
+  /// campaigns.
+  ///
+  /// [contentCategoryIds] - Select only placement groups that are associated
+  /// with these content categories.
+  ///
+  /// [directorySiteIds] - Select only placement groups that are associated with
+  /// these directory sites.
+  ///
+  /// [ids] - Select only placement groups with these IDs.
+  ///
+  /// [maxEndDate] - Select only placements or placement groups whose end date
+  /// is on or before the specified maxEndDate. The date should be formatted as
+  /// "yyyy-MM-dd".
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "800".
+  ///
+  /// [maxStartDate] - Select only placements or placement groups whose start
+  /// date is on or before the specified maxStartDate. The date should be
+  /// formatted as "yyyy-MM-dd".
+  ///
+  /// [minEndDate] - Select only placements or placement groups whose end date
+  /// is on or after the specified minEndDate. The date should be formatted as
+  /// "yyyy-MM-dd".
+  ///
+  /// [minStartDate] - Select only placements or placement groups whose start
+  /// date is on or after the specified minStartDate. The date should be
+  /// formatted as "yyyy-MM-dd".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [placementGroupType] - Select only placement groups belonging with this
+  /// group type. A package is a simple group of placements that acts as a
+  /// single pricing point for a group of tags. A roadblock is a group of
+  /// placements that not only acts as a single pricing point but also assumes
+  /// that all the tags in it will be served at the same time. A roadblock
+  /// requires one of its assigned placements to be marked as primary for
+  /// reporting.
+  /// Possible string values are:
+  /// - "PLACEMENT_PACKAGE"
+  /// - "PLACEMENT_ROADBLOCK"
+  ///
+  /// [placementStrategyIds] - Select only placement groups that are associated
+  /// with these placement strategies.
+  ///
+  /// [pricingTypes] - Select only placement groups with these pricing types.
+  ///
+  /// [searchString] - Allows searching for placement groups by name or ID.
+  /// Wildcards (*) are allowed. For example, "placement*2015" will return
+  /// placement groups with names like "placement group June 2015", "placement
+  /// group May 2015", or simply "placements 2015". Most of the searches also
+  /// add wildcards implicitly at the start and the end of the search string.
+  /// For example, a search string of "placementgroup" will match placement
+  /// groups with name "my placementgroup", "placementgroup 2015", or simply
+  /// "placementgroup".
+  ///
+  /// [siteIds] - Select only placement groups that are associated with these
+  /// sites.
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlacementGroupsListResponse].
+  ///
+  /// 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<PlacementGroupsListResponse> list(core.String profileId,
+      {core.List<core.String> advertiserIds,
+      core.bool archived,
+      core.List<core.String> campaignIds,
+      core.List<core.String> contentCategoryIds,
+      core.List<core.String> directorySiteIds,
+      core.List<core.String> ids,
+      core.String maxEndDate,
+      core.int maxResults,
+      core.String maxStartDate,
+      core.String minEndDate,
+      core.String minStartDate,
+      core.String pageToken,
+      core.String placementGroupType,
+      core.List<core.String> placementStrategyIds,
+      core.List<core.String> pricingTypes,
+      core.String searchString,
+      core.List<core.String> siteIds,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserIds != null) {
+      _queryParams["advertiserIds"] = advertiserIds;
+    }
+    if (archived != null) {
+      _queryParams["archived"] = ["${archived}"];
+    }
+    if (campaignIds != null) {
+      _queryParams["campaignIds"] = campaignIds;
+    }
+    if (contentCategoryIds != null) {
+      _queryParams["contentCategoryIds"] = contentCategoryIds;
+    }
+    if (directorySiteIds != null) {
+      _queryParams["directorySiteIds"] = directorySiteIds;
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxEndDate != null) {
+      _queryParams["maxEndDate"] = [maxEndDate];
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (maxStartDate != null) {
+      _queryParams["maxStartDate"] = [maxStartDate];
+    }
+    if (minEndDate != null) {
+      _queryParams["minEndDate"] = [minEndDate];
+    }
+    if (minStartDate != null) {
+      _queryParams["minStartDate"] = [minStartDate];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (placementGroupType != null) {
+      _queryParams["placementGroupType"] = [placementGroupType];
+    }
+    if (placementStrategyIds != null) {
+      _queryParams["placementStrategyIds"] = placementStrategyIds;
+    }
+    if (pricingTypes != null) {
+      _queryParams["pricingTypes"] = pricingTypes;
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (siteIds != null) {
+      _queryParams["siteIds"] = siteIds;
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placementGroups';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new PlacementGroupsListResponse.fromJson(data));
+  }
+
+  /// Updates an existing placement group. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Placement group ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlacementGroup].
+  ///
+  /// 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<PlacementGroup> patch(
+      PlacementGroup request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placementGroups';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new PlacementGroup.fromJson(data));
+  }
+
+  /// Updates an existing placement group.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlacementGroup].
+  ///
+  /// 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<PlacementGroup> update(
+      PlacementGroup request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placementGroups';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new PlacementGroup.fromJson(data));
+  }
+}
+
+class PlacementStrategiesResourceApi {
+  final commons.ApiRequester _requester;
+
+  PlacementStrategiesResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Deletes an existing placement strategy.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Placement strategy ID.
+  ///
+  /// [$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 profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placementStrategies/' +
+        commons.Escaper.ecapeVariable('$id');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Gets one placement strategy by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Placement strategy ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlacementStrategy].
+  ///
+  /// 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<PlacementStrategy> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placementStrategies/' +
+        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 PlacementStrategy.fromJson(data));
+  }
+
+  /// Inserts a new placement strategy.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlacementStrategy].
+  ///
+  /// 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<PlacementStrategy> insert(
+      PlacementStrategy request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placementStrategies';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new PlacementStrategy.fromJson(data));
+  }
+
+  /// Retrieves a list of placement strategies, possibly filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [ids] - Select only placement strategies with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for objects by name or ID. Wildcards (*)
+  /// are allowed. For example, "placementstrategy*2015" will return objects
+  /// with names like "placementstrategy June 2015", "placementstrategy April
+  /// 2015", or simply "placementstrategy 2015". Most of the searches also add
+  /// wildcards implicitly at the start and the end of the search string. For
+  /// example, a search string of "placementstrategy" will match objects with
+  /// name "my placementstrategy", "placementstrategy 2015", or simply
+  /// "placementstrategy".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlacementStrategiesListResponse].
+  ///
+  /// 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<PlacementStrategiesListResponse> list(core.String profileId,
+      {core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placementStrategies';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new PlacementStrategiesListResponse.fromJson(data));
+  }
+
+  /// Updates an existing placement strategy. This method supports patch
+  /// semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Placement strategy ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlacementStrategy].
+  ///
+  /// 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<PlacementStrategy> patch(
+      PlacementStrategy request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placementStrategies';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new PlacementStrategy.fromJson(data));
+  }
+
+  /// Updates an existing placement strategy.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlacementStrategy].
+  ///
+  /// 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<PlacementStrategy> update(
+      PlacementStrategy request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placementStrategies';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new PlacementStrategy.fromJson(data));
+  }
+}
+
+class PlacementsResourceApi {
+  final commons.ApiRequester _requester;
+
+  PlacementsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Generates tags for a placement.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [campaignId] - Generate placements belonging to this campaign. This is a
+  /// required field.
+  ///
+  /// [placementIds] - Generate tags for these placements.
+  ///
+  /// [tagFormats] - Tag formats to generate for these placements.
+  ///
+  /// Note: PLACEMENT_TAG_STANDARD can only be generated for 1x1 placements.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlacementsGenerateTagsResponse].
+  ///
+  /// 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<PlacementsGenerateTagsResponse> generatetags(
+      core.String profileId,
+      {core.String campaignId,
+      core.List<core.String> placementIds,
+      core.List<core.String> tagFormats,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (campaignId != null) {
+      _queryParams["campaignId"] = [campaignId];
+    }
+    if (placementIds != null) {
+      _queryParams["placementIds"] = placementIds;
+    }
+    if (tagFormats != null) {
+      _queryParams["tagFormats"] = tagFormats;
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placements/generatetags';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new PlacementsGenerateTagsResponse.fromJson(data));
+  }
+
+  /// Gets one placement by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Placement ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Placement].
+  ///
+  /// 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<Placement> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placements/' +
+        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 Placement.fromJson(data));
+  }
+
+  /// Inserts a new placement.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Placement].
+  ///
+  /// 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<Placement> insert(Placement request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placements';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Placement.fromJson(data));
+  }
+
+  /// Retrieves a list of placements, possibly filtered. This method supports
+  /// paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserIds] - Select only placements that belong to these advertisers.
+  ///
+  /// [archived] - Select only archived placements. Don't set this field to
+  /// select both archived and non-archived placements.
+  ///
+  /// [campaignIds] - Select only placements that belong to these campaigns.
+  ///
+  /// [compatibilities] - Select only placements that are associated with these
+  /// compatibilities. DISPLAY and DISPLAY_INTERSTITIAL refer to rendering
+  /// either on desktop or on mobile devices for regular or interstitial ads
+  /// respectively. APP and APP_INTERSTITIAL are for rendering in mobile apps.
+  /// IN_STREAM_VIDEO refers to rendering in in-stream video ads developed with
+  /// the VAST standard.
+  ///
+  /// [contentCategoryIds] - Select only placements that are associated with
+  /// these content categories.
+  ///
+  /// [directorySiteIds] - Select only placements that are associated with these
+  /// directory sites.
+  ///
+  /// [groupIds] - Select only placements that belong to these placement groups.
+  ///
+  /// [ids] - Select only placements with these IDs.
+  ///
+  /// [maxEndDate] - Select only placements or placement groups whose end date
+  /// is on or before the specified maxEndDate. The date should be formatted as
+  /// "yyyy-MM-dd".
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [maxStartDate] - Select only placements or placement groups whose start
+  /// date is on or before the specified maxStartDate. The date should be
+  /// formatted as "yyyy-MM-dd".
+  ///
+  /// [minEndDate] - Select only placements or placement groups whose end date
+  /// is on or after the specified minEndDate. The date should be formatted as
+  /// "yyyy-MM-dd".
+  ///
+  /// [minStartDate] - Select only placements or placement groups whose start
+  /// date is on or after the specified minStartDate. The date should be
+  /// formatted as "yyyy-MM-dd".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [paymentSource] - Select only placements with this payment source.
+  /// Possible string values are:
+  /// - "PLACEMENT_AGENCY_PAID"
+  /// - "PLACEMENT_PUBLISHER_PAID"
+  ///
+  /// [placementStrategyIds] - Select only placements that are associated with
+  /// these placement strategies.
+  ///
+  /// [pricingTypes] - Select only placements with these pricing types.
+  ///
+  /// [searchString] - Allows searching for placements by name or ID. Wildcards
+  /// (*) are allowed. For example, "placement*2015" will return placements with
+  /// names like "placement June 2015", "placement May 2015", or simply
+  /// "placements 2015". Most of the searches also add wildcards implicitly at
+  /// the start and the end of the search string. For example, a search string
+  /// of "placement" will match placements with name "my placement", "placement
+  /// 2015", or simply "placement".
+  ///
+  /// [siteIds] - Select only placements that are associated with these sites.
+  ///
+  /// [sizeIds] - Select only placements that are associated with these sizes.
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlacementsListResponse].
+  ///
+  /// 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<PlacementsListResponse> list(core.String profileId,
+      {core.List<core.String> advertiserIds,
+      core.bool archived,
+      core.List<core.String> campaignIds,
+      core.List<core.String> compatibilities,
+      core.List<core.String> contentCategoryIds,
+      core.List<core.String> directorySiteIds,
+      core.List<core.String> groupIds,
+      core.List<core.String> ids,
+      core.String maxEndDate,
+      core.int maxResults,
+      core.String maxStartDate,
+      core.String minEndDate,
+      core.String minStartDate,
+      core.String pageToken,
+      core.String paymentSource,
+      core.List<core.String> placementStrategyIds,
+      core.List<core.String> pricingTypes,
+      core.String searchString,
+      core.List<core.String> siteIds,
+      core.List<core.String> sizeIds,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserIds != null) {
+      _queryParams["advertiserIds"] = advertiserIds;
+    }
+    if (archived != null) {
+      _queryParams["archived"] = ["${archived}"];
+    }
+    if (campaignIds != null) {
+      _queryParams["campaignIds"] = campaignIds;
+    }
+    if (compatibilities != null) {
+      _queryParams["compatibilities"] = compatibilities;
+    }
+    if (contentCategoryIds != null) {
+      _queryParams["contentCategoryIds"] = contentCategoryIds;
+    }
+    if (directorySiteIds != null) {
+      _queryParams["directorySiteIds"] = directorySiteIds;
+    }
+    if (groupIds != null) {
+      _queryParams["groupIds"] = groupIds;
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxEndDate != null) {
+      _queryParams["maxEndDate"] = [maxEndDate];
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (maxStartDate != null) {
+      _queryParams["maxStartDate"] = [maxStartDate];
+    }
+    if (minEndDate != null) {
+      _queryParams["minEndDate"] = [minEndDate];
+    }
+    if (minStartDate != null) {
+      _queryParams["minStartDate"] = [minStartDate];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (paymentSource != null) {
+      _queryParams["paymentSource"] = [paymentSource];
+    }
+    if (placementStrategyIds != null) {
+      _queryParams["placementStrategyIds"] = placementStrategyIds;
+    }
+    if (pricingTypes != null) {
+      _queryParams["pricingTypes"] = pricingTypes;
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (siteIds != null) {
+      _queryParams["siteIds"] = siteIds;
+    }
+    if (sizeIds != null) {
+      _queryParams["sizeIds"] = sizeIds;
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placements';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new PlacementsListResponse.fromJson(data));
+  }
+
+  /// Updates an existing placement. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Placement ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Placement].
+  ///
+  /// 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<Placement> patch(
+      Placement request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placements';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Placement.fromJson(data));
+  }
+
+  /// Updates an existing placement.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Placement].
+  ///
+  /// 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<Placement> update(Placement request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/placements';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Placement.fromJson(data));
+  }
+}
+
+class PlatformTypesResourceApi {
+  final commons.ApiRequester _requester;
+
+  PlatformTypesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one platform type by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Platform type ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlatformType].
+  ///
+  /// 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<PlatformType> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/platformTypes/' +
+        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 PlatformType.fromJson(data));
+  }
+
+  /// Retrieves a list of platform types.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PlatformTypesListResponse].
+  ///
+  /// 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<PlatformTypesListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/platformTypes';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new PlatformTypesListResponse.fromJson(data));
+  }
+}
+
+class PostalCodesResourceApi {
+  final commons.ApiRequester _requester;
+
+  PostalCodesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one postal code by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [code] - Postal code ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PostalCode].
+  ///
+  /// 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<PostalCode> get(core.String profileId, core.String code,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (code == null) {
+      throw new core.ArgumentError("Parameter code is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/postalCodes/' +
+        commons.Escaper.ecapeVariable('$code');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new PostalCode.fromJson(data));
+  }
+
+  /// Retrieves a list of postal codes.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PostalCodesListResponse].
+  ///
+  /// 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<PostalCodesListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/postalCodes';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new PostalCodesListResponse.fromJson(data));
+  }
+}
+
+class ProjectsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ProjectsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one project by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Project ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Project].
+  ///
+  /// 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<Project> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/projects/' +
+        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 Project.fromJson(data));
+  }
+
+  /// Retrieves a list of projects, possibly filtered. This method supports
+  /// paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserIds] - Select only projects with these advertiser IDs.
+  ///
+  /// [ids] - Select only projects with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for projects by name or ID. Wildcards
+  /// (*) are allowed. For example, "project*2015" will return projects with
+  /// names like "project June 2015", "project April 2015", or simply "project
+  /// 2015". Most of the searches also add wildcards implicitly at the start and
+  /// the end of the search string. For example, a search string of "project"
+  /// will match projects with name "my project", "project 2015", or simply
+  /// "project".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ProjectsListResponse].
+  ///
+  /// 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<ProjectsListResponse> list(core.String profileId,
+      {core.List<core.String> advertiserIds,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserIds != null) {
+      _queryParams["advertiserIds"] = advertiserIds;
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/projects';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ProjectsListResponse.fromJson(data));
+  }
+}
+
+class RegionsResourceApi {
+  final commons.ApiRequester _requester;
+
+  RegionsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Retrieves a list of regions.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [RegionsListResponse].
+  ///
+  /// 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<RegionsListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/regions';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new RegionsListResponse.fromJson(data));
+  }
+}
+
+class RemarketingListSharesResourceApi {
+  final commons.ApiRequester _requester;
+
+  RemarketingListSharesResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one remarketing list share by remarketing list ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [remarketingListId] - Remarketing list ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [RemarketingListShare].
+  ///
+  /// 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<RemarketingListShare> get(
+      core.String profileId, core.String remarketingListId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (remarketingListId == null) {
+      throw new core.ArgumentError("Parameter remarketingListId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/remarketingListShares/' +
+        commons.Escaper.ecapeVariable('$remarketingListId');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new RemarketingListShare.fromJson(data));
+  }
+
+  /// Updates an existing remarketing list share. This method supports patch
+  /// semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [remarketingListId] - Remarketing list ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [RemarketingListShare].
+  ///
+  /// 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<RemarketingListShare> patch(RemarketingListShare request,
+      core.String profileId, core.String remarketingListId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (remarketingListId == null) {
+      throw new core.ArgumentError("Parameter remarketingListId is required.");
+    }
+    _queryParams["remarketingListId"] = [remarketingListId];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/remarketingListShares';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new RemarketingListShare.fromJson(data));
+  }
+
+  /// Updates an existing remarketing list share.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [RemarketingListShare].
+  ///
+  /// 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<RemarketingListShare> update(
+      RemarketingListShare request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/remarketingListShares';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new RemarketingListShare.fromJson(data));
+  }
+}
+
+class RemarketingListsResourceApi {
+  final commons.ApiRequester _requester;
+
+  RemarketingListsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one remarketing list by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Remarketing list ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [RemarketingList].
+  ///
+  /// 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<RemarketingList> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/remarketingLists/' +
+        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 RemarketingList.fromJson(data));
+  }
+
+  /// Inserts a new remarketing list.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [RemarketingList].
+  ///
+  /// 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<RemarketingList> insert(
+      RemarketingList request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/remarketingLists';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new RemarketingList.fromJson(data));
+  }
+
+  /// Retrieves a list of remarketing lists, possibly filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserId] - Select only remarketing lists owned by this advertiser.
+  ///
+  /// [active] - Select only active or only inactive remarketing lists.
+  ///
+  /// [floodlightActivityId] - Select only remarketing lists that have this
+  /// floodlight activity ID.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [name] - Allows searching for objects by name or ID. Wildcards (*) are
+  /// allowed. For example, "remarketing list*2015" will return objects with
+  /// names like "remarketing list June 2015", "remarketing list April 2015", or
+  /// simply "remarketing list 2015". Most of the searches also add wildcards
+  /// implicitly at the start and the end of the search string. For example, a
+  /// search string of "remarketing list" will match objects with name "my
+  /// remarketing list", "remarketing list 2015", or simply "remarketing list".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [RemarketingListsListResponse].
+  ///
+  /// 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<RemarketingListsListResponse> list(
+      core.String profileId, core.String advertiserId,
+      {core.bool active,
+      core.String floodlightActivityId,
+      core.int maxResults,
+      core.String name,
+      core.String pageToken,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserId == null) {
+      throw new core.ArgumentError("Parameter advertiserId is required.");
+    }
+    _queryParams["advertiserId"] = [advertiserId];
+    if (active != null) {
+      _queryParams["active"] = ["${active}"];
+    }
+    if (floodlightActivityId != null) {
+      _queryParams["floodlightActivityId"] = [floodlightActivityId];
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (name != null) {
+      _queryParams["name"] = [name];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/remarketingLists';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new RemarketingListsListResponse.fromJson(data));
+  }
+
+  /// Updates an existing remarketing list. This method supports patch
+  /// semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Remarketing list ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [RemarketingList].
+  ///
+  /// 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<RemarketingList> patch(
+      RemarketingList request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/remarketingLists';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new RemarketingList.fromJson(data));
+  }
+
+  /// Updates an existing remarketing list.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [RemarketingList].
+  ///
+  /// 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<RemarketingList> update(
+      RemarketingList request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/remarketingLists';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new RemarketingList.fromJson(data));
+  }
+}
+
+class ReportsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ReportsCompatibleFieldsResourceApi get compatibleFields =>
+      new ReportsCompatibleFieldsResourceApi(_requester);
+  ReportsFilesResourceApi get files => new ReportsFilesResourceApi(_requester);
+
+  ReportsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Deletes a report by its ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - The DFA user profile ID.
+  ///
+  /// [reportId] - The ID of the report.
+  ///
+  /// [$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 profileId, core.String reportId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (reportId == null) {
+      throw new core.ArgumentError("Parameter reportId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/reports/' +
+        commons.Escaper.ecapeVariable('$reportId');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Retrieves a report by its ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - The DFA user profile ID.
+  ///
+  /// [reportId] - The ID of the report.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Report].
+  ///
+  /// 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<Report> get(core.String profileId, core.String reportId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (reportId == null) {
+      throw new core.ArgumentError("Parameter reportId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/reports/' +
+        commons.Escaper.ecapeVariable('$reportId');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Report.fromJson(data));
+  }
+
+  /// Creates a report.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - The DFA user profile ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Report].
+  ///
+  /// 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<Report> insert(Report request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/reports';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Report.fromJson(data));
+  }
+
+  /// Retrieves list of reports.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - The DFA user profile ID.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "10".
+  ///
+  /// [pageToken] - The value of the nextToken from the previous result page.
+  ///
+  /// [scope] - The scope that defines which results are returned.
+  /// Possible string values are:
+  /// - "ALL" : All reports in account.
+  /// - "MINE" : My reports.
+  ///
+  /// [sortField] - The field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID" : Sort by report ID.
+  /// - "LAST_MODIFIED_TIME" : Sort by 'lastModifiedTime' field.
+  /// - "NAME" : Sort by name of reports.
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING" : Ascending order.
+  /// - "DESCENDING" : Descending order.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ReportList].
+  ///
+  /// 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<ReportList> list(core.String profileId,
+      {core.int maxResults,
+      core.String pageToken,
+      core.String scope,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (scope != null) {
+      _queryParams["scope"] = [scope];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/reports';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ReportList.fromJson(data));
+  }
+
+  /// Updates a report. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - The DFA user profile ID.
+  ///
+  /// [reportId] - The ID of the report.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Report].
+  ///
+  /// 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<Report> patch(
+      Report request, core.String profileId, core.String reportId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (reportId == null) {
+      throw new core.ArgumentError("Parameter reportId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/reports/' +
+        commons.Escaper.ecapeVariable('$reportId');
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Report.fromJson(data));
+  }
+
+  /// Runs a report.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - The DFA profile ID.
+  ///
+  /// [reportId] - The ID of the report.
+  ///
+  /// [synchronous] - If set and true, tries to run the report synchronously.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [File].
+  ///
+  /// 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<File> run(core.String profileId, core.String reportId,
+      {core.bool synchronous, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (reportId == null) {
+      throw new core.ArgumentError("Parameter reportId is required.");
+    }
+    if (synchronous != null) {
+      _queryParams["synchronous"] = ["${synchronous}"];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/reports/' +
+        commons.Escaper.ecapeVariable('$reportId') +
+        '/run';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new File.fromJson(data));
+  }
+
+  /// Updates a report.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - The DFA user profile ID.
+  ///
+  /// [reportId] - The ID of the report.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Report].
+  ///
+  /// 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<Report> update(
+      Report request, core.String profileId, core.String reportId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (reportId == null) {
+      throw new core.ArgumentError("Parameter reportId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/reports/' +
+        commons.Escaper.ecapeVariable('$reportId');
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Report.fromJson(data));
+  }
+}
+
+class ReportsCompatibleFieldsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ReportsCompatibleFieldsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Returns the fields that are compatible to be selected in the respective
+  /// sections of a report criteria, given the fields already selected in the
+  /// input report and user permissions.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - The DFA user profile ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [CompatibleFields].
+  ///
+  /// 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<CompatibleFields> query(Report request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/reports/compatiblefields/query';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new CompatibleFields.fromJson(data));
+  }
+}
+
+class ReportsFilesResourceApi {
+  final commons.ApiRequester _requester;
+
+  ReportsFilesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Retrieves a report file. This method supports media download.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - The DFA profile ID.
+  ///
+  /// [reportId] - The ID of the report.
+  ///
+  /// [fileId] - The ID of the report file.
+  ///
+  /// [$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
+  ///
+  /// - [File] 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(
+      core.String profileId, core.String reportId, core.String fileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (reportId == null) {
+      throw new core.ArgumentError("Parameter reportId is required.");
+    }
+    if (fileId == null) {
+      throw new core.ArgumentError("Parameter fileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = downloadOptions;
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/reports/' +
+        commons.Escaper.ecapeVariable('$reportId') +
+        '/files/' +
+        commons.Escaper.ecapeVariable('$fileId');
+
+    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 File.fromJson(data));
+    } else {
+      return _response;
+    }
+  }
+
+  /// Lists files for a report.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - The DFA profile ID.
+  ///
+  /// [reportId] - The ID of the parent report.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "10".
+  ///
+  /// [pageToken] - The value of the nextToken from the previous result page.
+  ///
+  /// [sortField] - The field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID" : Sort by file ID.
+  /// - "LAST_MODIFIED_TIME" : Sort by 'lastmodifiedAt' field.
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING" : Ascending order.
+  /// - "DESCENDING" : Descending order.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [FileList].
+  ///
+  /// 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<FileList> list(core.String profileId, core.String reportId,
+      {core.int maxResults,
+      core.String pageToken,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (reportId == null) {
+      throw new core.ArgumentError("Parameter reportId is required.");
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/reports/' +
+        commons.Escaper.ecapeVariable('$reportId') +
+        '/files';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new FileList.fromJson(data));
+  }
+}
+
+class SitesResourceApi {
+  final commons.ApiRequester _requester;
+
+  SitesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one site by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Site ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Site].
+  ///
+  /// 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<Site> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/sites/' +
+        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 Site.fromJson(data));
+  }
+
+  /// Inserts a new site.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Site].
+  ///
+  /// 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<Site> insert(Site request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/sites';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Site.fromJson(data));
+  }
+
+  /// Retrieves a list of sites, possibly filtered. This method supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [acceptsInStreamVideoPlacements] - This search filter is no longer
+  /// supported and will have no effect on the results returned.
+  ///
+  /// [acceptsInterstitialPlacements] - This search filter is no longer
+  /// supported and will have no effect on the results returned.
+  ///
+  /// [acceptsPublisherPaidPlacements] - Select only sites that accept publisher
+  /// paid placements.
+  ///
+  /// [adWordsSite] - Select only AdWords sites.
+  ///
+  /// [approved] - Select only approved sites.
+  ///
+  /// [campaignIds] - Select only sites with these campaign IDs.
+  ///
+  /// [directorySiteIds] - Select only sites with these directory site IDs.
+  ///
+  /// [ids] - Select only sites with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for objects by name, ID or keyName.
+  /// Wildcards (*) are allowed. For example, "site*2015" will return objects
+  /// with names like "site June 2015", "site April 2015", or simply "site
+  /// 2015". Most of the searches also add wildcards implicitly at the start and
+  /// the end of the search string. For example, a search string of "site" will
+  /// match objects with name "my site", "site 2015", or simply "site".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [subaccountId] - Select only sites with this subaccount ID.
+  ///
+  /// [unmappedSite] - Select only sites that have not been mapped to a
+  /// directory site.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [SitesListResponse].
+  ///
+  /// 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<SitesListResponse> list(core.String profileId,
+      {core.bool acceptsInStreamVideoPlacements,
+      core.bool acceptsInterstitialPlacements,
+      core.bool acceptsPublisherPaidPlacements,
+      core.bool adWordsSite,
+      core.bool approved,
+      core.List<core.String> campaignIds,
+      core.List<core.String> directorySiteIds,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      core.String subaccountId,
+      core.bool unmappedSite,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (acceptsInStreamVideoPlacements != null) {
+      _queryParams["acceptsInStreamVideoPlacements"] = [
+        "${acceptsInStreamVideoPlacements}"
+      ];
+    }
+    if (acceptsInterstitialPlacements != null) {
+      _queryParams["acceptsInterstitialPlacements"] = [
+        "${acceptsInterstitialPlacements}"
+      ];
+    }
+    if (acceptsPublisherPaidPlacements != null) {
+      _queryParams["acceptsPublisherPaidPlacements"] = [
+        "${acceptsPublisherPaidPlacements}"
+      ];
+    }
+    if (adWordsSite != null) {
+      _queryParams["adWordsSite"] = ["${adWordsSite}"];
+    }
+    if (approved != null) {
+      _queryParams["approved"] = ["${approved}"];
+    }
+    if (campaignIds != null) {
+      _queryParams["campaignIds"] = campaignIds;
+    }
+    if (directorySiteIds != null) {
+      _queryParams["directorySiteIds"] = directorySiteIds;
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if (subaccountId != null) {
+      _queryParams["subaccountId"] = [subaccountId];
+    }
+    if (unmappedSite != null) {
+      _queryParams["unmappedSite"] = ["${unmappedSite}"];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/sites';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new SitesListResponse.fromJson(data));
+  }
+
+  /// Updates an existing site. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Site ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Site].
+  ///
+  /// 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<Site> patch(Site request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/sites';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Site.fromJson(data));
+  }
+
+  /// Updates an existing site.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Site].
+  ///
+  /// 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<Site> update(Site request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/sites';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Site.fromJson(data));
+  }
+}
+
+class SizesResourceApi {
+  final commons.ApiRequester _requester;
+
+  SizesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one size by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Size ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Size].
+  ///
+  /// 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<Size> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/sizes/' +
+        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 Size.fromJson(data));
+  }
+
+  /// Inserts a new size.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Size].
+  ///
+  /// 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<Size> insert(Size request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/sizes';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Size.fromJson(data));
+  }
+
+  /// Retrieves a list of sizes, possibly filtered.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [height] - Select only sizes with this height.
+  /// Value must be between "0" and "32767".
+  ///
+  /// [iabStandard] - Select only IAB standard sizes.
+  ///
+  /// [ids] - Select only sizes with these IDs.
+  ///
+  /// [width] - Select only sizes with this width.
+  /// Value must be between "0" and "32767".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [SizesListResponse].
+  ///
+  /// 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<SizesListResponse> list(core.String profileId,
+      {core.int height,
+      core.bool iabStandard,
+      core.List<core.String> ids,
+      core.int width,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (height != null) {
+      _queryParams["height"] = ["${height}"];
+    }
+    if (iabStandard != null) {
+      _queryParams["iabStandard"] = ["${iabStandard}"];
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (width != null) {
+      _queryParams["width"] = ["${width}"];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/sizes';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new SizesListResponse.fromJson(data));
+  }
+}
+
+class SubaccountsResourceApi {
+  final commons.ApiRequester _requester;
+
+  SubaccountsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one subaccount by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Subaccount ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Subaccount].
+  ///
+  /// 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<Subaccount> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/subaccounts/' +
+        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 Subaccount.fromJson(data));
+  }
+
+  /// Inserts a new subaccount.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Subaccount].
+  ///
+  /// 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<Subaccount> insert(Subaccount request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/subaccounts';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Subaccount.fromJson(data));
+  }
+
+  /// Gets a list of subaccounts, possibly filtered. This method supports
+  /// paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [ids] - Select only subaccounts with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for objects by name or ID. Wildcards (*)
+  /// are allowed. For example, "subaccount*2015" will return objects with names
+  /// like "subaccount June 2015", "subaccount April 2015", or simply
+  /// "subaccount 2015". Most of the searches also add wildcards implicitly at
+  /// the start and the end of the search string. For example, a search string
+  /// of "subaccount" will match objects with name "my subaccount", "subaccount
+  /// 2015", or simply "subaccount".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [SubaccountsListResponse].
+  ///
+  /// 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<SubaccountsListResponse> list(core.String profileId,
+      {core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/subaccounts';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new SubaccountsListResponse.fromJson(data));
+  }
+
+  /// Updates an existing subaccount. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Subaccount ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Subaccount].
+  ///
+  /// 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<Subaccount> patch(
+      Subaccount request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/subaccounts';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Subaccount.fromJson(data));
+  }
+
+  /// Updates an existing subaccount.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Subaccount].
+  ///
+  /// 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<Subaccount> update(Subaccount request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/subaccounts';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Subaccount.fromJson(data));
+  }
+}
+
+class TargetableRemarketingListsResourceApi {
+  final commons.ApiRequester _requester;
+
+  TargetableRemarketingListsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one remarketing list by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Remarketing list ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [TargetableRemarketingList].
+  ///
+  /// 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<TargetableRemarketingList> get(
+      core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/targetableRemarketingLists/' +
+        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 TargetableRemarketingList.fromJson(data));
+  }
+
+  /// Retrieves a list of targetable remarketing lists, possibly filtered. This
+  /// method supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserId] - Select only targetable remarketing lists targetable by
+  /// these advertisers.
+  ///
+  /// [active] - Select only active or only inactive targetable remarketing
+  /// lists.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [name] - Allows searching for objects by name or ID. Wildcards (*) are
+  /// allowed. For example, "remarketing list*2015" will return objects with
+  /// names like "remarketing list June 2015", "remarketing list April 2015", or
+  /// simply "remarketing list 2015". Most of the searches also add wildcards
+  /// implicitly at the start and the end of the search string. For example, a
+  /// search string of "remarketing list" will match objects with name "my
+  /// remarketing list", "remarketing list 2015", or simply "remarketing list".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [TargetableRemarketingListsListResponse].
+  ///
+  /// 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<TargetableRemarketingListsListResponse> list(
+      core.String profileId, core.String advertiserId,
+      {core.bool active,
+      core.int maxResults,
+      core.String name,
+      core.String pageToken,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserId == null) {
+      throw new core.ArgumentError("Parameter advertiserId is required.");
+    }
+    _queryParams["advertiserId"] = [advertiserId];
+    if (active != null) {
+      _queryParams["active"] = ["${active}"];
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (name != null) {
+      _queryParams["name"] = [name];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/targetableRemarketingLists';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then(
+        (data) => new TargetableRemarketingListsListResponse.fromJson(data));
+  }
+}
+
+class TargetingTemplatesResourceApi {
+  final commons.ApiRequester _requester;
+
+  TargetingTemplatesResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one targeting template by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Targeting template ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [TargetingTemplate].
+  ///
+  /// 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<TargetingTemplate> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/targetingTemplates/' +
+        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 TargetingTemplate.fromJson(data));
+  }
+
+  /// Inserts a new targeting template.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [TargetingTemplate].
+  ///
+  /// 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<TargetingTemplate> insert(
+      TargetingTemplate request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/targetingTemplates';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new TargetingTemplate.fromJson(data));
+  }
+
+  /// Retrieves a list of targeting templates, optionally filtered. This method
+  /// supports paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [advertiserId] - Select only targeting templates with this advertiser ID.
+  ///
+  /// [ids] - Select only targeting templates with these IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for objects by name or ID. Wildcards (*)
+  /// are allowed. For example, "template*2015" will return objects with names
+  /// like "template June 2015", "template April 2015", or simply "template
+  /// 2015". Most of the searches also add wildcards implicitly at the start and
+  /// the end of the search string. For example, a search string of "template"
+  /// will match objects with name "my template", "template 2015", or simply
+  /// "template".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [TargetingTemplatesListResponse].
+  ///
+  /// 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<TargetingTemplatesListResponse> list(core.String profileId,
+      {core.String advertiserId,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (advertiserId != null) {
+      _queryParams["advertiserId"] = [advertiserId];
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/targetingTemplates';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new TargetingTemplatesListResponse.fromJson(data));
+  }
+
+  /// Updates an existing targeting template. This method supports patch
+  /// semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Targeting template ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [TargetingTemplate].
+  ///
+  /// 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<TargetingTemplate> patch(
+      TargetingTemplate request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/targetingTemplates';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new TargetingTemplate.fromJson(data));
+  }
+
+  /// Updates an existing targeting template.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [TargetingTemplate].
+  ///
+  /// 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<TargetingTemplate> update(
+      TargetingTemplate request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/targetingTemplates';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new TargetingTemplate.fromJson(data));
+  }
+}
+
+class UserProfilesResourceApi {
+  final commons.ApiRequester _requester;
+
+  UserProfilesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one user profile by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - The user profile ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [UserProfile].
+  ///
+  /// 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<UserProfile> get(core.String profileId, {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' + commons.Escaper.ecapeVariable('$profileId');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new UserProfile.fromJson(data));
+  }
+
+  /// Retrieves list of user profiles for a user.
+  ///
+  /// Request parameters:
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [UserProfileList].
+  ///
+  /// 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<UserProfileList> 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 = 'userprofiles';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new UserProfileList.fromJson(data));
+  }
+}
+
+class UserRolePermissionGroupsResourceApi {
+  final commons.ApiRequester _requester;
+
+  UserRolePermissionGroupsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one user role permission group by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - User role permission group ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [UserRolePermissionGroup].
+  ///
+  /// 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<UserRolePermissionGroup> get(
+      core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/userRolePermissionGroups/' +
+        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 UserRolePermissionGroup.fromJson(data));
+  }
+
+  /// Gets a list of all supported user role permission groups.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [UserRolePermissionGroupsListResponse].
+  ///
+  /// 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<UserRolePermissionGroupsListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/userRolePermissionGroups';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then(
+        (data) => new UserRolePermissionGroupsListResponse.fromJson(data));
+  }
+}
+
+class UserRolePermissionsResourceApi {
+  final commons.ApiRequester _requester;
+
+  UserRolePermissionsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Gets one user role permission by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - User role permission ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [UserRolePermission].
+  ///
+  /// 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<UserRolePermission> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/userRolePermissions/' +
+        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 UserRolePermission.fromJson(data));
+  }
+
+  /// Gets a list of user role permissions, possibly filtered.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [ids] - Select only user role permissions with these IDs.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [UserRolePermissionsListResponse].
+  ///
+  /// 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<UserRolePermissionsListResponse> list(core.String profileId,
+      {core.List<core.String> ids, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/userRolePermissions';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new UserRolePermissionsListResponse.fromJson(data));
+  }
+}
+
+class UserRolesResourceApi {
+  final commons.ApiRequester _requester;
+
+  UserRolesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Deletes an existing user role.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - User role ID.
+  ///
+  /// [$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 profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _downloadOptions = null;
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/userRoles/' +
+        commons.Escaper.ecapeVariable('$id');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /// Gets one user role by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - User role ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [UserRole].
+  ///
+  /// 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<UserRole> get(core.String profileId, 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/userRoles/' +
+        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 UserRole.fromJson(data));
+  }
+
+  /// Inserts a new user role.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [UserRole].
+  ///
+  /// 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<UserRole> insert(UserRole request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/userRoles';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new UserRole.fromJson(data));
+  }
+
+  /// Retrieves a list of user roles, possibly filtered. This method supports
+  /// paging.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [accountUserRoleOnly] - Select only account level user roles not
+  /// associated with any specific subaccount.
+  ///
+  /// [ids] - Select only user roles with the specified IDs.
+  ///
+  /// [maxResults] - Maximum number of results to return.
+  /// Value must be between "0" and "1000".
+  ///
+  /// [pageToken] - Value of the nextPageToken from the previous result page.
+  ///
+  /// [searchString] - Allows searching for objects by name or ID. Wildcards (*)
+  /// are allowed. For example, "userrole*2015" will return objects with names
+  /// like "userrole June 2015", "userrole April 2015", or simply "userrole
+  /// 2015". Most of the searches also add wildcards implicitly at the start and
+  /// the end of the search string. For example, a search string of "userrole"
+  /// will match objects with name "my userrole", "userrole 2015", or simply
+  /// "userrole".
+  ///
+  /// [sortField] - Field by which to sort the list.
+  /// Possible string values are:
+  /// - "ID"
+  /// - "NAME"
+  ///
+  /// [sortOrder] - Order of sorted results.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  ///
+  /// [subaccountId] - Select only user roles that belong to this subaccount.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [UserRolesListResponse].
+  ///
+  /// 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<UserRolesListResponse> list(core.String profileId,
+      {core.bool accountUserRoleOnly,
+      core.List<core.String> ids,
+      core.int maxResults,
+      core.String pageToken,
+      core.String searchString,
+      core.String sortField,
+      core.String sortOrder,
+      core.String subaccountId,
+      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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (accountUserRoleOnly != null) {
+      _queryParams["accountUserRoleOnly"] = ["${accountUserRoleOnly}"];
+    }
+    if (ids != null) {
+      _queryParams["ids"] = ids;
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (searchString != null) {
+      _queryParams["searchString"] = [searchString];
+    }
+    if (sortField != null) {
+      _queryParams["sortField"] = [sortField];
+    }
+    if (sortOrder != null) {
+      _queryParams["sortOrder"] = [sortOrder];
+    }
+    if (subaccountId != null) {
+      _queryParams["subaccountId"] = [subaccountId];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/userRoles';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new UserRolesListResponse.fromJson(data));
+  }
+
+  /// Updates an existing user role. This method supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - User role ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [UserRole].
+  ///
+  /// 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<UserRole> patch(
+      UserRole request, core.String profileId, 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 (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    _queryParams["id"] = [id];
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/userRoles';
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new UserRole.fromJson(data));
+  }
+
+  /// Updates an existing user role.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [UserRole].
+  ///
+  /// 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<UserRole> update(UserRole request, core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/userRoles';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new UserRole.fromJson(data));
+  }
+}
+
+class VideoFormatsResourceApi {
+  final commons.ApiRequester _requester;
+
+  VideoFormatsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Gets one video format by ID.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [id] - Video format ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [VideoFormat].
+  ///
+  /// 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<VideoFormat> get(core.String profileId, core.int 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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/videoFormats/' +
+        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 VideoFormat.fromJson(data));
+  }
+
+  /// Lists available video formats.
+  ///
+  /// Request parameters:
+  ///
+  /// [profileId] - User profile ID associated with this request.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [VideoFormatsListResponse].
+  ///
+  /// 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<VideoFormatsListResponse> list(core.String profileId,
+      {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 (profileId == null) {
+      throw new core.ArgumentError("Parameter profileId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'userprofiles/' +
+        commons.Escaper.ecapeVariable('$profileId') +
+        '/videoFormats';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new VideoFormatsListResponse.fromJson(data));
+  }
+}
+
+/// Contains properties of a DCM account.
+class Account {
+  /// Account permissions assigned to this account.
+  core.List<core.String> accountPermissionIds;
+
+  /// Profile for this account. This is a read-only field that can be left
+  /// blank.
+  /// Possible string values are:
+  /// - "ACCOUNT_PROFILE_BASIC"
+  /// - "ACCOUNT_PROFILE_STANDARD"
+  core.String accountProfile;
+
+  /// Whether this account is active.
+  core.bool active;
+
+  /// Maximum number of active ads allowed for this account.
+  /// Possible string values are:
+  /// - "ACTIVE_ADS_TIER_100K"
+  /// - "ACTIVE_ADS_TIER_1M"
+  /// - "ACTIVE_ADS_TIER_200K"
+  /// - "ACTIVE_ADS_TIER_300K"
+  /// - "ACTIVE_ADS_TIER_40K"
+  /// - "ACTIVE_ADS_TIER_500K"
+  /// - "ACTIVE_ADS_TIER_750K"
+  /// - "ACTIVE_ADS_TIER_75K"
+  core.String activeAdsLimitTier;
+
+  /// Whether to serve creatives with Active View tags. If disabled, viewability
+  /// data will not be available for any impressions.
+  core.bool activeViewOptOut;
+
+  /// User role permissions available to the user roles of this account.
+  core.List<core.String> availablePermissionIds;
+
+  /// ID of the country associated with this account.
+  core.String countryId;
+
+  /// ID of currency associated with this account. This is a required field.
+  /// Acceptable values are:
+  /// - "1" for USD
+  /// - "2" for GBP
+  /// - "3" for ESP
+  /// - "4" for SEK
+  /// - "5" for CAD
+  /// - "6" for JPY
+  /// - "7" for DEM
+  /// - "8" for AUD
+  /// - "9" for FRF
+  /// - "10" for ITL
+  /// - "11" for DKK
+  /// - "12" for NOK
+  /// - "13" for FIM
+  /// - "14" for ZAR
+  /// - "15" for IEP
+  /// - "16" for NLG
+  /// - "17" for EUR
+  /// - "18" for KRW
+  /// - "19" for TWD
+  /// - "20" for SGD
+  /// - "21" for CNY
+  /// - "22" for HKD
+  /// - "23" for NZD
+  /// - "24" for MYR
+  /// - "25" for BRL
+  /// - "26" for PTE
+  /// - "27" for MXP
+  /// - "28" for CLP
+  /// - "29" for TRY
+  /// - "30" for ARS
+  /// - "31" for PEN
+  /// - "32" for ILS
+  /// - "33" for CHF
+  /// - "34" for VEF
+  /// - "35" for COP
+  /// - "36" for GTQ
+  /// - "37" for PLN
+  /// - "39" for INR
+  /// - "40" for THB
+  /// - "41" for IDR
+  /// - "42" for CZK
+  /// - "43" for RON
+  /// - "44" for HUF
+  /// - "45" for RUB
+  /// - "46" for AED
+  /// - "47" for BGN
+  /// - "48" for HRK
+  /// - "49" for MXN
+  /// - "50" for NGN
+  core.String currencyId;
+
+  /// Default placement dimensions for this account.
+  core.String defaultCreativeSizeId;
+
+  /// Description of this account.
+  core.String description;
+
+  /// ID of this account. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#account".
+  core.String kind;
+
+  /// Locale of this account.
+  /// Acceptable values are:
+  /// - "cs" (Czech)
+  /// - "de" (German)
+  /// - "en" (English)
+  /// - "en-GB" (English United Kingdom)
+  /// - "es" (Spanish)
+  /// - "fr" (French)
+  /// - "it" (Italian)
+  /// - "ja" (Japanese)
+  /// - "ko" (Korean)
+  /// - "pl" (Polish)
+  /// - "pt-BR" (Portuguese Brazil)
+  /// - "ru" (Russian)
+  /// - "sv" (Swedish)
+  /// - "tr" (Turkish)
+  /// - "zh-CN" (Chinese Simplified)
+  /// - "zh-TW" (Chinese Traditional)
+  core.String locale;
+
+  /// Maximum image size allowed for this account, in kilobytes. Value must be
+  /// greater than or equal to 1.
+  core.String maximumImageSize;
+
+  /// Name of this account. This is a required field, and must be less than 128
+  /// characters long and be globally unique.
+  core.String name;
+
+  /// Whether campaigns created in this account will be enabled for Nielsen OCR
+  /// reach ratings by default.
+  core.bool nielsenOcrEnabled;
+
+  /// Reporting configuration of this account.
+  ReportsConfiguration reportsConfiguration;
+
+  /// Share Path to Conversion reports with Twitter.
+  core.bool shareReportsWithTwitter;
+
+  /// File size limit in kilobytes of Rich Media teaser creatives. Acceptable
+  /// values are 1 to 10240, inclusive.
+  core.String teaserSizeLimit;
+
+  Account();
+
+  Account.fromJson(core.Map _json) {
+    if (_json.containsKey("accountPermissionIds")) {
+      accountPermissionIds = _json["accountPermissionIds"];
+    }
+    if (_json.containsKey("accountProfile")) {
+      accountProfile = _json["accountProfile"];
+    }
+    if (_json.containsKey("active")) {
+      active = _json["active"];
+    }
+    if (_json.containsKey("activeAdsLimitTier")) {
+      activeAdsLimitTier = _json["activeAdsLimitTier"];
+    }
+    if (_json.containsKey("activeViewOptOut")) {
+      activeViewOptOut = _json["activeViewOptOut"];
+    }
+    if (_json.containsKey("availablePermissionIds")) {
+      availablePermissionIds = _json["availablePermissionIds"];
+    }
+    if (_json.containsKey("countryId")) {
+      countryId = _json["countryId"];
+    }
+    if (_json.containsKey("currencyId")) {
+      currencyId = _json["currencyId"];
+    }
+    if (_json.containsKey("defaultCreativeSizeId")) {
+      defaultCreativeSizeId = _json["defaultCreativeSizeId"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("locale")) {
+      locale = _json["locale"];
+    }
+    if (_json.containsKey("maximumImageSize")) {
+      maximumImageSize = _json["maximumImageSize"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("nielsenOcrEnabled")) {
+      nielsenOcrEnabled = _json["nielsenOcrEnabled"];
+    }
+    if (_json.containsKey("reportsConfiguration")) {
+      reportsConfiguration =
+          new ReportsConfiguration.fromJson(_json["reportsConfiguration"]);
+    }
+    if (_json.containsKey("shareReportsWithTwitter")) {
+      shareReportsWithTwitter = _json["shareReportsWithTwitter"];
+    }
+    if (_json.containsKey("teaserSizeLimit")) {
+      teaserSizeLimit = _json["teaserSizeLimit"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountPermissionIds != null) {
+      _json["accountPermissionIds"] = accountPermissionIds;
+    }
+    if (accountProfile != null) {
+      _json["accountProfile"] = accountProfile;
+    }
+    if (active != null) {
+      _json["active"] = active;
+    }
+    if (activeAdsLimitTier != null) {
+      _json["activeAdsLimitTier"] = activeAdsLimitTier;
+    }
+    if (activeViewOptOut != null) {
+      _json["activeViewOptOut"] = activeViewOptOut;
+    }
+    if (availablePermissionIds != null) {
+      _json["availablePermissionIds"] = availablePermissionIds;
+    }
+    if (countryId != null) {
+      _json["countryId"] = countryId;
+    }
+    if (currencyId != null) {
+      _json["currencyId"] = currencyId;
+    }
+    if (defaultCreativeSizeId != null) {
+      _json["defaultCreativeSizeId"] = defaultCreativeSizeId;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (locale != null) {
+      _json["locale"] = locale;
+    }
+    if (maximumImageSize != null) {
+      _json["maximumImageSize"] = maximumImageSize;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (nielsenOcrEnabled != null) {
+      _json["nielsenOcrEnabled"] = nielsenOcrEnabled;
+    }
+    if (reportsConfiguration != null) {
+      _json["reportsConfiguration"] = (reportsConfiguration).toJson();
+    }
+    if (shareReportsWithTwitter != null) {
+      _json["shareReportsWithTwitter"] = shareReportsWithTwitter;
+    }
+    if (teaserSizeLimit != null) {
+      _json["teaserSizeLimit"] = teaserSizeLimit;
+    }
+    return _json;
+  }
+}
+
+/// Gets a summary of active ads in an account.
+class AccountActiveAdSummary {
+  /// ID of the account.
+  core.String accountId;
+
+  /// Ads that have been activated for the account
+  core.String activeAds;
+
+  /// Maximum number of active ads allowed for the account.
+  /// Possible string values are:
+  /// - "ACTIVE_ADS_TIER_100K"
+  /// - "ACTIVE_ADS_TIER_1M"
+  /// - "ACTIVE_ADS_TIER_200K"
+  /// - "ACTIVE_ADS_TIER_300K"
+  /// - "ACTIVE_ADS_TIER_40K"
+  /// - "ACTIVE_ADS_TIER_500K"
+  /// - "ACTIVE_ADS_TIER_750K"
+  /// - "ACTIVE_ADS_TIER_75K"
+  core.String activeAdsLimitTier;
+
+  /// Ads that can be activated for the account.
+  core.String availableAds;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#accountActiveAdSummary".
+  core.String kind;
+
+  AccountActiveAdSummary();
+
+  AccountActiveAdSummary.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("activeAds")) {
+      activeAds = _json["activeAds"];
+    }
+    if (_json.containsKey("activeAdsLimitTier")) {
+      activeAdsLimitTier = _json["activeAdsLimitTier"];
+    }
+    if (_json.containsKey("availableAds")) {
+      availableAds = _json["availableAds"];
+    }
+    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 (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (activeAds != null) {
+      _json["activeAds"] = activeAds;
+    }
+    if (activeAdsLimitTier != null) {
+      _json["activeAdsLimitTier"] = activeAdsLimitTier;
+    }
+    if (availableAds != null) {
+      _json["availableAds"] = availableAds;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// AccountPermissions contains information about a particular account
+/// permission. Some features of DCM require an account permission to be present
+/// in the account.
+class AccountPermission {
+  /// Account profiles associated with this account permission.
+  ///
+  /// Possible values are:
+  /// - "ACCOUNT_PROFILE_BASIC"
+  /// - "ACCOUNT_PROFILE_STANDARD"
+  core.List<core.String> accountProfiles;
+
+  /// ID of this account permission.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#accountPermission".
+  core.String kind;
+
+  /// Administrative level required to enable this account permission.
+  /// Possible string values are:
+  /// - "ADMINISTRATOR"
+  /// - "USER"
+  core.String level;
+
+  /// Name of this account permission.
+  core.String name;
+
+  /// Permission group of this account permission.
+  core.String permissionGroupId;
+
+  AccountPermission();
+
+  AccountPermission.fromJson(core.Map _json) {
+    if (_json.containsKey("accountProfiles")) {
+      accountProfiles = _json["accountProfiles"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("level")) {
+      level = _json["level"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("permissionGroupId")) {
+      permissionGroupId = _json["permissionGroupId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountProfiles != null) {
+      _json["accountProfiles"] = accountProfiles;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (level != null) {
+      _json["level"] = level;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (permissionGroupId != null) {
+      _json["permissionGroupId"] = permissionGroupId;
+    }
+    return _json;
+  }
+}
+
+/// AccountPermissionGroups contains a mapping of permission group IDs to names.
+/// A permission group is a grouping of account permissions.
+class AccountPermissionGroup {
+  /// ID of this account permission group.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#accountPermissionGroup".
+  core.String kind;
+
+  /// Name of this account permission group.
+  core.String name;
+
+  AccountPermissionGroup();
+
+  AccountPermissionGroup.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    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 (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Account Permission Group List Response
+class AccountPermissionGroupsListResponse {
+  /// Account permission group collection.
+  core.List<AccountPermissionGroup> accountPermissionGroups;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#accountPermissionGroupsListResponse".
+  core.String kind;
+
+  AccountPermissionGroupsListResponse();
+
+  AccountPermissionGroupsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("accountPermissionGroups")) {
+      accountPermissionGroups = _json["accountPermissionGroups"]
+          .map((value) => new AccountPermissionGroup.fromJson(value))
+          .toList();
+    }
+    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 (accountPermissionGroups != null) {
+      _json["accountPermissionGroups"] =
+          accountPermissionGroups.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Account Permission List Response
+class AccountPermissionsListResponse {
+  /// Account permission collection.
+  core.List<AccountPermission> accountPermissions;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#accountPermissionsListResponse".
+  core.String kind;
+
+  AccountPermissionsListResponse();
+
+  AccountPermissionsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("accountPermissions")) {
+      accountPermissions = _json["accountPermissions"]
+          .map((value) => new AccountPermission.fromJson(value))
+          .toList();
+    }
+    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 (accountPermissions != null) {
+      _json["accountPermissions"] =
+          accountPermissions.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// AccountUserProfiles contains properties of a DCM user profile. This resource
+/// is specifically for managing user profiles, whereas UserProfiles is for
+/// accessing the API.
+class AccountUserProfile {
+  /// Account ID of the user profile. This is a read-only field that can be left
+  /// blank.
+  core.String accountId;
+
+  /// Whether this user profile is active. This defaults to false, and must be
+  /// set true on insert for the user profile to be usable.
+  core.bool active;
+
+  /// Filter that describes which advertisers are visible to the user profile.
+  ObjectFilter advertiserFilter;
+
+  /// Filter that describes which campaigns are visible to the user profile.
+  ObjectFilter campaignFilter;
+
+  /// Comments for this user profile.
+  core.String comments;
+
+  /// Email of the user profile. The email addresss must be linked to a Google
+  /// Account. This field is required on insertion and is read-only after
+  /// insertion.
+  core.String email;
+
+  /// ID of the user profile. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#accountUserProfile".
+  core.String kind;
+
+  /// Locale of the user profile. This is a required field.
+  /// Acceptable values are:
+  /// - "cs" (Czech)
+  /// - "de" (German)
+  /// - "en" (English)
+  /// - "en-GB" (English United Kingdom)
+  /// - "es" (Spanish)
+  /// - "fr" (French)
+  /// - "it" (Italian)
+  /// - "ja" (Japanese)
+  /// - "ko" (Korean)
+  /// - "pl" (Polish)
+  /// - "pt-BR" (Portuguese Brazil)
+  /// - "ru" (Russian)
+  /// - "sv" (Swedish)
+  /// - "tr" (Turkish)
+  /// - "zh-CN" (Chinese Simplified)
+  /// - "zh-TW" (Chinese Traditional)
+  core.String locale;
+
+  /// Name of the user profile. This is a required field. Must be less than 64
+  /// characters long, must be globally unique, and cannot contain whitespace or
+  /// any of the following characters: "&;"#%,".
+  core.String name;
+
+  /// Filter that describes which sites are visible to the user profile.
+  ObjectFilter siteFilter;
+
+  /// Subaccount ID of the user profile. This is a read-only field that can be
+  /// left blank.
+  core.String subaccountId;
+
+  /// Trafficker type of this user profile.
+  /// Possible string values are:
+  /// - "EXTERNAL_TRAFFICKER"
+  /// - "INTERNAL_NON_TRAFFICKER"
+  /// - "INTERNAL_TRAFFICKER"
+  core.String traffickerType;
+
+  /// User type of the user profile. This is a read-only field that can be left
+  /// blank.
+  /// Possible string values are:
+  /// - "INTERNAL_ADMINISTRATOR"
+  /// - "NORMAL_USER"
+  /// - "READ_ONLY_SUPER_USER"
+  /// - "SUPER_USER"
+  core.String userAccessType;
+
+  /// Filter that describes which user roles are visible to the user profile.
+  ObjectFilter userRoleFilter;
+
+  /// User role ID of the user profile. This is a required field.
+  core.String userRoleId;
+
+  AccountUserProfile();
+
+  AccountUserProfile.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("active")) {
+      active = _json["active"];
+    }
+    if (_json.containsKey("advertiserFilter")) {
+      advertiserFilter = new ObjectFilter.fromJson(_json["advertiserFilter"]);
+    }
+    if (_json.containsKey("campaignFilter")) {
+      campaignFilter = new ObjectFilter.fromJson(_json["campaignFilter"]);
+    }
+    if (_json.containsKey("comments")) {
+      comments = _json["comments"];
+    }
+    if (_json.containsKey("email")) {
+      email = _json["email"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("locale")) {
+      locale = _json["locale"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("siteFilter")) {
+      siteFilter = new ObjectFilter.fromJson(_json["siteFilter"]);
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("traffickerType")) {
+      traffickerType = _json["traffickerType"];
+    }
+    if (_json.containsKey("userAccessType")) {
+      userAccessType = _json["userAccessType"];
+    }
+    if (_json.containsKey("userRoleFilter")) {
+      userRoleFilter = new ObjectFilter.fromJson(_json["userRoleFilter"]);
+    }
+    if (_json.containsKey("userRoleId")) {
+      userRoleId = _json["userRoleId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (active != null) {
+      _json["active"] = active;
+    }
+    if (advertiserFilter != null) {
+      _json["advertiserFilter"] = (advertiserFilter).toJson();
+    }
+    if (campaignFilter != null) {
+      _json["campaignFilter"] = (campaignFilter).toJson();
+    }
+    if (comments != null) {
+      _json["comments"] = comments;
+    }
+    if (email != null) {
+      _json["email"] = email;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (locale != null) {
+      _json["locale"] = locale;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (siteFilter != null) {
+      _json["siteFilter"] = (siteFilter).toJson();
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (traffickerType != null) {
+      _json["traffickerType"] = traffickerType;
+    }
+    if (userAccessType != null) {
+      _json["userAccessType"] = userAccessType;
+    }
+    if (userRoleFilter != null) {
+      _json["userRoleFilter"] = (userRoleFilter).toJson();
+    }
+    if (userRoleId != null) {
+      _json["userRoleId"] = userRoleId;
+    }
+    return _json;
+  }
+}
+
+/// Account User Profile List Response
+class AccountUserProfilesListResponse {
+  /// Account user profile collection.
+  core.List<AccountUserProfile> accountUserProfiles;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#accountUserProfilesListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  AccountUserProfilesListResponse();
+
+  AccountUserProfilesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("accountUserProfiles")) {
+      accountUserProfiles = _json["accountUserProfiles"]
+          .map((value) => new AccountUserProfile.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 (accountUserProfiles != null) {
+      _json["accountUserProfiles"] =
+          accountUserProfiles.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Account List Response
+class AccountsListResponse {
+  /// Account collection.
+  core.List<Account> accounts;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#accountsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  AccountsListResponse();
+
+  AccountsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("accounts")) {
+      accounts = _json["accounts"]
+          .map((value) => new Account.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 (accounts != null) {
+      _json["accounts"] = accounts.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Represents an activity group.
+class Activities {
+  /// List of activity filters. The dimension values need to be all either of
+  /// type "dfa:activity" or "dfa:activityGroup".
+  core.List<DimensionValue> filters;
+
+  /// The kind of resource this is, in this case dfareporting#activities.
+  core.String kind;
+
+  /// List of names of floodlight activity metrics.
+  core.List<core.String> metricNames;
+
+  Activities();
+
+  Activities.fromJson(core.Map _json) {
+    if (_json.containsKey("filters")) {
+      filters = _json["filters"]
+          .map((value) => new DimensionValue.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("metricNames")) {
+      metricNames = _json["metricNames"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (filters != null) {
+      _json["filters"] = filters.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (metricNames != null) {
+      _json["metricNames"] = metricNames;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a DCM ad.
+class Ad {
+  /// Account ID of this ad. This is a read-only field that can be left blank.
+  core.String accountId;
+
+  /// Whether this ad is active. When true, archived must be false.
+  core.bool active;
+
+  /// Advertiser ID of this ad. This is a required field on insertion.
+  core.String advertiserId;
+
+  /// Dimension value for the ID of the advertiser. This is a read-only,
+  /// auto-generated field.
+  DimensionValue advertiserIdDimensionValue;
+
+  /// Whether this ad is archived. When true, active must be false.
+  core.bool archived;
+
+  /// Audience segment ID that is being targeted for this ad. Applicable when
+  /// type is AD_SERVING_STANDARD_AD.
+  core.String audienceSegmentId;
+
+  /// Campaign ID of this ad. This is a required field on insertion.
+  core.String campaignId;
+
+  /// Dimension value for the ID of the campaign. This is a read-only,
+  /// auto-generated field.
+  DimensionValue campaignIdDimensionValue;
+
+  /// Click-through URL for this ad. This is a required field on insertion.
+  /// Applicable when type is AD_SERVING_CLICK_TRACKER.
+  ClickThroughUrl clickThroughUrl;
+
+  /// Click-through URL suffix properties for this ad. Applies to the URL in the
+  /// ad or (if overriding ad properties) the URL in the creative.
+  ClickThroughUrlSuffixProperties clickThroughUrlSuffixProperties;
+
+  /// Comments for this ad.
+  core.String comments;
+
+  /// Compatibility of this ad. Applicable when type is AD_SERVING_DEFAULT_AD.
+  /// DISPLAY and DISPLAY_INTERSTITIAL refer to either rendering on desktop or
+  /// on mobile devices or in mobile apps for regular or interstitial ads,
+  /// respectively. APP and APP_INTERSTITIAL are only used for existing default
+  /// ads. New mobile placements must be assigned DISPLAY or
+  /// DISPLAY_INTERSTITIAL and default ads created for those placements will be
+  /// limited to those compatibility types. IN_STREAM_VIDEO refers to rendering
+  /// in-stream video ads developed with the VAST standard.
+  /// Possible string values are:
+  /// - "APP"
+  /// - "APP_INTERSTITIAL"
+  /// - "DISPLAY"
+  /// - "DISPLAY_INTERSTITIAL"
+  /// - "IN_STREAM_VIDEO"
+  core.String compatibility;
+
+  /// Information about the creation of this ad. This is a read-only field.
+  LastModifiedInfo createInfo;
+
+  /// Creative group assignments for this ad. Applicable when type is
+  /// AD_SERVING_CLICK_TRACKER. Only one assignment per creative group number is
+  /// allowed for a maximum of two assignments.
+  core.List<CreativeGroupAssignment> creativeGroupAssignments;
+
+  /// Creative rotation for this ad. Applicable when type is
+  /// AD_SERVING_DEFAULT_AD, AD_SERVING_STANDARD_AD, or AD_SERVING_TRACKING.
+  /// When type is AD_SERVING_DEFAULT_AD, this field should have exactly one
+  /// creativeAssignment.
+  CreativeRotation creativeRotation;
+
+  /// Time and day targeting information for this ad. This field must be left
+  /// blank if the ad is using a targeting template. Applicable when type is
+  /// AD_SERVING_STANDARD_AD.
+  DayPartTargeting dayPartTargeting;
+
+  /// Default click-through event tag properties for this ad.
+  DefaultClickThroughEventTagProperties defaultClickThroughEventTagProperties;
+
+  /// Delivery schedule information for this ad. Applicable when type is
+  /// AD_SERVING_STANDARD_AD or AD_SERVING_TRACKING. This field along with
+  /// subfields priority and impressionRatio are required on insertion when type
+  /// is AD_SERVING_STANDARD_AD.
+  DeliverySchedule deliverySchedule;
+
+  /// Whether this ad is a dynamic click tracker. Applicable when type is
+  /// AD_SERVING_CLICK_TRACKER. This is a required field on insert, and is
+  /// read-only after insert.
+  core.bool dynamicClickTracker;
+
+  /// Date and time that this ad should stop serving. Must be later than the
+  /// start time. This is a required field on insertion.
+  core.DateTime endTime;
+
+  /// Event tag overrides for this ad.
+  core.List<EventTagOverride> eventTagOverrides;
+
+  /// Geographical targeting information for this ad. This field must be left
+  /// blank if the ad is using a targeting template. Applicable when type is
+  /// AD_SERVING_STANDARD_AD.
+  GeoTargeting geoTargeting;
+
+  /// ID of this ad. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Dimension value for the ID of this ad. This is a read-only, auto-generated
+  /// field.
+  DimensionValue idDimensionValue;
+
+  /// Key-value targeting information for this ad. This field must be left blank
+  /// if the ad is using a targeting template. Applicable when type is
+  /// AD_SERVING_STANDARD_AD.
+  KeyValueTargetingExpression keyValueTargetingExpression;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#ad".
+  core.String kind;
+
+  /// Language targeting information for this ad. This field must be left blank
+  /// if the ad is using a targeting template. Applicable when type is
+  /// AD_SERVING_STANDARD_AD.
+  LanguageTargeting languageTargeting;
+
+  /// Information about the most recent modification of this ad. This is a
+  /// read-only field.
+  LastModifiedInfo lastModifiedInfo;
+
+  /// Name of this ad. This is a required field and must be less than 256
+  /// characters long.
+  core.String name;
+
+  /// Placement assignments for this ad.
+  core.List<PlacementAssignment> placementAssignments;
+
+  /// Remarketing list targeting expression for this ad. This field must be left
+  /// blank if the ad is using a targeting template. Applicable when type is
+  /// AD_SERVING_STANDARD_AD.
+  ListTargetingExpression remarketingListExpression;
+
+  /// Size of this ad. Applicable when type is AD_SERVING_DEFAULT_AD.
+  Size size;
+
+  /// Whether this ad is ssl compliant. This is a read-only field that is
+  /// auto-generated when the ad is inserted or updated.
+  core.bool sslCompliant;
+
+  /// Whether this ad requires ssl. This is a read-only field that is
+  /// auto-generated when the ad is inserted or updated.
+  core.bool sslRequired;
+
+  /// Date and time that this ad should start serving. If creating an ad, this
+  /// field must be a time in the future. This is a required field on insertion.
+  core.DateTime startTime;
+
+  /// Subaccount ID of this ad. This is a read-only field that can be left
+  /// blank.
+  core.String subaccountId;
+
+  /// Targeting template ID, used to apply preconfigured targeting information
+  /// to this ad. This cannot be set while any of dayPartTargeting,
+  /// geoTargeting, keyValueTargetingExpression, languageTargeting,
+  /// remarketingListExpression, or technologyTargeting are set. Applicable when
+  /// type is AD_SERVING_STANDARD_AD.
+  core.String targetingTemplateId;
+
+  /// Technology platform targeting information for this ad. This field must be
+  /// left blank if the ad is using a targeting template. Applicable when type
+  /// is AD_SERVING_STANDARD_AD.
+  TechnologyTargeting technologyTargeting;
+
+  /// Type of ad. This is a required field on insertion. Note that default ads
+  /// (AD_SERVING_DEFAULT_AD) cannot be created directly (see Creative
+  /// resource).
+  /// Possible string values are:
+  /// - "AD_SERVING_CLICK_TRACKER"
+  /// - "AD_SERVING_DEFAULT_AD"
+  /// - "AD_SERVING_STANDARD_AD"
+  /// - "AD_SERVING_TRACKING"
+  core.String type;
+
+  Ad();
+
+  Ad.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("active")) {
+      active = _json["active"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("advertiserIdDimensionValue")) {
+      advertiserIdDimensionValue =
+          new DimensionValue.fromJson(_json["advertiserIdDimensionValue"]);
+    }
+    if (_json.containsKey("archived")) {
+      archived = _json["archived"];
+    }
+    if (_json.containsKey("audienceSegmentId")) {
+      audienceSegmentId = _json["audienceSegmentId"];
+    }
+    if (_json.containsKey("campaignId")) {
+      campaignId = _json["campaignId"];
+    }
+    if (_json.containsKey("campaignIdDimensionValue")) {
+      campaignIdDimensionValue =
+          new DimensionValue.fromJson(_json["campaignIdDimensionValue"]);
+    }
+    if (_json.containsKey("clickThroughUrl")) {
+      clickThroughUrl = new ClickThroughUrl.fromJson(_json["clickThroughUrl"]);
+    }
+    if (_json.containsKey("clickThroughUrlSuffixProperties")) {
+      clickThroughUrlSuffixProperties =
+          new ClickThroughUrlSuffixProperties.fromJson(
+              _json["clickThroughUrlSuffixProperties"]);
+    }
+    if (_json.containsKey("comments")) {
+      comments = _json["comments"];
+    }
+    if (_json.containsKey("compatibility")) {
+      compatibility = _json["compatibility"];
+    }
+    if (_json.containsKey("createInfo")) {
+      createInfo = new LastModifiedInfo.fromJson(_json["createInfo"]);
+    }
+    if (_json.containsKey("creativeGroupAssignments")) {
+      creativeGroupAssignments = _json["creativeGroupAssignments"]
+          .map((value) => new CreativeGroupAssignment.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("creativeRotation")) {
+      creativeRotation =
+          new CreativeRotation.fromJson(_json["creativeRotation"]);
+    }
+    if (_json.containsKey("dayPartTargeting")) {
+      dayPartTargeting =
+          new DayPartTargeting.fromJson(_json["dayPartTargeting"]);
+    }
+    if (_json.containsKey("defaultClickThroughEventTagProperties")) {
+      defaultClickThroughEventTagProperties =
+          new DefaultClickThroughEventTagProperties.fromJson(
+              _json["defaultClickThroughEventTagProperties"]);
+    }
+    if (_json.containsKey("deliverySchedule")) {
+      deliverySchedule =
+          new DeliverySchedule.fromJson(_json["deliverySchedule"]);
+    }
+    if (_json.containsKey("dynamicClickTracker")) {
+      dynamicClickTracker = _json["dynamicClickTracker"];
+    }
+    if (_json.containsKey("endTime")) {
+      endTime = core.DateTime.parse(_json["endTime"]);
+    }
+    if (_json.containsKey("eventTagOverrides")) {
+      eventTagOverrides = _json["eventTagOverrides"]
+          .map((value) => new EventTagOverride.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("geoTargeting")) {
+      geoTargeting = new GeoTargeting.fromJson(_json["geoTargeting"]);
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("idDimensionValue")) {
+      idDimensionValue = new DimensionValue.fromJson(_json["idDimensionValue"]);
+    }
+    if (_json.containsKey("keyValueTargetingExpression")) {
+      keyValueTargetingExpression = new KeyValueTargetingExpression.fromJson(
+          _json["keyValueTargetingExpression"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("languageTargeting")) {
+      languageTargeting =
+          new LanguageTargeting.fromJson(_json["languageTargeting"]);
+    }
+    if (_json.containsKey("lastModifiedInfo")) {
+      lastModifiedInfo =
+          new LastModifiedInfo.fromJson(_json["lastModifiedInfo"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("placementAssignments")) {
+      placementAssignments = _json["placementAssignments"]
+          .map((value) => new PlacementAssignment.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("remarketingListExpression")) {
+      remarketingListExpression = new ListTargetingExpression.fromJson(
+          _json["remarketingListExpression"]);
+    }
+    if (_json.containsKey("size")) {
+      size = new Size.fromJson(_json["size"]);
+    }
+    if (_json.containsKey("sslCompliant")) {
+      sslCompliant = _json["sslCompliant"];
+    }
+    if (_json.containsKey("sslRequired")) {
+      sslRequired = _json["sslRequired"];
+    }
+    if (_json.containsKey("startTime")) {
+      startTime = core.DateTime.parse(_json["startTime"]);
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("targetingTemplateId")) {
+      targetingTemplateId = _json["targetingTemplateId"];
+    }
+    if (_json.containsKey("technologyTargeting")) {
+      technologyTargeting =
+          new TechnologyTargeting.fromJson(_json["technologyTargeting"]);
+    }
+    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 (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (active != null) {
+      _json["active"] = active;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (advertiserIdDimensionValue != null) {
+      _json["advertiserIdDimensionValue"] =
+          (advertiserIdDimensionValue).toJson();
+    }
+    if (archived != null) {
+      _json["archived"] = archived;
+    }
+    if (audienceSegmentId != null) {
+      _json["audienceSegmentId"] = audienceSegmentId;
+    }
+    if (campaignId != null) {
+      _json["campaignId"] = campaignId;
+    }
+    if (campaignIdDimensionValue != null) {
+      _json["campaignIdDimensionValue"] = (campaignIdDimensionValue).toJson();
+    }
+    if (clickThroughUrl != null) {
+      _json["clickThroughUrl"] = (clickThroughUrl).toJson();
+    }
+    if (clickThroughUrlSuffixProperties != null) {
+      _json["clickThroughUrlSuffixProperties"] =
+          (clickThroughUrlSuffixProperties).toJson();
+    }
+    if (comments != null) {
+      _json["comments"] = comments;
+    }
+    if (compatibility != null) {
+      _json["compatibility"] = compatibility;
+    }
+    if (createInfo != null) {
+      _json["createInfo"] = (createInfo).toJson();
+    }
+    if (creativeGroupAssignments != null) {
+      _json["creativeGroupAssignments"] =
+          creativeGroupAssignments.map((value) => (value).toJson()).toList();
+    }
+    if (creativeRotation != null) {
+      _json["creativeRotation"] = (creativeRotation).toJson();
+    }
+    if (dayPartTargeting != null) {
+      _json["dayPartTargeting"] = (dayPartTargeting).toJson();
+    }
+    if (defaultClickThroughEventTagProperties != null) {
+      _json["defaultClickThroughEventTagProperties"] =
+          (defaultClickThroughEventTagProperties).toJson();
+    }
+    if (deliverySchedule != null) {
+      _json["deliverySchedule"] = (deliverySchedule).toJson();
+    }
+    if (dynamicClickTracker != null) {
+      _json["dynamicClickTracker"] = dynamicClickTracker;
+    }
+    if (endTime != null) {
+      _json["endTime"] = (endTime).toIso8601String();
+    }
+    if (eventTagOverrides != null) {
+      _json["eventTagOverrides"] =
+          eventTagOverrides.map((value) => (value).toJson()).toList();
+    }
+    if (geoTargeting != null) {
+      _json["geoTargeting"] = (geoTargeting).toJson();
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (idDimensionValue != null) {
+      _json["idDimensionValue"] = (idDimensionValue).toJson();
+    }
+    if (keyValueTargetingExpression != null) {
+      _json["keyValueTargetingExpression"] =
+          (keyValueTargetingExpression).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (languageTargeting != null) {
+      _json["languageTargeting"] = (languageTargeting).toJson();
+    }
+    if (lastModifiedInfo != null) {
+      _json["lastModifiedInfo"] = (lastModifiedInfo).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (placementAssignments != null) {
+      _json["placementAssignments"] =
+          placementAssignments.map((value) => (value).toJson()).toList();
+    }
+    if (remarketingListExpression != null) {
+      _json["remarketingListExpression"] = (remarketingListExpression).toJson();
+    }
+    if (size != null) {
+      _json["size"] = (size).toJson();
+    }
+    if (sslCompliant != null) {
+      _json["sslCompliant"] = sslCompliant;
+    }
+    if (sslRequired != null) {
+      _json["sslRequired"] = sslRequired;
+    }
+    if (startTime != null) {
+      _json["startTime"] = (startTime).toIso8601String();
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (targetingTemplateId != null) {
+      _json["targetingTemplateId"] = targetingTemplateId;
+    }
+    if (technologyTargeting != null) {
+      _json["technologyTargeting"] = (technologyTargeting).toJson();
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+/// Campaign ad blocking settings.
+class AdBlockingConfiguration {
+  /// Click-through URL used by brand-neutral ads. This is a required field when
+  /// overrideClickThroughUrl is set to true.
+  core.String clickThroughUrl;
+
+  /// ID of a creative bundle to use for this campaign. If set, brand-neutral
+  /// ads will select creatives from this bundle. Otherwise, a default
+  /// transparent pixel will be used.
+  core.String creativeBundleId;
+
+  /// Whether this campaign has enabled ad blocking. When true, ad blocking is
+  /// enabled for placements in the campaign, but this may be overridden by site
+  /// and placement settings. When false, ad blocking is disabled for all
+  /// placements under the campaign, regardless of site and placement settings.
+  core.bool enabled;
+
+  /// Whether the brand-neutral ad's click-through URL comes from the campaign's
+  /// creative bundle or the override URL. Must be set to true if ad blocking is
+  /// enabled and no creative bundle is configured.
+  core.bool overrideClickThroughUrl;
+
+  AdBlockingConfiguration();
+
+  AdBlockingConfiguration.fromJson(core.Map _json) {
+    if (_json.containsKey("clickThroughUrl")) {
+      clickThroughUrl = _json["clickThroughUrl"];
+    }
+    if (_json.containsKey("creativeBundleId")) {
+      creativeBundleId = _json["creativeBundleId"];
+    }
+    if (_json.containsKey("enabled")) {
+      enabled = _json["enabled"];
+    }
+    if (_json.containsKey("overrideClickThroughUrl")) {
+      overrideClickThroughUrl = _json["overrideClickThroughUrl"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (clickThroughUrl != null) {
+      _json["clickThroughUrl"] = clickThroughUrl;
+    }
+    if (creativeBundleId != null) {
+      _json["creativeBundleId"] = creativeBundleId;
+    }
+    if (enabled != null) {
+      _json["enabled"] = enabled;
+    }
+    if (overrideClickThroughUrl != null) {
+      _json["overrideClickThroughUrl"] = overrideClickThroughUrl;
+    }
+    return _json;
+  }
+}
+
+/// Ad Slot
+class AdSlot {
+  /// Comment for this ad slot.
+  core.String comment;
+
+  /// Ad slot compatibility. DISPLAY and DISPLAY_INTERSTITIAL refer to rendering
+  /// either on desktop, mobile devices or in mobile apps for regular or
+  /// interstitial ads respectively. APP and APP_INTERSTITIAL are for rendering
+  /// in mobile apps. IN_STREAM_VIDEO refers to rendering in in-stream video ads
+  /// developed with the VAST standard.
+  /// Possible string values are:
+  /// - "APP"
+  /// - "APP_INTERSTITIAL"
+  /// - "DISPLAY"
+  /// - "DISPLAY_INTERSTITIAL"
+  /// - "IN_STREAM_VIDEO"
+  core.String compatibility;
+
+  /// Height of this ad slot.
+  core.String height;
+
+  /// ID of the placement from an external platform that is linked to this ad
+  /// slot.
+  core.String linkedPlacementId;
+
+  /// Name of this ad slot.
+  core.String name;
+
+  /// Payment source type of this ad slot.
+  /// Possible string values are:
+  /// - "PLANNING_PAYMENT_SOURCE_TYPE_AGENCY_PAID"
+  /// - "PLANNING_PAYMENT_SOURCE_TYPE_PUBLISHER_PAID"
+  core.String paymentSourceType;
+
+  /// Primary ad slot of a roadblock inventory item.
+  core.bool primary;
+
+  /// Width of this ad slot.
+  core.String width;
+
+  AdSlot();
+
+  AdSlot.fromJson(core.Map _json) {
+    if (_json.containsKey("comment")) {
+      comment = _json["comment"];
+    }
+    if (_json.containsKey("compatibility")) {
+      compatibility = _json["compatibility"];
+    }
+    if (_json.containsKey("height")) {
+      height = _json["height"];
+    }
+    if (_json.containsKey("linkedPlacementId")) {
+      linkedPlacementId = _json["linkedPlacementId"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("paymentSourceType")) {
+      paymentSourceType = _json["paymentSourceType"];
+    }
+    if (_json.containsKey("primary")) {
+      primary = _json["primary"];
+    }
+    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 (comment != null) {
+      _json["comment"] = comment;
+    }
+    if (compatibility != null) {
+      _json["compatibility"] = compatibility;
+    }
+    if (height != null) {
+      _json["height"] = height;
+    }
+    if (linkedPlacementId != null) {
+      _json["linkedPlacementId"] = linkedPlacementId;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (paymentSourceType != null) {
+      _json["paymentSourceType"] = paymentSourceType;
+    }
+    if (primary != null) {
+      _json["primary"] = primary;
+    }
+    if (width != null) {
+      _json["width"] = width;
+    }
+    return _json;
+  }
+}
+
+/// Ad List Response
+class AdsListResponse {
+  /// Ad collection.
+  core.List<Ad> ads;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#adsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  AdsListResponse();
+
+  AdsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("ads")) {
+      ads = _json["ads"].map((value) => new Ad.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 (ads != null) {
+      _json["ads"] = ads.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a DCM advertiser.
+class Advertiser {
+  /// Account ID of this advertiser.This is a read-only field that can be left
+  /// blank.
+  core.String accountId;
+
+  /// ID of the advertiser group this advertiser belongs to. You can group
+  /// advertisers for reporting purposes, allowing you to see aggregated
+  /// information for all advertisers in each group.
+  core.String advertiserGroupId;
+
+  /// Suffix added to click-through URL of ad creative associations under this
+  /// advertiser. Must be less than 129 characters long.
+  core.String clickThroughUrlSuffix;
+
+  /// ID of the click-through event tag to apply by default to the landing pages
+  /// of this advertiser's campaigns.
+  core.String defaultClickThroughEventTagId;
+
+  /// Default email address used in sender field for tag emails.
+  core.String defaultEmail;
+
+  /// Floodlight configuration ID of this advertiser. The floodlight
+  /// configuration ID will be created automatically, so on insert this field
+  /// should be left blank. This field can be set to another advertiser's
+  /// floodlight configuration ID in order to share that advertiser's floodlight
+  /// configuration with this advertiser, so long as:
+  /// - This advertiser's original floodlight configuration is not already
+  /// associated with floodlight activities or floodlight activity groups.
+  /// - This advertiser's original floodlight configuration is not already
+  /// shared with another advertiser.
+  core.String floodlightConfigurationId;
+
+  /// Dimension value for the ID of the floodlight configuration. This is a
+  /// read-only, auto-generated field.
+  DimensionValue floodlightConfigurationIdDimensionValue;
+
+  /// ID of this advertiser. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Dimension value for the ID of this advertiser. This is a read-only,
+  /// auto-generated field.
+  DimensionValue idDimensionValue;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#advertiser".
+  core.String kind;
+
+  /// Name of this advertiser. This is a required field and must be less than
+  /// 256 characters long and unique among advertisers of the same account.
+  core.String name;
+
+  /// Original floodlight configuration before any sharing occurred. Set the
+  /// floodlightConfigurationId of this advertiser to
+  /// originalFloodlightConfigurationId to unshare the advertiser's current
+  /// floodlight configuration. You cannot unshare an advertiser's floodlight
+  /// configuration if the shared configuration has activities associated with
+  /// any campaign or placement.
+  core.String originalFloodlightConfigurationId;
+
+  /// Status of this advertiser.
+  /// Possible string values are:
+  /// - "APPROVED"
+  /// - "ON_HOLD"
+  core.String status;
+
+  /// Subaccount ID of this advertiser.This is a read-only field that can be
+  /// left blank.
+  core.String subaccountId;
+
+  /// Suspension status of this advertiser.
+  core.bool suspended;
+
+  Advertiser();
+
+  Advertiser.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("advertiserGroupId")) {
+      advertiserGroupId = _json["advertiserGroupId"];
+    }
+    if (_json.containsKey("clickThroughUrlSuffix")) {
+      clickThroughUrlSuffix = _json["clickThroughUrlSuffix"];
+    }
+    if (_json.containsKey("defaultClickThroughEventTagId")) {
+      defaultClickThroughEventTagId = _json["defaultClickThroughEventTagId"];
+    }
+    if (_json.containsKey("defaultEmail")) {
+      defaultEmail = _json["defaultEmail"];
+    }
+    if (_json.containsKey("floodlightConfigurationId")) {
+      floodlightConfigurationId = _json["floodlightConfigurationId"];
+    }
+    if (_json.containsKey("floodlightConfigurationIdDimensionValue")) {
+      floodlightConfigurationIdDimensionValue = new DimensionValue.fromJson(
+          _json["floodlightConfigurationIdDimensionValue"]);
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("idDimensionValue")) {
+      idDimensionValue = new DimensionValue.fromJson(_json["idDimensionValue"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("originalFloodlightConfigurationId")) {
+      originalFloodlightConfigurationId =
+          _json["originalFloodlightConfigurationId"];
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("suspended")) {
+      suspended = _json["suspended"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (advertiserGroupId != null) {
+      _json["advertiserGroupId"] = advertiserGroupId;
+    }
+    if (clickThroughUrlSuffix != null) {
+      _json["clickThroughUrlSuffix"] = clickThroughUrlSuffix;
+    }
+    if (defaultClickThroughEventTagId != null) {
+      _json["defaultClickThroughEventTagId"] = defaultClickThroughEventTagId;
+    }
+    if (defaultEmail != null) {
+      _json["defaultEmail"] = defaultEmail;
+    }
+    if (floodlightConfigurationId != null) {
+      _json["floodlightConfigurationId"] = floodlightConfigurationId;
+    }
+    if (floodlightConfigurationIdDimensionValue != null) {
+      _json["floodlightConfigurationIdDimensionValue"] =
+          (floodlightConfigurationIdDimensionValue).toJson();
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (idDimensionValue != null) {
+      _json["idDimensionValue"] = (idDimensionValue).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (originalFloodlightConfigurationId != null) {
+      _json["originalFloodlightConfigurationId"] =
+          originalFloodlightConfigurationId;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (suspended != null) {
+      _json["suspended"] = suspended;
+    }
+    return _json;
+  }
+}
+
+/// Groups advertisers together so that reports can be generated for the entire
+/// group at once.
+class AdvertiserGroup {
+  /// Account ID of this advertiser group. This is a read-only field that can be
+  /// left blank.
+  core.String accountId;
+
+  /// ID of this advertiser group. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#advertiserGroup".
+  core.String kind;
+
+  /// Name of this advertiser group. This is a required field and must be less
+  /// than 256 characters long and unique among advertiser groups of the same
+  /// account.
+  core.String name;
+
+  AdvertiserGroup();
+
+  AdvertiserGroup.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    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 (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Advertiser Group List Response
+class AdvertiserGroupsListResponse {
+  /// Advertiser group collection.
+  core.List<AdvertiserGroup> advertiserGroups;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#advertiserGroupsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  AdvertiserGroupsListResponse();
+
+  AdvertiserGroupsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("advertiserGroups")) {
+      advertiserGroups = _json["advertiserGroups"]
+          .map((value) => new AdvertiserGroup.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 (advertiserGroups != null) {
+      _json["advertiserGroups"] =
+          advertiserGroups.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Landing Page List Response
+class AdvertiserLandingPagesListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#advertiserLandingPagesListResponse".
+  core.String kind;
+
+  /// Landing page collection
+  core.List<LandingPage> landingPages;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  AdvertiserLandingPagesListResponse();
+
+  AdvertiserLandingPagesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("landingPages")) {
+      landingPages = _json["landingPages"]
+          .map((value) => new LandingPage.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (landingPages != null) {
+      _json["landingPages"] =
+          landingPages.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Advertiser List Response
+class AdvertisersListResponse {
+  /// Advertiser collection.
+  core.List<Advertiser> advertisers;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#advertisersListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  AdvertisersListResponse();
+
+  AdvertisersListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("advertisers")) {
+      advertisers = _json["advertisers"]
+          .map((value) => new Advertiser.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 (advertisers != null) {
+      _json["advertisers"] =
+          advertisers.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Audience Segment.
+class AudienceSegment {
+  /// Weight allocated to this segment. The weight assigned will be understood
+  /// in proportion to the weights assigned to other segments in the same
+  /// segment group. Acceptable values are 1 to 1000, inclusive.
+  core.int allocation;
+
+  /// ID of this audience segment. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Name of this audience segment. This is a required field and must be less
+  /// than 65 characters long.
+  core.String name;
+
+  AudienceSegment();
+
+  AudienceSegment.fromJson(core.Map _json) {
+    if (_json.containsKey("allocation")) {
+      allocation = _json["allocation"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    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 (allocation != null) {
+      _json["allocation"] = allocation;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Audience Segment Group.
+class AudienceSegmentGroup {
+  /// Audience segments assigned to this group. The number of segments must be
+  /// between 2 and 100.
+  core.List<AudienceSegment> audienceSegments;
+
+  /// ID of this audience segment group. This is a read-only, auto-generated
+  /// field.
+  core.String id;
+
+  /// Name of this audience segment group. This is a required field and must be
+  /// less than 65 characters long.
+  core.String name;
+
+  AudienceSegmentGroup();
+
+  AudienceSegmentGroup.fromJson(core.Map _json) {
+    if (_json.containsKey("audienceSegments")) {
+      audienceSegments = _json["audienceSegments"]
+          .map((value) => new AudienceSegment.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    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 (audienceSegments != null) {
+      _json["audienceSegments"] =
+          audienceSegments.map((value) => (value).toJson()).toList();
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Contains information about a browser that can be targeted by ads.
+class Browser {
+  /// ID referring to this grouping of browser and version numbers. This is the
+  /// ID used for targeting.
+  core.String browserVersionId;
+
+  /// DART ID of this browser. This is the ID used when generating reports.
+  core.String dartId;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#browser".
+  core.String kind;
+
+  /// Major version number (leftmost number) of this browser. For example, for
+  /// Chrome 5.0.376.86 beta, this field should be set to 5. An asterisk (*) may
+  /// be used to target any version number, and a question mark (?) may be used
+  /// to target cases where the version number cannot be identified. For
+  /// example, Chrome *.* targets any version of Chrome: 1.2, 2.5, 3.5, and so
+  /// on. Chrome 3.* targets Chrome 3.1, 3.5, but not 4.0. Firefox ?.? targets
+  /// cases where the ad server knows the browser is Firefox but can't tell
+  /// which version it is.
+  core.String majorVersion;
+
+  /// Minor version number (number after first dot on left) of this browser. For
+  /// example, for Chrome 5.0.375.86 beta, this field should be set to 0. An
+  /// asterisk (*) may be used to target any version number, and a question mark
+  /// (?) may be used to target cases where the version number cannot be
+  /// identified. For example, Chrome *.* targets any version of Chrome: 1.2,
+  /// 2.5, 3.5, and so on. Chrome 3.* targets Chrome 3.1, 3.5, but not 4.0.
+  /// Firefox ?.? targets cases where the ad server knows the browser is Firefox
+  /// but can't tell which version it is.
+  core.String minorVersion;
+
+  /// Name of this browser.
+  core.String name;
+
+  Browser();
+
+  Browser.fromJson(core.Map _json) {
+    if (_json.containsKey("browserVersionId")) {
+      browserVersionId = _json["browserVersionId"];
+    }
+    if (_json.containsKey("dartId")) {
+      dartId = _json["dartId"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("majorVersion")) {
+      majorVersion = _json["majorVersion"];
+    }
+    if (_json.containsKey("minorVersion")) {
+      minorVersion = _json["minorVersion"];
+    }
+    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 (browserVersionId != null) {
+      _json["browserVersionId"] = browserVersionId;
+    }
+    if (dartId != null) {
+      _json["dartId"] = dartId;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (majorVersion != null) {
+      _json["majorVersion"] = majorVersion;
+    }
+    if (minorVersion != null) {
+      _json["minorVersion"] = minorVersion;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Browser List Response
+class BrowsersListResponse {
+  /// Browser collection.
+  core.List<Browser> browsers;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#browsersListResponse".
+  core.String kind;
+
+  BrowsersListResponse();
+
+  BrowsersListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("browsers")) {
+      browsers = _json["browsers"]
+          .map((value) => new Browser.fromJson(value))
+          .toList();
+    }
+    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 (browsers != null) {
+      _json["browsers"] = browsers.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a DCM campaign.
+class Campaign {
+  /// Account ID of this campaign. This is a read-only field that can be left
+  /// blank.
+  core.String accountId;
+
+  /// Ad blocking settings for this campaign.
+  AdBlockingConfiguration adBlockingConfiguration;
+
+  /// Additional creative optimization configurations for the campaign.
+  core.List<CreativeOptimizationConfiguration>
+      additionalCreativeOptimizationConfigurations;
+
+  /// Advertiser group ID of the associated advertiser.
+  core.String advertiserGroupId;
+
+  /// Advertiser ID of this campaign. This is a required field.
+  core.String advertiserId;
+
+  /// Dimension value for the advertiser ID of this campaign. This is a
+  /// read-only, auto-generated field.
+  DimensionValue advertiserIdDimensionValue;
+
+  /// Whether this campaign has been archived.
+  core.bool archived;
+
+  /// Audience segment groups assigned to this campaign. Cannot have more than
+  /// 300 segment groups.
+  core.List<AudienceSegmentGroup> audienceSegmentGroups;
+
+  /// Billing invoice code included in the DCM client billing invoices
+  /// associated with the campaign.
+  core.String billingInvoiceCode;
+
+  /// Click-through URL suffix override properties for this campaign.
+  ClickThroughUrlSuffixProperties clickThroughUrlSuffixProperties;
+
+  /// Arbitrary comments about this campaign. Must be less than 256 characters
+  /// long.
+  core.String comment;
+
+  /// Information about the creation of this campaign. This is a read-only
+  /// field.
+  LastModifiedInfo createInfo;
+
+  /// List of creative group IDs that are assigned to the campaign.
+  core.List<core.String> creativeGroupIds;
+
+  /// Creative optimization configuration for the campaign.
+  CreativeOptimizationConfiguration creativeOptimizationConfiguration;
+
+  /// Click-through event tag ID override properties for this campaign.
+  DefaultClickThroughEventTagProperties defaultClickThroughEventTagProperties;
+
+  /// The default landing page ID for this campaign.
+  core.String defaultLandingPageId;
+
+  /// Date on which the campaign will stop running. On insert, the end date must
+  /// be today or a future date. The end date must be later than or be the same
+  /// as the start date. If, for example, you set 6/25/2015 as both the start
+  /// and end dates, the effective campaign run date is just that day only,
+  /// 6/25/2015. The hours, minutes, and seconds of the end date should not be
+  /// set, as doing so will result in an error. This is a required field.
+  core.DateTime endDate;
+
+  /// Overrides that can be used to activate or deactivate advertiser event
+  /// tags.
+  core.List<EventTagOverride> eventTagOverrides;
+
+  /// External ID for this campaign.
+  core.String externalId;
+
+  /// ID of this campaign. This is a read-only auto-generated field.
+  core.String id;
+
+  /// Dimension value for the ID of this campaign. This is a read-only,
+  /// auto-generated field.
+  DimensionValue idDimensionValue;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#campaign".
+  core.String kind;
+
+  /// Information about the most recent modification of this campaign. This is a
+  /// read-only field.
+  LastModifiedInfo lastModifiedInfo;
+
+  /// Lookback window settings for the campaign.
+  LookbackConfiguration lookbackConfiguration;
+
+  /// Name of this campaign. This is a required field and must be less than 256
+  /// characters long and unique among campaigns of the same advertiser.
+  core.String name;
+
+  /// Whether Nielsen reports are enabled for this campaign.
+  core.bool nielsenOcrEnabled;
+
+  /// Date on which the campaign starts running. The start date can be any date.
+  /// The hours, minutes, and seconds of the start date should not be set, as
+  /// doing so will result in an error. This is a required field.
+  core.DateTime startDate;
+
+  /// Subaccount ID of this campaign. This is a read-only field that can be left
+  /// blank.
+  core.String subaccountId;
+
+  /// Campaign trafficker contact emails.
+  core.List<core.String> traffickerEmails;
+
+  Campaign();
+
+  Campaign.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("adBlockingConfiguration")) {
+      adBlockingConfiguration = new AdBlockingConfiguration.fromJson(
+          _json["adBlockingConfiguration"]);
+    }
+    if (_json.containsKey("additionalCreativeOptimizationConfigurations")) {
+      additionalCreativeOptimizationConfigurations = _json[
+              "additionalCreativeOptimizationConfigurations"]
+          .map((value) => new CreativeOptimizationConfiguration.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("advertiserGroupId")) {
+      advertiserGroupId = _json["advertiserGroupId"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("advertiserIdDimensionValue")) {
+      advertiserIdDimensionValue =
+          new DimensionValue.fromJson(_json["advertiserIdDimensionValue"]);
+    }
+    if (_json.containsKey("archived")) {
+      archived = _json["archived"];
+    }
+    if (_json.containsKey("audienceSegmentGroups")) {
+      audienceSegmentGroups = _json["audienceSegmentGroups"]
+          .map((value) => new AudienceSegmentGroup.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("billingInvoiceCode")) {
+      billingInvoiceCode = _json["billingInvoiceCode"];
+    }
+    if (_json.containsKey("clickThroughUrlSuffixProperties")) {
+      clickThroughUrlSuffixProperties =
+          new ClickThroughUrlSuffixProperties.fromJson(
+              _json["clickThroughUrlSuffixProperties"]);
+    }
+    if (_json.containsKey("comment")) {
+      comment = _json["comment"];
+    }
+    if (_json.containsKey("createInfo")) {
+      createInfo = new LastModifiedInfo.fromJson(_json["createInfo"]);
+    }
+    if (_json.containsKey("creativeGroupIds")) {
+      creativeGroupIds = _json["creativeGroupIds"];
+    }
+    if (_json.containsKey("creativeOptimizationConfiguration")) {
+      creativeOptimizationConfiguration =
+          new CreativeOptimizationConfiguration.fromJson(
+              _json["creativeOptimizationConfiguration"]);
+    }
+    if (_json.containsKey("defaultClickThroughEventTagProperties")) {
+      defaultClickThroughEventTagProperties =
+          new DefaultClickThroughEventTagProperties.fromJson(
+              _json["defaultClickThroughEventTagProperties"]);
+    }
+    if (_json.containsKey("defaultLandingPageId")) {
+      defaultLandingPageId = _json["defaultLandingPageId"];
+    }
+    if (_json.containsKey("endDate")) {
+      endDate = core.DateTime.parse(_json["endDate"]);
+    }
+    if (_json.containsKey("eventTagOverrides")) {
+      eventTagOverrides = _json["eventTagOverrides"]
+          .map((value) => new EventTagOverride.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("externalId")) {
+      externalId = _json["externalId"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("idDimensionValue")) {
+      idDimensionValue = new DimensionValue.fromJson(_json["idDimensionValue"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lastModifiedInfo")) {
+      lastModifiedInfo =
+          new LastModifiedInfo.fromJson(_json["lastModifiedInfo"]);
+    }
+    if (_json.containsKey("lookbackConfiguration")) {
+      lookbackConfiguration =
+          new LookbackConfiguration.fromJson(_json["lookbackConfiguration"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("nielsenOcrEnabled")) {
+      nielsenOcrEnabled = _json["nielsenOcrEnabled"];
+    }
+    if (_json.containsKey("startDate")) {
+      startDate = core.DateTime.parse(_json["startDate"]);
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("traffickerEmails")) {
+      traffickerEmails = _json["traffickerEmails"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (adBlockingConfiguration != null) {
+      _json["adBlockingConfiguration"] = (adBlockingConfiguration).toJson();
+    }
+    if (additionalCreativeOptimizationConfigurations != null) {
+      _json["additionalCreativeOptimizationConfigurations"] =
+          additionalCreativeOptimizationConfigurations
+              .map((value) => (value).toJson())
+              .toList();
+    }
+    if (advertiserGroupId != null) {
+      _json["advertiserGroupId"] = advertiserGroupId;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (advertiserIdDimensionValue != null) {
+      _json["advertiserIdDimensionValue"] =
+          (advertiserIdDimensionValue).toJson();
+    }
+    if (archived != null) {
+      _json["archived"] = archived;
+    }
+    if (audienceSegmentGroups != null) {
+      _json["audienceSegmentGroups"] =
+          audienceSegmentGroups.map((value) => (value).toJson()).toList();
+    }
+    if (billingInvoiceCode != null) {
+      _json["billingInvoiceCode"] = billingInvoiceCode;
+    }
+    if (clickThroughUrlSuffixProperties != null) {
+      _json["clickThroughUrlSuffixProperties"] =
+          (clickThroughUrlSuffixProperties).toJson();
+    }
+    if (comment != null) {
+      _json["comment"] = comment;
+    }
+    if (createInfo != null) {
+      _json["createInfo"] = (createInfo).toJson();
+    }
+    if (creativeGroupIds != null) {
+      _json["creativeGroupIds"] = creativeGroupIds;
+    }
+    if (creativeOptimizationConfiguration != null) {
+      _json["creativeOptimizationConfiguration"] =
+          (creativeOptimizationConfiguration).toJson();
+    }
+    if (defaultClickThroughEventTagProperties != null) {
+      _json["defaultClickThroughEventTagProperties"] =
+          (defaultClickThroughEventTagProperties).toJson();
+    }
+    if (defaultLandingPageId != null) {
+      _json["defaultLandingPageId"] = defaultLandingPageId;
+    }
+    if (endDate != null) {
+      _json["endDate"] =
+          "${(endDate).year.toString().padLeft(4, '0')}-${(endDate).month.toString().padLeft(2, '0')}-${(endDate).day.toString().padLeft(2, '0')}";
+    }
+    if (eventTagOverrides != null) {
+      _json["eventTagOverrides"] =
+          eventTagOverrides.map((value) => (value).toJson()).toList();
+    }
+    if (externalId != null) {
+      _json["externalId"] = externalId;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (idDimensionValue != null) {
+      _json["idDimensionValue"] = (idDimensionValue).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lastModifiedInfo != null) {
+      _json["lastModifiedInfo"] = (lastModifiedInfo).toJson();
+    }
+    if (lookbackConfiguration != null) {
+      _json["lookbackConfiguration"] = (lookbackConfiguration).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (nielsenOcrEnabled != null) {
+      _json["nielsenOcrEnabled"] = nielsenOcrEnabled;
+    }
+    if (startDate != null) {
+      _json["startDate"] =
+          "${(startDate).year.toString().padLeft(4, '0')}-${(startDate).month.toString().padLeft(2, '0')}-${(startDate).day.toString().padLeft(2, '0')}";
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (traffickerEmails != null) {
+      _json["traffickerEmails"] = traffickerEmails;
+    }
+    return _json;
+  }
+}
+
+/// Identifies a creative which has been associated with a given campaign.
+class CampaignCreativeAssociation {
+  /// ID of the creative associated with the campaign. This is a required field.
+  core.String creativeId;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#campaignCreativeAssociation".
+  core.String kind;
+
+  CampaignCreativeAssociation();
+
+  CampaignCreativeAssociation.fromJson(core.Map _json) {
+    if (_json.containsKey("creativeId")) {
+      creativeId = _json["creativeId"];
+    }
+    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 (creativeId != null) {
+      _json["creativeId"] = creativeId;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Campaign Creative Association List Response
+class CampaignCreativeAssociationsListResponse {
+  /// Campaign creative association collection
+  core.List<CampaignCreativeAssociation> campaignCreativeAssociations;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#campaignCreativeAssociationsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  CampaignCreativeAssociationsListResponse();
+
+  CampaignCreativeAssociationsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("campaignCreativeAssociations")) {
+      campaignCreativeAssociations = _json["campaignCreativeAssociations"]
+          .map((value) => new CampaignCreativeAssociation.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 (campaignCreativeAssociations != null) {
+      _json["campaignCreativeAssociations"] = campaignCreativeAssociations
+          .map((value) => (value).toJson())
+          .toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Campaign List Response
+class CampaignsListResponse {
+  /// Campaign collection.
+  core.List<Campaign> campaigns;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#campaignsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  CampaignsListResponse();
+
+  CampaignsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("campaigns")) {
+      campaigns = _json["campaigns"]
+          .map((value) => new Campaign.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 (campaigns != null) {
+      _json["campaigns"] = campaigns.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Describes a change that a user has made to a resource.
+class ChangeLog {
+  /// Account ID of the modified object.
+  core.String accountId;
+
+  /// Action which caused the change.
+  core.String action;
+
+  /// Time when the object was modified.
+  core.DateTime changeTime;
+
+  /// Field name of the object which changed.
+  core.String fieldName;
+
+  /// ID of this change log.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#changeLog".
+  core.String kind;
+
+  /// New value of the object field.
+  core.String newValue;
+
+  /// ID of the object of this change log. The object could be a campaign,
+  /// placement, ad, or other type.
+  core.String objectId;
+
+  /// Object type of the change log.
+  core.String objectType;
+
+  /// Old value of the object field.
+  core.String oldValue;
+
+  /// Subaccount ID of the modified object.
+  core.String subaccountId;
+
+  /// Transaction ID of this change log. When a single API call results in many
+  /// changes, each change will have a separate ID in the change log but will
+  /// share the same transactionId.
+  core.String transactionId;
+
+  /// ID of the user who modified the object.
+  core.String userProfileId;
+
+  /// User profile name of the user who modified the object.
+  core.String userProfileName;
+
+  ChangeLog();
+
+  ChangeLog.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("action")) {
+      action = _json["action"];
+    }
+    if (_json.containsKey("changeTime")) {
+      changeTime = core.DateTime.parse(_json["changeTime"]);
+    }
+    if (_json.containsKey("fieldName")) {
+      fieldName = _json["fieldName"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("newValue")) {
+      newValue = _json["newValue"];
+    }
+    if (_json.containsKey("objectId")) {
+      objectId = _json["objectId"];
+    }
+    if (_json.containsKey("objectType")) {
+      objectType = _json["objectType"];
+    }
+    if (_json.containsKey("oldValue")) {
+      oldValue = _json["oldValue"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("transactionId")) {
+      transactionId = _json["transactionId"];
+    }
+    if (_json.containsKey("userProfileId")) {
+      userProfileId = _json["userProfileId"];
+    }
+    if (_json.containsKey("userProfileName")) {
+      userProfileName = _json["userProfileName"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (action != null) {
+      _json["action"] = action;
+    }
+    if (changeTime != null) {
+      _json["changeTime"] = (changeTime).toIso8601String();
+    }
+    if (fieldName != null) {
+      _json["fieldName"] = fieldName;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (newValue != null) {
+      _json["newValue"] = newValue;
+    }
+    if (objectId != null) {
+      _json["objectId"] = objectId;
+    }
+    if (objectType != null) {
+      _json["objectType"] = objectType;
+    }
+    if (oldValue != null) {
+      _json["oldValue"] = oldValue;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (transactionId != null) {
+      _json["transactionId"] = transactionId;
+    }
+    if (userProfileId != null) {
+      _json["userProfileId"] = userProfileId;
+    }
+    if (userProfileName != null) {
+      _json["userProfileName"] = userProfileName;
+    }
+    return _json;
+  }
+}
+
+/// Change Log List Response
+class ChangeLogsListResponse {
+  /// Change log collection.
+  core.List<ChangeLog> changeLogs;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#changeLogsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  ChangeLogsListResponse();
+
+  ChangeLogsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("changeLogs")) {
+      changeLogs = _json["changeLogs"]
+          .map((value) => new ChangeLog.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 (changeLogs != null) {
+      _json["changeLogs"] =
+          changeLogs.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// City List Response
+class CitiesListResponse {
+  /// City collection.
+  core.List<City> cities;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#citiesListResponse".
+  core.String kind;
+
+  CitiesListResponse();
+
+  CitiesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("cities")) {
+      cities =
+          _json["cities"].map((value) => new City.fromJson(value)).toList();
+    }
+    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 (cities != null) {
+      _json["cities"] = cities.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Contains information about a city that can be targeted by ads.
+class City {
+  /// Country code of the country to which this city belongs.
+  core.String countryCode;
+
+  /// DART ID of the country to which this city belongs.
+  core.String countryDartId;
+
+  /// DART ID of this city. This is the ID used for targeting and generating
+  /// reports.
+  core.String dartId;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#city".
+  core.String kind;
+
+  /// Metro region code of the metro region (DMA) to which this city belongs.
+  core.String metroCode;
+
+  /// ID of the metro region (DMA) to which this city belongs.
+  core.String metroDmaId;
+
+  /// Name of this city.
+  core.String name;
+
+  /// Region code of the region to which this city belongs.
+  core.String regionCode;
+
+  /// DART ID of the region to which this city belongs.
+  core.String regionDartId;
+
+  City();
+
+  City.fromJson(core.Map _json) {
+    if (_json.containsKey("countryCode")) {
+      countryCode = _json["countryCode"];
+    }
+    if (_json.containsKey("countryDartId")) {
+      countryDartId = _json["countryDartId"];
+    }
+    if (_json.containsKey("dartId")) {
+      dartId = _json["dartId"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("metroCode")) {
+      metroCode = _json["metroCode"];
+    }
+    if (_json.containsKey("metroDmaId")) {
+      metroDmaId = _json["metroDmaId"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("regionCode")) {
+      regionCode = _json["regionCode"];
+    }
+    if (_json.containsKey("regionDartId")) {
+      regionDartId = _json["regionDartId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (countryCode != null) {
+      _json["countryCode"] = countryCode;
+    }
+    if (countryDartId != null) {
+      _json["countryDartId"] = countryDartId;
+    }
+    if (dartId != null) {
+      _json["dartId"] = dartId;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (metroCode != null) {
+      _json["metroCode"] = metroCode;
+    }
+    if (metroDmaId != null) {
+      _json["metroDmaId"] = metroDmaId;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (regionCode != null) {
+      _json["regionCode"] = regionCode;
+    }
+    if (regionDartId != null) {
+      _json["regionDartId"] = regionDartId;
+    }
+    return _json;
+  }
+}
+
+/// Creative Click Tag.
+class ClickTag {
+  /// Parameter value for the specified click tag. This field contains a
+  /// click-through url.
+  CreativeClickThroughUrl clickThroughUrl;
+
+  /// Advertiser event name associated with the click tag. This field is used by
+  /// DISPLAY_IMAGE_GALLERY and HTML5_BANNER creatives. Applicable to DISPLAY
+  /// when the primary asset type is not HTML_IMAGE.
+  core.String eventName;
+
+  /// Parameter name for the specified click tag. For DISPLAY_IMAGE_GALLERY
+  /// creative assets, this field must match the value of the creative asset's
+  /// creativeAssetId.name field.
+  core.String name;
+
+  ClickTag();
+
+  ClickTag.fromJson(core.Map _json) {
+    if (_json.containsKey("clickThroughUrl")) {
+      clickThroughUrl =
+          new CreativeClickThroughUrl.fromJson(_json["clickThroughUrl"]);
+    }
+    if (_json.containsKey("eventName")) {
+      eventName = _json["eventName"];
+    }
+    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 (clickThroughUrl != null) {
+      _json["clickThroughUrl"] = (clickThroughUrl).toJson();
+    }
+    if (eventName != null) {
+      _json["eventName"] = eventName;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Click-through URL
+class ClickThroughUrl {
+  /// Read-only convenience field representing the actual URL that will be used
+  /// for this click-through. The URL is computed as follows:
+  /// - If defaultLandingPage is enabled then the campaign's default landing
+  /// page URL is assigned to this field.
+  /// - If defaultLandingPage is not enabled and a landingPageId is specified
+  /// then that landing page's URL is assigned to this field.
+  /// - If neither of the above cases apply, then the customClickThroughUrl is
+  /// assigned to this field.
+  core.String computedClickThroughUrl;
+
+  /// Custom click-through URL. Applicable if the defaultLandingPage field is
+  /// set to false and the landingPageId field is left unset.
+  core.String customClickThroughUrl;
+
+  /// Whether the campaign default landing page is used.
+  core.bool defaultLandingPage;
+
+  /// ID of the landing page for the click-through URL. Applicable if the
+  /// defaultLandingPage field is set to false.
+  core.String landingPageId;
+
+  ClickThroughUrl();
+
+  ClickThroughUrl.fromJson(core.Map _json) {
+    if (_json.containsKey("computedClickThroughUrl")) {
+      computedClickThroughUrl = _json["computedClickThroughUrl"];
+    }
+    if (_json.containsKey("customClickThroughUrl")) {
+      customClickThroughUrl = _json["customClickThroughUrl"];
+    }
+    if (_json.containsKey("defaultLandingPage")) {
+      defaultLandingPage = _json["defaultLandingPage"];
+    }
+    if (_json.containsKey("landingPageId")) {
+      landingPageId = _json["landingPageId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (computedClickThroughUrl != null) {
+      _json["computedClickThroughUrl"] = computedClickThroughUrl;
+    }
+    if (customClickThroughUrl != null) {
+      _json["customClickThroughUrl"] = customClickThroughUrl;
+    }
+    if (defaultLandingPage != null) {
+      _json["defaultLandingPage"] = defaultLandingPage;
+    }
+    if (landingPageId != null) {
+      _json["landingPageId"] = landingPageId;
+    }
+    return _json;
+  }
+}
+
+/// Click Through URL Suffix settings.
+class ClickThroughUrlSuffixProperties {
+  /// Click-through URL suffix to apply to all ads in this entity's scope. Must
+  /// be less than 128 characters long.
+  core.String clickThroughUrlSuffix;
+
+  /// Whether this entity should override the inherited click-through URL suffix
+  /// with its own defined value.
+  core.bool overrideInheritedSuffix;
+
+  ClickThroughUrlSuffixProperties();
+
+  ClickThroughUrlSuffixProperties.fromJson(core.Map _json) {
+    if (_json.containsKey("clickThroughUrlSuffix")) {
+      clickThroughUrlSuffix = _json["clickThroughUrlSuffix"];
+    }
+    if (_json.containsKey("overrideInheritedSuffix")) {
+      overrideInheritedSuffix = _json["overrideInheritedSuffix"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (clickThroughUrlSuffix != null) {
+      _json["clickThroughUrlSuffix"] = clickThroughUrlSuffix;
+    }
+    if (overrideInheritedSuffix != null) {
+      _json["overrideInheritedSuffix"] = overrideInheritedSuffix;
+    }
+    return _json;
+  }
+}
+
+/// Companion Click-through override.
+class CompanionClickThroughOverride {
+  /// Click-through URL of this companion click-through override.
+  ClickThroughUrl clickThroughUrl;
+
+  /// ID of the creative for this companion click-through override.
+  core.String creativeId;
+
+  CompanionClickThroughOverride();
+
+  CompanionClickThroughOverride.fromJson(core.Map _json) {
+    if (_json.containsKey("clickThroughUrl")) {
+      clickThroughUrl = new ClickThroughUrl.fromJson(_json["clickThroughUrl"]);
+    }
+    if (_json.containsKey("creativeId")) {
+      creativeId = _json["creativeId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (clickThroughUrl != null) {
+      _json["clickThroughUrl"] = (clickThroughUrl).toJson();
+    }
+    if (creativeId != null) {
+      _json["creativeId"] = creativeId;
+    }
+    return _json;
+  }
+}
+
+/// Companion Settings
+class CompanionSetting {
+  /// Whether companions are disabled for this placement.
+  core.bool companionsDisabled;
+
+  /// Whitelist of companion sizes to be served to this placement. Set this list
+  /// to null or empty to serve all companion sizes.
+  core.List<Size> enabledSizes;
+
+  /// Whether to serve only static images as companions.
+  core.bool imageOnly;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#companionSetting".
+  core.String kind;
+
+  CompanionSetting();
+
+  CompanionSetting.fromJson(core.Map _json) {
+    if (_json.containsKey("companionsDisabled")) {
+      companionsDisabled = _json["companionsDisabled"];
+    }
+    if (_json.containsKey("enabledSizes")) {
+      enabledSizes = _json["enabledSizes"]
+          .map((value) => new Size.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("imageOnly")) {
+      imageOnly = _json["imageOnly"];
+    }
+    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 (companionsDisabled != null) {
+      _json["companionsDisabled"] = companionsDisabled;
+    }
+    if (enabledSizes != null) {
+      _json["enabledSizes"] =
+          enabledSizes.map((value) => (value).toJson()).toList();
+    }
+    if (imageOnly != null) {
+      _json["imageOnly"] = imageOnly;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Represents a response to the queryCompatibleFields method.
+class CompatibleFields {
+  /// Contains items that are compatible to be selected for a report of type
+  /// "CROSS_DIMENSION_REACH".
+  CrossDimensionReachReportCompatibleFields
+      crossDimensionReachReportCompatibleFields;
+
+  /// Contains items that are compatible to be selected for a report of type
+  /// "FLOODLIGHT".
+  FloodlightReportCompatibleFields floodlightReportCompatibleFields;
+
+  /// The kind of resource this is, in this case dfareporting#compatibleFields.
+  core.String kind;
+
+  /// Contains items that are compatible to be selected for a report of type
+  /// "PATH_TO_CONVERSION".
+  PathToConversionReportCompatibleFields pathToConversionReportCompatibleFields;
+
+  /// Contains items that are compatible to be selected for a report of type
+  /// "REACH".
+  ReachReportCompatibleFields reachReportCompatibleFields;
+
+  /// Contains items that are compatible to be selected for a report of type
+  /// "STANDARD".
+  ReportCompatibleFields reportCompatibleFields;
+
+  CompatibleFields();
+
+  CompatibleFields.fromJson(core.Map _json) {
+    if (_json.containsKey("crossDimensionReachReportCompatibleFields")) {
+      crossDimensionReachReportCompatibleFields =
+          new CrossDimensionReachReportCompatibleFields.fromJson(
+              _json["crossDimensionReachReportCompatibleFields"]);
+    }
+    if (_json.containsKey("floodlightReportCompatibleFields")) {
+      floodlightReportCompatibleFields =
+          new FloodlightReportCompatibleFields.fromJson(
+              _json["floodlightReportCompatibleFields"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("pathToConversionReportCompatibleFields")) {
+      pathToConversionReportCompatibleFields =
+          new PathToConversionReportCompatibleFields.fromJson(
+              _json["pathToConversionReportCompatibleFields"]);
+    }
+    if (_json.containsKey("reachReportCompatibleFields")) {
+      reachReportCompatibleFields = new ReachReportCompatibleFields.fromJson(
+          _json["reachReportCompatibleFields"]);
+    }
+    if (_json.containsKey("reportCompatibleFields")) {
+      reportCompatibleFields =
+          new ReportCompatibleFields.fromJson(_json["reportCompatibleFields"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (crossDimensionReachReportCompatibleFields != null) {
+      _json["crossDimensionReachReportCompatibleFields"] =
+          (crossDimensionReachReportCompatibleFields).toJson();
+    }
+    if (floodlightReportCompatibleFields != null) {
+      _json["floodlightReportCompatibleFields"] =
+          (floodlightReportCompatibleFields).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (pathToConversionReportCompatibleFields != null) {
+      _json["pathToConversionReportCompatibleFields"] =
+          (pathToConversionReportCompatibleFields).toJson();
+    }
+    if (reachReportCompatibleFields != null) {
+      _json["reachReportCompatibleFields"] =
+          (reachReportCompatibleFields).toJson();
+    }
+    if (reportCompatibleFields != null) {
+      _json["reportCompatibleFields"] = (reportCompatibleFields).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Contains information about an internet connection type that can be targeted
+/// by ads. Clients can use the connection type to target mobile vs. broadband
+/// users.
+class ConnectionType {
+  /// ID of this connection type.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#connectionType".
+  core.String kind;
+
+  /// Name of this connection type.
+  core.String name;
+
+  ConnectionType();
+
+  ConnectionType.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    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 (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Connection Type List Response
+class ConnectionTypesListResponse {
+  /// Collection of connection types such as broadband and mobile.
+  core.List<ConnectionType> connectionTypes;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#connectionTypesListResponse".
+  core.String kind;
+
+  ConnectionTypesListResponse();
+
+  ConnectionTypesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("connectionTypes")) {
+      connectionTypes = _json["connectionTypes"]
+          .map((value) => new ConnectionType.fromJson(value))
+          .toList();
+    }
+    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 (connectionTypes != null) {
+      _json["connectionTypes"] =
+          connectionTypes.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Content Category List Response
+class ContentCategoriesListResponse {
+  /// Content category collection.
+  core.List<ContentCategory> contentCategories;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#contentCategoriesListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  ContentCategoriesListResponse();
+
+  ContentCategoriesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("contentCategories")) {
+      contentCategories = _json["contentCategories"]
+          .map((value) => new ContentCategory.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 (contentCategories != null) {
+      _json["contentCategories"] =
+          contentCategories.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Organizes placements according to the contents of their associated webpages.
+class ContentCategory {
+  /// Account ID of this content category. This is a read-only field that can be
+  /// left blank.
+  core.String accountId;
+
+  /// ID of this content category. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#contentCategory".
+  core.String kind;
+
+  /// Name of this content category. This is a required field and must be less
+  /// than 256 characters long and unique among content categories of the same
+  /// account.
+  core.String name;
+
+  ContentCategory();
+
+  ContentCategory.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    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 (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// A Conversion represents when a user successfully performs a desired action
+/// after seeing an ad.
+class Conversion {
+  /// Whether the conversion was directed toward children.
+  core.bool childDirectedTreatment;
+
+  /// Custom floodlight variables.
+  core.List<CustomFloodlightVariable> customVariables;
+
+  /// The alphanumeric encrypted user ID. When set, encryptionInfo should also
+  /// be specified. This field is mutually exclusive with
+  /// encryptedUserIdCandidates[], mobileDeviceId and gclid. This or
+  /// encryptedUserIdCandidates[] or mobileDeviceId or gclid is a required
+  /// field.
+  core.String encryptedUserId;
+
+  /// A list of the alphanumeric encrypted user IDs. Any user ID with exposure
+  /// prior to the conversion timestamp will be used in the inserted conversion.
+  /// If no such user ID is found then the conversion will be rejected with
+  /// NO_COOKIE_MATCH_FOUND error. When set, encryptionInfo should also be
+  /// specified. This field may only be used when calling batchinsert; it is not
+  /// supported by batchupdate. This field is mutually exclusive with
+  /// encryptedUserId, mobileDeviceId and gclid. This or encryptedUserId or
+  /// mobileDeviceId or gclid is a required field.
+  core.List<core.String> encryptedUserIdCandidates;
+
+  /// Floodlight Activity ID of this conversion. This is a required field.
+  core.String floodlightActivityId;
+
+  /// Floodlight Configuration ID of this conversion. This is a required field.
+  core.String floodlightConfigurationId;
+
+  /// The Google click ID. This field is mutually exclusive with
+  /// encryptedUserId, encryptedUserIdCandidates[] and mobileDeviceId. This or
+  /// encryptedUserId or encryptedUserIdCandidates[] or mobileDeviceId is a
+  /// required field.
+  core.String gclid;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#conversion".
+  core.String kind;
+
+  /// Whether Limit Ad Tracking is enabled. When set to true, the conversion
+  /// will be used for reporting but not targeting. This will prevent
+  /// remarketing.
+  core.bool limitAdTracking;
+
+  /// The mobile device ID. This field is mutually exclusive with
+  /// encryptedUserId, encryptedUserIdCandidates[] and gclid. This or
+  /// encryptedUserId or encryptedUserIdCandidates[] or gclid is a required
+  /// field.
+  core.String mobileDeviceId;
+
+  /// The ordinal of the conversion. Use this field to control how conversions
+  /// of the same user and day are de-duplicated. This is a required field.
+  core.String ordinal;
+
+  /// The quantity of the conversion.
+  core.String quantity;
+
+  /// The timestamp of conversion, in Unix epoch micros. This is a required
+  /// field.
+  core.String timestampMicros;
+
+  /// The value of the conversion.
+  core.double value;
+
+  Conversion();
+
+  Conversion.fromJson(core.Map _json) {
+    if (_json.containsKey("childDirectedTreatment")) {
+      childDirectedTreatment = _json["childDirectedTreatment"];
+    }
+    if (_json.containsKey("customVariables")) {
+      customVariables = _json["customVariables"]
+          .map((value) => new CustomFloodlightVariable.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("encryptedUserId")) {
+      encryptedUserId = _json["encryptedUserId"];
+    }
+    if (_json.containsKey("encryptedUserIdCandidates")) {
+      encryptedUserIdCandidates = _json["encryptedUserIdCandidates"];
+    }
+    if (_json.containsKey("floodlightActivityId")) {
+      floodlightActivityId = _json["floodlightActivityId"];
+    }
+    if (_json.containsKey("floodlightConfigurationId")) {
+      floodlightConfigurationId = _json["floodlightConfigurationId"];
+    }
+    if (_json.containsKey("gclid")) {
+      gclid = _json["gclid"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("limitAdTracking")) {
+      limitAdTracking = _json["limitAdTracking"];
+    }
+    if (_json.containsKey("mobileDeviceId")) {
+      mobileDeviceId = _json["mobileDeviceId"];
+    }
+    if (_json.containsKey("ordinal")) {
+      ordinal = _json["ordinal"];
+    }
+    if (_json.containsKey("quantity")) {
+      quantity = _json["quantity"];
+    }
+    if (_json.containsKey("timestampMicros")) {
+      timestampMicros = _json["timestampMicros"];
+    }
+    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 (childDirectedTreatment != null) {
+      _json["childDirectedTreatment"] = childDirectedTreatment;
+    }
+    if (customVariables != null) {
+      _json["customVariables"] =
+          customVariables.map((value) => (value).toJson()).toList();
+    }
+    if (encryptedUserId != null) {
+      _json["encryptedUserId"] = encryptedUserId;
+    }
+    if (encryptedUserIdCandidates != null) {
+      _json["encryptedUserIdCandidates"] = encryptedUserIdCandidates;
+    }
+    if (floodlightActivityId != null) {
+      _json["floodlightActivityId"] = floodlightActivityId;
+    }
+    if (floodlightConfigurationId != null) {
+      _json["floodlightConfigurationId"] = floodlightConfigurationId;
+    }
+    if (gclid != null) {
+      _json["gclid"] = gclid;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (limitAdTracking != null) {
+      _json["limitAdTracking"] = limitAdTracking;
+    }
+    if (mobileDeviceId != null) {
+      _json["mobileDeviceId"] = mobileDeviceId;
+    }
+    if (ordinal != null) {
+      _json["ordinal"] = ordinal;
+    }
+    if (quantity != null) {
+      _json["quantity"] = quantity;
+    }
+    if (timestampMicros != null) {
+      _json["timestampMicros"] = timestampMicros;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+/// The error code and description for a conversion that failed to insert or
+/// update.
+class ConversionError {
+  /// The error code.
+  /// Possible string values are:
+  /// - "INTERNAL"
+  /// - "INVALID_ARGUMENT"
+  /// - "NOT_FOUND"
+  /// - "PERMISSION_DENIED"
+  core.String code;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#conversionError".
+  core.String kind;
+
+  /// A description of the error.
+  core.String message;
+
+  ConversionError();
+
+  ConversionError.fromJson(core.Map _json) {
+    if (_json.containsKey("code")) {
+      code = _json["code"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (message != null) {
+      _json["message"] = message;
+    }
+    return _json;
+  }
+}
+
+/// The original conversion that was inserted or updated and whether there were
+/// any errors.
+class ConversionStatus {
+  /// The original conversion that was inserted or updated.
+  Conversion conversion;
+
+  /// A list of errors related to this conversion.
+  core.List<ConversionError> errors;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#conversionStatus".
+  core.String kind;
+
+  ConversionStatus();
+
+  ConversionStatus.fromJson(core.Map _json) {
+    if (_json.containsKey("conversion")) {
+      conversion = new Conversion.fromJson(_json["conversion"]);
+    }
+    if (_json.containsKey("errors")) {
+      errors = _json["errors"]
+          .map((value) => new ConversionError.fromJson(value))
+          .toList();
+    }
+    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 (conversion != null) {
+      _json["conversion"] = (conversion).toJson();
+    }
+    if (errors != null) {
+      _json["errors"] = errors.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Insert Conversions Request.
+class ConversionsBatchInsertRequest {
+  /// The set of conversions to insert.
+  core.List<Conversion> conversions;
+
+  /// Describes how encryptedUserId or encryptedUserIdCandidates[] is encrypted.
+  /// This is a required field if encryptedUserId or encryptedUserIdCandidates[]
+  /// is used.
+  EncryptionInfo encryptionInfo;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#conversionsBatchInsertRequest".
+  core.String kind;
+
+  ConversionsBatchInsertRequest();
+
+  ConversionsBatchInsertRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("conversions")) {
+      conversions = _json["conversions"]
+          .map((value) => new Conversion.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("encryptionInfo")) {
+      encryptionInfo = new EncryptionInfo.fromJson(_json["encryptionInfo"]);
+    }
+    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 (conversions != null) {
+      _json["conversions"] =
+          conversions.map((value) => (value).toJson()).toList();
+    }
+    if (encryptionInfo != null) {
+      _json["encryptionInfo"] = (encryptionInfo).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Insert Conversions Response.
+class ConversionsBatchInsertResponse {
+  /// Indicates that some or all conversions failed to insert.
+  core.bool hasFailures;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#conversionsBatchInsertResponse".
+  core.String kind;
+
+  /// The insert status of each conversion. Statuses are returned in the same
+  /// order that conversions are inserted.
+  core.List<ConversionStatus> status;
+
+  ConversionsBatchInsertResponse();
+
+  ConversionsBatchInsertResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("hasFailures")) {
+      hasFailures = _json["hasFailures"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"]
+          .map((value) => new ConversionStatus.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 (hasFailures != null) {
+      _json["hasFailures"] = hasFailures;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (status != null) {
+      _json["status"] = status.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Update Conversions Request.
+class ConversionsBatchUpdateRequest {
+  /// The set of conversions to update.
+  core.List<Conversion> conversions;
+
+  /// Describes how encryptedUserId is encrypted. This is a required field if
+  /// encryptedUserId is used.
+  EncryptionInfo encryptionInfo;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#conversionsBatchUpdateRequest".
+  core.String kind;
+
+  ConversionsBatchUpdateRequest();
+
+  ConversionsBatchUpdateRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("conversions")) {
+      conversions = _json["conversions"]
+          .map((value) => new Conversion.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("encryptionInfo")) {
+      encryptionInfo = new EncryptionInfo.fromJson(_json["encryptionInfo"]);
+    }
+    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 (conversions != null) {
+      _json["conversions"] =
+          conversions.map((value) => (value).toJson()).toList();
+    }
+    if (encryptionInfo != null) {
+      _json["encryptionInfo"] = (encryptionInfo).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Update Conversions Response.
+class ConversionsBatchUpdateResponse {
+  /// Indicates that some or all conversions failed to update.
+  core.bool hasFailures;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#conversionsBatchUpdateResponse".
+  core.String kind;
+
+  /// The update status of each conversion. Statuses are returned in the same
+  /// order that conversions are updated.
+  core.List<ConversionStatus> status;
+
+  ConversionsBatchUpdateResponse();
+
+  ConversionsBatchUpdateResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("hasFailures")) {
+      hasFailures = _json["hasFailures"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"]
+          .map((value) => new ConversionStatus.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 (hasFailures != null) {
+      _json["hasFailures"] = hasFailures;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (status != null) {
+      _json["status"] = status.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Country List Response
+class CountriesListResponse {
+  /// Country collection.
+  core.List<Country> countries;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#countriesListResponse".
+  core.String kind;
+
+  CountriesListResponse();
+
+  CountriesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("countries")) {
+      countries = _json["countries"]
+          .map((value) => new Country.fromJson(value))
+          .toList();
+    }
+    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 (countries != null) {
+      _json["countries"] = countries.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Contains information about a country that can be targeted by ads.
+class Country {
+  /// Country code.
+  core.String countryCode;
+
+  /// DART ID of this country. This is the ID used for targeting and generating
+  /// reports.
+  core.String dartId;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#country".
+  core.String kind;
+
+  /// Name of this country.
+  core.String name;
+
+  /// Whether ad serving supports secure servers in this country.
+  core.bool sslEnabled;
+
+  Country();
+
+  Country.fromJson(core.Map _json) {
+    if (_json.containsKey("countryCode")) {
+      countryCode = _json["countryCode"];
+    }
+    if (_json.containsKey("dartId")) {
+      dartId = _json["dartId"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("sslEnabled")) {
+      sslEnabled = _json["sslEnabled"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (countryCode != null) {
+      _json["countryCode"] = countryCode;
+    }
+    if (dartId != null) {
+      _json["dartId"] = dartId;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (sslEnabled != null) {
+      _json["sslEnabled"] = sslEnabled;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a Creative.
+class Creative {
+  /// Account ID of this creative. This field, if left unset, will be
+  /// auto-generated for both insert and update operations. Applicable to all
+  /// creative types.
+  core.String accountId;
+
+  /// Whether the creative is active. Applicable to all creative types.
+  core.bool active;
+
+  /// Ad parameters user for VPAID creative. This is a read-only field.
+  /// Applicable to the following creative types: all VPAID.
+  core.String adParameters;
+
+  /// Keywords for a Rich Media creative. Keywords let you customize the
+  /// creative settings of a Rich Media ad running on your site without having
+  /// to contact the advertiser. You can use keywords to dynamically change the
+  /// look or functionality of a creative. Applicable to the following creative
+  /// types: all RICH_MEDIA, and all VPAID.
+  core.List<core.String> adTagKeys;
+
+  /// Advertiser ID of this creative. This is a required field. Applicable to
+  /// all creative types.
+  core.String advertiserId;
+
+  /// Whether script access is allowed for this creative. This is a read-only
+  /// and deprecated field which will automatically be set to true on update.
+  /// Applicable to the following creative types: FLASH_INPAGE.
+  core.bool allowScriptAccess;
+
+  /// Whether the creative is archived. Applicable to all creative types.
+  core.bool archived;
+
+  /// Type of artwork used for the creative. This is a read-only field.
+  /// Applicable to the following creative types: all RICH_MEDIA, and all VPAID.
+  /// Possible string values are:
+  /// - "ARTWORK_TYPE_FLASH"
+  /// - "ARTWORK_TYPE_HTML5"
+  /// - "ARTWORK_TYPE_IMAGE"
+  /// - "ARTWORK_TYPE_MIXED"
+  core.String artworkType;
+
+  /// Source application where creative was authored. Presently, only DBM
+  /// authored creatives will have this field set. Applicable to all creative
+  /// types.
+  /// Possible string values are:
+  /// - "CREATIVE_AUTHORING_SOURCE_DBM"
+  /// - "CREATIVE_AUTHORING_SOURCE_DCM"
+  /// - "CREATIVE_AUTHORING_SOURCE_STUDIO"
+  core.String authoringSource;
+
+  /// Authoring tool for HTML5 banner creatives. This is a read-only field.
+  /// Applicable to the following creative types: HTML5_BANNER.
+  /// Possible string values are:
+  /// - "NINJA"
+  /// - "SWIFFY"
+  core.String authoringTool;
+
+  /// Whether images are automatically advanced for image gallery creatives.
+  /// Applicable to the following creative types: DISPLAY_IMAGE_GALLERY.
+  core.bool autoAdvanceImages;
+
+  /// The 6-character HTML color code, beginning with #, for the background of
+  /// the window area where the Flash file is displayed. Default is white.
+  /// Applicable to the following creative types: FLASH_INPAGE.
+  core.String backgroundColor;
+
+  /// Click-through URL for backup image. Applicable to ENHANCED_BANNER when the
+  /// primary asset type is not HTML_IMAGE.
+  CreativeClickThroughUrl backupImageClickThroughUrl;
+
+  /// List of feature dependencies that will cause a backup image to be served
+  /// if the browser that serves the ad does not support them. Feature
+  /// dependencies are features that a browser must be able to support in order
+  /// to render your HTML5 creative asset correctly. This field is initially
+  /// auto-generated to contain all features detected by DCM for all the assets
+  /// of this creative and can then be modified by the client. To reset this
+  /// field, copy over all the creativeAssets' detected features. Applicable to
+  /// the following creative types: HTML5_BANNER. Applicable to DISPLAY when the
+  /// primary asset type is not HTML_IMAGE.
+  core.List<core.String> backupImageFeatures;
+
+  /// Reporting label used for HTML5 banner backup image. Applicable to the
+  /// following creative types: DISPLAY when the primary asset type is not
+  /// HTML_IMAGE.
+  core.String backupImageReportingLabel;
+
+  /// Target window for backup image. Applicable to the following creative
+  /// types: FLASH_INPAGE and HTML5_BANNER. Applicable to DISPLAY when the
+  /// primary asset type is not HTML_IMAGE.
+  TargetWindow backupImageTargetWindow;
+
+  /// Click tags of the creative. For DISPLAY, FLASH_INPAGE, and HTML5_BANNER
+  /// creatives, this is a subset of detected click tags for the assets
+  /// associated with this creative. After creating a flash asset, detected
+  /// click tags will be returned in the creativeAssetMetadata. When inserting
+  /// the creative, populate the creative clickTags field using the
+  /// creativeAssetMetadata.clickTags field. For DISPLAY_IMAGE_GALLERY
+  /// creatives, there should be exactly one entry in this list for each image
+  /// creative asset. A click tag is matched with a corresponding creative asset
+  /// by matching the clickTag.name field with the
+  /// creativeAsset.assetIdentifier.name field. Applicable to the following
+  /// creative types: DISPLAY_IMAGE_GALLERY, FLASH_INPAGE, HTML5_BANNER.
+  /// Applicable to DISPLAY when the primary asset type is not HTML_IMAGE.
+  core.List<ClickTag> clickTags;
+
+  /// Industry standard ID assigned to creative for reach and frequency.
+  /// Applicable to INSTREAM_VIDEO_REDIRECT creatives.
+  core.String commercialId;
+
+  /// List of companion creatives assigned to an in-Stream videocreative.
+  /// Acceptable values include IDs of existing flash and image creatives.
+  /// Applicable to the following creative types: all VPAID and all
+  /// INSTREAM_VIDEO with dynamicAssetSelection set to false.
+  core.List<core.String> companionCreatives;
+
+  /// Compatibilities associated with this creative. This is a read-only field.
+  /// DISPLAY and DISPLAY_INTERSTITIAL refer to rendering either on desktop or
+  /// on mobile devices or in mobile apps for regular or interstitial ads,
+  /// respectively. APP and APP_INTERSTITIAL are for rendering in mobile apps.
+  /// Only pre-existing creatives may have these compatibilities since new
+  /// creatives will either be assigned DISPLAY or DISPLAY_INTERSTITIAL instead.
+  /// IN_STREAM_VIDEO refers to rendering in in-stream video ads developed with
+  /// the VAST standard. Applicable to all creative types.
+  ///
+  /// Acceptable values are:
+  /// - "APP"
+  /// - "APP_INTERSTITIAL"
+  /// - "IN_STREAM_VIDEO"
+  /// - "DISPLAY"
+  /// - "DISPLAY_INTERSTITIAL"
+  core.List<core.String> compatibility;
+
+  /// Whether Flash assets associated with the creative need to be automatically
+  /// converted to HTML5. This flag is enabled by default and users can choose
+  /// to disable it if they don't want the system to generate and use HTML5
+  /// asset for this creative. Applicable to the following creative type:
+  /// FLASH_INPAGE. Applicable to DISPLAY when the primary asset type is not
+  /// HTML_IMAGE.
+  core.bool convertFlashToHtml5;
+
+  /// List of counter events configured for the creative. For
+  /// DISPLAY_IMAGE_GALLERY creatives, these are read-only and auto-generated
+  /// from clickTags. Applicable to the following creative types:
+  /// DISPLAY_IMAGE_GALLERY, all RICH_MEDIA, and all VPAID.
+  core.List<CreativeCustomEvent> counterCustomEvents;
+
+  /// Required if dynamicAssetSelection is true.
+  CreativeAssetSelection creativeAssetSelection;
+
+  /// Assets associated with a creative. Applicable to all but the following
+  /// creative types: INTERNAL_REDIRECT, INTERSTITIAL_INTERNAL_REDIRECT, and
+  /// REDIRECT
+  core.List<CreativeAsset> creativeAssets;
+
+  /// Creative field assignments for this creative. Applicable to all creative
+  /// types.
+  core.List<CreativeFieldAssignment> creativeFieldAssignments;
+
+  /// Custom key-values for a Rich Media creative. Key-values let you customize
+  /// the creative settings of a Rich Media ad running on your site without
+  /// having to contact the advertiser. You can use key-values to dynamically
+  /// change the look or functionality of a creative. Applicable to the
+  /// following creative types: all RICH_MEDIA, and all VPAID.
+  core.List<core.String> customKeyValues;
+
+  /// Set this to true to enable the use of rules to target individual assets in
+  /// this creative. When set to true creativeAssetSelection must be set. This
+  /// also controls asset-level companions. When this is true, companion
+  /// creatives should be assigned to creative assets. Learn more. Applicable to
+  /// INSTREAM_VIDEO creatives.
+  core.bool dynamicAssetSelection;
+
+  /// List of exit events configured for the creative. For DISPLAY and
+  /// DISPLAY_IMAGE_GALLERY creatives, these are read-only and auto-generated
+  /// from clickTags, For DISPLAY, an event is also created from the
+  /// backupImageReportingLabel. Applicable to the following creative types:
+  /// DISPLAY_IMAGE_GALLERY, all RICH_MEDIA, and all VPAID. Applicable to
+  /// DISPLAY when the primary asset type is not HTML_IMAGE.
+  core.List<CreativeCustomEvent> exitCustomEvents;
+
+  /// OpenWindow FSCommand of this creative. This lets the SWF file communicate
+  /// with either Flash Player or the program hosting Flash Player, such as a
+  /// web browser. This is only triggered if allowScriptAccess field is true.
+  /// Applicable to the following creative types: FLASH_INPAGE.
+  FsCommand fsCommand;
+
+  /// HTML code for the creative. This is a required field when applicable. This
+  /// field is ignored if htmlCodeLocked is true. Applicable to the following
+  /// creative types: all CUSTOM, FLASH_INPAGE, and HTML5_BANNER, and all
+  /// RICH_MEDIA.
+  core.String htmlCode;
+
+  /// Whether HTML code is DCM-generated or manually entered. Set to true to
+  /// ignore changes to htmlCode. Applicable to the following creative types:
+  /// FLASH_INPAGE and HTML5_BANNER.
+  core.bool htmlCodeLocked;
+
+  /// ID of this creative. This is a read-only, auto-generated field. Applicable
+  /// to all creative types.
+  core.String id;
+
+  /// Dimension value for the ID of this creative. This is a read-only field.
+  /// Applicable to all creative types.
+  DimensionValue idDimensionValue;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#creative".
+  core.String kind;
+
+  /// Creative last modification information. This is a read-only field.
+  /// Applicable to all creative types.
+  LastModifiedInfo lastModifiedInfo;
+
+  /// Latest Studio trafficked creative ID associated with rich media and VPAID
+  /// creatives. This is a read-only field. Applicable to the following creative
+  /// types: all RICH_MEDIA, and all VPAID.
+  core.String latestTraffickedCreativeId;
+
+  /// Name of the creative. This is a required field and must be less than 256
+  /// characters long. Applicable to all creative types.
+  core.String name;
+
+  /// Override CSS value for rich media creatives. Applicable to the following
+  /// creative types: all RICH_MEDIA.
+  core.String overrideCss;
+
+  /// The asset ID of the polite load image asset. Applicable to the creative
+  /// type: DISPLAY.
+  core.String politeLoadAssetId;
+
+  /// Amount of time to play the video before counting a view. Applicable to the
+  /// following creative types: all INSTREAM_VIDEO.
+  VideoOffset progressOffset;
+
+  /// URL of hosted image or hosted video or another ad tag. For
+  /// INSTREAM_VIDEO_REDIRECT creatives this is the in-stream video redirect
+  /// URL. The standard for a VAST (Video Ad Serving Template) ad response
+  /// allows for a redirect link to another VAST 2.0 or 3.0 call. This is a
+  /// required field when applicable. Applicable to the following creative
+  /// types: DISPLAY_REDIRECT, INTERNAL_REDIRECT,
+  /// INTERSTITIAL_INTERNAL_REDIRECT, and INSTREAM_VIDEO_REDIRECT
+  core.String redirectUrl;
+
+  /// ID of current rendering version. This is a read-only field. Applicable to
+  /// all creative types.
+  core.String renderingId;
+
+  /// Dimension value for the rendering ID of this creative. This is a read-only
+  /// field. Applicable to all creative types.
+  DimensionValue renderingIdDimensionValue;
+
+  /// The minimum required Flash plugin version for this creative. For example,
+  /// 11.2.202.235. This is a read-only field. Applicable to the following
+  /// creative types: all RICH_MEDIA, and all VPAID.
+  core.String requiredFlashPluginVersion;
+
+  /// The internal Flash version for this creative as calculated by DoubleClick
+  /// Studio. This is a read-only field. Applicable to the following creative
+  /// types: FLASH_INPAGE all RICH_MEDIA, and all VPAID. Applicable to DISPLAY
+  /// when the primary asset type is not HTML_IMAGE.
+  core.int requiredFlashVersion;
+
+  /// Size associated with this creative. When inserting or updating a creative
+  /// either the size ID field or size width and height fields can be used. This
+  /// is a required field when applicable; however for IMAGE, FLASH_INPAGE
+  /// creatives, and for DISPLAY creatives with a primary asset of type
+  /// HTML_IMAGE, if left blank, this field will be automatically set using the
+  /// actual size of the associated image assets. Applicable to the following
+  /// creative types: DISPLAY, DISPLAY_IMAGE_GALLERY, FLASH_INPAGE,
+  /// HTML5_BANNER, IMAGE, and all RICH_MEDIA.
+  Size size;
+
+  /// Amount of time to play the video before the skip button appears.
+  /// Applicable to the following creative types: all INSTREAM_VIDEO.
+  VideoOffset skipOffset;
+
+  /// Whether the user can choose to skip the creative. Applicable to the
+  /// following creative types: all INSTREAM_VIDEO and all VPAID.
+  core.bool skippable;
+
+  /// Whether the creative is SSL-compliant. This is a read-only field.
+  /// Applicable to all creative types.
+  core.bool sslCompliant;
+
+  /// Whether creative should be treated as SSL compliant even if the system
+  /// scan shows it's not. Applicable to all creative types.
+  core.bool sslOverride;
+
+  /// Studio advertiser ID associated with rich media and VPAID creatives. This
+  /// is a read-only field. Applicable to the following creative types: all
+  /// RICH_MEDIA, and all VPAID.
+  core.String studioAdvertiserId;
+
+  /// Studio creative ID associated with rich media and VPAID creatives. This is
+  /// a read-only field. Applicable to the following creative types: all
+  /// RICH_MEDIA, and all VPAID.
+  core.String studioCreativeId;
+
+  /// Studio trafficked creative ID associated with rich media and VPAID
+  /// creatives. This is a read-only field. Applicable to the following creative
+  /// types: all RICH_MEDIA, and all VPAID.
+  core.String studioTraffickedCreativeId;
+
+  /// Subaccount ID of this creative. This field, if left unset, will be
+  /// auto-generated for both insert and update operations. Applicable to all
+  /// creative types.
+  core.String subaccountId;
+
+  /// Third-party URL used to record backup image impressions. Applicable to the
+  /// following creative types: all RICH_MEDIA.
+  core.String thirdPartyBackupImageImpressionsUrl;
+
+  /// Third-party URL used to record rich media impressions. Applicable to the
+  /// following creative types: all RICH_MEDIA.
+  core.String thirdPartyRichMediaImpressionsUrl;
+
+  /// Third-party URLs for tracking in-stream video creative events. Applicable
+  /// to the following creative types: all INSTREAM_VIDEO and all VPAID.
+  core.List<ThirdPartyTrackingUrl> thirdPartyUrls;
+
+  /// List of timer events configured for the creative. For
+  /// DISPLAY_IMAGE_GALLERY creatives, these are read-only and auto-generated
+  /// from clickTags. Applicable to the following creative types:
+  /// DISPLAY_IMAGE_GALLERY, all RICH_MEDIA, and all VPAID. Applicable to
+  /// DISPLAY when the primary asset is not HTML_IMAGE.
+  core.List<CreativeCustomEvent> timerCustomEvents;
+
+  /// Combined size of all creative assets. This is a read-only field.
+  /// Applicable to the following creative types: all RICH_MEDIA, and all VPAID.
+  core.String totalFileSize;
+
+  /// Type of this creative. This is a required field. Applicable to all
+  /// creative types.
+  ///
+  /// Note: FLASH_INPAGE, HTML5_BANNER, and IMAGE are only used for existing
+  /// creatives. New creatives should use DISPLAY as a replacement for these
+  /// types.
+  /// Possible string values are:
+  /// - "BRAND_SAFE_DEFAULT_INSTREAM_VIDEO"
+  /// - "CUSTOM_DISPLAY"
+  /// - "CUSTOM_DISPLAY_INTERSTITIAL"
+  /// - "DISPLAY"
+  /// - "DISPLAY_IMAGE_GALLERY"
+  /// - "DISPLAY_REDIRECT"
+  /// - "FLASH_INPAGE"
+  /// - "HTML5_BANNER"
+  /// - "IMAGE"
+  /// - "INSTREAM_VIDEO"
+  /// - "INSTREAM_VIDEO_REDIRECT"
+  /// - "INTERNAL_REDIRECT"
+  /// - "INTERSTITIAL_INTERNAL_REDIRECT"
+  /// - "RICH_MEDIA_DISPLAY_BANNER"
+  /// - "RICH_MEDIA_DISPLAY_EXPANDING"
+  /// - "RICH_MEDIA_DISPLAY_INTERSTITIAL"
+  /// - "RICH_MEDIA_DISPLAY_MULTI_FLOATING_INTERSTITIAL"
+  /// - "RICH_MEDIA_IM_EXPAND"
+  /// - "RICH_MEDIA_INPAGE_FLOATING"
+  /// - "RICH_MEDIA_MOBILE_IN_APP"
+  /// - "RICH_MEDIA_PEEL_DOWN"
+  /// - "TRACKING_TEXT"
+  /// - "VPAID_LINEAR_VIDEO"
+  /// - "VPAID_NON_LINEAR_VIDEO"
+  core.String type;
+
+  /// A Universal Ad ID as per the VAST 4.0 spec. Applicable to the following
+  /// creative types: INSTREAM_VIDEO and VPAID.
+  UniversalAdId universalAdId;
+
+  /// The version number helps you keep track of multiple versions of your
+  /// creative in your reports. The version number will always be auto-generated
+  /// during insert operations to start at 1. For tracking creatives the version
+  /// cannot be incremented and will always remain at 1. For all other creative
+  /// types the version can be incremented only by 1 during update operations.
+  /// In addition, the version will be automatically incremented by 1 when
+  /// undergoing Rich Media creative merging. Applicable to all creative types.
+  core.int version;
+
+  /// Description of the video ad. Applicable to the following creative types:
+  /// all INSTREAM_VIDEO and all VPAID.
+  core.String videoDescription;
+
+  /// Creative video duration in seconds. This is a read-only field. Applicable
+  /// to the following creative types: INSTREAM_VIDEO, all RICH_MEDIA, and all
+  /// VPAID.
+  core.double videoDuration;
+
+  Creative();
+
+  Creative.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("active")) {
+      active = _json["active"];
+    }
+    if (_json.containsKey("adParameters")) {
+      adParameters = _json["adParameters"];
+    }
+    if (_json.containsKey("adTagKeys")) {
+      adTagKeys = _json["adTagKeys"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("allowScriptAccess")) {
+      allowScriptAccess = _json["allowScriptAccess"];
+    }
+    if (_json.containsKey("archived")) {
+      archived = _json["archived"];
+    }
+    if (_json.containsKey("artworkType")) {
+      artworkType = _json["artworkType"];
+    }
+    if (_json.containsKey("authoringSource")) {
+      authoringSource = _json["authoringSource"];
+    }
+    if (_json.containsKey("authoringTool")) {
+      authoringTool = _json["authoringTool"];
+    }
+    if (_json.containsKey("autoAdvanceImages")) {
+      autoAdvanceImages = _json["autoAdvanceImages"];
+    }
+    if (_json.containsKey("backgroundColor")) {
+      backgroundColor = _json["backgroundColor"];
+    }
+    if (_json.containsKey("backupImageClickThroughUrl")) {
+      backupImageClickThroughUrl = new CreativeClickThroughUrl.fromJson(
+          _json["backupImageClickThroughUrl"]);
+    }
+    if (_json.containsKey("backupImageFeatures")) {
+      backupImageFeatures = _json["backupImageFeatures"];
+    }
+    if (_json.containsKey("backupImageReportingLabel")) {
+      backupImageReportingLabel = _json["backupImageReportingLabel"];
+    }
+    if (_json.containsKey("backupImageTargetWindow")) {
+      backupImageTargetWindow =
+          new TargetWindow.fromJson(_json["backupImageTargetWindow"]);
+    }
+    if (_json.containsKey("clickTags")) {
+      clickTags = _json["clickTags"]
+          .map((value) => new ClickTag.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("commercialId")) {
+      commercialId = _json["commercialId"];
+    }
+    if (_json.containsKey("companionCreatives")) {
+      companionCreatives = _json["companionCreatives"];
+    }
+    if (_json.containsKey("compatibility")) {
+      compatibility = _json["compatibility"];
+    }
+    if (_json.containsKey("convertFlashToHtml5")) {
+      convertFlashToHtml5 = _json["convertFlashToHtml5"];
+    }
+    if (_json.containsKey("counterCustomEvents")) {
+      counterCustomEvents = _json["counterCustomEvents"]
+          .map((value) => new CreativeCustomEvent.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("creativeAssetSelection")) {
+      creativeAssetSelection =
+          new CreativeAssetSelection.fromJson(_json["creativeAssetSelection"]);
+    }
+    if (_json.containsKey("creativeAssets")) {
+      creativeAssets = _json["creativeAssets"]
+          .map((value) => new CreativeAsset.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("creativeFieldAssignments")) {
+      creativeFieldAssignments = _json["creativeFieldAssignments"]
+          .map((value) => new CreativeFieldAssignment.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("customKeyValues")) {
+      customKeyValues = _json["customKeyValues"];
+    }
+    if (_json.containsKey("dynamicAssetSelection")) {
+      dynamicAssetSelection = _json["dynamicAssetSelection"];
+    }
+    if (_json.containsKey("exitCustomEvents")) {
+      exitCustomEvents = _json["exitCustomEvents"]
+          .map((value) => new CreativeCustomEvent.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("fsCommand")) {
+      fsCommand = new FsCommand.fromJson(_json["fsCommand"]);
+    }
+    if (_json.containsKey("htmlCode")) {
+      htmlCode = _json["htmlCode"];
+    }
+    if (_json.containsKey("htmlCodeLocked")) {
+      htmlCodeLocked = _json["htmlCodeLocked"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("idDimensionValue")) {
+      idDimensionValue = new DimensionValue.fromJson(_json["idDimensionValue"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lastModifiedInfo")) {
+      lastModifiedInfo =
+          new LastModifiedInfo.fromJson(_json["lastModifiedInfo"]);
+    }
+    if (_json.containsKey("latestTraffickedCreativeId")) {
+      latestTraffickedCreativeId = _json["latestTraffickedCreativeId"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("overrideCss")) {
+      overrideCss = _json["overrideCss"];
+    }
+    if (_json.containsKey("politeLoadAssetId")) {
+      politeLoadAssetId = _json["politeLoadAssetId"];
+    }
+    if (_json.containsKey("progressOffset")) {
+      progressOffset = new VideoOffset.fromJson(_json["progressOffset"]);
+    }
+    if (_json.containsKey("redirectUrl")) {
+      redirectUrl = _json["redirectUrl"];
+    }
+    if (_json.containsKey("renderingId")) {
+      renderingId = _json["renderingId"];
+    }
+    if (_json.containsKey("renderingIdDimensionValue")) {
+      renderingIdDimensionValue =
+          new DimensionValue.fromJson(_json["renderingIdDimensionValue"]);
+    }
+    if (_json.containsKey("requiredFlashPluginVersion")) {
+      requiredFlashPluginVersion = _json["requiredFlashPluginVersion"];
+    }
+    if (_json.containsKey("requiredFlashVersion")) {
+      requiredFlashVersion = _json["requiredFlashVersion"];
+    }
+    if (_json.containsKey("size")) {
+      size = new Size.fromJson(_json["size"]);
+    }
+    if (_json.containsKey("skipOffset")) {
+      skipOffset = new VideoOffset.fromJson(_json["skipOffset"]);
+    }
+    if (_json.containsKey("skippable")) {
+      skippable = _json["skippable"];
+    }
+    if (_json.containsKey("sslCompliant")) {
+      sslCompliant = _json["sslCompliant"];
+    }
+    if (_json.containsKey("sslOverride")) {
+      sslOverride = _json["sslOverride"];
+    }
+    if (_json.containsKey("studioAdvertiserId")) {
+      studioAdvertiserId = _json["studioAdvertiserId"];
+    }
+    if (_json.containsKey("studioCreativeId")) {
+      studioCreativeId = _json["studioCreativeId"];
+    }
+    if (_json.containsKey("studioTraffickedCreativeId")) {
+      studioTraffickedCreativeId = _json["studioTraffickedCreativeId"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("thirdPartyBackupImageImpressionsUrl")) {
+      thirdPartyBackupImageImpressionsUrl =
+          _json["thirdPartyBackupImageImpressionsUrl"];
+    }
+    if (_json.containsKey("thirdPartyRichMediaImpressionsUrl")) {
+      thirdPartyRichMediaImpressionsUrl =
+          _json["thirdPartyRichMediaImpressionsUrl"];
+    }
+    if (_json.containsKey("thirdPartyUrls")) {
+      thirdPartyUrls = _json["thirdPartyUrls"]
+          .map((value) => new ThirdPartyTrackingUrl.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("timerCustomEvents")) {
+      timerCustomEvents = _json["timerCustomEvents"]
+          .map((value) => new CreativeCustomEvent.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("totalFileSize")) {
+      totalFileSize = _json["totalFileSize"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    if (_json.containsKey("universalAdId")) {
+      universalAdId = new UniversalAdId.fromJson(_json["universalAdId"]);
+    }
+    if (_json.containsKey("version")) {
+      version = _json["version"];
+    }
+    if (_json.containsKey("videoDescription")) {
+      videoDescription = _json["videoDescription"];
+    }
+    if (_json.containsKey("videoDuration")) {
+      videoDuration = _json["videoDuration"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (active != null) {
+      _json["active"] = active;
+    }
+    if (adParameters != null) {
+      _json["adParameters"] = adParameters;
+    }
+    if (adTagKeys != null) {
+      _json["adTagKeys"] = adTagKeys;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (allowScriptAccess != null) {
+      _json["allowScriptAccess"] = allowScriptAccess;
+    }
+    if (archived != null) {
+      _json["archived"] = archived;
+    }
+    if (artworkType != null) {
+      _json["artworkType"] = artworkType;
+    }
+    if (authoringSource != null) {
+      _json["authoringSource"] = authoringSource;
+    }
+    if (authoringTool != null) {
+      _json["authoringTool"] = authoringTool;
+    }
+    if (autoAdvanceImages != null) {
+      _json["autoAdvanceImages"] = autoAdvanceImages;
+    }
+    if (backgroundColor != null) {
+      _json["backgroundColor"] = backgroundColor;
+    }
+    if (backupImageClickThroughUrl != null) {
+      _json["backupImageClickThroughUrl"] =
+          (backupImageClickThroughUrl).toJson();
+    }
+    if (backupImageFeatures != null) {
+      _json["backupImageFeatures"] = backupImageFeatures;
+    }
+    if (backupImageReportingLabel != null) {
+      _json["backupImageReportingLabel"] = backupImageReportingLabel;
+    }
+    if (backupImageTargetWindow != null) {
+      _json["backupImageTargetWindow"] = (backupImageTargetWindow).toJson();
+    }
+    if (clickTags != null) {
+      _json["clickTags"] = clickTags.map((value) => (value).toJson()).toList();
+    }
+    if (commercialId != null) {
+      _json["commercialId"] = commercialId;
+    }
+    if (companionCreatives != null) {
+      _json["companionCreatives"] = companionCreatives;
+    }
+    if (compatibility != null) {
+      _json["compatibility"] = compatibility;
+    }
+    if (convertFlashToHtml5 != null) {
+      _json["convertFlashToHtml5"] = convertFlashToHtml5;
+    }
+    if (counterCustomEvents != null) {
+      _json["counterCustomEvents"] =
+          counterCustomEvents.map((value) => (value).toJson()).toList();
+    }
+    if (creativeAssetSelection != null) {
+      _json["creativeAssetSelection"] = (creativeAssetSelection).toJson();
+    }
+    if (creativeAssets != null) {
+      _json["creativeAssets"] =
+          creativeAssets.map((value) => (value).toJson()).toList();
+    }
+    if (creativeFieldAssignments != null) {
+      _json["creativeFieldAssignments"] =
+          creativeFieldAssignments.map((value) => (value).toJson()).toList();
+    }
+    if (customKeyValues != null) {
+      _json["customKeyValues"] = customKeyValues;
+    }
+    if (dynamicAssetSelection != null) {
+      _json["dynamicAssetSelection"] = dynamicAssetSelection;
+    }
+    if (exitCustomEvents != null) {
+      _json["exitCustomEvents"] =
+          exitCustomEvents.map((value) => (value).toJson()).toList();
+    }
+    if (fsCommand != null) {
+      _json["fsCommand"] = (fsCommand).toJson();
+    }
+    if (htmlCode != null) {
+      _json["htmlCode"] = htmlCode;
+    }
+    if (htmlCodeLocked != null) {
+      _json["htmlCodeLocked"] = htmlCodeLocked;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (idDimensionValue != null) {
+      _json["idDimensionValue"] = (idDimensionValue).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lastModifiedInfo != null) {
+      _json["lastModifiedInfo"] = (lastModifiedInfo).toJson();
+    }
+    if (latestTraffickedCreativeId != null) {
+      _json["latestTraffickedCreativeId"] = latestTraffickedCreativeId;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (overrideCss != null) {
+      _json["overrideCss"] = overrideCss;
+    }
+    if (politeLoadAssetId != null) {
+      _json["politeLoadAssetId"] = politeLoadAssetId;
+    }
+    if (progressOffset != null) {
+      _json["progressOffset"] = (progressOffset).toJson();
+    }
+    if (redirectUrl != null) {
+      _json["redirectUrl"] = redirectUrl;
+    }
+    if (renderingId != null) {
+      _json["renderingId"] = renderingId;
+    }
+    if (renderingIdDimensionValue != null) {
+      _json["renderingIdDimensionValue"] = (renderingIdDimensionValue).toJson();
+    }
+    if (requiredFlashPluginVersion != null) {
+      _json["requiredFlashPluginVersion"] = requiredFlashPluginVersion;
+    }
+    if (requiredFlashVersion != null) {
+      _json["requiredFlashVersion"] = requiredFlashVersion;
+    }
+    if (size != null) {
+      _json["size"] = (size).toJson();
+    }
+    if (skipOffset != null) {
+      _json["skipOffset"] = (skipOffset).toJson();
+    }
+    if (skippable != null) {
+      _json["skippable"] = skippable;
+    }
+    if (sslCompliant != null) {
+      _json["sslCompliant"] = sslCompliant;
+    }
+    if (sslOverride != null) {
+      _json["sslOverride"] = sslOverride;
+    }
+    if (studioAdvertiserId != null) {
+      _json["studioAdvertiserId"] = studioAdvertiserId;
+    }
+    if (studioCreativeId != null) {
+      _json["studioCreativeId"] = studioCreativeId;
+    }
+    if (studioTraffickedCreativeId != null) {
+      _json["studioTraffickedCreativeId"] = studioTraffickedCreativeId;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (thirdPartyBackupImageImpressionsUrl != null) {
+      _json["thirdPartyBackupImageImpressionsUrl"] =
+          thirdPartyBackupImageImpressionsUrl;
+    }
+    if (thirdPartyRichMediaImpressionsUrl != null) {
+      _json["thirdPartyRichMediaImpressionsUrl"] =
+          thirdPartyRichMediaImpressionsUrl;
+    }
+    if (thirdPartyUrls != null) {
+      _json["thirdPartyUrls"] =
+          thirdPartyUrls.map((value) => (value).toJson()).toList();
+    }
+    if (timerCustomEvents != null) {
+      _json["timerCustomEvents"] =
+          timerCustomEvents.map((value) => (value).toJson()).toList();
+    }
+    if (totalFileSize != null) {
+      _json["totalFileSize"] = totalFileSize;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (universalAdId != null) {
+      _json["universalAdId"] = (universalAdId).toJson();
+    }
+    if (version != null) {
+      _json["version"] = version;
+    }
+    if (videoDescription != null) {
+      _json["videoDescription"] = videoDescription;
+    }
+    if (videoDuration != null) {
+      _json["videoDuration"] = videoDuration;
+    }
+    return _json;
+  }
+}
+
+/// Creative Asset.
+class CreativeAsset {
+  /// Whether ActionScript3 is enabled for the flash asset. This is a read-only
+  /// field. Applicable to the following creative type: FLASH_INPAGE. Applicable
+  /// to DISPLAY when the primary asset type is not HTML_IMAGE.
+  core.bool actionScript3;
+
+  /// Whether the video asset is active. This is a read-only field for
+  /// VPAID_NON_LINEAR_VIDEO assets. Applicable to the following creative types:
+  /// INSTREAM_VIDEO and all VPAID.
+  core.bool active;
+
+  /// Possible alignments for an asset. This is a read-only field. Applicable to
+  /// the following creative types:
+  /// RICH_MEDIA_DISPLAY_MULTI_FLOATING_INTERSTITIAL.
+  /// Possible string values are:
+  /// - "ALIGNMENT_BOTTOM"
+  /// - "ALIGNMENT_LEFT"
+  /// - "ALIGNMENT_RIGHT"
+  /// - "ALIGNMENT_TOP"
+  core.String alignment;
+
+  /// Artwork type of rich media creative. This is a read-only field. Applicable
+  /// to the following creative types: all RICH_MEDIA.
+  /// Possible string values are:
+  /// - "ARTWORK_TYPE_FLASH"
+  /// - "ARTWORK_TYPE_HTML5"
+  /// - "ARTWORK_TYPE_IMAGE"
+  /// - "ARTWORK_TYPE_MIXED"
+  core.String artworkType;
+
+  /// Identifier of this asset. This is the same identifier returned during
+  /// creative asset insert operation. This is a required field. Applicable to
+  /// all but the following creative types: all REDIRECT and TRACKING_TEXT.
+  CreativeAssetId assetIdentifier;
+
+  /// Exit event configured for the backup image. Applicable to the following
+  /// creative types: all RICH_MEDIA.
+  CreativeCustomEvent backupImageExit;
+
+  /// Detected bit-rate for video asset. This is a read-only field. Applicable
+  /// to the following creative types: INSTREAM_VIDEO and all VPAID.
+  core.int bitRate;
+
+  /// Rich media child asset type. This is a read-only field. Applicable to the
+  /// following creative types: all VPAID.
+  /// Possible string values are:
+  /// - "CHILD_ASSET_TYPE_DATA"
+  /// - "CHILD_ASSET_TYPE_FLASH"
+  /// - "CHILD_ASSET_TYPE_IMAGE"
+  /// - "CHILD_ASSET_TYPE_VIDEO"
+  core.String childAssetType;
+
+  /// Size of an asset when collapsed. This is a read-only field. Applicable to
+  /// the following creative types: all RICH_MEDIA and all VPAID. Additionally,
+  /// applicable to assets whose displayType is ASSET_DISPLAY_TYPE_EXPANDING or
+  /// ASSET_DISPLAY_TYPE_PEEL_DOWN.
+  Size collapsedSize;
+
+  /// List of companion creatives assigned to an in-stream video creative asset.
+  /// Acceptable values include IDs of existing flash and image creatives.
+  /// Applicable to INSTREAM_VIDEO creative type with dynamicAssetSelection set
+  /// to true.
+  core.List<core.String> companionCreativeIds;
+
+  /// Custom start time in seconds for making the asset visible. Applicable to
+  /// the following creative types: all RICH_MEDIA. Value must be greater than
+  /// or equal to 0.
+  core.int customStartTimeValue;
+
+  /// List of feature dependencies for the creative asset that are detected by
+  /// DCM. Feature dependencies are features that a browser must be able to
+  /// support in order to render your HTML5 creative correctly. This is a
+  /// read-only, auto-generated field. Applicable to the following creative
+  /// types: HTML5_BANNER. Applicable to DISPLAY when the primary asset type is
+  /// not HTML_IMAGE.
+  core.List<core.String> detectedFeatures;
+
+  /// Type of rich media asset. This is a read-only field. Applicable to the
+  /// following creative types: all RICH_MEDIA.
+  /// Possible string values are:
+  /// - "ASSET_DISPLAY_TYPE_BACKDROP"
+  /// - "ASSET_DISPLAY_TYPE_EXPANDING"
+  /// - "ASSET_DISPLAY_TYPE_FLASH_IN_FLASH"
+  /// - "ASSET_DISPLAY_TYPE_FLASH_IN_FLASH_EXPANDING"
+  /// - "ASSET_DISPLAY_TYPE_FLOATING"
+  /// - "ASSET_DISPLAY_TYPE_INPAGE"
+  /// - "ASSET_DISPLAY_TYPE_OVERLAY"
+  /// - "ASSET_DISPLAY_TYPE_PEEL_DOWN"
+  /// - "ASSET_DISPLAY_TYPE_VPAID_LINEAR"
+  /// - "ASSET_DISPLAY_TYPE_VPAID_NON_LINEAR"
+  core.String displayType;
+
+  /// Duration in seconds for which an asset will be displayed. Applicable to
+  /// the following creative types: INSTREAM_VIDEO and VPAID_LINEAR_VIDEO. Value
+  /// must be greater than or equal to 1.
+  core.int duration;
+
+  /// Duration type for which an asset will be displayed. Applicable to the
+  /// following creative types: all RICH_MEDIA.
+  /// Possible string values are:
+  /// - "ASSET_DURATION_TYPE_AUTO"
+  /// - "ASSET_DURATION_TYPE_CUSTOM"
+  /// - "ASSET_DURATION_TYPE_NONE"
+  core.String durationType;
+
+  /// Detected expanded dimension for video asset. This is a read-only field.
+  /// Applicable to the following creative types: INSTREAM_VIDEO and all VPAID.
+  Size expandedDimension;
+
+  /// File size associated with this creative asset. This is a read-only field.
+  /// Applicable to all but the following creative types: all REDIRECT and
+  /// TRACKING_TEXT.
+  core.String fileSize;
+
+  /// Flash version of the asset. This is a read-only field. Applicable to the
+  /// following creative types: FLASH_INPAGE, all RICH_MEDIA, and all VPAID.
+  /// Applicable to DISPLAY when the primary asset type is not HTML_IMAGE.
+  core.int flashVersion;
+
+  /// Whether to hide Flash objects flag for an asset. Applicable to the
+  /// following creative types: all RICH_MEDIA.
+  core.bool hideFlashObjects;
+
+  /// Whether to hide selection boxes flag for an asset. Applicable to the
+  /// following creative types: all RICH_MEDIA.
+  core.bool hideSelectionBoxes;
+
+  /// Whether the asset is horizontally locked. This is a read-only field.
+  /// Applicable to the following creative types: all RICH_MEDIA.
+  core.bool horizontallyLocked;
+
+  /// Numeric ID of this creative asset. This is a required field and should not
+  /// be modified. Applicable to all but the following creative types: all
+  /// REDIRECT and TRACKING_TEXT.
+  core.String id;
+
+  /// Dimension value for the ID of the asset. This is a read-only,
+  /// auto-generated field.
+  DimensionValue idDimensionValue;
+
+  /// Detected MIME type for video asset. This is a read-only field. Applicable
+  /// to the following creative types: INSTREAM_VIDEO and all VPAID.
+  core.String mimeType;
+
+  /// Offset position for an asset in collapsed mode. This is a read-only field.
+  /// Applicable to the following creative types: all RICH_MEDIA and all VPAID.
+  /// Additionally, only applicable to assets whose displayType is
+  /// ASSET_DISPLAY_TYPE_EXPANDING or ASSET_DISPLAY_TYPE_PEEL_DOWN.
+  OffsetPosition offset;
+
+  /// Orientation of video asset. This is a read-only, auto-generated field.
+  /// Possible string values are:
+  /// - "LANDSCAPE"
+  /// - "PORTRAIT"
+  /// - "SQUARE"
+  core.String orientation;
+
+  /// Whether the backup asset is original or changed by the user in DCM.
+  /// Applicable to the following creative types: all RICH_MEDIA.
+  core.bool originalBackup;
+
+  /// Offset position for an asset. Applicable to the following creative types:
+  /// all RICH_MEDIA.
+  OffsetPosition position;
+
+  /// Offset left unit for an asset. This is a read-only field. Applicable to
+  /// the following creative types: all RICH_MEDIA.
+  /// Possible string values are:
+  /// - "OFFSET_UNIT_PERCENT"
+  /// - "OFFSET_UNIT_PIXEL"
+  /// - "OFFSET_UNIT_PIXEL_FROM_CENTER"
+  core.String positionLeftUnit;
+
+  /// Offset top unit for an asset. This is a read-only field if the asset
+  /// displayType is ASSET_DISPLAY_TYPE_OVERLAY. Applicable to the following
+  /// creative types: all RICH_MEDIA.
+  /// Possible string values are:
+  /// - "OFFSET_UNIT_PERCENT"
+  /// - "OFFSET_UNIT_PIXEL"
+  /// - "OFFSET_UNIT_PIXEL_FROM_CENTER"
+  core.String positionTopUnit;
+
+  /// Progressive URL for video asset. This is a read-only field. Applicable to
+  /// the following creative types: INSTREAM_VIDEO and all VPAID.
+  core.String progressiveServingUrl;
+
+  /// Whether the asset pushes down other content. Applicable to the following
+  /// creative types: all RICH_MEDIA. Additionally, only applicable when the
+  /// asset offsets are 0, the collapsedSize.width matches size.width, and the
+  /// collapsedSize.height is less than size.height.
+  core.bool pushdown;
+
+  /// Pushdown duration in seconds for an asset. Applicable to the following
+  /// creative types: all RICH_MEDIA.Additionally, only applicable when the
+  /// asset pushdown field is true, the offsets are 0, the collapsedSize.width
+  /// matches size.width, and the collapsedSize.height is less than size.height.
+  /// Acceptable values are 0 to 9.99, inclusive.
+  core.double pushdownDuration;
+
+  /// Role of the asset in relation to creative. Applicable to all but the
+  /// following creative types: all REDIRECT and TRACKING_TEXT. This is a
+  /// required field.
+  /// PRIMARY applies to DISPLAY, FLASH_INPAGE, HTML5_BANNER, IMAGE,
+  /// DISPLAY_IMAGE_GALLERY, all RICH_MEDIA (which may contain multiple primary
+  /// assets), and all VPAID creatives.
+  /// BACKUP_IMAGE applies to FLASH_INPAGE, HTML5_BANNER, all RICH_MEDIA, and
+  /// all VPAID creatives. Applicable to DISPLAY when the primary asset type is
+  /// not HTML_IMAGE.
+  /// ADDITIONAL_IMAGE and ADDITIONAL_FLASH apply to FLASH_INPAGE creatives.
+  /// OTHER refers to assets from sources other than DCM, such as Studio
+  /// uploaded assets, applicable to all RICH_MEDIA and all VPAID creatives.
+  /// PARENT_VIDEO refers to videos uploaded by the user in DCM and is
+  /// applicable to INSTREAM_VIDEO and VPAID_LINEAR_VIDEO creatives.
+  /// TRANSCODED_VIDEO refers to videos transcoded by DCM from PARENT_VIDEO
+  /// assets and is applicable to INSTREAM_VIDEO and VPAID_LINEAR_VIDEO
+  /// creatives.
+  /// ALTERNATE_VIDEO refers to the DCM representation of child asset videos
+  /// from Studio, and is applicable to VPAID_LINEAR_VIDEO creatives. These
+  /// cannot be added or removed within DCM.
+  /// For VPAID_LINEAR_VIDEO creatives, PARENT_VIDEO, TRANSCODED_VIDEO and
+  /// ALTERNATE_VIDEO assets that are marked active serve as backup in case the
+  /// VPAID creative cannot be served. Only PARENT_VIDEO assets can be added or
+  /// removed for an INSTREAM_VIDEO or VPAID_LINEAR_VIDEO creative.
+  /// Possible string values are:
+  /// - "ADDITIONAL_FLASH"
+  /// - "ADDITIONAL_IMAGE"
+  /// - "ALTERNATE_VIDEO"
+  /// - "BACKUP_IMAGE"
+  /// - "OTHER"
+  /// - "PARENT_VIDEO"
+  /// - "PRIMARY"
+  /// - "TRANSCODED_VIDEO"
+  core.String role;
+
+  /// Size associated with this creative asset. This is a required field when
+  /// applicable; however for IMAGE and FLASH_INPAGE, creatives if left blank,
+  /// this field will be automatically set using the actual size of the
+  /// associated image asset. Applicable to the following creative types:
+  /// DISPLAY_IMAGE_GALLERY, FLASH_INPAGE, HTML5_BANNER, IMAGE, and all
+  /// RICH_MEDIA. Applicable to DISPLAY when the primary asset type is not
+  /// HTML_IMAGE.
+  Size size;
+
+  /// Whether the asset is SSL-compliant. This is a read-only field. Applicable
+  /// to all but the following creative types: all REDIRECT and TRACKING_TEXT.
+  core.bool sslCompliant;
+
+  /// Initial wait time type before making the asset visible. Applicable to the
+  /// following creative types: all RICH_MEDIA.
+  /// Possible string values are:
+  /// - "ASSET_START_TIME_TYPE_CUSTOM"
+  /// - "ASSET_START_TIME_TYPE_NONE"
+  core.String startTimeType;
+
+  /// Streaming URL for video asset. This is a read-only field. Applicable to
+  /// the following creative types: INSTREAM_VIDEO and all VPAID.
+  core.String streamingServingUrl;
+
+  /// Whether the asset is transparent. Applicable to the following creative
+  /// types: all RICH_MEDIA. Additionally, only applicable to HTML5 assets.
+  core.bool transparency;
+
+  /// Whether the asset is vertically locked. This is a read-only field.
+  /// Applicable to the following creative types: all RICH_MEDIA.
+  core.bool verticallyLocked;
+
+  /// Detected video duration for video asset. This is a read-only field.
+  /// Applicable to the following creative types: INSTREAM_VIDEO and all VPAID.
+  core.double videoDuration;
+
+  /// Window mode options for flash assets. Applicable to the following creative
+  /// types: FLASH_INPAGE, RICH_MEDIA_DISPLAY_EXPANDING, RICH_MEDIA_IM_EXPAND,
+  /// RICH_MEDIA_DISPLAY_BANNER, and RICH_MEDIA_INPAGE_FLOATING.
+  /// Possible string values are:
+  /// - "OPAQUE"
+  /// - "TRANSPARENT"
+  /// - "WINDOW"
+  core.String windowMode;
+
+  /// zIndex value of an asset. Applicable to the following creative types: all
+  /// RICH_MEDIA.Additionally, only applicable to assets whose displayType is
+  /// NOT one of the following types: ASSET_DISPLAY_TYPE_INPAGE or
+  /// ASSET_DISPLAY_TYPE_OVERLAY. Acceptable values are -999999999 to 999999999,
+  /// inclusive.
+  core.int zIndex;
+
+  /// File name of zip file. This is a read-only field. Applicable to the
+  /// following creative types: HTML5_BANNER.
+  core.String zipFilename;
+
+  /// Size of zip file. This is a read-only field. Applicable to the following
+  /// creative types: HTML5_BANNER.
+  core.String zipFilesize;
+
+  CreativeAsset();
+
+  CreativeAsset.fromJson(core.Map _json) {
+    if (_json.containsKey("actionScript3")) {
+      actionScript3 = _json["actionScript3"];
+    }
+    if (_json.containsKey("active")) {
+      active = _json["active"];
+    }
+    if (_json.containsKey("alignment")) {
+      alignment = _json["alignment"];
+    }
+    if (_json.containsKey("artworkType")) {
+      artworkType = _json["artworkType"];
+    }
+    if (_json.containsKey("assetIdentifier")) {
+      assetIdentifier = new CreativeAssetId.fromJson(_json["assetIdentifier"]);
+    }
+    if (_json.containsKey("backupImageExit")) {
+      backupImageExit =
+          new CreativeCustomEvent.fromJson(_json["backupImageExit"]);
+    }
+    if (_json.containsKey("bitRate")) {
+      bitRate = _json["bitRate"];
+    }
+    if (_json.containsKey("childAssetType")) {
+      childAssetType = _json["childAssetType"];
+    }
+    if (_json.containsKey("collapsedSize")) {
+      collapsedSize = new Size.fromJson(_json["collapsedSize"]);
+    }
+    if (_json.containsKey("companionCreativeIds")) {
+      companionCreativeIds = _json["companionCreativeIds"];
+    }
+    if (_json.containsKey("customStartTimeValue")) {
+      customStartTimeValue = _json["customStartTimeValue"];
+    }
+    if (_json.containsKey("detectedFeatures")) {
+      detectedFeatures = _json["detectedFeatures"];
+    }
+    if (_json.containsKey("displayType")) {
+      displayType = _json["displayType"];
+    }
+    if (_json.containsKey("duration")) {
+      duration = _json["duration"];
+    }
+    if (_json.containsKey("durationType")) {
+      durationType = _json["durationType"];
+    }
+    if (_json.containsKey("expandedDimension")) {
+      expandedDimension = new Size.fromJson(_json["expandedDimension"]);
+    }
+    if (_json.containsKey("fileSize")) {
+      fileSize = _json["fileSize"];
+    }
+    if (_json.containsKey("flashVersion")) {
+      flashVersion = _json["flashVersion"];
+    }
+    if (_json.containsKey("hideFlashObjects")) {
+      hideFlashObjects = _json["hideFlashObjects"];
+    }
+    if (_json.containsKey("hideSelectionBoxes")) {
+      hideSelectionBoxes = _json["hideSelectionBoxes"];
+    }
+    if (_json.containsKey("horizontallyLocked")) {
+      horizontallyLocked = _json["horizontallyLocked"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("idDimensionValue")) {
+      idDimensionValue = new DimensionValue.fromJson(_json["idDimensionValue"]);
+    }
+    if (_json.containsKey("mimeType")) {
+      mimeType = _json["mimeType"];
+    }
+    if (_json.containsKey("offset")) {
+      offset = new OffsetPosition.fromJson(_json["offset"]);
+    }
+    if (_json.containsKey("orientation")) {
+      orientation = _json["orientation"];
+    }
+    if (_json.containsKey("originalBackup")) {
+      originalBackup = _json["originalBackup"];
+    }
+    if (_json.containsKey("position")) {
+      position = new OffsetPosition.fromJson(_json["position"]);
+    }
+    if (_json.containsKey("positionLeftUnit")) {
+      positionLeftUnit = _json["positionLeftUnit"];
+    }
+    if (_json.containsKey("positionTopUnit")) {
+      positionTopUnit = _json["positionTopUnit"];
+    }
+    if (_json.containsKey("progressiveServingUrl")) {
+      progressiveServingUrl = _json["progressiveServingUrl"];
+    }
+    if (_json.containsKey("pushdown")) {
+      pushdown = _json["pushdown"];
+    }
+    if (_json.containsKey("pushdownDuration")) {
+      pushdownDuration = _json["pushdownDuration"];
+    }
+    if (_json.containsKey("role")) {
+      role = _json["role"];
+    }
+    if (_json.containsKey("size")) {
+      size = new Size.fromJson(_json["size"]);
+    }
+    if (_json.containsKey("sslCompliant")) {
+      sslCompliant = _json["sslCompliant"];
+    }
+    if (_json.containsKey("startTimeType")) {
+      startTimeType = _json["startTimeType"];
+    }
+    if (_json.containsKey("streamingServingUrl")) {
+      streamingServingUrl = _json["streamingServingUrl"];
+    }
+    if (_json.containsKey("transparency")) {
+      transparency = _json["transparency"];
+    }
+    if (_json.containsKey("verticallyLocked")) {
+      verticallyLocked = _json["verticallyLocked"];
+    }
+    if (_json.containsKey("videoDuration")) {
+      videoDuration = _json["videoDuration"];
+    }
+    if (_json.containsKey("windowMode")) {
+      windowMode = _json["windowMode"];
+    }
+    if (_json.containsKey("zIndex")) {
+      zIndex = _json["zIndex"];
+    }
+    if (_json.containsKey("zipFilename")) {
+      zipFilename = _json["zipFilename"];
+    }
+    if (_json.containsKey("zipFilesize")) {
+      zipFilesize = _json["zipFilesize"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (actionScript3 != null) {
+      _json["actionScript3"] = actionScript3;
+    }
+    if (active != null) {
+      _json["active"] = active;
+    }
+    if (alignment != null) {
+      _json["alignment"] = alignment;
+    }
+    if (artworkType != null) {
+      _json["artworkType"] = artworkType;
+    }
+    if (assetIdentifier != null) {
+      _json["assetIdentifier"] = (assetIdentifier).toJson();
+    }
+    if (backupImageExit != null) {
+      _json["backupImageExit"] = (backupImageExit).toJson();
+    }
+    if (bitRate != null) {
+      _json["bitRate"] = bitRate;
+    }
+    if (childAssetType != null) {
+      _json["childAssetType"] = childAssetType;
+    }
+    if (collapsedSize != null) {
+      _json["collapsedSize"] = (collapsedSize).toJson();
+    }
+    if (companionCreativeIds != null) {
+      _json["companionCreativeIds"] = companionCreativeIds;
+    }
+    if (customStartTimeValue != null) {
+      _json["customStartTimeValue"] = customStartTimeValue;
+    }
+    if (detectedFeatures != null) {
+      _json["detectedFeatures"] = detectedFeatures;
+    }
+    if (displayType != null) {
+      _json["displayType"] = displayType;
+    }
+    if (duration != null) {
+      _json["duration"] = duration;
+    }
+    if (durationType != null) {
+      _json["durationType"] = durationType;
+    }
+    if (expandedDimension != null) {
+      _json["expandedDimension"] = (expandedDimension).toJson();
+    }
+    if (fileSize != null) {
+      _json["fileSize"] = fileSize;
+    }
+    if (flashVersion != null) {
+      _json["flashVersion"] = flashVersion;
+    }
+    if (hideFlashObjects != null) {
+      _json["hideFlashObjects"] = hideFlashObjects;
+    }
+    if (hideSelectionBoxes != null) {
+      _json["hideSelectionBoxes"] = hideSelectionBoxes;
+    }
+    if (horizontallyLocked != null) {
+      _json["horizontallyLocked"] = horizontallyLocked;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (idDimensionValue != null) {
+      _json["idDimensionValue"] = (idDimensionValue).toJson();
+    }
+    if (mimeType != null) {
+      _json["mimeType"] = mimeType;
+    }
+    if (offset != null) {
+      _json["offset"] = (offset).toJson();
+    }
+    if (orientation != null) {
+      _json["orientation"] = orientation;
+    }
+    if (originalBackup != null) {
+      _json["originalBackup"] = originalBackup;
+    }
+    if (position != null) {
+      _json["position"] = (position).toJson();
+    }
+    if (positionLeftUnit != null) {
+      _json["positionLeftUnit"] = positionLeftUnit;
+    }
+    if (positionTopUnit != null) {
+      _json["positionTopUnit"] = positionTopUnit;
+    }
+    if (progressiveServingUrl != null) {
+      _json["progressiveServingUrl"] = progressiveServingUrl;
+    }
+    if (pushdown != null) {
+      _json["pushdown"] = pushdown;
+    }
+    if (pushdownDuration != null) {
+      _json["pushdownDuration"] = pushdownDuration;
+    }
+    if (role != null) {
+      _json["role"] = role;
+    }
+    if (size != null) {
+      _json["size"] = (size).toJson();
+    }
+    if (sslCompliant != null) {
+      _json["sslCompliant"] = sslCompliant;
+    }
+    if (startTimeType != null) {
+      _json["startTimeType"] = startTimeType;
+    }
+    if (streamingServingUrl != null) {
+      _json["streamingServingUrl"] = streamingServingUrl;
+    }
+    if (transparency != null) {
+      _json["transparency"] = transparency;
+    }
+    if (verticallyLocked != null) {
+      _json["verticallyLocked"] = verticallyLocked;
+    }
+    if (videoDuration != null) {
+      _json["videoDuration"] = videoDuration;
+    }
+    if (windowMode != null) {
+      _json["windowMode"] = windowMode;
+    }
+    if (zIndex != null) {
+      _json["zIndex"] = zIndex;
+    }
+    if (zipFilename != null) {
+      _json["zipFilename"] = zipFilename;
+    }
+    if (zipFilesize != null) {
+      _json["zipFilesize"] = zipFilesize;
+    }
+    return _json;
+  }
+}
+
+/// Creative Asset ID.
+class CreativeAssetId {
+  /// Name of the creative asset. This is a required field while inserting an
+  /// asset. After insertion, this assetIdentifier is used to identify the
+  /// uploaded asset. Characters in the name must be alphanumeric or one of the
+  /// following: ".-_ ". Spaces are allowed.
+  core.String name;
+
+  /// Type of asset to upload. This is a required field. FLASH and IMAGE are no
+  /// longer supported for new uploads. All image assets should use HTML_IMAGE.
+  /// Possible string values are:
+  /// - "FLASH"
+  /// - "HTML"
+  /// - "HTML_IMAGE"
+  /// - "IMAGE"
+  /// - "VIDEO"
+  core.String type;
+
+  CreativeAssetId();
+
+  CreativeAssetId.fromJson(core.Map _json) {
+    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 (name != null) {
+      _json["name"] = name;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+/// CreativeAssets contains properties of a creative asset file which will be
+/// uploaded or has already been uploaded. Refer to the creative sample code for
+/// how to upload assets and insert a creative.
+class CreativeAssetMetadata {
+  /// ID of the creative asset. This is a required field.
+  CreativeAssetId assetIdentifier;
+
+  /// List of detected click tags for assets. This is a read-only auto-generated
+  /// field.
+  core.List<ClickTag> clickTags;
+
+  /// List of feature dependencies for the creative asset that are detected by
+  /// DCM. Feature dependencies are features that a browser must be able to
+  /// support in order to render your HTML5 creative correctly. This is a
+  /// read-only, auto-generated field.
+  core.List<core.String> detectedFeatures;
+
+  /// Numeric ID of the asset. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Dimension value for the numeric ID of the asset. This is a read-only,
+  /// auto-generated field.
+  DimensionValue idDimensionValue;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#creativeAssetMetadata".
+  core.String kind;
+
+  /// Rules validated during code generation that generated a warning. This is a
+  /// read-only, auto-generated field.
+  ///
+  /// Possible values are:
+  /// - "ADMOB_REFERENCED"
+  /// - "ASSET_FORMAT_UNSUPPORTED_DCM"
+  /// - "ASSET_INVALID"
+  /// - "CLICK_TAG_HARD_CODED"
+  /// - "CLICK_TAG_INVALID"
+  /// - "CLICK_TAG_IN_GWD"
+  /// - "CLICK_TAG_MISSING"
+  /// - "CLICK_TAG_MORE_THAN_ONE"
+  /// - "CLICK_TAG_NON_TOP_LEVEL"
+  /// - "COMPONENT_UNSUPPORTED_DCM"
+  /// - "ENABLER_UNSUPPORTED_METHOD_DCM"
+  /// - "EXTERNAL_FILE_REFERENCED"
+  /// - "FILE_DETAIL_EMPTY"
+  /// - "FILE_TYPE_INVALID"
+  /// - "GWD_PROPERTIES_INVALID"
+  /// - "HTML5_FEATURE_UNSUPPORTED"
+  /// - "LINKED_FILE_NOT_FOUND"
+  /// - "MAX_FLASH_VERSION_11"
+  /// - "MRAID_REFERENCED"
+  /// - "NOT_SSL_COMPLIANT"
+  /// - "ORPHANED_ASSET"
+  /// - "PRIMARY_HTML_MISSING"
+  /// - "SVG_INVALID"
+  /// - "ZIP_INVALID"
+  core.List<core.String> warnedValidationRules;
+
+  CreativeAssetMetadata();
+
+  CreativeAssetMetadata.fromJson(core.Map _json) {
+    if (_json.containsKey("assetIdentifier")) {
+      assetIdentifier = new CreativeAssetId.fromJson(_json["assetIdentifier"]);
+    }
+    if (_json.containsKey("clickTags")) {
+      clickTags = _json["clickTags"]
+          .map((value) => new ClickTag.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("detectedFeatures")) {
+      detectedFeatures = _json["detectedFeatures"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("idDimensionValue")) {
+      idDimensionValue = new DimensionValue.fromJson(_json["idDimensionValue"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("warnedValidationRules")) {
+      warnedValidationRules = _json["warnedValidationRules"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (assetIdentifier != null) {
+      _json["assetIdentifier"] = (assetIdentifier).toJson();
+    }
+    if (clickTags != null) {
+      _json["clickTags"] = clickTags.map((value) => (value).toJson()).toList();
+    }
+    if (detectedFeatures != null) {
+      _json["detectedFeatures"] = detectedFeatures;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (idDimensionValue != null) {
+      _json["idDimensionValue"] = (idDimensionValue).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (warnedValidationRules != null) {
+      _json["warnedValidationRules"] = warnedValidationRules;
+    }
+    return _json;
+  }
+}
+
+/// Encapsulates the list of rules for asset selection and a default asset in
+/// case none of the rules match. Applicable to INSTREAM_VIDEO creatives.
+class CreativeAssetSelection {
+  /// A creativeAssets[].id. This should refer to one of the parent assets in
+  /// this creative, and will be served if none of the rules match. This is a
+  /// required field.
+  core.String defaultAssetId;
+
+  /// Rules determine which asset will be served to a viewer. Rules will be
+  /// evaluated in the order in which they are stored in this list. This list
+  /// must contain at least one rule. Applicable to INSTREAM_VIDEO creatives.
+  core.List<Rule> rules;
+
+  CreativeAssetSelection();
+
+  CreativeAssetSelection.fromJson(core.Map _json) {
+    if (_json.containsKey("defaultAssetId")) {
+      defaultAssetId = _json["defaultAssetId"];
+    }
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"].map((value) => new Rule.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 (defaultAssetId != null) {
+      _json["defaultAssetId"] = defaultAssetId;
+    }
+    if (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Creative Assignment.
+class CreativeAssignment {
+  /// Whether this creative assignment is active. When true, the creative will
+  /// be included in the ad's rotation.
+  core.bool active;
+
+  /// Whether applicable event tags should fire when this creative assignment is
+  /// rendered. If this value is unset when the ad is inserted or updated, it
+  /// will default to true for all creative types EXCEPT for INTERNAL_REDIRECT,
+  /// INTERSTITIAL_INTERNAL_REDIRECT, and INSTREAM_VIDEO.
+  core.bool applyEventTags;
+
+  /// Click-through URL of the creative assignment.
+  ClickThroughUrl clickThroughUrl;
+
+  /// Companion creative overrides for this creative assignment. Applicable to
+  /// video ads.
+  core.List<CompanionClickThroughOverride> companionCreativeOverrides;
+
+  /// Creative group assignments for this creative assignment. Only one
+  /// assignment per creative group number is allowed for a maximum of two
+  /// assignments.
+  core.List<CreativeGroupAssignment> creativeGroupAssignments;
+
+  /// ID of the creative to be assigned. This is a required field.
+  core.String creativeId;
+
+  /// Dimension value for the ID of the creative. This is a read-only,
+  /// auto-generated field.
+  DimensionValue creativeIdDimensionValue;
+
+  /// Date and time that the assigned creative should stop serving. Must be
+  /// later than the start time.
+  core.DateTime endTime;
+
+  /// Rich media exit overrides for this creative assignment.
+  /// Applicable when the creative type is any of the following:
+  /// - DISPLAY
+  /// - RICH_MEDIA_INPAGE
+  /// - RICH_MEDIA_INPAGE_FLOATING
+  /// - RICH_MEDIA_IM_EXPAND
+  /// - RICH_MEDIA_EXPANDING
+  /// - RICH_MEDIA_INTERSTITIAL_FLOAT
+  /// - RICH_MEDIA_MOBILE_IN_APP
+  /// - RICH_MEDIA_MULTI_FLOATING
+  /// - RICH_MEDIA_PEEL_DOWN
+  /// - VPAID_LINEAR
+  /// - VPAID_NON_LINEAR
+  core.List<RichMediaExitOverride> richMediaExitOverrides;
+
+  /// Sequence number of the creative assignment, applicable when the rotation
+  /// type is CREATIVE_ROTATION_TYPE_SEQUENTIAL. Acceptable values are 1 to
+  /// 65535, inclusive.
+  core.int sequence;
+
+  /// Whether the creative to be assigned is SSL-compliant. This is a read-only
+  /// field that is auto-generated when the ad is inserted or updated.
+  core.bool sslCompliant;
+
+  /// Date and time that the assigned creative should start serving.
+  core.DateTime startTime;
+
+  /// Weight of the creative assignment, applicable when the rotation type is
+  /// CREATIVE_ROTATION_TYPE_RANDOM. Value must be greater than or equal to 1.
+  core.int weight;
+
+  CreativeAssignment();
+
+  CreativeAssignment.fromJson(core.Map _json) {
+    if (_json.containsKey("active")) {
+      active = _json["active"];
+    }
+    if (_json.containsKey("applyEventTags")) {
+      applyEventTags = _json["applyEventTags"];
+    }
+    if (_json.containsKey("clickThroughUrl")) {
+      clickThroughUrl = new ClickThroughUrl.fromJson(_json["clickThroughUrl"]);
+    }
+    if (_json.containsKey("companionCreativeOverrides")) {
+      companionCreativeOverrides = _json["companionCreativeOverrides"]
+          .map((value) => new CompanionClickThroughOverride.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("creativeGroupAssignments")) {
+      creativeGroupAssignments = _json["creativeGroupAssignments"]
+          .map((value) => new CreativeGroupAssignment.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("creativeId")) {
+      creativeId = _json["creativeId"];
+    }
+    if (_json.containsKey("creativeIdDimensionValue")) {
+      creativeIdDimensionValue =
+          new DimensionValue.fromJson(_json["creativeIdDimensionValue"]);
+    }
+    if (_json.containsKey("endTime")) {
+      endTime = core.DateTime.parse(_json["endTime"]);
+    }
+    if (_json.containsKey("richMediaExitOverrides")) {
+      richMediaExitOverrides = _json["richMediaExitOverrides"]
+          .map((value) => new RichMediaExitOverride.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("sequence")) {
+      sequence = _json["sequence"];
+    }
+    if (_json.containsKey("sslCompliant")) {
+      sslCompliant = _json["sslCompliant"];
+    }
+    if (_json.containsKey("startTime")) {
+      startTime = core.DateTime.parse(_json["startTime"]);
+    }
+    if (_json.containsKey("weight")) {
+      weight = _json["weight"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (active != null) {
+      _json["active"] = active;
+    }
+    if (applyEventTags != null) {
+      _json["applyEventTags"] = applyEventTags;
+    }
+    if (clickThroughUrl != null) {
+      _json["clickThroughUrl"] = (clickThroughUrl).toJson();
+    }
+    if (companionCreativeOverrides != null) {
+      _json["companionCreativeOverrides"] =
+          companionCreativeOverrides.map((value) => (value).toJson()).toList();
+    }
+    if (creativeGroupAssignments != null) {
+      _json["creativeGroupAssignments"] =
+          creativeGroupAssignments.map((value) => (value).toJson()).toList();
+    }
+    if (creativeId != null) {
+      _json["creativeId"] = creativeId;
+    }
+    if (creativeIdDimensionValue != null) {
+      _json["creativeIdDimensionValue"] = (creativeIdDimensionValue).toJson();
+    }
+    if (endTime != null) {
+      _json["endTime"] = (endTime).toIso8601String();
+    }
+    if (richMediaExitOverrides != null) {
+      _json["richMediaExitOverrides"] =
+          richMediaExitOverrides.map((value) => (value).toJson()).toList();
+    }
+    if (sequence != null) {
+      _json["sequence"] = sequence;
+    }
+    if (sslCompliant != null) {
+      _json["sslCompliant"] = sslCompliant;
+    }
+    if (startTime != null) {
+      _json["startTime"] = (startTime).toIso8601String();
+    }
+    if (weight != null) {
+      _json["weight"] = weight;
+    }
+    return _json;
+  }
+}
+
+/// Click-through URL
+class CreativeClickThroughUrl {
+  /// Read-only convenience field representing the actual URL that will be used
+  /// for this click-through. The URL is computed as follows:
+  /// - If landingPageId is specified then that landing page's URL is assigned
+  /// to this field.
+  /// - Otherwise, the customClickThroughUrl is assigned to this field.
+  core.String computedClickThroughUrl;
+
+  /// Custom click-through URL. Applicable if the landingPageId field is left
+  /// unset.
+  core.String customClickThroughUrl;
+
+  /// ID of the landing page for the click-through URL.
+  core.String landingPageId;
+
+  CreativeClickThroughUrl();
+
+  CreativeClickThroughUrl.fromJson(core.Map _json) {
+    if (_json.containsKey("computedClickThroughUrl")) {
+      computedClickThroughUrl = _json["computedClickThroughUrl"];
+    }
+    if (_json.containsKey("customClickThroughUrl")) {
+      customClickThroughUrl = _json["customClickThroughUrl"];
+    }
+    if (_json.containsKey("landingPageId")) {
+      landingPageId = _json["landingPageId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (computedClickThroughUrl != null) {
+      _json["computedClickThroughUrl"] = computedClickThroughUrl;
+    }
+    if (customClickThroughUrl != null) {
+      _json["customClickThroughUrl"] = customClickThroughUrl;
+    }
+    if (landingPageId != null) {
+      _json["landingPageId"] = landingPageId;
+    }
+    return _json;
+  }
+}
+
+/// Creative Custom Event.
+class CreativeCustomEvent {
+  /// Unique ID of this event used by DDM Reporting and Data Transfer. This is a
+  /// read-only field.
+  core.String advertiserCustomEventId;
+
+  /// User-entered name for the event.
+  core.String advertiserCustomEventName;
+
+  /// Type of the event. This is a read-only field.
+  /// Possible string values are:
+  /// - "ADVERTISER_EVENT_COUNTER"
+  /// - "ADVERTISER_EVENT_EXIT"
+  /// - "ADVERTISER_EVENT_TIMER"
+  core.String advertiserCustomEventType;
+
+  /// Artwork label column, used to link events in DCM back to events in Studio.
+  /// This is a required field and should not be modified after insertion.
+  core.String artworkLabel;
+
+  /// Artwork type used by the creative.This is a read-only field.
+  /// Possible string values are:
+  /// - "ARTWORK_TYPE_FLASH"
+  /// - "ARTWORK_TYPE_HTML5"
+  /// - "ARTWORK_TYPE_IMAGE"
+  /// - "ARTWORK_TYPE_MIXED"
+  core.String artworkType;
+
+  /// Exit click-through URL for the event. This field is used only for exit
+  /// events.
+  CreativeClickThroughUrl exitClickThroughUrl;
+
+  /// ID of this event. This is a required field and should not be modified
+  /// after insertion.
+  core.String id;
+
+  /// Properties for rich media popup windows. This field is used only for exit
+  /// events.
+  PopupWindowProperties popupWindowProperties;
+
+  /// Target type used by the event.
+  /// Possible string values are:
+  /// - "TARGET_BLANK"
+  /// - "TARGET_PARENT"
+  /// - "TARGET_POPUP"
+  /// - "TARGET_SELF"
+  /// - "TARGET_TOP"
+  core.String targetType;
+
+  /// Video reporting ID, used to differentiate multiple videos in a single
+  /// creative. This is a read-only field.
+  core.String videoReportingId;
+
+  CreativeCustomEvent();
+
+  CreativeCustomEvent.fromJson(core.Map _json) {
+    if (_json.containsKey("advertiserCustomEventId")) {
+      advertiserCustomEventId = _json["advertiserCustomEventId"];
+    }
+    if (_json.containsKey("advertiserCustomEventName")) {
+      advertiserCustomEventName = _json["advertiserCustomEventName"];
+    }
+    if (_json.containsKey("advertiserCustomEventType")) {
+      advertiserCustomEventType = _json["advertiserCustomEventType"];
+    }
+    if (_json.containsKey("artworkLabel")) {
+      artworkLabel = _json["artworkLabel"];
+    }
+    if (_json.containsKey("artworkType")) {
+      artworkType = _json["artworkType"];
+    }
+    if (_json.containsKey("exitClickThroughUrl")) {
+      exitClickThroughUrl =
+          new CreativeClickThroughUrl.fromJson(_json["exitClickThroughUrl"]);
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("popupWindowProperties")) {
+      popupWindowProperties =
+          new PopupWindowProperties.fromJson(_json["popupWindowProperties"]);
+    }
+    if (_json.containsKey("targetType")) {
+      targetType = _json["targetType"];
+    }
+    if (_json.containsKey("videoReportingId")) {
+      videoReportingId = _json["videoReportingId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (advertiserCustomEventId != null) {
+      _json["advertiserCustomEventId"] = advertiserCustomEventId;
+    }
+    if (advertiserCustomEventName != null) {
+      _json["advertiserCustomEventName"] = advertiserCustomEventName;
+    }
+    if (advertiserCustomEventType != null) {
+      _json["advertiserCustomEventType"] = advertiserCustomEventType;
+    }
+    if (artworkLabel != null) {
+      _json["artworkLabel"] = artworkLabel;
+    }
+    if (artworkType != null) {
+      _json["artworkType"] = artworkType;
+    }
+    if (exitClickThroughUrl != null) {
+      _json["exitClickThroughUrl"] = (exitClickThroughUrl).toJson();
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (popupWindowProperties != null) {
+      _json["popupWindowProperties"] = (popupWindowProperties).toJson();
+    }
+    if (targetType != null) {
+      _json["targetType"] = targetType;
+    }
+    if (videoReportingId != null) {
+      _json["videoReportingId"] = videoReportingId;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a creative field.
+class CreativeField {
+  /// Account ID of this creative field. This is a read-only field that can be
+  /// left blank.
+  core.String accountId;
+
+  /// Advertiser ID of this creative field. This is a required field on
+  /// insertion.
+  core.String advertiserId;
+
+  /// Dimension value for the ID of the advertiser. This is a read-only,
+  /// auto-generated field.
+  DimensionValue advertiserIdDimensionValue;
+
+  /// ID of this creative field. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#creativeField".
+  core.String kind;
+
+  /// Name of this creative field. This is a required field and must be less
+  /// than 256 characters long and unique among creative fields of the same
+  /// advertiser.
+  core.String name;
+
+  /// Subaccount ID of this creative field. This is a read-only field that can
+  /// be left blank.
+  core.String subaccountId;
+
+  CreativeField();
+
+  CreativeField.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("advertiserIdDimensionValue")) {
+      advertiserIdDimensionValue =
+          new DimensionValue.fromJson(_json["advertiserIdDimensionValue"]);
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (advertiserIdDimensionValue != null) {
+      _json["advertiserIdDimensionValue"] =
+          (advertiserIdDimensionValue).toJson();
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    return _json;
+  }
+}
+
+/// Creative Field Assignment.
+class CreativeFieldAssignment {
+  /// ID of the creative field.
+  core.String creativeFieldId;
+
+  /// ID of the creative field value.
+  core.String creativeFieldValueId;
+
+  CreativeFieldAssignment();
+
+  CreativeFieldAssignment.fromJson(core.Map _json) {
+    if (_json.containsKey("creativeFieldId")) {
+      creativeFieldId = _json["creativeFieldId"];
+    }
+    if (_json.containsKey("creativeFieldValueId")) {
+      creativeFieldValueId = _json["creativeFieldValueId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (creativeFieldId != null) {
+      _json["creativeFieldId"] = creativeFieldId;
+    }
+    if (creativeFieldValueId != null) {
+      _json["creativeFieldValueId"] = creativeFieldValueId;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a creative field value.
+class CreativeFieldValue {
+  /// ID of this creative field value. This is a read-only, auto-generated
+  /// field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#creativeFieldValue".
+  core.String kind;
+
+  /// Value of this creative field value. It needs to be less than 256
+  /// characters in length and unique per creative field.
+  core.String value;
+
+  CreativeFieldValue();
+
+  CreativeFieldValue.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    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 (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+/// Creative Field Value List Response
+class CreativeFieldValuesListResponse {
+  /// Creative field value collection.
+  core.List<CreativeFieldValue> creativeFieldValues;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#creativeFieldValuesListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  CreativeFieldValuesListResponse();
+
+  CreativeFieldValuesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("creativeFieldValues")) {
+      creativeFieldValues = _json["creativeFieldValues"]
+          .map((value) => new CreativeFieldValue.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 (creativeFieldValues != null) {
+      _json["creativeFieldValues"] =
+          creativeFieldValues.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Creative Field List Response
+class CreativeFieldsListResponse {
+  /// Creative field collection.
+  core.List<CreativeField> creativeFields;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#creativeFieldsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  CreativeFieldsListResponse();
+
+  CreativeFieldsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("creativeFields")) {
+      creativeFields = _json["creativeFields"]
+          .map((value) => new CreativeField.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 (creativeFields != null) {
+      _json["creativeFields"] =
+          creativeFields.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a creative group.
+class CreativeGroup {
+  /// Account ID of this creative group. This is a read-only field that can be
+  /// left blank.
+  core.String accountId;
+
+  /// Advertiser ID of this creative group. This is a required field on
+  /// insertion.
+  core.String advertiserId;
+
+  /// Dimension value for the ID of the advertiser. This is a read-only,
+  /// auto-generated field.
+  DimensionValue advertiserIdDimensionValue;
+
+  /// Subgroup of the creative group. Assign your creative groups to a subgroup
+  /// in order to filter or manage them more easily. This field is required on
+  /// insertion and is read-only after insertion. Acceptable values are 1 to 2,
+  /// inclusive.
+  core.int groupNumber;
+
+  /// ID of this creative group. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#creativeGroup".
+  core.String kind;
+
+  /// Name of this creative group. This is a required field and must be less
+  /// than 256 characters long and unique among creative groups of the same
+  /// advertiser.
+  core.String name;
+
+  /// Subaccount ID of this creative group. This is a read-only field that can
+  /// be left blank.
+  core.String subaccountId;
+
+  CreativeGroup();
+
+  CreativeGroup.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("advertiserIdDimensionValue")) {
+      advertiserIdDimensionValue =
+          new DimensionValue.fromJson(_json["advertiserIdDimensionValue"]);
+    }
+    if (_json.containsKey("groupNumber")) {
+      groupNumber = _json["groupNumber"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (advertiserIdDimensionValue != null) {
+      _json["advertiserIdDimensionValue"] =
+          (advertiserIdDimensionValue).toJson();
+    }
+    if (groupNumber != null) {
+      _json["groupNumber"] = groupNumber;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    return _json;
+  }
+}
+
+/// Creative Group Assignment.
+class CreativeGroupAssignment {
+  /// ID of the creative group to be assigned.
+  core.String creativeGroupId;
+
+  /// Creative group number of the creative group assignment.
+  /// Possible string values are:
+  /// - "CREATIVE_GROUP_ONE"
+  /// - "CREATIVE_GROUP_TWO"
+  core.String creativeGroupNumber;
+
+  CreativeGroupAssignment();
+
+  CreativeGroupAssignment.fromJson(core.Map _json) {
+    if (_json.containsKey("creativeGroupId")) {
+      creativeGroupId = _json["creativeGroupId"];
+    }
+    if (_json.containsKey("creativeGroupNumber")) {
+      creativeGroupNumber = _json["creativeGroupNumber"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (creativeGroupId != null) {
+      _json["creativeGroupId"] = creativeGroupId;
+    }
+    if (creativeGroupNumber != null) {
+      _json["creativeGroupNumber"] = creativeGroupNumber;
+    }
+    return _json;
+  }
+}
+
+/// Creative Group List Response
+class CreativeGroupsListResponse {
+  /// Creative group collection.
+  core.List<CreativeGroup> creativeGroups;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#creativeGroupsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  CreativeGroupsListResponse();
+
+  CreativeGroupsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("creativeGroups")) {
+      creativeGroups = _json["creativeGroups"]
+          .map((value) => new CreativeGroup.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 (creativeGroups != null) {
+      _json["creativeGroups"] =
+          creativeGroups.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Creative optimization settings.
+class CreativeOptimizationConfiguration {
+  /// ID of this creative optimization config. This field is auto-generated when
+  /// the campaign is inserted or updated. It can be null for existing
+  /// campaigns.
+  core.String id;
+
+  /// Name of this creative optimization config. This is a required field and
+  /// must be less than 129 characters long.
+  core.String name;
+
+  /// List of optimization activities associated with this configuration.
+  core.List<OptimizationActivity> optimizationActivitys;
+
+  /// Optimization model for this configuration.
+  /// Possible string values are:
+  /// - "CLICK"
+  /// - "POST_CLICK"
+  /// - "POST_CLICK_AND_IMPRESSION"
+  /// - "POST_IMPRESSION"
+  /// - "VIDEO_COMPLETION"
+  core.String optimizationModel;
+
+  CreativeOptimizationConfiguration();
+
+  CreativeOptimizationConfiguration.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("optimizationActivitys")) {
+      optimizationActivitys = _json["optimizationActivitys"]
+          .map((value) => new OptimizationActivity.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("optimizationModel")) {
+      optimizationModel = _json["optimizationModel"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (optimizationActivitys != null) {
+      _json["optimizationActivitys"] =
+          optimizationActivitys.map((value) => (value).toJson()).toList();
+    }
+    if (optimizationModel != null) {
+      _json["optimizationModel"] = optimizationModel;
+    }
+    return _json;
+  }
+}
+
+/// Creative Rotation.
+class CreativeRotation {
+  /// Creative assignments in this creative rotation.
+  core.List<CreativeAssignment> creativeAssignments;
+
+  /// Creative optimization configuration that is used by this ad. It should
+  /// refer to one of the existing optimization configurations in the ad's
+  /// campaign. If it is unset or set to 0, then the campaign's default
+  /// optimization configuration will be used for this ad.
+  core.String creativeOptimizationConfigurationId;
+
+  /// Type of creative rotation. Can be used to specify whether to use
+  /// sequential or random rotation.
+  /// Possible string values are:
+  /// - "CREATIVE_ROTATION_TYPE_RANDOM"
+  /// - "CREATIVE_ROTATION_TYPE_SEQUENTIAL"
+  core.String type;
+
+  /// Strategy for calculating weights. Used with CREATIVE_ROTATION_TYPE_RANDOM.
+  /// Possible string values are:
+  /// - "WEIGHT_STRATEGY_CUSTOM"
+  /// - "WEIGHT_STRATEGY_EQUAL"
+  /// - "WEIGHT_STRATEGY_HIGHEST_CTR"
+  /// - "WEIGHT_STRATEGY_OPTIMIZED"
+  core.String weightCalculationStrategy;
+
+  CreativeRotation();
+
+  CreativeRotation.fromJson(core.Map _json) {
+    if (_json.containsKey("creativeAssignments")) {
+      creativeAssignments = _json["creativeAssignments"]
+          .map((value) => new CreativeAssignment.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("creativeOptimizationConfigurationId")) {
+      creativeOptimizationConfigurationId =
+          _json["creativeOptimizationConfigurationId"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    if (_json.containsKey("weightCalculationStrategy")) {
+      weightCalculationStrategy = _json["weightCalculationStrategy"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (creativeAssignments != null) {
+      _json["creativeAssignments"] =
+          creativeAssignments.map((value) => (value).toJson()).toList();
+    }
+    if (creativeOptimizationConfigurationId != null) {
+      _json["creativeOptimizationConfigurationId"] =
+          creativeOptimizationConfigurationId;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (weightCalculationStrategy != null) {
+      _json["weightCalculationStrategy"] = weightCalculationStrategy;
+    }
+    return _json;
+  }
+}
+
+/// Creative Settings
+class CreativeSettings {
+  /// Header text for iFrames for this site. Must be less than or equal to 2000
+  /// characters long.
+  core.String iFrameFooter;
+
+  /// Header text for iFrames for this site. Must be less than or equal to 2000
+  /// characters long.
+  core.String iFrameHeader;
+
+  CreativeSettings();
+
+  CreativeSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("iFrameFooter")) {
+      iFrameFooter = _json["iFrameFooter"];
+    }
+    if (_json.containsKey("iFrameHeader")) {
+      iFrameHeader = _json["iFrameHeader"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (iFrameFooter != null) {
+      _json["iFrameFooter"] = iFrameFooter;
+    }
+    if (iFrameHeader != null) {
+      _json["iFrameHeader"] = iFrameHeader;
+    }
+    return _json;
+  }
+}
+
+/// Creative List Response
+class CreativesListResponse {
+  /// Creative collection.
+  core.List<Creative> creatives;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#creativesListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  CreativesListResponse();
+
+  CreativesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("creatives")) {
+      creatives = _json["creatives"]
+          .map((value) => new Creative.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 (creatives != null) {
+      _json["creatives"] = creatives.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Represents fields that are compatible to be selected for a report of type
+/// "CROSS_DIMENSION_REACH".
+class CrossDimensionReachReportCompatibleFields {
+  /// Dimensions which are compatible to be selected in the "breakdown" section
+  /// of the report.
+  core.List<Dimension> breakdown;
+
+  /// Dimensions which are compatible to be selected in the "dimensionFilters"
+  /// section of the report.
+  core.List<Dimension> dimensionFilters;
+
+  /// The kind of resource this is, in this case
+  /// dfareporting#crossDimensionReachReportCompatibleFields.
+  core.String kind;
+
+  /// Metrics which are compatible to be selected in the "metricNames" section
+  /// of the report.
+  core.List<Metric> metrics;
+
+  /// Metrics which are compatible to be selected in the "overlapMetricNames"
+  /// section of the report.
+  core.List<Metric> overlapMetrics;
+
+  CrossDimensionReachReportCompatibleFields();
+
+  CrossDimensionReachReportCompatibleFields.fromJson(core.Map _json) {
+    if (_json.containsKey("breakdown")) {
+      breakdown = _json["breakdown"]
+          .map((value) => new Dimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("dimensionFilters")) {
+      dimensionFilters = _json["dimensionFilters"]
+          .map((value) => new Dimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("metrics")) {
+      metrics =
+          _json["metrics"].map((value) => new Metric.fromJson(value)).toList();
+    }
+    if (_json.containsKey("overlapMetrics")) {
+      overlapMetrics = _json["overlapMetrics"]
+          .map((value) => new Metric.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 (breakdown != null) {
+      _json["breakdown"] = breakdown.map((value) => (value).toJson()).toList();
+    }
+    if (dimensionFilters != null) {
+      _json["dimensionFilters"] =
+          dimensionFilters.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (metrics != null) {
+      _json["metrics"] = metrics.map((value) => (value).toJson()).toList();
+    }
+    if (overlapMetrics != null) {
+      _json["overlapMetrics"] =
+          overlapMetrics.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// A custom floodlight variable.
+class CustomFloodlightVariable {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#customFloodlightVariable".
+  core.String kind;
+
+  /// The type of custom floodlight variable to supply a value for. These map to
+  /// the "u[1-20]=" in the tags.
+  /// Possible string values are:
+  /// - "U1"
+  /// - "U10"
+  /// - "U100"
+  /// - "U11"
+  /// - "U12"
+  /// - "U13"
+  /// - "U14"
+  /// - "U15"
+  /// - "U16"
+  /// - "U17"
+  /// - "U18"
+  /// - "U19"
+  /// - "U2"
+  /// - "U20"
+  /// - "U21"
+  /// - "U22"
+  /// - "U23"
+  /// - "U24"
+  /// - "U25"
+  /// - "U26"
+  /// - "U27"
+  /// - "U28"
+  /// - "U29"
+  /// - "U3"
+  /// - "U30"
+  /// - "U31"
+  /// - "U32"
+  /// - "U33"
+  /// - "U34"
+  /// - "U35"
+  /// - "U36"
+  /// - "U37"
+  /// - "U38"
+  /// - "U39"
+  /// - "U4"
+  /// - "U40"
+  /// - "U41"
+  /// - "U42"
+  /// - "U43"
+  /// - "U44"
+  /// - "U45"
+  /// - "U46"
+  /// - "U47"
+  /// - "U48"
+  /// - "U49"
+  /// - "U5"
+  /// - "U50"
+  /// - "U51"
+  /// - "U52"
+  /// - "U53"
+  /// - "U54"
+  /// - "U55"
+  /// - "U56"
+  /// - "U57"
+  /// - "U58"
+  /// - "U59"
+  /// - "U6"
+  /// - "U60"
+  /// - "U61"
+  /// - "U62"
+  /// - "U63"
+  /// - "U64"
+  /// - "U65"
+  /// - "U66"
+  /// - "U67"
+  /// - "U68"
+  /// - "U69"
+  /// - "U7"
+  /// - "U70"
+  /// - "U71"
+  /// - "U72"
+  /// - "U73"
+  /// - "U74"
+  /// - "U75"
+  /// - "U76"
+  /// - "U77"
+  /// - "U78"
+  /// - "U79"
+  /// - "U8"
+  /// - "U80"
+  /// - "U81"
+  /// - "U82"
+  /// - "U83"
+  /// - "U84"
+  /// - "U85"
+  /// - "U86"
+  /// - "U87"
+  /// - "U88"
+  /// - "U89"
+  /// - "U9"
+  /// - "U90"
+  /// - "U91"
+  /// - "U92"
+  /// - "U93"
+  /// - "U94"
+  /// - "U95"
+  /// - "U96"
+  /// - "U97"
+  /// - "U98"
+  /// - "U99"
+  core.String type;
+
+  /// The value of the custom floodlight variable. The length of string must not
+  /// exceed 50 characters.
+  core.String value;
+
+  CustomFloodlightVariable();
+
+  CustomFloodlightVariable.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+/// Represents a Custom Rich Media Events group.
+class CustomRichMediaEvents {
+  /// List of custom rich media event IDs. Dimension values must be all of type
+  /// dfa:richMediaEventTypeIdAndName.
+  core.List<DimensionValue> filteredEventIds;
+
+  /// The kind of resource this is, in this case
+  /// dfareporting#customRichMediaEvents.
+  core.String kind;
+
+  CustomRichMediaEvents();
+
+  CustomRichMediaEvents.fromJson(core.Map _json) {
+    if (_json.containsKey("filteredEventIds")) {
+      filteredEventIds = _json["filteredEventIds"]
+          .map((value) => new DimensionValue.fromJson(value))
+          .toList();
+    }
+    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 (filteredEventIds != null) {
+      _json["filteredEventIds"] =
+          filteredEventIds.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Represents a date range.
+class DateRange {
+  /// The end date of the date range, inclusive. A string of the format:
+  /// "yyyy-MM-dd".
+  core.DateTime endDate;
+
+  /// The kind of resource this is, in this case dfareporting#dateRange.
+  core.String kind;
+
+  /// The date range relative to the date of when the report is run.
+  /// Possible string values are:
+  /// - "LAST_24_MONTHS"
+  /// - "LAST_30_DAYS"
+  /// - "LAST_365_DAYS"
+  /// - "LAST_7_DAYS"
+  /// - "LAST_90_DAYS"
+  /// - "MONTH_TO_DATE"
+  /// - "PREVIOUS_MONTH"
+  /// - "PREVIOUS_QUARTER"
+  /// - "PREVIOUS_WEEK"
+  /// - "PREVIOUS_YEAR"
+  /// - "QUARTER_TO_DATE"
+  /// - "TODAY"
+  /// - "WEEK_TO_DATE"
+  /// - "YEAR_TO_DATE"
+  /// - "YESTERDAY"
+  core.String relativeDateRange;
+
+  /// The start date of the date range, inclusive. A string of the format:
+  /// "yyyy-MM-dd".
+  core.DateTime startDate;
+
+  DateRange();
+
+  DateRange.fromJson(core.Map _json) {
+    if (_json.containsKey("endDate")) {
+      endDate = core.DateTime.parse(_json["endDate"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("relativeDateRange")) {
+      relativeDateRange = _json["relativeDateRange"];
+    }
+    if (_json.containsKey("startDate")) {
+      startDate = core.DateTime.parse(_json["startDate"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (endDate != null) {
+      _json["endDate"] =
+          "${(endDate).year.toString().padLeft(4, '0')}-${(endDate).month.toString().padLeft(2, '0')}-${(endDate).day.toString().padLeft(2, '0')}";
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (relativeDateRange != null) {
+      _json["relativeDateRange"] = relativeDateRange;
+    }
+    if (startDate != null) {
+      _json["startDate"] =
+          "${(startDate).year.toString().padLeft(4, '0')}-${(startDate).month.toString().padLeft(2, '0')}-${(startDate).day.toString().padLeft(2, '0')}";
+    }
+    return _json;
+  }
+}
+
+/// Day Part Targeting.
+class DayPartTargeting {
+  /// Days of the week when the ad will serve.
+  ///
+  /// Acceptable values are:
+  /// - "SUNDAY"
+  /// - "MONDAY"
+  /// - "TUESDAY"
+  /// - "WEDNESDAY"
+  /// - "THURSDAY"
+  /// - "FRIDAY"
+  /// - "SATURDAY"
+  core.List<core.String> daysOfWeek;
+
+  /// Hours of the day when the ad will serve, where 0 is midnight to 1 AM and
+  /// 23 is 11 PM to midnight. Can be specified with days of week, in which case
+  /// the ad would serve during these hours on the specified days. For example
+  /// if Monday, Wednesday, Friday are the days of week specified and 9-10am,
+  /// 3-5pm (hours 9, 15, and 16) is specified, the ad would serve Monday,
+  /// Wednesdays, and Fridays at 9-10am and 3-5pm. Acceptable values are 0 to
+  /// 23, inclusive.
+  core.List<core.int> hoursOfDay;
+
+  /// Whether or not to use the user's local time. If false, the America/New
+  /// York time zone applies.
+  core.bool userLocalTime;
+
+  DayPartTargeting();
+
+  DayPartTargeting.fromJson(core.Map _json) {
+    if (_json.containsKey("daysOfWeek")) {
+      daysOfWeek = _json["daysOfWeek"];
+    }
+    if (_json.containsKey("hoursOfDay")) {
+      hoursOfDay = _json["hoursOfDay"];
+    }
+    if (_json.containsKey("userLocalTime")) {
+      userLocalTime = _json["userLocalTime"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (daysOfWeek != null) {
+      _json["daysOfWeek"] = daysOfWeek;
+    }
+    if (hoursOfDay != null) {
+      _json["hoursOfDay"] = hoursOfDay;
+    }
+    if (userLocalTime != null) {
+      _json["userLocalTime"] = userLocalTime;
+    }
+    return _json;
+  }
+}
+
+/// Properties of inheriting and overriding the default click-through event tag.
+/// A campaign may override the event tag defined at the advertiser level, and
+/// an ad may also override the campaign's setting further.
+class DefaultClickThroughEventTagProperties {
+  /// ID of the click-through event tag to apply to all ads in this entity's
+  /// scope.
+  core.String defaultClickThroughEventTagId;
+
+  /// Whether this entity should override the inherited default click-through
+  /// event tag with its own defined value.
+  core.bool overrideInheritedEventTag;
+
+  DefaultClickThroughEventTagProperties();
+
+  DefaultClickThroughEventTagProperties.fromJson(core.Map _json) {
+    if (_json.containsKey("defaultClickThroughEventTagId")) {
+      defaultClickThroughEventTagId = _json["defaultClickThroughEventTagId"];
+    }
+    if (_json.containsKey("overrideInheritedEventTag")) {
+      overrideInheritedEventTag = _json["overrideInheritedEventTag"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (defaultClickThroughEventTagId != null) {
+      _json["defaultClickThroughEventTagId"] = defaultClickThroughEventTagId;
+    }
+    if (overrideInheritedEventTag != null) {
+      _json["overrideInheritedEventTag"] = overrideInheritedEventTag;
+    }
+    return _json;
+  }
+}
+
+/// Delivery Schedule.
+class DeliverySchedule {
+  /// Limit on the number of times an individual user can be served the ad
+  /// within a specified period of time.
+  FrequencyCap frequencyCap;
+
+  /// Whether or not hard cutoff is enabled. If true, the ad will not serve
+  /// after the end date and time. Otherwise the ad will continue to be served
+  /// until it has reached its delivery goals.
+  core.bool hardCutoff;
+
+  /// Impression ratio for this ad. This ratio determines how often each ad is
+  /// served relative to the others. For example, if ad A has an impression
+  /// ratio of 1 and ad B has an impression ratio of 3, then DCM will serve ad B
+  /// three times as often as ad A. Acceptable values are 1 to 10, inclusive.
+  core.String impressionRatio;
+
+  /// Serving priority of an ad, with respect to other ads. The lower the
+  /// priority number, the greater the priority with which it is served.
+  /// Possible string values are:
+  /// - "AD_PRIORITY_01"
+  /// - "AD_PRIORITY_02"
+  /// - "AD_PRIORITY_03"
+  /// - "AD_PRIORITY_04"
+  /// - "AD_PRIORITY_05"
+  /// - "AD_PRIORITY_06"
+  /// - "AD_PRIORITY_07"
+  /// - "AD_PRIORITY_08"
+  /// - "AD_PRIORITY_09"
+  /// - "AD_PRIORITY_10"
+  /// - "AD_PRIORITY_11"
+  /// - "AD_PRIORITY_12"
+  /// - "AD_PRIORITY_13"
+  /// - "AD_PRIORITY_14"
+  /// - "AD_PRIORITY_15"
+  /// - "AD_PRIORITY_16"
+  core.String priority;
+
+  DeliverySchedule();
+
+  DeliverySchedule.fromJson(core.Map _json) {
+    if (_json.containsKey("frequencyCap")) {
+      frequencyCap = new FrequencyCap.fromJson(_json["frequencyCap"]);
+    }
+    if (_json.containsKey("hardCutoff")) {
+      hardCutoff = _json["hardCutoff"];
+    }
+    if (_json.containsKey("impressionRatio")) {
+      impressionRatio = _json["impressionRatio"];
+    }
+    if (_json.containsKey("priority")) {
+      priority = _json["priority"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (frequencyCap != null) {
+      _json["frequencyCap"] = (frequencyCap).toJson();
+    }
+    if (hardCutoff != null) {
+      _json["hardCutoff"] = hardCutoff;
+    }
+    if (impressionRatio != null) {
+      _json["impressionRatio"] = impressionRatio;
+    }
+    if (priority != null) {
+      _json["priority"] = priority;
+    }
+    return _json;
+  }
+}
+
+/// DFP Settings
+class DfpSettings {
+  /// DFP network code for this directory site.
+  core.String dfpNetworkCode;
+
+  /// DFP network name for this directory site.
+  core.String dfpNetworkName;
+
+  /// Whether this directory site accepts programmatic placements.
+  core.bool programmaticPlacementAccepted;
+
+  /// Whether this directory site accepts publisher-paid tags.
+  core.bool pubPaidPlacementAccepted;
+
+  /// Whether this directory site is available only via DoubleClick Publisher
+  /// Portal.
+  core.bool publisherPortalOnly;
+
+  DfpSettings();
+
+  DfpSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("dfpNetworkCode")) {
+      dfpNetworkCode = _json["dfpNetworkCode"];
+    }
+    if (_json.containsKey("dfpNetworkName")) {
+      dfpNetworkName = _json["dfpNetworkName"];
+    }
+    if (_json.containsKey("programmaticPlacementAccepted")) {
+      programmaticPlacementAccepted = _json["programmaticPlacementAccepted"];
+    }
+    if (_json.containsKey("pubPaidPlacementAccepted")) {
+      pubPaidPlacementAccepted = _json["pubPaidPlacementAccepted"];
+    }
+    if (_json.containsKey("publisherPortalOnly")) {
+      publisherPortalOnly = _json["publisherPortalOnly"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (dfpNetworkCode != null) {
+      _json["dfpNetworkCode"] = dfpNetworkCode;
+    }
+    if (dfpNetworkName != null) {
+      _json["dfpNetworkName"] = dfpNetworkName;
+    }
+    if (programmaticPlacementAccepted != null) {
+      _json["programmaticPlacementAccepted"] = programmaticPlacementAccepted;
+    }
+    if (pubPaidPlacementAccepted != null) {
+      _json["pubPaidPlacementAccepted"] = pubPaidPlacementAccepted;
+    }
+    if (publisherPortalOnly != null) {
+      _json["publisherPortalOnly"] = publisherPortalOnly;
+    }
+    return _json;
+  }
+}
+
+/// Represents a dimension.
+class Dimension {
+  /// The kind of resource this is, in this case dfareporting#dimension.
+  core.String kind;
+
+  /// The dimension name, e.g. dfa:advertiser
+  core.String name;
+
+  Dimension();
+
+  Dimension.fromJson(core.Map _json) {
+    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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Represents a dimension filter.
+class DimensionFilter {
+  /// The name of the dimension to filter.
+  core.String dimensionName;
+
+  /// The kind of resource this is, in this case dfareporting#dimensionFilter.
+  core.String kind;
+
+  /// The value of the dimension to filter.
+  core.String value;
+
+  DimensionFilter();
+
+  DimensionFilter.fromJson(core.Map _json) {
+    if (_json.containsKey("dimensionName")) {
+      dimensionName = _json["dimensionName"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    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 (dimensionName != null) {
+      _json["dimensionName"] = dimensionName;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+/// Represents a DimensionValue resource.
+class DimensionValue {
+  /// The name of the dimension.
+  core.String dimensionName;
+
+  /// The eTag of this response for caching purposes.
+  core.String etag;
+
+  /// The ID associated with the value if available.
+  core.String id;
+
+  /// The kind of resource this is, in this case dfareporting#dimensionValue.
+  core.String kind;
+
+  /// Determines how the 'value' field is matched when filtering. If not
+  /// specified, defaults to EXACT. If set to WILDCARD_EXPRESSION, '*' is
+  /// allowed as a placeholder for variable length character sequences, and it
+  /// can be escaped with a backslash. Note, only paid search dimensions
+  /// ('dfa:paidSearch*') allow a matchType other than EXACT.
+  /// Possible string values are:
+  /// - "BEGINS_WITH"
+  /// - "CONTAINS"
+  /// - "EXACT"
+  /// - "WILDCARD_EXPRESSION"
+  core.String matchType;
+
+  /// The value of the dimension.
+  core.String value;
+
+  DimensionValue();
+
+  DimensionValue.fromJson(core.Map _json) {
+    if (_json.containsKey("dimensionName")) {
+      dimensionName = _json["dimensionName"];
+    }
+    if (_json.containsKey("etag")) {
+      etag = _json["etag"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("matchType")) {
+      matchType = _json["matchType"];
+    }
+    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 (dimensionName != null) {
+      _json["dimensionName"] = dimensionName;
+    }
+    if (etag != null) {
+      _json["etag"] = etag;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (matchType != null) {
+      _json["matchType"] = matchType;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+/// Represents the list of DimensionValue resources.
+class DimensionValueList {
+  /// The eTag of this response for caching purposes.
+  core.String etag;
+
+  /// The dimension values returned in this response.
+  core.List<DimensionValue> items;
+
+  /// The kind of list this is, in this case dfareporting#dimensionValueList.
+  core.String kind;
+
+  /// Continuation token used to page through dimension values. To retrieve the
+  /// next page of results, set the next request's "pageToken" to the value of
+  /// this field. The page token is only valid for a limited amount of time and
+  /// should not be persisted.
+  core.String nextPageToken;
+
+  DimensionValueList();
+
+  DimensionValueList.fromJson(core.Map _json) {
+    if (_json.containsKey("etag")) {
+      etag = _json["etag"];
+    }
+    if (_json.containsKey("items")) {
+      items = _json["items"]
+          .map((value) => new DimensionValue.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 (items != null) {
+      _json["items"] = items.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Represents a DimensionValuesRequest.
+class DimensionValueRequest {
+  /// The name of the dimension for which values should be requested.
+  core.String dimensionName;
+
+  /// The end date of the date range for which to retrieve dimension values. A
+  /// string of the format "yyyy-MM-dd".
+  core.DateTime endDate;
+
+  /// The list of filters by which to filter values. The filters are ANDed.
+  core.List<DimensionFilter> filters;
+
+  /// The kind of request this is, in this case
+  /// dfareporting#dimensionValueRequest.
+  core.String kind;
+
+  /// The start date of the date range for which to retrieve dimension values. A
+  /// string of the format "yyyy-MM-dd".
+  core.DateTime startDate;
+
+  DimensionValueRequest();
+
+  DimensionValueRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("dimensionName")) {
+      dimensionName = _json["dimensionName"];
+    }
+    if (_json.containsKey("endDate")) {
+      endDate = core.DateTime.parse(_json["endDate"]);
+    }
+    if (_json.containsKey("filters")) {
+      filters = _json["filters"]
+          .map((value) => new DimensionFilter.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("startDate")) {
+      startDate = core.DateTime.parse(_json["startDate"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (dimensionName != null) {
+      _json["dimensionName"] = dimensionName;
+    }
+    if (endDate != null) {
+      _json["endDate"] =
+          "${(endDate).year.toString().padLeft(4, '0')}-${(endDate).month.toString().padLeft(2, '0')}-${(endDate).day.toString().padLeft(2, '0')}";
+    }
+    if (filters != null) {
+      _json["filters"] = filters.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (startDate != null) {
+      _json["startDate"] =
+          "${(startDate).year.toString().padLeft(4, '0')}-${(startDate).month.toString().padLeft(2, '0')}-${(startDate).day.toString().padLeft(2, '0')}";
+    }
+    return _json;
+  }
+}
+
+/// DirectorySites contains properties of a website from the Site Directory.
+/// Sites need to be added to an account via the Sites resource before they can
+/// be assigned to a placement.
+class DirectorySite {
+  /// Whether this directory site is active.
+  core.bool active;
+
+  /// Directory site contacts.
+  core.List<DirectorySiteContactAssignment> contactAssignments;
+
+  /// Country ID of this directory site. This is a read-only field.
+  core.String countryId;
+
+  /// Currency ID of this directory site. This is a read-only field.
+  /// Possible values are:
+  /// - "1" for USD
+  /// - "2" for GBP
+  /// - "3" for ESP
+  /// - "4" for SEK
+  /// - "5" for CAD
+  /// - "6" for JPY
+  /// - "7" for DEM
+  /// - "8" for AUD
+  /// - "9" for FRF
+  /// - "10" for ITL
+  /// - "11" for DKK
+  /// - "12" for NOK
+  /// - "13" for FIM
+  /// - "14" for ZAR
+  /// - "15" for IEP
+  /// - "16" for NLG
+  /// - "17" for EUR
+  /// - "18" for KRW
+  /// - "19" for TWD
+  /// - "20" for SGD
+  /// - "21" for CNY
+  /// - "22" for HKD
+  /// - "23" for NZD
+  /// - "24" for MYR
+  /// - "25" for BRL
+  /// - "26" for PTE
+  /// - "27" for MXP
+  /// - "28" for CLP
+  /// - "29" for TRY
+  /// - "30" for ARS
+  /// - "31" for PEN
+  /// - "32" for ILS
+  /// - "33" for CHF
+  /// - "34" for VEF
+  /// - "35" for COP
+  /// - "36" for GTQ
+  /// - "37" for PLN
+  /// - "39" for INR
+  /// - "40" for THB
+  /// - "41" for IDR
+  /// - "42" for CZK
+  /// - "43" for RON
+  /// - "44" for HUF
+  /// - "45" for RUB
+  /// - "46" for AED
+  /// - "47" for BGN
+  /// - "48" for HRK
+  /// - "49" for MXN
+  /// - "50" for NGN
+  core.String currencyId;
+
+  /// Description of this directory site. This is a read-only field.
+  core.String description;
+
+  /// ID of this directory site. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Dimension value for the ID of this directory site. This is a read-only,
+  /// auto-generated field.
+  DimensionValue idDimensionValue;
+
+  /// Tag types for regular placements.
+  ///
+  /// Acceptable values are:
+  /// - "STANDARD"
+  /// - "IFRAME_JAVASCRIPT_INPAGE"
+  /// - "INTERNAL_REDIRECT_INPAGE"
+  /// - "JAVASCRIPT_INPAGE"
+  core.List<core.String> inpageTagFormats;
+
+  /// Tag types for interstitial placements.
+  ///
+  /// Acceptable values are:
+  /// - "IFRAME_JAVASCRIPT_INTERSTITIAL"
+  /// - "INTERNAL_REDIRECT_INTERSTITIAL"
+  /// - "JAVASCRIPT_INTERSTITIAL"
+  core.List<core.String> interstitialTagFormats;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#directorySite".
+  core.String kind;
+
+  /// Name of this directory site.
+  core.String name;
+
+  /// Parent directory site ID.
+  core.String parentId;
+
+  /// Directory site settings.
+  DirectorySiteSettings settings;
+
+  /// URL of this directory site.
+  core.String url;
+
+  DirectorySite();
+
+  DirectorySite.fromJson(core.Map _json) {
+    if (_json.containsKey("active")) {
+      active = _json["active"];
+    }
+    if (_json.containsKey("contactAssignments")) {
+      contactAssignments = _json["contactAssignments"]
+          .map((value) => new DirectorySiteContactAssignment.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("countryId")) {
+      countryId = _json["countryId"];
+    }
+    if (_json.containsKey("currencyId")) {
+      currencyId = _json["currencyId"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("idDimensionValue")) {
+      idDimensionValue = new DimensionValue.fromJson(_json["idDimensionValue"]);
+    }
+    if (_json.containsKey("inpageTagFormats")) {
+      inpageTagFormats = _json["inpageTagFormats"];
+    }
+    if (_json.containsKey("interstitialTagFormats")) {
+      interstitialTagFormats = _json["interstitialTagFormats"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("parentId")) {
+      parentId = _json["parentId"];
+    }
+    if (_json.containsKey("settings")) {
+      settings = new DirectorySiteSettings.fromJson(_json["settings"]);
+    }
+    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 (active != null) {
+      _json["active"] = active;
+    }
+    if (contactAssignments != null) {
+      _json["contactAssignments"] =
+          contactAssignments.map((value) => (value).toJson()).toList();
+    }
+    if (countryId != null) {
+      _json["countryId"] = countryId;
+    }
+    if (currencyId != null) {
+      _json["currencyId"] = currencyId;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (idDimensionValue != null) {
+      _json["idDimensionValue"] = (idDimensionValue).toJson();
+    }
+    if (inpageTagFormats != null) {
+      _json["inpageTagFormats"] = inpageTagFormats;
+    }
+    if (interstitialTagFormats != null) {
+      _json["interstitialTagFormats"] = interstitialTagFormats;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (parentId != null) {
+      _json["parentId"] = parentId;
+    }
+    if (settings != null) {
+      _json["settings"] = (settings).toJson();
+    }
+    if (url != null) {
+      _json["url"] = url;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a Site Directory contact.
+class DirectorySiteContact {
+  /// Address of this directory site contact.
+  core.String address;
+
+  /// Email address of this directory site contact.
+  core.String email;
+
+  /// First name of this directory site contact.
+  core.String firstName;
+
+  /// ID of this directory site contact. This is a read-only, auto-generated
+  /// field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#directorySiteContact".
+  core.String kind;
+
+  /// Last name of this directory site contact.
+  core.String lastName;
+
+  /// Phone number of this directory site contact.
+  core.String phone;
+
+  /// Directory site contact role.
+  /// Possible string values are:
+  /// - "ADMIN"
+  /// - "EDIT"
+  /// - "VIEW"
+  core.String role;
+
+  /// Title or designation of this directory site contact.
+  core.String title;
+
+  /// Directory site contact type.
+  /// Possible string values are:
+  /// - "BILLING"
+  /// - "OTHER"
+  /// - "SALES"
+  /// - "TECHNICAL"
+  core.String type;
+
+  DirectorySiteContact();
+
+  DirectorySiteContact.fromJson(core.Map _json) {
+    if (_json.containsKey("address")) {
+      address = _json["address"];
+    }
+    if (_json.containsKey("email")) {
+      email = _json["email"];
+    }
+    if (_json.containsKey("firstName")) {
+      firstName = _json["firstName"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lastName")) {
+      lastName = _json["lastName"];
+    }
+    if (_json.containsKey("phone")) {
+      phone = _json["phone"];
+    }
+    if (_json.containsKey("role")) {
+      role = _json["role"];
+    }
+    if (_json.containsKey("title")) {
+      title = _json["title"];
+    }
+    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 (address != null) {
+      _json["address"] = address;
+    }
+    if (email != null) {
+      _json["email"] = email;
+    }
+    if (firstName != null) {
+      _json["firstName"] = firstName;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lastName != null) {
+      _json["lastName"] = lastName;
+    }
+    if (phone != null) {
+      _json["phone"] = phone;
+    }
+    if (role != null) {
+      _json["role"] = role;
+    }
+    if (title != null) {
+      _json["title"] = title;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+/// Directory Site Contact Assignment
+class DirectorySiteContactAssignment {
+  /// ID of this directory site contact. This is a read-only, auto-generated
+  /// field.
+  core.String contactId;
+
+  /// Visibility of this directory site contact assignment. When set to PUBLIC
+  /// this contact assignment is visible to all account and agency users; when
+  /// set to PRIVATE it is visible only to the site.
+  /// Possible string values are:
+  /// - "PRIVATE"
+  /// - "PUBLIC"
+  core.String visibility;
+
+  DirectorySiteContactAssignment();
+
+  DirectorySiteContactAssignment.fromJson(core.Map _json) {
+    if (_json.containsKey("contactId")) {
+      contactId = _json["contactId"];
+    }
+    if (_json.containsKey("visibility")) {
+      visibility = _json["visibility"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (contactId != null) {
+      _json["contactId"] = contactId;
+    }
+    if (visibility != null) {
+      _json["visibility"] = visibility;
+    }
+    return _json;
+  }
+}
+
+/// Directory Site Contact List Response
+class DirectorySiteContactsListResponse {
+  /// Directory site contact collection
+  core.List<DirectorySiteContact> directorySiteContacts;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#directorySiteContactsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  DirectorySiteContactsListResponse();
+
+  DirectorySiteContactsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("directorySiteContacts")) {
+      directorySiteContacts = _json["directorySiteContacts"]
+          .map((value) => new DirectorySiteContact.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 (directorySiteContacts != null) {
+      _json["directorySiteContacts"] =
+          directorySiteContacts.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Directory Site Settings
+class DirectorySiteSettings {
+  /// Whether this directory site has disabled active view creatives.
+  core.bool activeViewOptOut;
+
+  /// Directory site DFP settings.
+  DfpSettings dfpSettings;
+
+  /// Whether this site accepts in-stream video ads.
+  core.bool instreamVideoPlacementAccepted;
+
+  /// Whether this site accepts interstitial ads.
+  core.bool interstitialPlacementAccepted;
+
+  /// Whether this directory site has disabled Nielsen OCR reach ratings.
+  core.bool nielsenOcrOptOut;
+
+  /// Whether this directory site has disabled generation of Verification ins
+  /// tags.
+  core.bool verificationTagOptOut;
+
+  /// Whether this directory site has disabled active view for in-stream video
+  /// creatives. This is a read-only field.
+  core.bool videoActiveViewOptOut;
+
+  DirectorySiteSettings();
+
+  DirectorySiteSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("activeViewOptOut")) {
+      activeViewOptOut = _json["activeViewOptOut"];
+    }
+    if (_json.containsKey("dfpSettings")) {
+      dfpSettings = new DfpSettings.fromJson(_json["dfpSettings"]);
+    }
+    if (_json.containsKey("instreamVideoPlacementAccepted")) {
+      instreamVideoPlacementAccepted = _json["instreamVideoPlacementAccepted"];
+    }
+    if (_json.containsKey("interstitialPlacementAccepted")) {
+      interstitialPlacementAccepted = _json["interstitialPlacementAccepted"];
+    }
+    if (_json.containsKey("nielsenOcrOptOut")) {
+      nielsenOcrOptOut = _json["nielsenOcrOptOut"];
+    }
+    if (_json.containsKey("verificationTagOptOut")) {
+      verificationTagOptOut = _json["verificationTagOptOut"];
+    }
+    if (_json.containsKey("videoActiveViewOptOut")) {
+      videoActiveViewOptOut = _json["videoActiveViewOptOut"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (activeViewOptOut != null) {
+      _json["activeViewOptOut"] = activeViewOptOut;
+    }
+    if (dfpSettings != null) {
+      _json["dfpSettings"] = (dfpSettings).toJson();
+    }
+    if (instreamVideoPlacementAccepted != null) {
+      _json["instreamVideoPlacementAccepted"] = instreamVideoPlacementAccepted;
+    }
+    if (interstitialPlacementAccepted != null) {
+      _json["interstitialPlacementAccepted"] = interstitialPlacementAccepted;
+    }
+    if (nielsenOcrOptOut != null) {
+      _json["nielsenOcrOptOut"] = nielsenOcrOptOut;
+    }
+    if (verificationTagOptOut != null) {
+      _json["verificationTagOptOut"] = verificationTagOptOut;
+    }
+    if (videoActiveViewOptOut != null) {
+      _json["videoActiveViewOptOut"] = videoActiveViewOptOut;
+    }
+    return _json;
+  }
+}
+
+/// Directory Site List Response
+class DirectorySitesListResponse {
+  /// Directory site collection.
+  core.List<DirectorySite> directorySites;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#directorySitesListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  DirectorySitesListResponse();
+
+  DirectorySitesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("directorySites")) {
+      directorySites = _json["directorySites"]
+          .map((value) => new DirectorySite.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 (directorySites != null) {
+      _json["directorySites"] =
+          directorySites.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a dynamic targeting key. Dynamic targeting keys are
+/// unique, user-friendly labels, created at the advertiser level in DCM, that
+/// can be assigned to ads, creatives, and placements and used for targeting
+/// with DoubleClick Studio dynamic creatives. Use these labels instead of
+/// numeric DCM IDs (such as placement IDs) to save time and avoid errors in
+/// your dynamic feeds.
+class DynamicTargetingKey {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#dynamicTargetingKey".
+  core.String kind;
+
+  /// Name of this dynamic targeting key. This is a required field. Must be less
+  /// than 256 characters long and cannot contain commas. All characters are
+  /// converted to lowercase.
+  core.String name;
+
+  /// ID of the object of this dynamic targeting key. This is a required field.
+  core.String objectId;
+
+  /// Type of the object of this dynamic targeting key. This is a required
+  /// field.
+  /// Possible string values are:
+  /// - "OBJECT_AD"
+  /// - "OBJECT_ADVERTISER"
+  /// - "OBJECT_CREATIVE"
+  /// - "OBJECT_PLACEMENT"
+  core.String objectType;
+
+  DynamicTargetingKey();
+
+  DynamicTargetingKey.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("objectId")) {
+      objectId = _json["objectId"];
+    }
+    if (_json.containsKey("objectType")) {
+      objectType = _json["objectType"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (objectId != null) {
+      _json["objectId"] = objectId;
+    }
+    if (objectType != null) {
+      _json["objectType"] = objectType;
+    }
+    return _json;
+  }
+}
+
+/// Dynamic Targeting Key List Response
+class DynamicTargetingKeysListResponse {
+  /// Dynamic targeting key collection.
+  core.List<DynamicTargetingKey> dynamicTargetingKeys;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#dynamicTargetingKeysListResponse".
+  core.String kind;
+
+  DynamicTargetingKeysListResponse();
+
+  DynamicTargetingKeysListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("dynamicTargetingKeys")) {
+      dynamicTargetingKeys = _json["dynamicTargetingKeys"]
+          .map((value) => new DynamicTargetingKey.fromJson(value))
+          .toList();
+    }
+    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 (dynamicTargetingKeys != null) {
+      _json["dynamicTargetingKeys"] =
+          dynamicTargetingKeys.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// A description of how user IDs are encrypted.
+class EncryptionInfo {
+  /// The encryption entity ID. This should match the encryption configuration
+  /// for ad serving or Data Transfer.
+  core.String encryptionEntityId;
+
+  /// The encryption entity type. This should match the encryption configuration
+  /// for ad serving or Data Transfer.
+  /// Possible string values are:
+  /// - "ADWORDS_CUSTOMER"
+  /// - "DBM_ADVERTISER"
+  /// - "DBM_PARTNER"
+  /// - "DCM_ACCOUNT"
+  /// - "DCM_ADVERTISER"
+  /// - "ENCRYPTION_ENTITY_TYPE_UNKNOWN"
+  core.String encryptionEntityType;
+
+  /// Describes whether the encrypted cookie was received from ad serving (the
+  /// %m macro) or from Data Transfer.
+  /// Possible string values are:
+  /// - "AD_SERVING"
+  /// - "DATA_TRANSFER"
+  /// - "ENCRYPTION_SCOPE_UNKNOWN"
+  core.String encryptionSource;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#encryptionInfo".
+  core.String kind;
+
+  EncryptionInfo();
+
+  EncryptionInfo.fromJson(core.Map _json) {
+    if (_json.containsKey("encryptionEntityId")) {
+      encryptionEntityId = _json["encryptionEntityId"];
+    }
+    if (_json.containsKey("encryptionEntityType")) {
+      encryptionEntityType = _json["encryptionEntityType"];
+    }
+    if (_json.containsKey("encryptionSource")) {
+      encryptionSource = _json["encryptionSource"];
+    }
+    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 (encryptionEntityId != null) {
+      _json["encryptionEntityId"] = encryptionEntityId;
+    }
+    if (encryptionEntityType != null) {
+      _json["encryptionEntityType"] = encryptionEntityType;
+    }
+    if (encryptionSource != null) {
+      _json["encryptionSource"] = encryptionSource;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of an event tag.
+class EventTag {
+  /// Account ID of this event tag. This is a read-only field that can be left
+  /// blank.
+  core.String accountId;
+
+  /// Advertiser ID of this event tag. This field or the campaignId field is
+  /// required on insertion.
+  core.String advertiserId;
+
+  /// Dimension value for the ID of the advertiser. This is a read-only,
+  /// auto-generated field.
+  DimensionValue advertiserIdDimensionValue;
+
+  /// Campaign ID of this event tag. This field or the advertiserId field is
+  /// required on insertion.
+  core.String campaignId;
+
+  /// Dimension value for the ID of the campaign. This is a read-only,
+  /// auto-generated field.
+  DimensionValue campaignIdDimensionValue;
+
+  /// Whether this event tag should be automatically enabled for all of the
+  /// advertiser's campaigns and ads.
+  core.bool enabledByDefault;
+
+  /// Whether to remove this event tag from ads that are trafficked through
+  /// DoubleClick Bid Manager to Ad Exchange. This may be useful if the event
+  /// tag uses a pixel that is unapproved for Ad Exchange bids on one or more
+  /// networks, such as the Google Display Network.
+  core.bool excludeFromAdxRequests;
+
+  /// ID of this event tag. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#eventTag".
+  core.String kind;
+
+  /// Name of this event tag. This is a required field and must be less than 256
+  /// characters long.
+  core.String name;
+
+  /// Site filter type for this event tag. If no type is specified then the
+  /// event tag will be applied to all sites.
+  /// Possible string values are:
+  /// - "BLACKLIST"
+  /// - "WHITELIST"
+  core.String siteFilterType;
+
+  /// Filter list of site IDs associated with this event tag. The siteFilterType
+  /// determines whether this is a whitelist or blacklist filter.
+  core.List<core.String> siteIds;
+
+  /// Whether this tag is SSL-compliant or not. This is a read-only field.
+  core.bool sslCompliant;
+
+  /// Status of this event tag. Must be ENABLED for this event tag to fire. This
+  /// is a required field.
+  /// Possible string values are:
+  /// - "DISABLED"
+  /// - "ENABLED"
+  core.String status;
+
+  /// Subaccount ID of this event tag. This is a read-only field that can be
+  /// left blank.
+  core.String subaccountId;
+
+  /// Event tag type. Can be used to specify whether to use a third-party pixel,
+  /// a third-party JavaScript URL, or a third-party click-through URL for
+  /// either impression or click tracking. This is a required field.
+  /// Possible string values are:
+  /// - "CLICK_THROUGH_EVENT_TAG"
+  /// - "IMPRESSION_IMAGE_EVENT_TAG"
+  /// - "IMPRESSION_JAVASCRIPT_EVENT_TAG"
+  core.String type;
+
+  /// Payload URL for this event tag. The URL on a click-through event tag
+  /// should have a landing page URL appended to the end of it. This field is
+  /// required on insertion.
+  core.String url;
+
+  /// Number of times the landing page URL should be URL-escaped before being
+  /// appended to the click-through event tag URL. Only applies to click-through
+  /// event tags as specified by the event tag type.
+  core.int urlEscapeLevels;
+
+  EventTag();
+
+  EventTag.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("advertiserIdDimensionValue")) {
+      advertiserIdDimensionValue =
+          new DimensionValue.fromJson(_json["advertiserIdDimensionValue"]);
+    }
+    if (_json.containsKey("campaignId")) {
+      campaignId = _json["campaignId"];
+    }
+    if (_json.containsKey("campaignIdDimensionValue")) {
+      campaignIdDimensionValue =
+          new DimensionValue.fromJson(_json["campaignIdDimensionValue"]);
+    }
+    if (_json.containsKey("enabledByDefault")) {
+      enabledByDefault = _json["enabledByDefault"];
+    }
+    if (_json.containsKey("excludeFromAdxRequests")) {
+      excludeFromAdxRequests = _json["excludeFromAdxRequests"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("siteFilterType")) {
+      siteFilterType = _json["siteFilterType"];
+    }
+    if (_json.containsKey("siteIds")) {
+      siteIds = _json["siteIds"];
+    }
+    if (_json.containsKey("sslCompliant")) {
+      sslCompliant = _json["sslCompliant"];
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    if (_json.containsKey("url")) {
+      url = _json["url"];
+    }
+    if (_json.containsKey("urlEscapeLevels")) {
+      urlEscapeLevels = _json["urlEscapeLevels"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (advertiserIdDimensionValue != null) {
+      _json["advertiserIdDimensionValue"] =
+          (advertiserIdDimensionValue).toJson();
+    }
+    if (campaignId != null) {
+      _json["campaignId"] = campaignId;
+    }
+    if (campaignIdDimensionValue != null) {
+      _json["campaignIdDimensionValue"] = (campaignIdDimensionValue).toJson();
+    }
+    if (enabledByDefault != null) {
+      _json["enabledByDefault"] = enabledByDefault;
+    }
+    if (excludeFromAdxRequests != null) {
+      _json["excludeFromAdxRequests"] = excludeFromAdxRequests;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (siteFilterType != null) {
+      _json["siteFilterType"] = siteFilterType;
+    }
+    if (siteIds != null) {
+      _json["siteIds"] = siteIds;
+    }
+    if (sslCompliant != null) {
+      _json["sslCompliant"] = sslCompliant;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (url != null) {
+      _json["url"] = url;
+    }
+    if (urlEscapeLevels != null) {
+      _json["urlEscapeLevels"] = urlEscapeLevels;
+    }
+    return _json;
+  }
+}
+
+/// Event tag override information.
+class EventTagOverride {
+  /// Whether this override is enabled.
+  core.bool enabled;
+
+  /// ID of this event tag override. This is a read-only, auto-generated field.
+  core.String id;
+
+  EventTagOverride();
+
+  EventTagOverride.fromJson(core.Map _json) {
+    if (_json.containsKey("enabled")) {
+      enabled = _json["enabled"];
+    }
+    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 (enabled != null) {
+      _json["enabled"] = enabled;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    return _json;
+  }
+}
+
+/// Event Tag List Response
+class EventTagsListResponse {
+  /// Event tag collection.
+  core.List<EventTag> eventTags;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#eventTagsListResponse".
+  core.String kind;
+
+  EventTagsListResponse();
+
+  EventTagsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("eventTags")) {
+      eventTags = _json["eventTags"]
+          .map((value) => new EventTag.fromJson(value))
+          .toList();
+    }
+    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 (eventTags != null) {
+      _json["eventTags"] = eventTags.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// The URLs where the completed report file can be downloaded.
+class FileUrls {
+  /// The URL for downloading the report data through the API.
+  core.String apiUrl;
+
+  /// The URL for downloading the report data through a browser.
+  core.String browserUrl;
+
+  FileUrls();
+
+  FileUrls.fromJson(core.Map _json) {
+    if (_json.containsKey("apiUrl")) {
+      apiUrl = _json["apiUrl"];
+    }
+    if (_json.containsKey("browserUrl")) {
+      browserUrl = _json["browserUrl"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (apiUrl != null) {
+      _json["apiUrl"] = apiUrl;
+    }
+    if (browserUrl != null) {
+      _json["browserUrl"] = browserUrl;
+    }
+    return _json;
+  }
+}
+
+/// Represents a File resource. A file contains the metadata for a report run.
+/// It shows the status of the run and holds the URLs to the generated report
+/// data if the run is finished and the status is "REPORT_AVAILABLE".
+class File {
+  /// The date range for which the file has report data. The date range will
+  /// always be the absolute date range for which the report is run.
+  DateRange dateRange;
+
+  /// The eTag of this response for caching purposes.
+  core.String etag;
+
+  /// The filename of the file.
+  core.String fileName;
+
+  /// The output format of the report. Only available once the file is
+  /// available.
+  /// Possible string values are:
+  /// - "CSV"
+  /// - "EXCEL"
+  core.String format;
+
+  /// The unique ID of this report file.
+  core.String id;
+
+  /// The kind of resource this is, in this case dfareporting#file.
+  core.String kind;
+
+  /// The timestamp in milliseconds since epoch when this file was last
+  /// modified.
+  core.String lastModifiedTime;
+
+  /// The ID of the report this file was generated from.
+  core.String reportId;
+
+  /// The status of the report file.
+  /// Possible string values are:
+  /// - "CANCELLED"
+  /// - "FAILED"
+  /// - "PROCESSING"
+  /// - "REPORT_AVAILABLE"
+  core.String status;
+
+  /// The URLs where the completed report file can be downloaded.
+  FileUrls urls;
+
+  File();
+
+  File.fromJson(core.Map _json) {
+    if (_json.containsKey("dateRange")) {
+      dateRange = new DateRange.fromJson(_json["dateRange"]);
+    }
+    if (_json.containsKey("etag")) {
+      etag = _json["etag"];
+    }
+    if (_json.containsKey("fileName")) {
+      fileName = _json["fileName"];
+    }
+    if (_json.containsKey("format")) {
+      format = _json["format"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lastModifiedTime")) {
+      lastModifiedTime = _json["lastModifiedTime"];
+    }
+    if (_json.containsKey("reportId")) {
+      reportId = _json["reportId"];
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"];
+    }
+    if (_json.containsKey("urls")) {
+      urls = new FileUrls.fromJson(_json["urls"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (dateRange != null) {
+      _json["dateRange"] = (dateRange).toJson();
+    }
+    if (etag != null) {
+      _json["etag"] = etag;
+    }
+    if (fileName != null) {
+      _json["fileName"] = fileName;
+    }
+    if (format != null) {
+      _json["format"] = format;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lastModifiedTime != null) {
+      _json["lastModifiedTime"] = lastModifiedTime;
+    }
+    if (reportId != null) {
+      _json["reportId"] = reportId;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    if (urls != null) {
+      _json["urls"] = (urls).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Represents the list of File resources.
+class FileList {
+  /// The eTag of this response for caching purposes.
+  core.String etag;
+
+  /// The files returned in this response.
+  core.List<File> items;
+
+  /// The kind of list this is, in this case dfareporting#fileList.
+  core.String kind;
+
+  /// Continuation token used to page through files. To retrieve the next page
+  /// of results, set the next request's "pageToken" to the value of this field.
+  /// The page token is only valid for a limited amount of time and should not
+  /// be persisted.
+  core.String nextPageToken;
+
+  FileList();
+
+  FileList.fromJson(core.Map _json) {
+    if (_json.containsKey("etag")) {
+      etag = _json["etag"];
+    }
+    if (_json.containsKey("items")) {
+      items = _json["items"].map((value) => new File.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 (items != null) {
+      _json["items"] = items.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Flight
+class Flight {
+  /// Inventory item flight end date.
+  core.DateTime endDate;
+
+  /// Rate or cost of this flight.
+  core.String rateOrCost;
+
+  /// Inventory item flight start date.
+  core.DateTime startDate;
+
+  /// Units of this flight.
+  core.String units;
+
+  Flight();
+
+  Flight.fromJson(core.Map _json) {
+    if (_json.containsKey("endDate")) {
+      endDate = core.DateTime.parse(_json["endDate"]);
+    }
+    if (_json.containsKey("rateOrCost")) {
+      rateOrCost = _json["rateOrCost"];
+    }
+    if (_json.containsKey("startDate")) {
+      startDate = core.DateTime.parse(_json["startDate"]);
+    }
+    if (_json.containsKey("units")) {
+      units = _json["units"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (endDate != null) {
+      _json["endDate"] =
+          "${(endDate).year.toString().padLeft(4, '0')}-${(endDate).month.toString().padLeft(2, '0')}-${(endDate).day.toString().padLeft(2, '0')}";
+    }
+    if (rateOrCost != null) {
+      _json["rateOrCost"] = rateOrCost;
+    }
+    if (startDate != null) {
+      _json["startDate"] =
+          "${(startDate).year.toString().padLeft(4, '0')}-${(startDate).month.toString().padLeft(2, '0')}-${(startDate).day.toString().padLeft(2, '0')}";
+    }
+    if (units != null) {
+      _json["units"] = units;
+    }
+    return _json;
+  }
+}
+
+/// Floodlight Activity GenerateTag Response
+class FloodlightActivitiesGenerateTagResponse {
+  /// Generated tag for this Floodlight activity. For global site tags, this is
+  /// the event snippet.
+  core.String floodlightActivityTag;
+
+  /// The global snippet section of a global site tag. The global site tag sets
+  /// new cookies on your domain, which will store a unique identifier for a
+  /// user or the ad click that brought the user to your site. Learn more.
+  core.String globalSiteTagGlobalSnippet;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#floodlightActivitiesGenerateTagResponse".
+  core.String kind;
+
+  FloodlightActivitiesGenerateTagResponse();
+
+  FloodlightActivitiesGenerateTagResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("floodlightActivityTag")) {
+      floodlightActivityTag = _json["floodlightActivityTag"];
+    }
+    if (_json.containsKey("globalSiteTagGlobalSnippet")) {
+      globalSiteTagGlobalSnippet = _json["globalSiteTagGlobalSnippet"];
+    }
+    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 (floodlightActivityTag != null) {
+      _json["floodlightActivityTag"] = floodlightActivityTag;
+    }
+    if (globalSiteTagGlobalSnippet != null) {
+      _json["globalSiteTagGlobalSnippet"] = globalSiteTagGlobalSnippet;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Floodlight Activity List Response
+class FloodlightActivitiesListResponse {
+  /// Floodlight activity collection.
+  core.List<FloodlightActivity> floodlightActivities;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#floodlightActivitiesListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  FloodlightActivitiesListResponse();
+
+  FloodlightActivitiesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("floodlightActivities")) {
+      floodlightActivities = _json["floodlightActivities"]
+          .map((value) => new FloodlightActivity.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 (floodlightActivities != null) {
+      _json["floodlightActivities"] =
+          floodlightActivities.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a Floodlight activity.
+class FloodlightActivity {
+  /// Account ID of this floodlight activity. This is a read-only field that can
+  /// be left blank.
+  core.String accountId;
+
+  /// Advertiser ID of this floodlight activity. If this field is left blank,
+  /// the value will be copied over either from the activity group's advertiser
+  /// or the existing activity's advertiser.
+  core.String advertiserId;
+
+  /// Dimension value for the ID of the advertiser. This is a read-only,
+  /// auto-generated field.
+  DimensionValue advertiserIdDimensionValue;
+
+  /// Code type used for cache busting in the generated tag. Applicable only
+  /// when floodlightActivityGroupType is COUNTER and countingMethod is
+  /// STANDARD_COUNTING or UNIQUE_COUNTING.
+  /// Possible string values are:
+  /// - "ACTIVE_SERVER_PAGE"
+  /// - "COLD_FUSION"
+  /// - "JAVASCRIPT"
+  /// - "JSP"
+  /// - "PHP"
+  core.String cacheBustingType;
+
+  /// Counting method for conversions for this floodlight activity. This is a
+  /// required field.
+  /// Possible string values are:
+  /// - "ITEMS_SOLD_COUNTING"
+  /// - "SESSION_COUNTING"
+  /// - "STANDARD_COUNTING"
+  /// - "TRANSACTIONS_COUNTING"
+  /// - "UNIQUE_COUNTING"
+  core.String countingMethod;
+
+  /// Dynamic floodlight tags.
+  core.List<FloodlightActivityDynamicTag> defaultTags;
+
+  /// URL where this tag will be deployed. If specified, must be less than 256
+  /// characters long.
+  core.String expectedUrl;
+
+  /// Floodlight activity group ID of this floodlight activity. This is a
+  /// required field.
+  core.String floodlightActivityGroupId;
+
+  /// Name of the associated floodlight activity group. This is a read-only
+  /// field.
+  core.String floodlightActivityGroupName;
+
+  /// Tag string of the associated floodlight activity group. This is a
+  /// read-only field.
+  core.String floodlightActivityGroupTagString;
+
+  /// Type of the associated floodlight activity group. This is a read-only
+  /// field.
+  /// Possible string values are:
+  /// - "COUNTER"
+  /// - "SALE"
+  core.String floodlightActivityGroupType;
+
+  /// Floodlight configuration ID of this floodlight activity. If this field is
+  /// left blank, the value will be copied over either from the activity group's
+  /// floodlight configuration or from the existing activity's floodlight
+  /// configuration.
+  core.String floodlightConfigurationId;
+
+  /// Dimension value for the ID of the floodlight configuration. This is a
+  /// read-only, auto-generated field.
+  DimensionValue floodlightConfigurationIdDimensionValue;
+
+  /// The type of Floodlight tag this activity will generate. This is a required
+  /// field.
+  /// Possible string values are:
+  /// - "GLOBAL_SITE_TAG"
+  /// - "IFRAME"
+  /// - "IMAGE"
+  core.String floodlightTagType;
+
+  /// Whether this activity is archived.
+  core.bool hidden;
+
+  /// ID of this floodlight activity. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Dimension value for the ID of this floodlight activity. This is a
+  /// read-only, auto-generated field.
+  DimensionValue idDimensionValue;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#floodlightActivity".
+  core.String kind;
+
+  /// Name of this floodlight activity. This is a required field. Must be less
+  /// than 129 characters long and cannot contain quotes.
+  core.String name;
+
+  /// General notes or implementation instructions for the tag.
+  core.String notes;
+
+  /// Publisher dynamic floodlight tags.
+  core.List<FloodlightActivityPublisherDynamicTag> publisherTags;
+
+  /// Whether this tag should use SSL.
+  core.bool secure;
+
+  /// Whether the floodlight activity is SSL-compliant. This is a read-only
+  /// field, its value detected by the system from the floodlight tags.
+  core.bool sslCompliant;
+
+  /// Whether this floodlight activity must be SSL-compliant.
+  core.bool sslRequired;
+
+  /// Subaccount ID of this floodlight activity. This is a read-only field that
+  /// can be left blank.
+  core.String subaccountId;
+
+  /// Tag format type for the floodlight activity. If left blank, the tag format
+  /// will default to HTML.
+  /// Possible string values are:
+  /// - "HTML"
+  /// - "XHTML"
+  core.String tagFormat;
+
+  /// Value of the cat= parameter in the floodlight tag, which the ad servers
+  /// use to identify the activity. This is optional: if empty, a new tag string
+  /// will be generated for you. This string must be 1 to 8 characters long,
+  /// with valid characters being [a-z][A-Z][0-9][-][ _ ]. This tag string must
+  /// also be unique among activities of the same activity group. This field is
+  /// read-only after insertion.
+  core.String tagString;
+
+  /// List of the user-defined variables used by this conversion tag. These map
+  /// to the "u[1-100]=" in the tags. Each of these can have a user defined
+  /// type.
+  /// Acceptable values are U1 to U100, inclusive.
+  core.List<core.String> userDefinedVariableTypes;
+
+  FloodlightActivity();
+
+  FloodlightActivity.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("advertiserIdDimensionValue")) {
+      advertiserIdDimensionValue =
+          new DimensionValue.fromJson(_json["advertiserIdDimensionValue"]);
+    }
+    if (_json.containsKey("cacheBustingType")) {
+      cacheBustingType = _json["cacheBustingType"];
+    }
+    if (_json.containsKey("countingMethod")) {
+      countingMethod = _json["countingMethod"];
+    }
+    if (_json.containsKey("defaultTags")) {
+      defaultTags = _json["defaultTags"]
+          .map((value) => new FloodlightActivityDynamicTag.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("expectedUrl")) {
+      expectedUrl = _json["expectedUrl"];
+    }
+    if (_json.containsKey("floodlightActivityGroupId")) {
+      floodlightActivityGroupId = _json["floodlightActivityGroupId"];
+    }
+    if (_json.containsKey("floodlightActivityGroupName")) {
+      floodlightActivityGroupName = _json["floodlightActivityGroupName"];
+    }
+    if (_json.containsKey("floodlightActivityGroupTagString")) {
+      floodlightActivityGroupTagString =
+          _json["floodlightActivityGroupTagString"];
+    }
+    if (_json.containsKey("floodlightActivityGroupType")) {
+      floodlightActivityGroupType = _json["floodlightActivityGroupType"];
+    }
+    if (_json.containsKey("floodlightConfigurationId")) {
+      floodlightConfigurationId = _json["floodlightConfigurationId"];
+    }
+    if (_json.containsKey("floodlightConfigurationIdDimensionValue")) {
+      floodlightConfigurationIdDimensionValue = new DimensionValue.fromJson(
+          _json["floodlightConfigurationIdDimensionValue"]);
+    }
+    if (_json.containsKey("floodlightTagType")) {
+      floodlightTagType = _json["floodlightTagType"];
+    }
+    if (_json.containsKey("hidden")) {
+      hidden = _json["hidden"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("idDimensionValue")) {
+      idDimensionValue = new DimensionValue.fromJson(_json["idDimensionValue"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("notes")) {
+      notes = _json["notes"];
+    }
+    if (_json.containsKey("publisherTags")) {
+      publisherTags = _json["publisherTags"]
+          .map((value) =>
+              new FloodlightActivityPublisherDynamicTag.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("secure")) {
+      secure = _json["secure"];
+    }
+    if (_json.containsKey("sslCompliant")) {
+      sslCompliant = _json["sslCompliant"];
+    }
+    if (_json.containsKey("sslRequired")) {
+      sslRequired = _json["sslRequired"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("tagFormat")) {
+      tagFormat = _json["tagFormat"];
+    }
+    if (_json.containsKey("tagString")) {
+      tagString = _json["tagString"];
+    }
+    if (_json.containsKey("userDefinedVariableTypes")) {
+      userDefinedVariableTypes = _json["userDefinedVariableTypes"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (advertiserIdDimensionValue != null) {
+      _json["advertiserIdDimensionValue"] =
+          (advertiserIdDimensionValue).toJson();
+    }
+    if (cacheBustingType != null) {
+      _json["cacheBustingType"] = cacheBustingType;
+    }
+    if (countingMethod != null) {
+      _json["countingMethod"] = countingMethod;
+    }
+    if (defaultTags != null) {
+      _json["defaultTags"] =
+          defaultTags.map((value) => (value).toJson()).toList();
+    }
+    if (expectedUrl != null) {
+      _json["expectedUrl"] = expectedUrl;
+    }
+    if (floodlightActivityGroupId != null) {
+      _json["floodlightActivityGroupId"] = floodlightActivityGroupId;
+    }
+    if (floodlightActivityGroupName != null) {
+      _json["floodlightActivityGroupName"] = floodlightActivityGroupName;
+    }
+    if (floodlightActivityGroupTagString != null) {
+      _json["floodlightActivityGroupTagString"] =
+          floodlightActivityGroupTagString;
+    }
+    if (floodlightActivityGroupType != null) {
+      _json["floodlightActivityGroupType"] = floodlightActivityGroupType;
+    }
+    if (floodlightConfigurationId != null) {
+      _json["floodlightConfigurationId"] = floodlightConfigurationId;
+    }
+    if (floodlightConfigurationIdDimensionValue != null) {
+      _json["floodlightConfigurationIdDimensionValue"] =
+          (floodlightConfigurationIdDimensionValue).toJson();
+    }
+    if (floodlightTagType != null) {
+      _json["floodlightTagType"] = floodlightTagType;
+    }
+    if (hidden != null) {
+      _json["hidden"] = hidden;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (idDimensionValue != null) {
+      _json["idDimensionValue"] = (idDimensionValue).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (notes != null) {
+      _json["notes"] = notes;
+    }
+    if (publisherTags != null) {
+      _json["publisherTags"] =
+          publisherTags.map((value) => (value).toJson()).toList();
+    }
+    if (secure != null) {
+      _json["secure"] = secure;
+    }
+    if (sslCompliant != null) {
+      _json["sslCompliant"] = sslCompliant;
+    }
+    if (sslRequired != null) {
+      _json["sslRequired"] = sslRequired;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (tagFormat != null) {
+      _json["tagFormat"] = tagFormat;
+    }
+    if (tagString != null) {
+      _json["tagString"] = tagString;
+    }
+    if (userDefinedVariableTypes != null) {
+      _json["userDefinedVariableTypes"] = userDefinedVariableTypes;
+    }
+    return _json;
+  }
+}
+
+/// Dynamic Tag
+class FloodlightActivityDynamicTag {
+  /// ID of this dynamic tag. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Name of this tag.
+  core.String name;
+
+  /// Tag code.
+  core.String tag;
+
+  FloodlightActivityDynamicTag();
+
+  FloodlightActivityDynamicTag.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("tag")) {
+      tag = _json["tag"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (tag != null) {
+      _json["tag"] = tag;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a Floodlight activity group.
+class FloodlightActivityGroup {
+  /// Account ID of this floodlight activity group. This is a read-only field
+  /// that can be left blank.
+  core.String accountId;
+
+  /// Advertiser ID of this floodlight activity group. If this field is left
+  /// blank, the value will be copied over either from the floodlight
+  /// configuration's advertiser or from the existing activity group's
+  /// advertiser.
+  core.String advertiserId;
+
+  /// Dimension value for the ID of the advertiser. This is a read-only,
+  /// auto-generated field.
+  DimensionValue advertiserIdDimensionValue;
+
+  /// Floodlight configuration ID of this floodlight activity group. This is a
+  /// required field.
+  core.String floodlightConfigurationId;
+
+  /// Dimension value for the ID of the floodlight configuration. This is a
+  /// read-only, auto-generated field.
+  DimensionValue floodlightConfigurationIdDimensionValue;
+
+  /// ID of this floodlight activity group. This is a read-only, auto-generated
+  /// field.
+  core.String id;
+
+  /// Dimension value for the ID of this floodlight activity group. This is a
+  /// read-only, auto-generated field.
+  DimensionValue idDimensionValue;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#floodlightActivityGroup".
+  core.String kind;
+
+  /// Name of this floodlight activity group. This is a required field. Must be
+  /// less than 65 characters long and cannot contain quotes.
+  core.String name;
+
+  /// Subaccount ID of this floodlight activity group. This is a read-only field
+  /// that can be left blank.
+  core.String subaccountId;
+
+  /// Value of the type= parameter in the floodlight tag, which the ad servers
+  /// use to identify the activity group that the activity belongs to. This is
+  /// optional: if empty, a new tag string will be generated for you. This
+  /// string must be 1 to 8 characters long, with valid characters being
+  /// [a-z][A-Z][0-9][-][ _ ]. This tag string must also be unique among
+  /// activity groups of the same floodlight configuration. This field is
+  /// read-only after insertion.
+  core.String tagString;
+
+  /// Type of the floodlight activity group. This is a required field that is
+  /// read-only after insertion.
+  /// Possible string values are:
+  /// - "COUNTER"
+  /// - "SALE"
+  core.String type;
+
+  FloodlightActivityGroup();
+
+  FloodlightActivityGroup.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("advertiserIdDimensionValue")) {
+      advertiserIdDimensionValue =
+          new DimensionValue.fromJson(_json["advertiserIdDimensionValue"]);
+    }
+    if (_json.containsKey("floodlightConfigurationId")) {
+      floodlightConfigurationId = _json["floodlightConfigurationId"];
+    }
+    if (_json.containsKey("floodlightConfigurationIdDimensionValue")) {
+      floodlightConfigurationIdDimensionValue = new DimensionValue.fromJson(
+          _json["floodlightConfigurationIdDimensionValue"]);
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("idDimensionValue")) {
+      idDimensionValue = new DimensionValue.fromJson(_json["idDimensionValue"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("tagString")) {
+      tagString = _json["tagString"];
+    }
+    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 (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (advertiserIdDimensionValue != null) {
+      _json["advertiserIdDimensionValue"] =
+          (advertiserIdDimensionValue).toJson();
+    }
+    if (floodlightConfigurationId != null) {
+      _json["floodlightConfigurationId"] = floodlightConfigurationId;
+    }
+    if (floodlightConfigurationIdDimensionValue != null) {
+      _json["floodlightConfigurationIdDimensionValue"] =
+          (floodlightConfigurationIdDimensionValue).toJson();
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (idDimensionValue != null) {
+      _json["idDimensionValue"] = (idDimensionValue).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (tagString != null) {
+      _json["tagString"] = tagString;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+/// Floodlight Activity Group List Response
+class FloodlightActivityGroupsListResponse {
+  /// Floodlight activity group collection.
+  core.List<FloodlightActivityGroup> floodlightActivityGroups;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#floodlightActivityGroupsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  FloodlightActivityGroupsListResponse();
+
+  FloodlightActivityGroupsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("floodlightActivityGroups")) {
+      floodlightActivityGroups = _json["floodlightActivityGroups"]
+          .map((value) => new FloodlightActivityGroup.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 (floodlightActivityGroups != null) {
+      _json["floodlightActivityGroups"] =
+          floodlightActivityGroups.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Publisher Dynamic Tag
+class FloodlightActivityPublisherDynamicTag {
+  /// Whether this tag is applicable only for click-throughs.
+  core.bool clickThrough;
+
+  /// Directory site ID of this dynamic tag. This is a write-only field that can
+  /// be used as an alternative to the siteId field. When this resource is
+  /// retrieved, only the siteId field will be populated.
+  core.String directorySiteId;
+
+  /// Dynamic floodlight tag.
+  FloodlightActivityDynamicTag dynamicTag;
+
+  /// Site ID of this dynamic tag.
+  core.String siteId;
+
+  /// Dimension value for the ID of the site. This is a read-only,
+  /// auto-generated field.
+  DimensionValue siteIdDimensionValue;
+
+  /// Whether this tag is applicable only for view-throughs.
+  core.bool viewThrough;
+
+  FloodlightActivityPublisherDynamicTag();
+
+  FloodlightActivityPublisherDynamicTag.fromJson(core.Map _json) {
+    if (_json.containsKey("clickThrough")) {
+      clickThrough = _json["clickThrough"];
+    }
+    if (_json.containsKey("directorySiteId")) {
+      directorySiteId = _json["directorySiteId"];
+    }
+    if (_json.containsKey("dynamicTag")) {
+      dynamicTag =
+          new FloodlightActivityDynamicTag.fromJson(_json["dynamicTag"]);
+    }
+    if (_json.containsKey("siteId")) {
+      siteId = _json["siteId"];
+    }
+    if (_json.containsKey("siteIdDimensionValue")) {
+      siteIdDimensionValue =
+          new DimensionValue.fromJson(_json["siteIdDimensionValue"]);
+    }
+    if (_json.containsKey("viewThrough")) {
+      viewThrough = _json["viewThrough"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (clickThrough != null) {
+      _json["clickThrough"] = clickThrough;
+    }
+    if (directorySiteId != null) {
+      _json["directorySiteId"] = directorySiteId;
+    }
+    if (dynamicTag != null) {
+      _json["dynamicTag"] = (dynamicTag).toJson();
+    }
+    if (siteId != null) {
+      _json["siteId"] = siteId;
+    }
+    if (siteIdDimensionValue != null) {
+      _json["siteIdDimensionValue"] = (siteIdDimensionValue).toJson();
+    }
+    if (viewThrough != null) {
+      _json["viewThrough"] = viewThrough;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a Floodlight configuration.
+class FloodlightConfiguration {
+  /// Account ID of this floodlight configuration. This is a read-only field
+  /// that can be left blank.
+  core.String accountId;
+
+  /// Advertiser ID of the parent advertiser of this floodlight configuration.
+  core.String advertiserId;
+
+  /// Dimension value for the ID of the advertiser. This is a read-only,
+  /// auto-generated field.
+  DimensionValue advertiserIdDimensionValue;
+
+  /// Whether advertiser data is shared with Google Analytics.
+  core.bool analyticsDataSharingEnabled;
+
+  /// Whether the exposure-to-conversion report is enabled. This report shows
+  /// detailed pathway information on up to 10 of the most recent ad exposures
+  /// seen by a user before converting.
+  core.bool exposureToConversionEnabled;
+
+  /// Day that will be counted as the first day of the week in reports. This is
+  /// a required field.
+  /// Possible string values are:
+  /// - "MONDAY"
+  /// - "SUNDAY"
+  core.String firstDayOfWeek;
+
+  /// ID of this floodlight configuration. This is a read-only, auto-generated
+  /// field.
+  core.String id;
+
+  /// Dimension value for the ID of this floodlight configuration. This is a
+  /// read-only, auto-generated field.
+  DimensionValue idDimensionValue;
+
+  /// Whether in-app attribution tracking is enabled.
+  core.bool inAppAttributionTrackingEnabled;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#floodlightConfiguration".
+  core.String kind;
+
+  /// Lookback window settings for this floodlight configuration.
+  LookbackConfiguration lookbackConfiguration;
+
+  /// Types of attribution options for natural search conversions.
+  /// Possible string values are:
+  /// - "EXCLUDE_NATURAL_SEARCH_CONVERSION_ATTRIBUTION"
+  /// - "INCLUDE_NATURAL_SEARCH_CONVERSION_ATTRIBUTION"
+  /// - "INCLUDE_NATURAL_SEARCH_TIERED_CONVERSION_ATTRIBUTION"
+  core.String naturalSearchConversionAttributionOption;
+
+  /// Settings for DCM Omniture integration.
+  OmnitureSettings omnitureSettings;
+
+  /// Subaccount ID of this floodlight configuration. This is a read-only field
+  /// that can be left blank.
+  core.String subaccountId;
+
+  /// Configuration settings for dynamic and image floodlight tags.
+  TagSettings tagSettings;
+
+  /// List of third-party authentication tokens enabled for this configuration.
+  core.List<ThirdPartyAuthenticationToken> thirdPartyAuthenticationTokens;
+
+  /// List of user defined variables enabled for this configuration.
+  core.List<UserDefinedVariableConfiguration> userDefinedVariableConfigurations;
+
+  FloodlightConfiguration();
+
+  FloodlightConfiguration.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("advertiserIdDimensionValue")) {
+      advertiserIdDimensionValue =
+          new DimensionValue.fromJson(_json["advertiserIdDimensionValue"]);
+    }
+    if (_json.containsKey("analyticsDataSharingEnabled")) {
+      analyticsDataSharingEnabled = _json["analyticsDataSharingEnabled"];
+    }
+    if (_json.containsKey("exposureToConversionEnabled")) {
+      exposureToConversionEnabled = _json["exposureToConversionEnabled"];
+    }
+    if (_json.containsKey("firstDayOfWeek")) {
+      firstDayOfWeek = _json["firstDayOfWeek"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("idDimensionValue")) {
+      idDimensionValue = new DimensionValue.fromJson(_json["idDimensionValue"]);
+    }
+    if (_json.containsKey("inAppAttributionTrackingEnabled")) {
+      inAppAttributionTrackingEnabled =
+          _json["inAppAttributionTrackingEnabled"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lookbackConfiguration")) {
+      lookbackConfiguration =
+          new LookbackConfiguration.fromJson(_json["lookbackConfiguration"]);
+    }
+    if (_json.containsKey("naturalSearchConversionAttributionOption")) {
+      naturalSearchConversionAttributionOption =
+          _json["naturalSearchConversionAttributionOption"];
+    }
+    if (_json.containsKey("omnitureSettings")) {
+      omnitureSettings =
+          new OmnitureSettings.fromJson(_json["omnitureSettings"]);
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("tagSettings")) {
+      tagSettings = new TagSettings.fromJson(_json["tagSettings"]);
+    }
+    if (_json.containsKey("thirdPartyAuthenticationTokens")) {
+      thirdPartyAuthenticationTokens = _json["thirdPartyAuthenticationTokens"]
+          .map((value) => new ThirdPartyAuthenticationToken.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("userDefinedVariableConfigurations")) {
+      userDefinedVariableConfigurations = _json[
+              "userDefinedVariableConfigurations"]
+          .map((value) => new UserDefinedVariableConfiguration.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 (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (advertiserIdDimensionValue != null) {
+      _json["advertiserIdDimensionValue"] =
+          (advertiserIdDimensionValue).toJson();
+    }
+    if (analyticsDataSharingEnabled != null) {
+      _json["analyticsDataSharingEnabled"] = analyticsDataSharingEnabled;
+    }
+    if (exposureToConversionEnabled != null) {
+      _json["exposureToConversionEnabled"] = exposureToConversionEnabled;
+    }
+    if (firstDayOfWeek != null) {
+      _json["firstDayOfWeek"] = firstDayOfWeek;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (idDimensionValue != null) {
+      _json["idDimensionValue"] = (idDimensionValue).toJson();
+    }
+    if (inAppAttributionTrackingEnabled != null) {
+      _json["inAppAttributionTrackingEnabled"] =
+          inAppAttributionTrackingEnabled;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lookbackConfiguration != null) {
+      _json["lookbackConfiguration"] = (lookbackConfiguration).toJson();
+    }
+    if (naturalSearchConversionAttributionOption != null) {
+      _json["naturalSearchConversionAttributionOption"] =
+          naturalSearchConversionAttributionOption;
+    }
+    if (omnitureSettings != null) {
+      _json["omnitureSettings"] = (omnitureSettings).toJson();
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (tagSettings != null) {
+      _json["tagSettings"] = (tagSettings).toJson();
+    }
+    if (thirdPartyAuthenticationTokens != null) {
+      _json["thirdPartyAuthenticationTokens"] = thirdPartyAuthenticationTokens
+          .map((value) => (value).toJson())
+          .toList();
+    }
+    if (userDefinedVariableConfigurations != null) {
+      _json["userDefinedVariableConfigurations"] =
+          userDefinedVariableConfigurations
+              .map((value) => (value).toJson())
+              .toList();
+    }
+    return _json;
+  }
+}
+
+/// Floodlight Configuration List Response
+class FloodlightConfigurationsListResponse {
+  /// Floodlight configuration collection.
+  core.List<FloodlightConfiguration> floodlightConfigurations;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#floodlightConfigurationsListResponse".
+  core.String kind;
+
+  FloodlightConfigurationsListResponse();
+
+  FloodlightConfigurationsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("floodlightConfigurations")) {
+      floodlightConfigurations = _json["floodlightConfigurations"]
+          .map((value) => new FloodlightConfiguration.fromJson(value))
+          .toList();
+    }
+    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 (floodlightConfigurations != null) {
+      _json["floodlightConfigurations"] =
+          floodlightConfigurations.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Represents fields that are compatible to be selected for a report of type
+/// "FlOODLIGHT".
+class FloodlightReportCompatibleFields {
+  /// Dimensions which are compatible to be selected in the "dimensionFilters"
+  /// section of the report.
+  core.List<Dimension> dimensionFilters;
+
+  /// Dimensions which are compatible to be selected in the "dimensions" section
+  /// of the report.
+  core.List<Dimension> dimensions;
+
+  /// The kind of resource this is, in this case
+  /// dfareporting#floodlightReportCompatibleFields.
+  core.String kind;
+
+  /// Metrics which are compatible to be selected in the "metricNames" section
+  /// of the report.
+  core.List<Metric> metrics;
+
+  FloodlightReportCompatibleFields();
+
+  FloodlightReportCompatibleFields.fromJson(core.Map _json) {
+    if (_json.containsKey("dimensionFilters")) {
+      dimensionFilters = _json["dimensionFilters"]
+          .map((value) => new Dimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("dimensions")) {
+      dimensions = _json["dimensions"]
+          .map((value) => new Dimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("metrics")) {
+      metrics =
+          _json["metrics"].map((value) => new Metric.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 (dimensionFilters != null) {
+      _json["dimensionFilters"] =
+          dimensionFilters.map((value) => (value).toJson()).toList();
+    }
+    if (dimensions != null) {
+      _json["dimensions"] =
+          dimensions.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (metrics != null) {
+      _json["metrics"] = metrics.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Frequency Cap.
+class FrequencyCap {
+  /// Duration of time, in seconds, for this frequency cap. The maximum duration
+  /// is 90 days. Acceptable values are 1 to 7776000, inclusive.
+  core.String duration;
+
+  /// Number of times an individual user can be served the ad within the
+  /// specified duration. Acceptable values are 1 to 15, inclusive.
+  core.String impressions;
+
+  FrequencyCap();
+
+  FrequencyCap.fromJson(core.Map _json) {
+    if (_json.containsKey("duration")) {
+      duration = _json["duration"];
+    }
+    if (_json.containsKey("impressions")) {
+      impressions = _json["impressions"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (duration != null) {
+      _json["duration"] = duration;
+    }
+    if (impressions != null) {
+      _json["impressions"] = impressions;
+    }
+    return _json;
+  }
+}
+
+/// FsCommand.
+class FsCommand {
+  /// Distance from the left of the browser.Applicable when positionOption is
+  /// DISTANCE_FROM_TOP_LEFT_CORNER.
+  core.int left;
+
+  /// Position in the browser where the window will open.
+  /// Possible string values are:
+  /// - "CENTERED"
+  /// - "DISTANCE_FROM_TOP_LEFT_CORNER"
+  core.String positionOption;
+
+  /// Distance from the top of the browser. Applicable when positionOption is
+  /// DISTANCE_FROM_TOP_LEFT_CORNER.
+  core.int top;
+
+  /// Height of the window.
+  core.int windowHeight;
+
+  /// Width of the window.
+  core.int windowWidth;
+
+  FsCommand();
+
+  FsCommand.fromJson(core.Map _json) {
+    if (_json.containsKey("left")) {
+      left = _json["left"];
+    }
+    if (_json.containsKey("positionOption")) {
+      positionOption = _json["positionOption"];
+    }
+    if (_json.containsKey("top")) {
+      top = _json["top"];
+    }
+    if (_json.containsKey("windowHeight")) {
+      windowHeight = _json["windowHeight"];
+    }
+    if (_json.containsKey("windowWidth")) {
+      windowWidth = _json["windowWidth"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (left != null) {
+      _json["left"] = left;
+    }
+    if (positionOption != null) {
+      _json["positionOption"] = positionOption;
+    }
+    if (top != null) {
+      _json["top"] = top;
+    }
+    if (windowHeight != null) {
+      _json["windowHeight"] = windowHeight;
+    }
+    if (windowWidth != null) {
+      _json["windowWidth"] = windowWidth;
+    }
+    return _json;
+  }
+}
+
+/// Geographical Targeting.
+class GeoTargeting {
+  /// Cities to be targeted. For each city only dartId is required. The other
+  /// fields are populated automatically when the ad is inserted or updated. If
+  /// targeting a city, do not target or exclude the country of the city, and do
+  /// not target the metro or region of the city.
+  core.List<City> cities;
+
+  /// Countries to be targeted or excluded from targeting, depending on the
+  /// setting of the excludeCountries field. For each country only dartId is
+  /// required. The other fields are populated automatically when the ad is
+  /// inserted or updated. If targeting or excluding a country, do not target
+  /// regions, cities, metros, or postal codes in the same country.
+  core.List<Country> countries;
+
+  /// Whether or not to exclude the countries in the countries field from
+  /// targeting. If false, the countries field refers to countries which will be
+  /// targeted by the ad.
+  core.bool excludeCountries;
+
+  /// Metros to be targeted. For each metro only dmaId is required. The other
+  /// fields are populated automatically when the ad is inserted or updated. If
+  /// targeting a metro, do not target or exclude the country of the metro.
+  core.List<Metro> metros;
+
+  /// Postal codes to be targeted. For each postal code only id is required. The
+  /// other fields are populated automatically when the ad is inserted or
+  /// updated. If targeting a postal code, do not target or exclude the country
+  /// of the postal code.
+  core.List<PostalCode> postalCodes;
+
+  /// Regions to be targeted. For each region only dartId is required. The other
+  /// fields are populated automatically when the ad is inserted or updated. If
+  /// targeting a region, do not target or exclude the country of the region.
+  core.List<Region> regions;
+
+  GeoTargeting();
+
+  GeoTargeting.fromJson(core.Map _json) {
+    if (_json.containsKey("cities")) {
+      cities =
+          _json["cities"].map((value) => new City.fromJson(value)).toList();
+    }
+    if (_json.containsKey("countries")) {
+      countries = _json["countries"]
+          .map((value) => new Country.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("excludeCountries")) {
+      excludeCountries = _json["excludeCountries"];
+    }
+    if (_json.containsKey("metros")) {
+      metros =
+          _json["metros"].map((value) => new Metro.fromJson(value)).toList();
+    }
+    if (_json.containsKey("postalCodes")) {
+      postalCodes = _json["postalCodes"]
+          .map((value) => new PostalCode.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("regions")) {
+      regions =
+          _json["regions"].map((value) => new Region.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 (cities != null) {
+      _json["cities"] = cities.map((value) => (value).toJson()).toList();
+    }
+    if (countries != null) {
+      _json["countries"] = countries.map((value) => (value).toJson()).toList();
+    }
+    if (excludeCountries != null) {
+      _json["excludeCountries"] = excludeCountries;
+    }
+    if (metros != null) {
+      _json["metros"] = metros.map((value) => (value).toJson()).toList();
+    }
+    if (postalCodes != null) {
+      _json["postalCodes"] =
+          postalCodes.map((value) => (value).toJson()).toList();
+    }
+    if (regions != null) {
+      _json["regions"] = regions.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Represents a buy from the DoubleClick Planning inventory store.
+class InventoryItem {
+  /// Account ID of this inventory item.
+  core.String accountId;
+
+  /// Ad slots of this inventory item. If this inventory item represents a
+  /// standalone placement, there will be exactly one ad slot. If this inventory
+  /// item represents a placement group, there will be more than one ad slot,
+  /// each representing one child placement in that placement group.
+  core.List<AdSlot> adSlots;
+
+  /// Advertiser ID of this inventory item.
+  core.String advertiserId;
+
+  /// Content category ID of this inventory item.
+  core.String contentCategoryId;
+
+  /// Estimated click-through rate of this inventory item.
+  core.String estimatedClickThroughRate;
+
+  /// Estimated conversion rate of this inventory item.
+  core.String estimatedConversionRate;
+
+  /// ID of this inventory item.
+  core.String id;
+
+  /// Whether this inventory item is in plan.
+  core.bool inPlan;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#inventoryItem".
+  core.String kind;
+
+  /// Information about the most recent modification of this inventory item.
+  LastModifiedInfo lastModifiedInfo;
+
+  /// Name of this inventory item. For standalone inventory items, this is the
+  /// same name as that of its only ad slot. For group inventory items, this can
+  /// differ from the name of any of its ad slots.
+  core.String name;
+
+  /// Negotiation channel ID of this inventory item.
+  core.String negotiationChannelId;
+
+  /// Order ID of this inventory item.
+  core.String orderId;
+
+  /// Placement strategy ID of this inventory item.
+  core.String placementStrategyId;
+
+  /// Pricing of this inventory item.
+  Pricing pricing;
+
+  /// Project ID of this inventory item.
+  core.String projectId;
+
+  /// RFP ID of this inventory item.
+  core.String rfpId;
+
+  /// ID of the site this inventory item is associated with.
+  core.String siteId;
+
+  /// Subaccount ID of this inventory item.
+  core.String subaccountId;
+
+  /// Type of inventory item.
+  /// Possible string values are:
+  /// - "PLANNING_PLACEMENT_TYPE_CREDIT"
+  /// - "PLANNING_PLACEMENT_TYPE_REGULAR"
+  core.String type;
+
+  InventoryItem();
+
+  InventoryItem.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("adSlots")) {
+      adSlots =
+          _json["adSlots"].map((value) => new AdSlot.fromJson(value)).toList();
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("contentCategoryId")) {
+      contentCategoryId = _json["contentCategoryId"];
+    }
+    if (_json.containsKey("estimatedClickThroughRate")) {
+      estimatedClickThroughRate = _json["estimatedClickThroughRate"];
+    }
+    if (_json.containsKey("estimatedConversionRate")) {
+      estimatedConversionRate = _json["estimatedConversionRate"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("inPlan")) {
+      inPlan = _json["inPlan"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lastModifiedInfo")) {
+      lastModifiedInfo =
+          new LastModifiedInfo.fromJson(_json["lastModifiedInfo"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("negotiationChannelId")) {
+      negotiationChannelId = _json["negotiationChannelId"];
+    }
+    if (_json.containsKey("orderId")) {
+      orderId = _json["orderId"];
+    }
+    if (_json.containsKey("placementStrategyId")) {
+      placementStrategyId = _json["placementStrategyId"];
+    }
+    if (_json.containsKey("pricing")) {
+      pricing = new Pricing.fromJson(_json["pricing"]);
+    }
+    if (_json.containsKey("projectId")) {
+      projectId = _json["projectId"];
+    }
+    if (_json.containsKey("rfpId")) {
+      rfpId = _json["rfpId"];
+    }
+    if (_json.containsKey("siteId")) {
+      siteId = _json["siteId"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    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 (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (adSlots != null) {
+      _json["adSlots"] = adSlots.map((value) => (value).toJson()).toList();
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (contentCategoryId != null) {
+      _json["contentCategoryId"] = contentCategoryId;
+    }
+    if (estimatedClickThroughRate != null) {
+      _json["estimatedClickThroughRate"] = estimatedClickThroughRate;
+    }
+    if (estimatedConversionRate != null) {
+      _json["estimatedConversionRate"] = estimatedConversionRate;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (inPlan != null) {
+      _json["inPlan"] = inPlan;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lastModifiedInfo != null) {
+      _json["lastModifiedInfo"] = (lastModifiedInfo).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (negotiationChannelId != null) {
+      _json["negotiationChannelId"] = negotiationChannelId;
+    }
+    if (orderId != null) {
+      _json["orderId"] = orderId;
+    }
+    if (placementStrategyId != null) {
+      _json["placementStrategyId"] = placementStrategyId;
+    }
+    if (pricing != null) {
+      _json["pricing"] = (pricing).toJson();
+    }
+    if (projectId != null) {
+      _json["projectId"] = projectId;
+    }
+    if (rfpId != null) {
+      _json["rfpId"] = rfpId;
+    }
+    if (siteId != null) {
+      _json["siteId"] = siteId;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+/// Inventory item List Response
+class InventoryItemsListResponse {
+  /// Inventory item collection
+  core.List<InventoryItem> inventoryItems;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#inventoryItemsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  InventoryItemsListResponse();
+
+  InventoryItemsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("inventoryItems")) {
+      inventoryItems = _json["inventoryItems"]
+          .map((value) => new InventoryItem.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 (inventoryItems != null) {
+      _json["inventoryItems"] =
+          inventoryItems.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Key Value Targeting Expression.
+class KeyValueTargetingExpression {
+  /// Keyword expression being targeted by the ad.
+  core.String expression;
+
+  KeyValueTargetingExpression();
+
+  KeyValueTargetingExpression.fromJson(core.Map _json) {
+    if (_json.containsKey("expression")) {
+      expression = _json["expression"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (expression != null) {
+      _json["expression"] = expression;
+    }
+    return _json;
+  }
+}
+
+/// Contains information about where a user's browser is taken after the user
+/// clicks an ad.
+class LandingPage {
+  /// Advertiser ID of this landing page. This is a required field.
+  core.String advertiserId;
+
+  /// Whether this landing page has been archived.
+  core.bool archived;
+
+  /// ID of this landing page. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#landingPage".
+  core.String kind;
+
+  /// Name of this landing page. This is a required field. It must be less than
+  /// 256 characters long.
+  core.String name;
+
+  /// URL of this landing page. This is a required field.
+  core.String url;
+
+  LandingPage();
+
+  LandingPage.fromJson(core.Map _json) {
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("archived")) {
+      archived = _json["archived"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    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 (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (archived != null) {
+      _json["archived"] = archived;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (url != null) {
+      _json["url"] = url;
+    }
+    return _json;
+  }
+}
+
+/// Contains information about a language that can be targeted by ads.
+class Language {
+  /// Language ID of this language. This is the ID used for targeting and
+  /// generating reports.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#language".
+  core.String kind;
+
+  /// Format of language code is an ISO 639 two-letter language code optionally
+  /// followed by an underscore followed by an ISO 3166 code. Examples are "en"
+  /// for English or "zh_CN" for Simplified Chinese.
+  core.String languageCode;
+
+  /// Name of this language.
+  core.String name;
+
+  Language();
+
+  Language.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("languageCode")) {
+      languageCode = _json["languageCode"];
+    }
+    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 (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (languageCode != null) {
+      _json["languageCode"] = languageCode;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Language Targeting.
+class LanguageTargeting {
+  /// Languages that this ad targets. For each language only languageId is
+  /// required. The other fields are populated automatically when the ad is
+  /// inserted or updated.
+  core.List<Language> languages;
+
+  LanguageTargeting();
+
+  LanguageTargeting.fromJson(core.Map _json) {
+    if (_json.containsKey("languages")) {
+      languages = _json["languages"]
+          .map((value) => new Language.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 (languages != null) {
+      _json["languages"] = languages.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Language List Response
+class LanguagesListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#languagesListResponse".
+  core.String kind;
+
+  /// Language collection.
+  core.List<Language> languages;
+
+  LanguagesListResponse();
+
+  LanguagesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("languages")) {
+      languages = _json["languages"]
+          .map((value) => new Language.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (languages != null) {
+      _json["languages"] = languages.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Modification timestamp.
+class LastModifiedInfo {
+  /// Timestamp of the last change in milliseconds since epoch.
+  core.String time;
+
+  LastModifiedInfo();
+
+  LastModifiedInfo.fromJson(core.Map _json) {
+    if (_json.containsKey("time")) {
+      time = _json["time"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (time != null) {
+      _json["time"] = time;
+    }
+    return _json;
+  }
+}
+
+/// A group clause made up of list population terms representing constraints
+/// joined by ORs.
+class ListPopulationClause {
+  /// Terms of this list population clause. Each clause is made up of list
+  /// population terms representing constraints and are joined by ORs.
+  core.List<ListPopulationTerm> terms;
+
+  ListPopulationClause();
+
+  ListPopulationClause.fromJson(core.Map _json) {
+    if (_json.containsKey("terms")) {
+      terms = _json["terms"]
+          .map((value) => new ListPopulationTerm.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 (terms != null) {
+      _json["terms"] = terms.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Remarketing List Population Rule.
+class ListPopulationRule {
+  /// Floodlight activity ID associated with this rule. This field can be left
+  /// blank.
+  core.String floodlightActivityId;
+
+  /// Name of floodlight activity associated with this rule. This is a
+  /// read-only, auto-generated field.
+  core.String floodlightActivityName;
+
+  /// Clauses that make up this list population rule. Clauses are joined by
+  /// ANDs, and the clauses themselves are made up of list population terms
+  /// which are joined by ORs.
+  core.List<ListPopulationClause> listPopulationClauses;
+
+  ListPopulationRule();
+
+  ListPopulationRule.fromJson(core.Map _json) {
+    if (_json.containsKey("floodlightActivityId")) {
+      floodlightActivityId = _json["floodlightActivityId"];
+    }
+    if (_json.containsKey("floodlightActivityName")) {
+      floodlightActivityName = _json["floodlightActivityName"];
+    }
+    if (_json.containsKey("listPopulationClauses")) {
+      listPopulationClauses = _json["listPopulationClauses"]
+          .map((value) => new ListPopulationClause.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 (floodlightActivityId != null) {
+      _json["floodlightActivityId"] = floodlightActivityId;
+    }
+    if (floodlightActivityName != null) {
+      _json["floodlightActivityName"] = floodlightActivityName;
+    }
+    if (listPopulationClauses != null) {
+      _json["listPopulationClauses"] =
+          listPopulationClauses.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Remarketing List Population Rule Term.
+class ListPopulationTerm {
+  /// Will be true if the term should check if the user is in the list and false
+  /// if the term should check if the user is not in the list. This field is
+  /// only relevant when type is set to LIST_MEMBERSHIP_TERM. False by default.
+  core.bool contains;
+
+  /// Whether to negate the comparison result of this term during rule
+  /// evaluation. This field is only relevant when type is left unset or set to
+  /// CUSTOM_VARIABLE_TERM or REFERRER_TERM.
+  core.bool negation;
+
+  /// Comparison operator of this term. This field is only relevant when type is
+  /// left unset or set to CUSTOM_VARIABLE_TERM or REFERRER_TERM.
+  /// Possible string values are:
+  /// - "NUM_EQUALS"
+  /// - "NUM_GREATER_THAN"
+  /// - "NUM_GREATER_THAN_EQUAL"
+  /// - "NUM_LESS_THAN"
+  /// - "NUM_LESS_THAN_EQUAL"
+  /// - "STRING_CONTAINS"
+  /// - "STRING_EQUALS"
+  core.String operator;
+
+  /// ID of the list in question. This field is only relevant when type is set
+  /// to LIST_MEMBERSHIP_TERM.
+  core.String remarketingListId;
+
+  /// List population term type determines the applicable fields in this object.
+  /// If left unset or set to CUSTOM_VARIABLE_TERM, then variableName,
+  /// variableFriendlyName, operator, value, and negation are applicable. If set
+  /// to LIST_MEMBERSHIP_TERM then remarketingListId and contains are
+  /// applicable. If set to REFERRER_TERM then operator, value, and negation are
+  /// applicable.
+  /// Possible string values are:
+  /// - "CUSTOM_VARIABLE_TERM"
+  /// - "LIST_MEMBERSHIP_TERM"
+  /// - "REFERRER_TERM"
+  core.String type;
+
+  /// Literal to compare the variable to. This field is only relevant when type
+  /// is left unset or set to CUSTOM_VARIABLE_TERM or REFERRER_TERM.
+  core.String value;
+
+  /// Friendly name of this term's variable. This is a read-only, auto-generated
+  /// field. This field is only relevant when type is left unset or set to
+  /// CUSTOM_VARIABLE_TERM.
+  core.String variableFriendlyName;
+
+  /// Name of the variable (U1, U2, etc.) being compared in this term. This
+  /// field is only relevant when type is set to null, CUSTOM_VARIABLE_TERM or
+  /// REFERRER_TERM.
+  core.String variableName;
+
+  ListPopulationTerm();
+
+  ListPopulationTerm.fromJson(core.Map _json) {
+    if (_json.containsKey("contains")) {
+      contains = _json["contains"];
+    }
+    if (_json.containsKey("negation")) {
+      negation = _json["negation"];
+    }
+    if (_json.containsKey("operator")) {
+      operator = _json["operator"];
+    }
+    if (_json.containsKey("remarketingListId")) {
+      remarketingListId = _json["remarketingListId"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    if (_json.containsKey("value")) {
+      value = _json["value"];
+    }
+    if (_json.containsKey("variableFriendlyName")) {
+      variableFriendlyName = _json["variableFriendlyName"];
+    }
+    if (_json.containsKey("variableName")) {
+      variableName = _json["variableName"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (contains != null) {
+      _json["contains"] = contains;
+    }
+    if (negation != null) {
+      _json["negation"] = negation;
+    }
+    if (operator != null) {
+      _json["operator"] = operator;
+    }
+    if (remarketingListId != null) {
+      _json["remarketingListId"] = remarketingListId;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    if (variableFriendlyName != null) {
+      _json["variableFriendlyName"] = variableFriendlyName;
+    }
+    if (variableName != null) {
+      _json["variableName"] = variableName;
+    }
+    return _json;
+  }
+}
+
+/// Remarketing List Targeting Expression.
+class ListTargetingExpression {
+  /// Expression describing which lists are being targeted by the ad.
+  core.String expression;
+
+  ListTargetingExpression();
+
+  ListTargetingExpression.fromJson(core.Map _json) {
+    if (_json.containsKey("expression")) {
+      expression = _json["expression"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (expression != null) {
+      _json["expression"] = expression;
+    }
+    return _json;
+  }
+}
+
+/// Lookback configuration settings.
+class LookbackConfiguration {
+  /// Lookback window, in days, from the last time a given user clicked on one
+  /// of your ads. If you enter 0, clicks will not be considered as triggering
+  /// events for floodlight tracking. If you leave this field blank, the default
+  /// value for your account will be used. Acceptable values are 0 to 90,
+  /// inclusive.
+  core.int clickDuration;
+
+  /// Lookback window, in days, from the last time a given user viewed one of
+  /// your ads. If you enter 0, impressions will not be considered as triggering
+  /// events for floodlight tracking. If you leave this field blank, the default
+  /// value for your account will be used. Acceptable values are 0 to 90,
+  /// inclusive.
+  core.int postImpressionActivitiesDuration;
+
+  LookbackConfiguration();
+
+  LookbackConfiguration.fromJson(core.Map _json) {
+    if (_json.containsKey("clickDuration")) {
+      clickDuration = _json["clickDuration"];
+    }
+    if (_json.containsKey("postImpressionActivitiesDuration")) {
+      postImpressionActivitiesDuration =
+          _json["postImpressionActivitiesDuration"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (clickDuration != null) {
+      _json["clickDuration"] = clickDuration;
+    }
+    if (postImpressionActivitiesDuration != null) {
+      _json["postImpressionActivitiesDuration"] =
+          postImpressionActivitiesDuration;
+    }
+    return _json;
+  }
+}
+
+/// Represents a metric.
+class Metric {
+  /// The kind of resource this is, in this case dfareporting#metric.
+  core.String kind;
+
+  /// The metric name, e.g. dfa:impressions
+  core.String name;
+
+  Metric();
+
+  Metric.fromJson(core.Map _json) {
+    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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Contains information about a metro region that can be targeted by ads.
+class Metro {
+  /// Country code of the country to which this metro region belongs.
+  core.String countryCode;
+
+  /// DART ID of the country to which this metro region belongs.
+  core.String countryDartId;
+
+  /// DART ID of this metro region.
+  core.String dartId;
+
+  /// DMA ID of this metro region. This is the ID used for targeting and
+  /// generating reports, and is equivalent to metro_code.
+  core.String dmaId;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#metro".
+  core.String kind;
+
+  /// Metro code of this metro region. This is equivalent to dma_id.
+  core.String metroCode;
+
+  /// Name of this metro region.
+  core.String name;
+
+  Metro();
+
+  Metro.fromJson(core.Map _json) {
+    if (_json.containsKey("countryCode")) {
+      countryCode = _json["countryCode"];
+    }
+    if (_json.containsKey("countryDartId")) {
+      countryDartId = _json["countryDartId"];
+    }
+    if (_json.containsKey("dartId")) {
+      dartId = _json["dartId"];
+    }
+    if (_json.containsKey("dmaId")) {
+      dmaId = _json["dmaId"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("metroCode")) {
+      metroCode = _json["metroCode"];
+    }
+    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 (countryCode != null) {
+      _json["countryCode"] = countryCode;
+    }
+    if (countryDartId != null) {
+      _json["countryDartId"] = countryDartId;
+    }
+    if (dartId != null) {
+      _json["dartId"] = dartId;
+    }
+    if (dmaId != null) {
+      _json["dmaId"] = dmaId;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (metroCode != null) {
+      _json["metroCode"] = metroCode;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Metro List Response
+class MetrosListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#metrosListResponse".
+  core.String kind;
+
+  /// Metro collection.
+  core.List<Metro> metros;
+
+  MetrosListResponse();
+
+  MetrosListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("metros")) {
+      metros =
+          _json["metros"].map((value) => new Metro.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (metros != null) {
+      _json["metros"] = metros.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Contains information about a mobile carrier that can be targeted by ads.
+class MobileCarrier {
+  /// Country code of the country to which this mobile carrier belongs.
+  core.String countryCode;
+
+  /// DART ID of the country to which this mobile carrier belongs.
+  core.String countryDartId;
+
+  /// ID of this mobile carrier.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#mobileCarrier".
+  core.String kind;
+
+  /// Name of this mobile carrier.
+  core.String name;
+
+  MobileCarrier();
+
+  MobileCarrier.fromJson(core.Map _json) {
+    if (_json.containsKey("countryCode")) {
+      countryCode = _json["countryCode"];
+    }
+    if (_json.containsKey("countryDartId")) {
+      countryDartId = _json["countryDartId"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    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 (countryCode != null) {
+      _json["countryCode"] = countryCode;
+    }
+    if (countryDartId != null) {
+      _json["countryDartId"] = countryDartId;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Mobile Carrier List Response
+class MobileCarriersListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#mobileCarriersListResponse".
+  core.String kind;
+
+  /// Mobile carrier collection.
+  core.List<MobileCarrier> mobileCarriers;
+
+  MobileCarriersListResponse();
+
+  MobileCarriersListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("mobileCarriers")) {
+      mobileCarriers = _json["mobileCarriers"]
+          .map((value) => new MobileCarrier.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (mobileCarriers != null) {
+      _json["mobileCarriers"] =
+          mobileCarriers.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Object Filter.
+class ObjectFilter {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#objectFilter".
+  core.String kind;
+
+  /// Applicable when status is ASSIGNED. The user has access to objects with
+  /// these object IDs.
+  core.List<core.String> objectIds;
+
+  /// Status of the filter. NONE means the user has access to none of the
+  /// objects. ALL means the user has access to all objects. ASSIGNED means the
+  /// user has access to the objects with IDs in the objectIds list.
+  /// Possible string values are:
+  /// - "ALL"
+  /// - "ASSIGNED"
+  /// - "NONE"
+  core.String status;
+
+  ObjectFilter();
+
+  ObjectFilter.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("objectIds")) {
+      objectIds = _json["objectIds"];
+    }
+    if (_json.containsKey("status")) {
+      status = _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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (objectIds != null) {
+      _json["objectIds"] = objectIds;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    return _json;
+  }
+}
+
+/// Offset Position.
+class OffsetPosition {
+  /// Offset distance from left side of an asset or a window.
+  core.int left;
+
+  /// Offset distance from top side of an asset or a window.
+  core.int top;
+
+  OffsetPosition();
+
+  OffsetPosition.fromJson(core.Map _json) {
+    if (_json.containsKey("left")) {
+      left = _json["left"];
+    }
+    if (_json.containsKey("top")) {
+      top = _json["top"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (left != null) {
+      _json["left"] = left;
+    }
+    if (top != null) {
+      _json["top"] = top;
+    }
+    return _json;
+  }
+}
+
+/// Omniture Integration Settings.
+class OmnitureSettings {
+  /// Whether placement cost data will be sent to Omniture. This property can be
+  /// enabled only if omnitureIntegrationEnabled is true.
+  core.bool omnitureCostDataEnabled;
+
+  /// Whether Omniture integration is enabled. This property can be enabled only
+  /// when the "Advanced Ad Serving" account setting is enabled.
+  core.bool omnitureIntegrationEnabled;
+
+  OmnitureSettings();
+
+  OmnitureSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("omnitureCostDataEnabled")) {
+      omnitureCostDataEnabled = _json["omnitureCostDataEnabled"];
+    }
+    if (_json.containsKey("omnitureIntegrationEnabled")) {
+      omnitureIntegrationEnabled = _json["omnitureIntegrationEnabled"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (omnitureCostDataEnabled != null) {
+      _json["omnitureCostDataEnabled"] = omnitureCostDataEnabled;
+    }
+    if (omnitureIntegrationEnabled != null) {
+      _json["omnitureIntegrationEnabled"] = omnitureIntegrationEnabled;
+    }
+    return _json;
+  }
+}
+
+/// Contains information about an operating system that can be targeted by ads.
+class OperatingSystem {
+  /// DART ID of this operating system. This is the ID used for targeting.
+  core.String dartId;
+
+  /// Whether this operating system is for desktop.
+  core.bool desktop;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#operatingSystem".
+  core.String kind;
+
+  /// Whether this operating system is for mobile.
+  core.bool mobile;
+
+  /// Name of this operating system.
+  core.String name;
+
+  OperatingSystem();
+
+  OperatingSystem.fromJson(core.Map _json) {
+    if (_json.containsKey("dartId")) {
+      dartId = _json["dartId"];
+    }
+    if (_json.containsKey("desktop")) {
+      desktop = _json["desktop"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("mobile")) {
+      mobile = _json["mobile"];
+    }
+    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 (dartId != null) {
+      _json["dartId"] = dartId;
+    }
+    if (desktop != null) {
+      _json["desktop"] = desktop;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (mobile != null) {
+      _json["mobile"] = mobile;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Contains information about a particular version of an operating system that
+/// can be targeted by ads.
+class OperatingSystemVersion {
+  /// ID of this operating system version.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#operatingSystemVersion".
+  core.String kind;
+
+  /// Major version (leftmost number) of this operating system version.
+  core.String majorVersion;
+
+  /// Minor version (number after the first dot) of this operating system
+  /// version.
+  core.String minorVersion;
+
+  /// Name of this operating system version.
+  core.String name;
+
+  /// Operating system of this operating system version.
+  OperatingSystem operatingSystem;
+
+  OperatingSystemVersion();
+
+  OperatingSystemVersion.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("majorVersion")) {
+      majorVersion = _json["majorVersion"];
+    }
+    if (_json.containsKey("minorVersion")) {
+      minorVersion = _json["minorVersion"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("operatingSystem")) {
+      operatingSystem = new OperatingSystem.fromJson(_json["operatingSystem"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (majorVersion != null) {
+      _json["majorVersion"] = majorVersion;
+    }
+    if (minorVersion != null) {
+      _json["minorVersion"] = minorVersion;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (operatingSystem != null) {
+      _json["operatingSystem"] = (operatingSystem).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Operating System Version List Response
+class OperatingSystemVersionsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#operatingSystemVersionsListResponse".
+  core.String kind;
+
+  /// Operating system version collection.
+  core.List<OperatingSystemVersion> operatingSystemVersions;
+
+  OperatingSystemVersionsListResponse();
+
+  OperatingSystemVersionsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("operatingSystemVersions")) {
+      operatingSystemVersions = _json["operatingSystemVersions"]
+          .map((value) => new OperatingSystemVersion.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (operatingSystemVersions != null) {
+      _json["operatingSystemVersions"] =
+          operatingSystemVersions.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Operating System List Response
+class OperatingSystemsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#operatingSystemsListResponse".
+  core.String kind;
+
+  /// Operating system collection.
+  core.List<OperatingSystem> operatingSystems;
+
+  OperatingSystemsListResponse();
+
+  OperatingSystemsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("operatingSystems")) {
+      operatingSystems = _json["operatingSystems"]
+          .map((value) => new OperatingSystem.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (operatingSystems != null) {
+      _json["operatingSystems"] =
+          operatingSystems.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Creative optimization activity.
+class OptimizationActivity {
+  /// Floodlight activity ID of this optimization activity. This is a required
+  /// field.
+  core.String floodlightActivityId;
+
+  /// Dimension value for the ID of the floodlight activity. This is a
+  /// read-only, auto-generated field.
+  DimensionValue floodlightActivityIdDimensionValue;
+
+  /// Weight associated with this optimization. The weight assigned will be
+  /// understood in proportion to the weights assigned to the other optimization
+  /// activities. Value must be greater than or equal to 1.
+  core.int weight;
+
+  OptimizationActivity();
+
+  OptimizationActivity.fromJson(core.Map _json) {
+    if (_json.containsKey("floodlightActivityId")) {
+      floodlightActivityId = _json["floodlightActivityId"];
+    }
+    if (_json.containsKey("floodlightActivityIdDimensionValue")) {
+      floodlightActivityIdDimensionValue = new DimensionValue.fromJson(
+          _json["floodlightActivityIdDimensionValue"]);
+    }
+    if (_json.containsKey("weight")) {
+      weight = _json["weight"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (floodlightActivityId != null) {
+      _json["floodlightActivityId"] = floodlightActivityId;
+    }
+    if (floodlightActivityIdDimensionValue != null) {
+      _json["floodlightActivityIdDimensionValue"] =
+          (floodlightActivityIdDimensionValue).toJson();
+    }
+    if (weight != null) {
+      _json["weight"] = weight;
+    }
+    return _json;
+  }
+}
+
+/// Describes properties of a DoubleClick Planning order.
+class Order {
+  /// Account ID of this order.
+  core.String accountId;
+
+  /// Advertiser ID of this order.
+  core.String advertiserId;
+
+  /// IDs for users that have to approve documents created for this order.
+  core.List<core.String> approverUserProfileIds;
+
+  /// Buyer invoice ID associated with this order.
+  core.String buyerInvoiceId;
+
+  /// Name of the buyer organization.
+  core.String buyerOrganizationName;
+
+  /// Comments in this order.
+  core.String comments;
+
+  /// Contacts for this order.
+  core.List<OrderContact> contacts;
+
+  /// ID of this order. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#order".
+  core.String kind;
+
+  /// Information about the most recent modification of this order.
+  LastModifiedInfo lastModifiedInfo;
+
+  /// Name of this order.
+  core.String name;
+
+  /// Notes of this order.
+  core.String notes;
+
+  /// ID of the terms and conditions template used in this order.
+  core.String planningTermId;
+
+  /// Project ID of this order.
+  core.String projectId;
+
+  /// Seller order ID associated with this order.
+  core.String sellerOrderId;
+
+  /// Name of the seller organization.
+  core.String sellerOrganizationName;
+
+  /// Site IDs this order is associated with.
+  core.List<core.String> siteId;
+
+  /// Free-form site names this order is associated with.
+  core.List<core.String> siteNames;
+
+  /// Subaccount ID of this order.
+  core.String subaccountId;
+
+  /// Terms and conditions of this order.
+  core.String termsAndConditions;
+
+  Order();
+
+  Order.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("approverUserProfileIds")) {
+      approverUserProfileIds = _json["approverUserProfileIds"];
+    }
+    if (_json.containsKey("buyerInvoiceId")) {
+      buyerInvoiceId = _json["buyerInvoiceId"];
+    }
+    if (_json.containsKey("buyerOrganizationName")) {
+      buyerOrganizationName = _json["buyerOrganizationName"];
+    }
+    if (_json.containsKey("comments")) {
+      comments = _json["comments"];
+    }
+    if (_json.containsKey("contacts")) {
+      contacts = _json["contacts"]
+          .map((value) => new OrderContact.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lastModifiedInfo")) {
+      lastModifiedInfo =
+          new LastModifiedInfo.fromJson(_json["lastModifiedInfo"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("notes")) {
+      notes = _json["notes"];
+    }
+    if (_json.containsKey("planningTermId")) {
+      planningTermId = _json["planningTermId"];
+    }
+    if (_json.containsKey("projectId")) {
+      projectId = _json["projectId"];
+    }
+    if (_json.containsKey("sellerOrderId")) {
+      sellerOrderId = _json["sellerOrderId"];
+    }
+    if (_json.containsKey("sellerOrganizationName")) {
+      sellerOrganizationName = _json["sellerOrganizationName"];
+    }
+    if (_json.containsKey("siteId")) {
+      siteId = _json["siteId"];
+    }
+    if (_json.containsKey("siteNames")) {
+      siteNames = _json["siteNames"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("termsAndConditions")) {
+      termsAndConditions = _json["termsAndConditions"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (approverUserProfileIds != null) {
+      _json["approverUserProfileIds"] = approverUserProfileIds;
+    }
+    if (buyerInvoiceId != null) {
+      _json["buyerInvoiceId"] = buyerInvoiceId;
+    }
+    if (buyerOrganizationName != null) {
+      _json["buyerOrganizationName"] = buyerOrganizationName;
+    }
+    if (comments != null) {
+      _json["comments"] = comments;
+    }
+    if (contacts != null) {
+      _json["contacts"] = contacts.map((value) => (value).toJson()).toList();
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lastModifiedInfo != null) {
+      _json["lastModifiedInfo"] = (lastModifiedInfo).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (notes != null) {
+      _json["notes"] = notes;
+    }
+    if (planningTermId != null) {
+      _json["planningTermId"] = planningTermId;
+    }
+    if (projectId != null) {
+      _json["projectId"] = projectId;
+    }
+    if (sellerOrderId != null) {
+      _json["sellerOrderId"] = sellerOrderId;
+    }
+    if (sellerOrganizationName != null) {
+      _json["sellerOrganizationName"] = sellerOrganizationName;
+    }
+    if (siteId != null) {
+      _json["siteId"] = siteId;
+    }
+    if (siteNames != null) {
+      _json["siteNames"] = siteNames;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (termsAndConditions != null) {
+      _json["termsAndConditions"] = termsAndConditions;
+    }
+    return _json;
+  }
+}
+
+/// Contact of an order.
+class OrderContact {
+  /// Free-form information about this contact. It could be any information
+  /// related to this contact in addition to type, title, name, and signature
+  /// user profile ID.
+  core.String contactInfo;
+
+  /// Name of this contact.
+  core.String contactName;
+
+  /// Title of this contact.
+  core.String contactTitle;
+
+  /// Type of this contact.
+  /// Possible string values are:
+  /// - "PLANNING_ORDER_CONTACT_BUYER_BILLING_CONTACT"
+  /// - "PLANNING_ORDER_CONTACT_BUYER_CONTACT"
+  /// - "PLANNING_ORDER_CONTACT_SELLER_CONTACT"
+  core.String contactType;
+
+  /// ID of the user profile containing the signature that will be embedded into
+  /// order documents.
+  core.String signatureUserProfileId;
+
+  OrderContact();
+
+  OrderContact.fromJson(core.Map _json) {
+    if (_json.containsKey("contactInfo")) {
+      contactInfo = _json["contactInfo"];
+    }
+    if (_json.containsKey("contactName")) {
+      contactName = _json["contactName"];
+    }
+    if (_json.containsKey("contactTitle")) {
+      contactTitle = _json["contactTitle"];
+    }
+    if (_json.containsKey("contactType")) {
+      contactType = _json["contactType"];
+    }
+    if (_json.containsKey("signatureUserProfileId")) {
+      signatureUserProfileId = _json["signatureUserProfileId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (contactInfo != null) {
+      _json["contactInfo"] = contactInfo;
+    }
+    if (contactName != null) {
+      _json["contactName"] = contactName;
+    }
+    if (contactTitle != null) {
+      _json["contactTitle"] = contactTitle;
+    }
+    if (contactType != null) {
+      _json["contactType"] = contactType;
+    }
+    if (signatureUserProfileId != null) {
+      _json["signatureUserProfileId"] = signatureUserProfileId;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a DoubleClick Planning order document.
+class OrderDocument {
+  /// Account ID of this order document.
+  core.String accountId;
+
+  /// Advertiser ID of this order document.
+  core.String advertiserId;
+
+  /// The amended order document ID of this order document. An order document
+  /// can be created by optionally amending another order document so that the
+  /// change history can be preserved.
+  core.String amendedOrderDocumentId;
+
+  /// IDs of users who have approved this order document.
+  core.List<core.String> approvedByUserProfileIds;
+
+  /// Whether this order document is cancelled.
+  core.bool cancelled;
+
+  /// Information about the creation of this order document.
+  LastModifiedInfo createdInfo;
+
+  /// Effective date of this order document.
+  core.DateTime effectiveDate;
+
+  /// ID of this order document.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#orderDocument".
+  core.String kind;
+
+  /// List of email addresses that received the last sent document.
+  core.List<core.String> lastSentRecipients;
+
+  /// Timestamp of the last email sent with this order document.
+  core.DateTime lastSentTime;
+
+  /// ID of the order from which this order document is created.
+  core.String orderId;
+
+  /// Project ID of this order document.
+  core.String projectId;
+
+  /// Whether this order document has been signed.
+  core.bool signed;
+
+  /// Subaccount ID of this order document.
+  core.String subaccountId;
+
+  /// Title of this order document.
+  core.String title;
+
+  /// Type of this order document
+  /// Possible string values are:
+  /// - "PLANNING_ORDER_TYPE_CHANGE_ORDER"
+  /// - "PLANNING_ORDER_TYPE_INSERTION_ORDER"
+  core.String type;
+
+  OrderDocument();
+
+  OrderDocument.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("amendedOrderDocumentId")) {
+      amendedOrderDocumentId = _json["amendedOrderDocumentId"];
+    }
+    if (_json.containsKey("approvedByUserProfileIds")) {
+      approvedByUserProfileIds = _json["approvedByUserProfileIds"];
+    }
+    if (_json.containsKey("cancelled")) {
+      cancelled = _json["cancelled"];
+    }
+    if (_json.containsKey("createdInfo")) {
+      createdInfo = new LastModifiedInfo.fromJson(_json["createdInfo"]);
+    }
+    if (_json.containsKey("effectiveDate")) {
+      effectiveDate = core.DateTime.parse(_json["effectiveDate"]);
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lastSentRecipients")) {
+      lastSentRecipients = _json["lastSentRecipients"];
+    }
+    if (_json.containsKey("lastSentTime")) {
+      lastSentTime = core.DateTime.parse(_json["lastSentTime"]);
+    }
+    if (_json.containsKey("orderId")) {
+      orderId = _json["orderId"];
+    }
+    if (_json.containsKey("projectId")) {
+      projectId = _json["projectId"];
+    }
+    if (_json.containsKey("signed")) {
+      signed = _json["signed"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("title")) {
+      title = _json["title"];
+    }
+    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 (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (amendedOrderDocumentId != null) {
+      _json["amendedOrderDocumentId"] = amendedOrderDocumentId;
+    }
+    if (approvedByUserProfileIds != null) {
+      _json["approvedByUserProfileIds"] = approvedByUserProfileIds;
+    }
+    if (cancelled != null) {
+      _json["cancelled"] = cancelled;
+    }
+    if (createdInfo != null) {
+      _json["createdInfo"] = (createdInfo).toJson();
+    }
+    if (effectiveDate != null) {
+      _json["effectiveDate"] =
+          "${(effectiveDate).year.toString().padLeft(4, '0')}-${(effectiveDate).month.toString().padLeft(2, '0')}-${(effectiveDate).day.toString().padLeft(2, '0')}";
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lastSentRecipients != null) {
+      _json["lastSentRecipients"] = lastSentRecipients;
+    }
+    if (lastSentTime != null) {
+      _json["lastSentTime"] = (lastSentTime).toIso8601String();
+    }
+    if (orderId != null) {
+      _json["orderId"] = orderId;
+    }
+    if (projectId != null) {
+      _json["projectId"] = projectId;
+    }
+    if (signed != null) {
+      _json["signed"] = signed;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (title != null) {
+      _json["title"] = title;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+/// Order document List Response
+class OrderDocumentsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#orderDocumentsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  /// Order document collection
+  core.List<OrderDocument> orderDocuments;
+
+  OrderDocumentsListResponse();
+
+  OrderDocumentsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("orderDocuments")) {
+      orderDocuments = _json["orderDocuments"]
+          .map((value) => new OrderDocument.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (orderDocuments != null) {
+      _json["orderDocuments"] =
+          orderDocuments.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Order List Response
+class OrdersListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#ordersListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  /// Order collection.
+  core.List<Order> orders;
+
+  OrdersListResponse();
+
+  OrdersListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("orders")) {
+      orders =
+          _json["orders"].map((value) => new Order.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (orders != null) {
+      _json["orders"] = orders.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Represents fields that are compatible to be selected for a report of type
+/// "PATH_TO_CONVERSION".
+class PathToConversionReportCompatibleFields {
+  /// Conversion dimensions which are compatible to be selected in the
+  /// "conversionDimensions" section of the report.
+  core.List<Dimension> conversionDimensions;
+
+  /// Custom floodlight variables which are compatible to be selected in the
+  /// "customFloodlightVariables" section of the report.
+  core.List<Dimension> customFloodlightVariables;
+
+  /// The kind of resource this is, in this case
+  /// dfareporting#pathToConversionReportCompatibleFields.
+  core.String kind;
+
+  /// Metrics which are compatible to be selected in the "metricNames" section
+  /// of the report.
+  core.List<Metric> metrics;
+
+  /// Per-interaction dimensions which are compatible to be selected in the
+  /// "perInteractionDimensions" section of the report.
+  core.List<Dimension> perInteractionDimensions;
+
+  PathToConversionReportCompatibleFields();
+
+  PathToConversionReportCompatibleFields.fromJson(core.Map _json) {
+    if (_json.containsKey("conversionDimensions")) {
+      conversionDimensions = _json["conversionDimensions"]
+          .map((value) => new Dimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("customFloodlightVariables")) {
+      customFloodlightVariables = _json["customFloodlightVariables"]
+          .map((value) => new Dimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("metrics")) {
+      metrics =
+          _json["metrics"].map((value) => new Metric.fromJson(value)).toList();
+    }
+    if (_json.containsKey("perInteractionDimensions")) {
+      perInteractionDimensions = _json["perInteractionDimensions"]
+          .map((value) => new Dimension.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 (conversionDimensions != null) {
+      _json["conversionDimensions"] =
+          conversionDimensions.map((value) => (value).toJson()).toList();
+    }
+    if (customFloodlightVariables != null) {
+      _json["customFloodlightVariables"] =
+          customFloodlightVariables.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (metrics != null) {
+      _json["metrics"] = metrics.map((value) => (value).toJson()).toList();
+    }
+    if (perInteractionDimensions != null) {
+      _json["perInteractionDimensions"] =
+          perInteractionDimensions.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a placement.
+class Placement {
+  /// Account ID of this placement. This field can be left blank.
+  core.String accountId;
+
+  /// Whether this placement opts out of ad blocking. When true, ad blocking is
+  /// disabled for this placement. When false, the campaign and site settings
+  /// take effect.
+  core.bool adBlockingOptOut;
+
+  /// Advertiser ID of this placement. This field can be left blank.
+  core.String advertiserId;
+
+  /// Dimension value for the ID of the advertiser. This is a read-only,
+  /// auto-generated field.
+  DimensionValue advertiserIdDimensionValue;
+
+  /// Whether this placement is archived.
+  core.bool archived;
+
+  /// Campaign ID of this placement. This field is a required field on
+  /// insertion.
+  core.String campaignId;
+
+  /// Dimension value for the ID of the campaign. This is a read-only,
+  /// auto-generated field.
+  DimensionValue campaignIdDimensionValue;
+
+  /// Comments for this placement.
+  core.String comment;
+
+  /// Placement compatibility. DISPLAY and DISPLAY_INTERSTITIAL refer to
+  /// rendering on desktop, on mobile devices or in mobile apps for regular or
+  /// interstitial ads respectively. APP and APP_INTERSTITIAL are no longer
+  /// allowed for new placement insertions. Instead, use DISPLAY or
+  /// DISPLAY_INTERSTITIAL. IN_STREAM_VIDEO refers to rendering in in-stream
+  /// video ads developed with the VAST standard. This field is required on
+  /// insertion.
+  /// Possible string values are:
+  /// - "APP"
+  /// - "APP_INTERSTITIAL"
+  /// - "DISPLAY"
+  /// - "DISPLAY_INTERSTITIAL"
+  /// - "IN_STREAM_VIDEO"
+  core.String compatibility;
+
+  /// ID of the content category assigned to this placement.
+  core.String contentCategoryId;
+
+  /// Information about the creation of this placement. This is a read-only
+  /// field.
+  LastModifiedInfo createInfo;
+
+  /// Directory site ID of this placement. On insert, you must set either this
+  /// field or the siteId field to specify the site associated with this
+  /// placement. This is a required field that is read-only after insertion.
+  core.String directorySiteId;
+
+  /// Dimension value for the ID of the directory site. This is a read-only,
+  /// auto-generated field.
+  DimensionValue directorySiteIdDimensionValue;
+
+  /// External ID for this placement.
+  core.String externalId;
+
+  /// ID of this placement. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Dimension value for the ID of this placement. This is a read-only,
+  /// auto-generated field.
+  DimensionValue idDimensionValue;
+
+  /// Key name of this placement. This is a read-only, auto-generated field.
+  core.String keyName;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#placement".
+  core.String kind;
+
+  /// Information about the most recent modification of this placement. This is
+  /// a read-only field.
+  LastModifiedInfo lastModifiedInfo;
+
+  /// Lookback window settings for this placement.
+  LookbackConfiguration lookbackConfiguration;
+
+  /// Name of this placement.This is a required field and must be less than 256
+  /// characters long.
+  core.String name;
+
+  /// Whether payment was approved for this placement. This is a read-only field
+  /// relevant only to publisher-paid placements.
+  core.bool paymentApproved;
+
+  /// Payment source for this placement. This is a required field that is
+  /// read-only after insertion.
+  /// Possible string values are:
+  /// - "PLACEMENT_AGENCY_PAID"
+  /// - "PLACEMENT_PUBLISHER_PAID"
+  core.String paymentSource;
+
+  /// ID of this placement's group, if applicable.
+  core.String placementGroupId;
+
+  /// Dimension value for the ID of the placement group. This is a read-only,
+  /// auto-generated field.
+  DimensionValue placementGroupIdDimensionValue;
+
+  /// ID of the placement strategy assigned to this placement.
+  core.String placementStrategyId;
+
+  /// Pricing schedule of this placement. This field is required on insertion,
+  /// specifically subfields startDate, endDate and pricingType.
+  PricingSchedule pricingSchedule;
+
+  /// Whether this placement is the primary placement of a roadblock (placement
+  /// group). You cannot change this field from true to false. Setting this
+  /// field to true will automatically set the primary field on the original
+  /// primary placement of the roadblock to false, and it will automatically set
+  /// the roadblock's primaryPlacementId field to the ID of this placement.
+  core.bool primary;
+
+  /// Information about the last publisher update. This is a read-only field.
+  LastModifiedInfo publisherUpdateInfo;
+
+  /// Site ID associated with this placement. On insert, you must set either
+  /// this field or the directorySiteId field to specify the site associated
+  /// with this placement. This is a required field that is read-only after
+  /// insertion.
+  core.String siteId;
+
+  /// Dimension value for the ID of the site. This is a read-only,
+  /// auto-generated field.
+  DimensionValue siteIdDimensionValue;
+
+  /// Size associated with this placement. When inserting or updating a
+  /// placement, only the size ID field is used. This field is required on
+  /// insertion.
+  Size size;
+
+  /// Whether creatives assigned to this placement must be SSL-compliant.
+  core.bool sslRequired;
+
+  /// Third-party placement status.
+  /// Possible string values are:
+  /// - "ACKNOWLEDGE_ACCEPTANCE"
+  /// - "ACKNOWLEDGE_REJECTION"
+  /// - "DRAFT"
+  /// - "PAYMENT_ACCEPTED"
+  /// - "PAYMENT_REJECTED"
+  /// - "PENDING_REVIEW"
+  core.String status;
+
+  /// Subaccount ID of this placement. This field can be left blank.
+  core.String subaccountId;
+
+  /// Tag formats to generate for this placement. This field is required on
+  /// insertion.
+  /// Acceptable values are:
+  /// - "PLACEMENT_TAG_STANDARD"
+  /// - "PLACEMENT_TAG_IFRAME_JAVASCRIPT"
+  /// - "PLACEMENT_TAG_IFRAME_ILAYER"
+  /// - "PLACEMENT_TAG_INTERNAL_REDIRECT"
+  /// - "PLACEMENT_TAG_JAVASCRIPT"
+  /// - "PLACEMENT_TAG_INTERSTITIAL_IFRAME_JAVASCRIPT"
+  /// - "PLACEMENT_TAG_INTERSTITIAL_INTERNAL_REDIRECT"
+  /// - "PLACEMENT_TAG_INTERSTITIAL_JAVASCRIPT"
+  /// - "PLACEMENT_TAG_CLICK_COMMANDS"
+  /// - "PLACEMENT_TAG_INSTREAM_VIDEO_PREFETCH"
+  /// - "PLACEMENT_TAG_INSTREAM_VIDEO_PREFETCH_VAST_3"
+  /// - "PLACEMENT_TAG_INSTREAM_VIDEO_PREFETCH_VAST_4"
+  /// - "PLACEMENT_TAG_TRACKING"
+  /// - "PLACEMENT_TAG_TRACKING_IFRAME"
+  /// - "PLACEMENT_TAG_TRACKING_JAVASCRIPT"
+  core.List<core.String> tagFormats;
+
+  /// Tag settings for this placement.
+  TagSetting tagSetting;
+
+  /// Whether Verification and ActiveView are disabled for in-stream video
+  /// creatives for this placement. The same setting videoActiveViewOptOut
+  /// exists on the site level -- the opt out occurs if either of these settings
+  /// are true. These settings are distinct from
+  /// DirectorySites.settings.activeViewOptOut or
+  /// Sites.siteSettings.activeViewOptOut which only apply to display ads.
+  /// However, Accounts.activeViewOptOut opts out both video traffic, as well as
+  /// display ads, from Verification and ActiveView.
+  core.bool videoActiveViewOptOut;
+
+  /// A collection of settings which affect video creatives served through this
+  /// placement. Applicable to placements with IN_STREAM_VIDEO compatibility.
+  VideoSettings videoSettings;
+
+  /// VPAID adapter setting for this placement. Controls which VPAID format the
+  /// measurement adapter will use for in-stream video creatives assigned to
+  /// this placement.
+  ///
+  /// Note: Flash is no longer supported. This field now defaults to HTML5 when
+  /// the following values are provided: FLASH, BOTH.
+  /// Possible string values are:
+  /// - "BOTH"
+  /// - "DEFAULT"
+  /// - "FLASH"
+  /// - "HTML5"
+  core.String vpaidAdapterChoice;
+
+  Placement();
+
+  Placement.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("adBlockingOptOut")) {
+      adBlockingOptOut = _json["adBlockingOptOut"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("advertiserIdDimensionValue")) {
+      advertiserIdDimensionValue =
+          new DimensionValue.fromJson(_json["advertiserIdDimensionValue"]);
+    }
+    if (_json.containsKey("archived")) {
+      archived = _json["archived"];
+    }
+    if (_json.containsKey("campaignId")) {
+      campaignId = _json["campaignId"];
+    }
+    if (_json.containsKey("campaignIdDimensionValue")) {
+      campaignIdDimensionValue =
+          new DimensionValue.fromJson(_json["campaignIdDimensionValue"]);
+    }
+    if (_json.containsKey("comment")) {
+      comment = _json["comment"];
+    }
+    if (_json.containsKey("compatibility")) {
+      compatibility = _json["compatibility"];
+    }
+    if (_json.containsKey("contentCategoryId")) {
+      contentCategoryId = _json["contentCategoryId"];
+    }
+    if (_json.containsKey("createInfo")) {
+      createInfo = new LastModifiedInfo.fromJson(_json["createInfo"]);
+    }
+    if (_json.containsKey("directorySiteId")) {
+      directorySiteId = _json["directorySiteId"];
+    }
+    if (_json.containsKey("directorySiteIdDimensionValue")) {
+      directorySiteIdDimensionValue =
+          new DimensionValue.fromJson(_json["directorySiteIdDimensionValue"]);
+    }
+    if (_json.containsKey("externalId")) {
+      externalId = _json["externalId"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("idDimensionValue")) {
+      idDimensionValue = new DimensionValue.fromJson(_json["idDimensionValue"]);
+    }
+    if (_json.containsKey("keyName")) {
+      keyName = _json["keyName"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lastModifiedInfo")) {
+      lastModifiedInfo =
+          new LastModifiedInfo.fromJson(_json["lastModifiedInfo"]);
+    }
+    if (_json.containsKey("lookbackConfiguration")) {
+      lookbackConfiguration =
+          new LookbackConfiguration.fromJson(_json["lookbackConfiguration"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("paymentApproved")) {
+      paymentApproved = _json["paymentApproved"];
+    }
+    if (_json.containsKey("paymentSource")) {
+      paymentSource = _json["paymentSource"];
+    }
+    if (_json.containsKey("placementGroupId")) {
+      placementGroupId = _json["placementGroupId"];
+    }
+    if (_json.containsKey("placementGroupIdDimensionValue")) {
+      placementGroupIdDimensionValue =
+          new DimensionValue.fromJson(_json["placementGroupIdDimensionValue"]);
+    }
+    if (_json.containsKey("placementStrategyId")) {
+      placementStrategyId = _json["placementStrategyId"];
+    }
+    if (_json.containsKey("pricingSchedule")) {
+      pricingSchedule = new PricingSchedule.fromJson(_json["pricingSchedule"]);
+    }
+    if (_json.containsKey("primary")) {
+      primary = _json["primary"];
+    }
+    if (_json.containsKey("publisherUpdateInfo")) {
+      publisherUpdateInfo =
+          new LastModifiedInfo.fromJson(_json["publisherUpdateInfo"]);
+    }
+    if (_json.containsKey("siteId")) {
+      siteId = _json["siteId"];
+    }
+    if (_json.containsKey("siteIdDimensionValue")) {
+      siteIdDimensionValue =
+          new DimensionValue.fromJson(_json["siteIdDimensionValue"]);
+    }
+    if (_json.containsKey("size")) {
+      size = new Size.fromJson(_json["size"]);
+    }
+    if (_json.containsKey("sslRequired")) {
+      sslRequired = _json["sslRequired"];
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("tagFormats")) {
+      tagFormats = _json["tagFormats"];
+    }
+    if (_json.containsKey("tagSetting")) {
+      tagSetting = new TagSetting.fromJson(_json["tagSetting"]);
+    }
+    if (_json.containsKey("videoActiveViewOptOut")) {
+      videoActiveViewOptOut = _json["videoActiveViewOptOut"];
+    }
+    if (_json.containsKey("videoSettings")) {
+      videoSettings = new VideoSettings.fromJson(_json["videoSettings"]);
+    }
+    if (_json.containsKey("vpaidAdapterChoice")) {
+      vpaidAdapterChoice = _json["vpaidAdapterChoice"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (adBlockingOptOut != null) {
+      _json["adBlockingOptOut"] = adBlockingOptOut;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (advertiserIdDimensionValue != null) {
+      _json["advertiserIdDimensionValue"] =
+          (advertiserIdDimensionValue).toJson();
+    }
+    if (archived != null) {
+      _json["archived"] = archived;
+    }
+    if (campaignId != null) {
+      _json["campaignId"] = campaignId;
+    }
+    if (campaignIdDimensionValue != null) {
+      _json["campaignIdDimensionValue"] = (campaignIdDimensionValue).toJson();
+    }
+    if (comment != null) {
+      _json["comment"] = comment;
+    }
+    if (compatibility != null) {
+      _json["compatibility"] = compatibility;
+    }
+    if (contentCategoryId != null) {
+      _json["contentCategoryId"] = contentCategoryId;
+    }
+    if (createInfo != null) {
+      _json["createInfo"] = (createInfo).toJson();
+    }
+    if (directorySiteId != null) {
+      _json["directorySiteId"] = directorySiteId;
+    }
+    if (directorySiteIdDimensionValue != null) {
+      _json["directorySiteIdDimensionValue"] =
+          (directorySiteIdDimensionValue).toJson();
+    }
+    if (externalId != null) {
+      _json["externalId"] = externalId;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (idDimensionValue != null) {
+      _json["idDimensionValue"] = (idDimensionValue).toJson();
+    }
+    if (keyName != null) {
+      _json["keyName"] = keyName;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lastModifiedInfo != null) {
+      _json["lastModifiedInfo"] = (lastModifiedInfo).toJson();
+    }
+    if (lookbackConfiguration != null) {
+      _json["lookbackConfiguration"] = (lookbackConfiguration).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (paymentApproved != null) {
+      _json["paymentApproved"] = paymentApproved;
+    }
+    if (paymentSource != null) {
+      _json["paymentSource"] = paymentSource;
+    }
+    if (placementGroupId != null) {
+      _json["placementGroupId"] = placementGroupId;
+    }
+    if (placementGroupIdDimensionValue != null) {
+      _json["placementGroupIdDimensionValue"] =
+          (placementGroupIdDimensionValue).toJson();
+    }
+    if (placementStrategyId != null) {
+      _json["placementStrategyId"] = placementStrategyId;
+    }
+    if (pricingSchedule != null) {
+      _json["pricingSchedule"] = (pricingSchedule).toJson();
+    }
+    if (primary != null) {
+      _json["primary"] = primary;
+    }
+    if (publisherUpdateInfo != null) {
+      _json["publisherUpdateInfo"] = (publisherUpdateInfo).toJson();
+    }
+    if (siteId != null) {
+      _json["siteId"] = siteId;
+    }
+    if (siteIdDimensionValue != null) {
+      _json["siteIdDimensionValue"] = (siteIdDimensionValue).toJson();
+    }
+    if (size != null) {
+      _json["size"] = (size).toJson();
+    }
+    if (sslRequired != null) {
+      _json["sslRequired"] = sslRequired;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (tagFormats != null) {
+      _json["tagFormats"] = tagFormats;
+    }
+    if (tagSetting != null) {
+      _json["tagSetting"] = (tagSetting).toJson();
+    }
+    if (videoActiveViewOptOut != null) {
+      _json["videoActiveViewOptOut"] = videoActiveViewOptOut;
+    }
+    if (videoSettings != null) {
+      _json["videoSettings"] = (videoSettings).toJson();
+    }
+    if (vpaidAdapterChoice != null) {
+      _json["vpaidAdapterChoice"] = vpaidAdapterChoice;
+    }
+    return _json;
+  }
+}
+
+/// Placement Assignment.
+class PlacementAssignment {
+  /// Whether this placement assignment is active. When true, the placement will
+  /// be included in the ad's rotation.
+  core.bool active;
+
+  /// ID of the placement to be assigned. This is a required field.
+  core.String placementId;
+
+  /// Dimension value for the ID of the placement. This is a read-only,
+  /// auto-generated field.
+  DimensionValue placementIdDimensionValue;
+
+  /// Whether the placement to be assigned requires SSL. This is a read-only
+  /// field that is auto-generated when the ad is inserted or updated.
+  core.bool sslRequired;
+
+  PlacementAssignment();
+
+  PlacementAssignment.fromJson(core.Map _json) {
+    if (_json.containsKey("active")) {
+      active = _json["active"];
+    }
+    if (_json.containsKey("placementId")) {
+      placementId = _json["placementId"];
+    }
+    if (_json.containsKey("placementIdDimensionValue")) {
+      placementIdDimensionValue =
+          new DimensionValue.fromJson(_json["placementIdDimensionValue"]);
+    }
+    if (_json.containsKey("sslRequired")) {
+      sslRequired = _json["sslRequired"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (active != null) {
+      _json["active"] = active;
+    }
+    if (placementId != null) {
+      _json["placementId"] = placementId;
+    }
+    if (placementIdDimensionValue != null) {
+      _json["placementIdDimensionValue"] = (placementIdDimensionValue).toJson();
+    }
+    if (sslRequired != null) {
+      _json["sslRequired"] = sslRequired;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a package or roadblock.
+class PlacementGroup {
+  /// Account ID of this placement group. This is a read-only field that can be
+  /// left blank.
+  core.String accountId;
+
+  /// Advertiser ID of this placement group. This is a required field on
+  /// insertion.
+  core.String advertiserId;
+
+  /// Dimension value for the ID of the advertiser. This is a read-only,
+  /// auto-generated field.
+  DimensionValue advertiserIdDimensionValue;
+
+  /// Whether this placement group is archived.
+  core.bool archived;
+
+  /// Campaign ID of this placement group. This field is required on insertion.
+  core.String campaignId;
+
+  /// Dimension value for the ID of the campaign. This is a read-only,
+  /// auto-generated field.
+  DimensionValue campaignIdDimensionValue;
+
+  /// IDs of placements which are assigned to this placement group. This is a
+  /// read-only, auto-generated field.
+  core.List<core.String> childPlacementIds;
+
+  /// Comments for this placement group.
+  core.String comment;
+
+  /// ID of the content category assigned to this placement group.
+  core.String contentCategoryId;
+
+  /// Information about the creation of this placement group. This is a
+  /// read-only field.
+  LastModifiedInfo createInfo;
+
+  /// Directory site ID associated with this placement group. On insert, you
+  /// must set either this field or the site_id field to specify the site
+  /// associated with this placement group. This is a required field that is
+  /// read-only after insertion.
+  core.String directorySiteId;
+
+  /// Dimension value for the ID of the directory site. This is a read-only,
+  /// auto-generated field.
+  DimensionValue directorySiteIdDimensionValue;
+
+  /// External ID for this placement.
+  core.String externalId;
+
+  /// ID of this placement group. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Dimension value for the ID of this placement group. This is a read-only,
+  /// auto-generated field.
+  DimensionValue idDimensionValue;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#placementGroup".
+  core.String kind;
+
+  /// Information about the most recent modification of this placement group.
+  /// This is a read-only field.
+  LastModifiedInfo lastModifiedInfo;
+
+  /// Name of this placement group. This is a required field and must be less
+  /// than 256 characters long.
+  core.String name;
+
+  /// Type of this placement group. A package is a simple group of placements
+  /// that acts as a single pricing point for a group of tags. A roadblock is a
+  /// group of placements that not only acts as a single pricing point, but also
+  /// assumes that all the tags in it will be served at the same time. A
+  /// roadblock requires one of its assigned placements to be marked as primary
+  /// for reporting. This field is required on insertion.
+  /// Possible string values are:
+  /// - "PLACEMENT_PACKAGE"
+  /// - "PLACEMENT_ROADBLOCK"
+  core.String placementGroupType;
+
+  /// ID of the placement strategy assigned to this placement group.
+  core.String placementStrategyId;
+
+  /// Pricing schedule of this placement group. This field is required on
+  /// insertion.
+  PricingSchedule pricingSchedule;
+
+  /// ID of the primary placement, used to calculate the media cost of a
+  /// roadblock (placement group). Modifying this field will automatically
+  /// modify the primary field on all affected roadblock child placements.
+  core.String primaryPlacementId;
+
+  /// Dimension value for the ID of the primary placement. This is a read-only,
+  /// auto-generated field.
+  DimensionValue primaryPlacementIdDimensionValue;
+
+  /// Site ID associated with this placement group. On insert, you must set
+  /// either this field or the directorySiteId field to specify the site
+  /// associated with this placement group. This is a required field that is
+  /// read-only after insertion.
+  core.String siteId;
+
+  /// Dimension value for the ID of the site. This is a read-only,
+  /// auto-generated field.
+  DimensionValue siteIdDimensionValue;
+
+  /// Subaccount ID of this placement group. This is a read-only field that can
+  /// be left blank.
+  core.String subaccountId;
+
+  PlacementGroup();
+
+  PlacementGroup.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("advertiserIdDimensionValue")) {
+      advertiserIdDimensionValue =
+          new DimensionValue.fromJson(_json["advertiserIdDimensionValue"]);
+    }
+    if (_json.containsKey("archived")) {
+      archived = _json["archived"];
+    }
+    if (_json.containsKey("campaignId")) {
+      campaignId = _json["campaignId"];
+    }
+    if (_json.containsKey("campaignIdDimensionValue")) {
+      campaignIdDimensionValue =
+          new DimensionValue.fromJson(_json["campaignIdDimensionValue"]);
+    }
+    if (_json.containsKey("childPlacementIds")) {
+      childPlacementIds = _json["childPlacementIds"];
+    }
+    if (_json.containsKey("comment")) {
+      comment = _json["comment"];
+    }
+    if (_json.containsKey("contentCategoryId")) {
+      contentCategoryId = _json["contentCategoryId"];
+    }
+    if (_json.containsKey("createInfo")) {
+      createInfo = new LastModifiedInfo.fromJson(_json["createInfo"]);
+    }
+    if (_json.containsKey("directorySiteId")) {
+      directorySiteId = _json["directorySiteId"];
+    }
+    if (_json.containsKey("directorySiteIdDimensionValue")) {
+      directorySiteIdDimensionValue =
+          new DimensionValue.fromJson(_json["directorySiteIdDimensionValue"]);
+    }
+    if (_json.containsKey("externalId")) {
+      externalId = _json["externalId"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("idDimensionValue")) {
+      idDimensionValue = new DimensionValue.fromJson(_json["idDimensionValue"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lastModifiedInfo")) {
+      lastModifiedInfo =
+          new LastModifiedInfo.fromJson(_json["lastModifiedInfo"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("placementGroupType")) {
+      placementGroupType = _json["placementGroupType"];
+    }
+    if (_json.containsKey("placementStrategyId")) {
+      placementStrategyId = _json["placementStrategyId"];
+    }
+    if (_json.containsKey("pricingSchedule")) {
+      pricingSchedule = new PricingSchedule.fromJson(_json["pricingSchedule"]);
+    }
+    if (_json.containsKey("primaryPlacementId")) {
+      primaryPlacementId = _json["primaryPlacementId"];
+    }
+    if (_json.containsKey("primaryPlacementIdDimensionValue")) {
+      primaryPlacementIdDimensionValue = new DimensionValue.fromJson(
+          _json["primaryPlacementIdDimensionValue"]);
+    }
+    if (_json.containsKey("siteId")) {
+      siteId = _json["siteId"];
+    }
+    if (_json.containsKey("siteIdDimensionValue")) {
+      siteIdDimensionValue =
+          new DimensionValue.fromJson(_json["siteIdDimensionValue"]);
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (advertiserIdDimensionValue != null) {
+      _json["advertiserIdDimensionValue"] =
+          (advertiserIdDimensionValue).toJson();
+    }
+    if (archived != null) {
+      _json["archived"] = archived;
+    }
+    if (campaignId != null) {
+      _json["campaignId"] = campaignId;
+    }
+    if (campaignIdDimensionValue != null) {
+      _json["campaignIdDimensionValue"] = (campaignIdDimensionValue).toJson();
+    }
+    if (childPlacementIds != null) {
+      _json["childPlacementIds"] = childPlacementIds;
+    }
+    if (comment != null) {
+      _json["comment"] = comment;
+    }
+    if (contentCategoryId != null) {
+      _json["contentCategoryId"] = contentCategoryId;
+    }
+    if (createInfo != null) {
+      _json["createInfo"] = (createInfo).toJson();
+    }
+    if (directorySiteId != null) {
+      _json["directorySiteId"] = directorySiteId;
+    }
+    if (directorySiteIdDimensionValue != null) {
+      _json["directorySiteIdDimensionValue"] =
+          (directorySiteIdDimensionValue).toJson();
+    }
+    if (externalId != null) {
+      _json["externalId"] = externalId;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (idDimensionValue != null) {
+      _json["idDimensionValue"] = (idDimensionValue).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lastModifiedInfo != null) {
+      _json["lastModifiedInfo"] = (lastModifiedInfo).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (placementGroupType != null) {
+      _json["placementGroupType"] = placementGroupType;
+    }
+    if (placementStrategyId != null) {
+      _json["placementStrategyId"] = placementStrategyId;
+    }
+    if (pricingSchedule != null) {
+      _json["pricingSchedule"] = (pricingSchedule).toJson();
+    }
+    if (primaryPlacementId != null) {
+      _json["primaryPlacementId"] = primaryPlacementId;
+    }
+    if (primaryPlacementIdDimensionValue != null) {
+      _json["primaryPlacementIdDimensionValue"] =
+          (primaryPlacementIdDimensionValue).toJson();
+    }
+    if (siteId != null) {
+      _json["siteId"] = siteId;
+    }
+    if (siteIdDimensionValue != null) {
+      _json["siteIdDimensionValue"] = (siteIdDimensionValue).toJson();
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    return _json;
+  }
+}
+
+/// Placement Group List Response
+class PlacementGroupsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#placementGroupsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  /// Placement group collection.
+  core.List<PlacementGroup> placementGroups;
+
+  PlacementGroupsListResponse();
+
+  PlacementGroupsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("placementGroups")) {
+      placementGroups = _json["placementGroups"]
+          .map((value) => new PlacementGroup.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (placementGroups != null) {
+      _json["placementGroups"] =
+          placementGroups.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Placement Strategy List Response
+class PlacementStrategiesListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#placementStrategiesListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  /// Placement strategy collection.
+  core.List<PlacementStrategy> placementStrategies;
+
+  PlacementStrategiesListResponse();
+
+  PlacementStrategiesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("placementStrategies")) {
+      placementStrategies = _json["placementStrategies"]
+          .map((value) => new PlacementStrategy.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (placementStrategies != null) {
+      _json["placementStrategies"] =
+          placementStrategies.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a placement strategy.
+class PlacementStrategy {
+  /// Account ID of this placement strategy.This is a read-only field that can
+  /// be left blank.
+  core.String accountId;
+
+  /// ID of this placement strategy. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#placementStrategy".
+  core.String kind;
+
+  /// Name of this placement strategy. This is a required field. It must be less
+  /// than 256 characters long and unique among placement strategies of the same
+  /// account.
+  core.String name;
+
+  PlacementStrategy();
+
+  PlacementStrategy.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    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 (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Placement Tag
+class PlacementTag {
+  /// Placement ID
+  core.String placementId;
+
+  /// Tags generated for this placement.
+  core.List<TagData> tagDatas;
+
+  PlacementTag();
+
+  PlacementTag.fromJson(core.Map _json) {
+    if (_json.containsKey("placementId")) {
+      placementId = _json["placementId"];
+    }
+    if (_json.containsKey("tagDatas")) {
+      tagDatas = _json["tagDatas"]
+          .map((value) => new TagData.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 (placementId != null) {
+      _json["placementId"] = placementId;
+    }
+    if (tagDatas != null) {
+      _json["tagDatas"] = tagDatas.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Placement GenerateTags Response
+class PlacementsGenerateTagsResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#placementsGenerateTagsResponse".
+  core.String kind;
+
+  /// Set of generated tags for the specified placements.
+  core.List<PlacementTag> placementTags;
+
+  PlacementsGenerateTagsResponse();
+
+  PlacementsGenerateTagsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("placementTags")) {
+      placementTags = _json["placementTags"]
+          .map((value) => new PlacementTag.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (placementTags != null) {
+      _json["placementTags"] =
+          placementTags.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Placement List Response
+class PlacementsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#placementsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  /// Placement collection.
+  core.List<Placement> placements;
+
+  PlacementsListResponse();
+
+  PlacementsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("placements")) {
+      placements = _json["placements"]
+          .map((value) => new Placement.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (placements != null) {
+      _json["placements"] =
+          placements.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Contains information about a platform type that can be targeted by ads.
+class PlatformType {
+  /// ID of this platform type.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#platformType".
+  core.String kind;
+
+  /// Name of this platform type.
+  core.String name;
+
+  PlatformType();
+
+  PlatformType.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    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 (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Platform Type List Response
+class PlatformTypesListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#platformTypesListResponse".
+  core.String kind;
+
+  /// Platform type collection.
+  core.List<PlatformType> platformTypes;
+
+  PlatformTypesListResponse();
+
+  PlatformTypesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("platformTypes")) {
+      platformTypes = _json["platformTypes"]
+          .map((value) => new PlatformType.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (platformTypes != null) {
+      _json["platformTypes"] =
+          platformTypes.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Popup Window Properties.
+class PopupWindowProperties {
+  /// Popup dimension for a creative. This is a read-only field. Applicable to
+  /// the following creative types: all RICH_MEDIA and all VPAID
+  Size dimension;
+
+  /// Upper-left corner coordinates of the popup window. Applicable if
+  /// positionType is COORDINATES.
+  OffsetPosition offset;
+
+  /// Popup window position either centered or at specific coordinate.
+  /// Possible string values are:
+  /// - "CENTER"
+  /// - "COORDINATES"
+  core.String positionType;
+
+  /// Whether to display the browser address bar.
+  core.bool showAddressBar;
+
+  /// Whether to display the browser menu bar.
+  core.bool showMenuBar;
+
+  /// Whether to display the browser scroll bar.
+  core.bool showScrollBar;
+
+  /// Whether to display the browser status bar.
+  core.bool showStatusBar;
+
+  /// Whether to display the browser tool bar.
+  core.bool showToolBar;
+
+  /// Title of popup window.
+  core.String title;
+
+  PopupWindowProperties();
+
+  PopupWindowProperties.fromJson(core.Map _json) {
+    if (_json.containsKey("dimension")) {
+      dimension = new Size.fromJson(_json["dimension"]);
+    }
+    if (_json.containsKey("offset")) {
+      offset = new OffsetPosition.fromJson(_json["offset"]);
+    }
+    if (_json.containsKey("positionType")) {
+      positionType = _json["positionType"];
+    }
+    if (_json.containsKey("showAddressBar")) {
+      showAddressBar = _json["showAddressBar"];
+    }
+    if (_json.containsKey("showMenuBar")) {
+      showMenuBar = _json["showMenuBar"];
+    }
+    if (_json.containsKey("showScrollBar")) {
+      showScrollBar = _json["showScrollBar"];
+    }
+    if (_json.containsKey("showStatusBar")) {
+      showStatusBar = _json["showStatusBar"];
+    }
+    if (_json.containsKey("showToolBar")) {
+      showToolBar = _json["showToolBar"];
+    }
+    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 (dimension != null) {
+      _json["dimension"] = (dimension).toJson();
+    }
+    if (offset != null) {
+      _json["offset"] = (offset).toJson();
+    }
+    if (positionType != null) {
+      _json["positionType"] = positionType;
+    }
+    if (showAddressBar != null) {
+      _json["showAddressBar"] = showAddressBar;
+    }
+    if (showMenuBar != null) {
+      _json["showMenuBar"] = showMenuBar;
+    }
+    if (showScrollBar != null) {
+      _json["showScrollBar"] = showScrollBar;
+    }
+    if (showStatusBar != null) {
+      _json["showStatusBar"] = showStatusBar;
+    }
+    if (showToolBar != null) {
+      _json["showToolBar"] = showToolBar;
+    }
+    if (title != null) {
+      _json["title"] = title;
+    }
+    return _json;
+  }
+}
+
+/// Contains information about a postal code that can be targeted by ads.
+class PostalCode {
+  /// Postal code. This is equivalent to the id field.
+  core.String code;
+
+  /// Country code of the country to which this postal code belongs.
+  core.String countryCode;
+
+  /// DART ID of the country to which this postal code belongs.
+  core.String countryDartId;
+
+  /// ID of this postal code.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#postalCode".
+  core.String kind;
+
+  PostalCode();
+
+  PostalCode.fromJson(core.Map _json) {
+    if (_json.containsKey("code")) {
+      code = _json["code"];
+    }
+    if (_json.containsKey("countryCode")) {
+      countryCode = _json["countryCode"];
+    }
+    if (_json.containsKey("countryDartId")) {
+      countryDartId = _json["countryDartId"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    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 (code != null) {
+      _json["code"] = code;
+    }
+    if (countryCode != null) {
+      _json["countryCode"] = countryCode;
+    }
+    if (countryDartId != null) {
+      _json["countryDartId"] = countryDartId;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Postal Code List Response
+class PostalCodesListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#postalCodesListResponse".
+  core.String kind;
+
+  /// Postal code collection.
+  core.List<PostalCode> postalCodes;
+
+  PostalCodesListResponse();
+
+  PostalCodesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("postalCodes")) {
+      postalCodes = _json["postalCodes"]
+          .map((value) => new PostalCode.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (postalCodes != null) {
+      _json["postalCodes"] =
+          postalCodes.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Pricing Information
+class Pricing {
+  /// Cap cost type of this inventory item.
+  /// Possible string values are:
+  /// - "PLANNING_PLACEMENT_CAP_COST_TYPE_CUMULATIVE"
+  /// - "PLANNING_PLACEMENT_CAP_COST_TYPE_MONTHLY"
+  /// - "PLANNING_PLACEMENT_CAP_COST_TYPE_NONE"
+  core.String capCostType;
+
+  /// End date of this inventory item.
+  core.DateTime endDate;
+
+  /// Flights of this inventory item. A flight (a.k.a. pricing period)
+  /// represents the inventory item pricing information for a specific period of
+  /// time.
+  core.List<Flight> flights;
+
+  /// Group type of this inventory item if it represents a placement group. Is
+  /// null otherwise. There are two type of placement groups:
+  /// PLANNING_PLACEMENT_GROUP_TYPE_PACKAGE is a simple group of inventory items
+  /// that acts as a single pricing point for a group of tags.
+  /// PLANNING_PLACEMENT_GROUP_TYPE_ROADBLOCK is a group of inventory items that
+  /// not only acts as a single pricing point, but also assumes that all the
+  /// tags in it will be served at the same time. A roadblock requires one of
+  /// its assigned inventory items to be marked as primary.
+  /// Possible string values are:
+  /// - "PLANNING_PLACEMENT_GROUP_TYPE_PACKAGE"
+  /// - "PLANNING_PLACEMENT_GROUP_TYPE_ROADBLOCK"
+  core.String groupType;
+
+  /// Pricing type of this inventory item.
+  /// Possible string values are:
+  /// - "PLANNING_PLACEMENT_PRICING_TYPE_CLICKS"
+  /// - "PLANNING_PLACEMENT_PRICING_TYPE_CPA"
+  /// - "PLANNING_PLACEMENT_PRICING_TYPE_CPC"
+  /// - "PLANNING_PLACEMENT_PRICING_TYPE_CPM"
+  /// - "PLANNING_PLACEMENT_PRICING_TYPE_CPM_ACTIVEVIEW"
+  /// - "PLANNING_PLACEMENT_PRICING_TYPE_FLAT_RATE_CLICKS"
+  /// - "PLANNING_PLACEMENT_PRICING_TYPE_FLAT_RATE_IMPRESSIONS"
+  /// - "PLANNING_PLACEMENT_PRICING_TYPE_IMPRESSIONS"
+  core.String pricingType;
+
+  /// Start date of this inventory item.
+  core.DateTime startDate;
+
+  Pricing();
+
+  Pricing.fromJson(core.Map _json) {
+    if (_json.containsKey("capCostType")) {
+      capCostType = _json["capCostType"];
+    }
+    if (_json.containsKey("endDate")) {
+      endDate = core.DateTime.parse(_json["endDate"]);
+    }
+    if (_json.containsKey("flights")) {
+      flights =
+          _json["flights"].map((value) => new Flight.fromJson(value)).toList();
+    }
+    if (_json.containsKey("groupType")) {
+      groupType = _json["groupType"];
+    }
+    if (_json.containsKey("pricingType")) {
+      pricingType = _json["pricingType"];
+    }
+    if (_json.containsKey("startDate")) {
+      startDate = core.DateTime.parse(_json["startDate"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (capCostType != null) {
+      _json["capCostType"] = capCostType;
+    }
+    if (endDate != null) {
+      _json["endDate"] =
+          "${(endDate).year.toString().padLeft(4, '0')}-${(endDate).month.toString().padLeft(2, '0')}-${(endDate).day.toString().padLeft(2, '0')}";
+    }
+    if (flights != null) {
+      _json["flights"] = flights.map((value) => (value).toJson()).toList();
+    }
+    if (groupType != null) {
+      _json["groupType"] = groupType;
+    }
+    if (pricingType != null) {
+      _json["pricingType"] = pricingType;
+    }
+    if (startDate != null) {
+      _json["startDate"] =
+          "${(startDate).year.toString().padLeft(4, '0')}-${(startDate).month.toString().padLeft(2, '0')}-${(startDate).day.toString().padLeft(2, '0')}";
+    }
+    return _json;
+  }
+}
+
+/// Pricing Schedule
+class PricingSchedule {
+  /// Placement cap cost option.
+  /// Possible string values are:
+  /// - "CAP_COST_CUMULATIVE"
+  /// - "CAP_COST_MONTHLY"
+  /// - "CAP_COST_NONE"
+  core.String capCostOption;
+
+  /// Whether cap costs are ignored by ad serving.
+  core.bool disregardOverdelivery;
+
+  /// Placement end date. This date must be later than, or the same day as, the
+  /// placement start date, but not later than the campaign end date. If, for
+  /// example, you set 6/25/2015 as both the start and end dates, the effective
+  /// placement date is just that day only, 6/25/2015. The hours, minutes, and
+  /// seconds of the end date should not be set, as doing so will result in an
+  /// error. This field is required on insertion.
+  core.DateTime endDate;
+
+  /// Whether this placement is flighted. If true, pricing periods will be
+  /// computed automatically.
+  core.bool flighted;
+
+  /// Floodlight activity ID associated with this placement. This field should
+  /// be set when placement pricing type is set to PRICING_TYPE_CPA.
+  core.String floodlightActivityId;
+
+  /// Pricing periods for this placement.
+  core.List<PricingSchedulePricingPeriod> pricingPeriods;
+
+  /// Placement pricing type. This field is required on insertion.
+  /// Possible string values are:
+  /// - "PRICING_TYPE_CPA"
+  /// - "PRICING_TYPE_CPC"
+  /// - "PRICING_TYPE_CPM"
+  /// - "PRICING_TYPE_CPM_ACTIVEVIEW"
+  /// - "PRICING_TYPE_FLAT_RATE_CLICKS"
+  /// - "PRICING_TYPE_FLAT_RATE_IMPRESSIONS"
+  core.String pricingType;
+
+  /// Placement start date. This date must be later than, or the same day as,
+  /// the campaign start date. The hours, minutes, and seconds of the start date
+  /// should not be set, as doing so will result in an error. This field is
+  /// required on insertion.
+  core.DateTime startDate;
+
+  /// Testing start date of this placement. The hours, minutes, and seconds of
+  /// the start date should not be set, as doing so will result in an error.
+  core.DateTime testingStartDate;
+
+  PricingSchedule();
+
+  PricingSchedule.fromJson(core.Map _json) {
+    if (_json.containsKey("capCostOption")) {
+      capCostOption = _json["capCostOption"];
+    }
+    if (_json.containsKey("disregardOverdelivery")) {
+      disregardOverdelivery = _json["disregardOverdelivery"];
+    }
+    if (_json.containsKey("endDate")) {
+      endDate = core.DateTime.parse(_json["endDate"]);
+    }
+    if (_json.containsKey("flighted")) {
+      flighted = _json["flighted"];
+    }
+    if (_json.containsKey("floodlightActivityId")) {
+      floodlightActivityId = _json["floodlightActivityId"];
+    }
+    if (_json.containsKey("pricingPeriods")) {
+      pricingPeriods = _json["pricingPeriods"]
+          .map((value) => new PricingSchedulePricingPeriod.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("pricingType")) {
+      pricingType = _json["pricingType"];
+    }
+    if (_json.containsKey("startDate")) {
+      startDate = core.DateTime.parse(_json["startDate"]);
+    }
+    if (_json.containsKey("testingStartDate")) {
+      testingStartDate = core.DateTime.parse(_json["testingStartDate"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (capCostOption != null) {
+      _json["capCostOption"] = capCostOption;
+    }
+    if (disregardOverdelivery != null) {
+      _json["disregardOverdelivery"] = disregardOverdelivery;
+    }
+    if (endDate != null) {
+      _json["endDate"] =
+          "${(endDate).year.toString().padLeft(4, '0')}-${(endDate).month.toString().padLeft(2, '0')}-${(endDate).day.toString().padLeft(2, '0')}";
+    }
+    if (flighted != null) {
+      _json["flighted"] = flighted;
+    }
+    if (floodlightActivityId != null) {
+      _json["floodlightActivityId"] = floodlightActivityId;
+    }
+    if (pricingPeriods != null) {
+      _json["pricingPeriods"] =
+          pricingPeriods.map((value) => (value).toJson()).toList();
+    }
+    if (pricingType != null) {
+      _json["pricingType"] = pricingType;
+    }
+    if (startDate != null) {
+      _json["startDate"] =
+          "${(startDate).year.toString().padLeft(4, '0')}-${(startDate).month.toString().padLeft(2, '0')}-${(startDate).day.toString().padLeft(2, '0')}";
+    }
+    if (testingStartDate != null) {
+      _json["testingStartDate"] =
+          "${(testingStartDate).year.toString().padLeft(4, '0')}-${(testingStartDate).month.toString().padLeft(2, '0')}-${(testingStartDate).day.toString().padLeft(2, '0')}";
+    }
+    return _json;
+  }
+}
+
+/// Pricing Period
+class PricingSchedulePricingPeriod {
+  /// Pricing period end date. This date must be later than, or the same day as,
+  /// the pricing period start date, but not later than the placement end date.
+  /// The period end date can be the same date as the period start date. If, for
+  /// example, you set 6/25/2015 as both the start and end dates, the effective
+  /// pricing period date is just that day only, 6/25/2015. The hours, minutes,
+  /// and seconds of the end date should not be set, as doing so will result in
+  /// an error.
+  core.DateTime endDate;
+
+  /// Comments for this pricing period.
+  core.String pricingComment;
+
+  /// Rate or cost of this pricing period in nanos (i.e., multipled by
+  /// 1000000000). Acceptable values are 0 to 1000000000000000000, inclusive.
+  core.String rateOrCostNanos;
+
+  /// Pricing period start date. This date must be later than, or the same day
+  /// as, the placement start date. The hours, minutes, and seconds of the start
+  /// date should not be set, as doing so will result in an error.
+  core.DateTime startDate;
+
+  /// Units of this pricing period. Acceptable values are 0 to 10000000000,
+  /// inclusive.
+  core.String units;
+
+  PricingSchedulePricingPeriod();
+
+  PricingSchedulePricingPeriod.fromJson(core.Map _json) {
+    if (_json.containsKey("endDate")) {
+      endDate = core.DateTime.parse(_json["endDate"]);
+    }
+    if (_json.containsKey("pricingComment")) {
+      pricingComment = _json["pricingComment"];
+    }
+    if (_json.containsKey("rateOrCostNanos")) {
+      rateOrCostNanos = _json["rateOrCostNanos"];
+    }
+    if (_json.containsKey("startDate")) {
+      startDate = core.DateTime.parse(_json["startDate"]);
+    }
+    if (_json.containsKey("units")) {
+      units = _json["units"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (endDate != null) {
+      _json["endDate"] =
+          "${(endDate).year.toString().padLeft(4, '0')}-${(endDate).month.toString().padLeft(2, '0')}-${(endDate).day.toString().padLeft(2, '0')}";
+    }
+    if (pricingComment != null) {
+      _json["pricingComment"] = pricingComment;
+    }
+    if (rateOrCostNanos != null) {
+      _json["rateOrCostNanos"] = rateOrCostNanos;
+    }
+    if (startDate != null) {
+      _json["startDate"] =
+          "${(startDate).year.toString().padLeft(4, '0')}-${(startDate).month.toString().padLeft(2, '0')}-${(startDate).day.toString().padLeft(2, '0')}";
+    }
+    if (units != null) {
+      _json["units"] = units;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a DoubleClick Planning project.
+class Project {
+  /// Account ID of this project.
+  core.String accountId;
+
+  /// Advertiser ID of this project.
+  core.String advertiserId;
+
+  /// Audience age group of this project.
+  /// Possible string values are:
+  /// - "PLANNING_AUDIENCE_AGE_18_24"
+  /// - "PLANNING_AUDIENCE_AGE_25_34"
+  /// - "PLANNING_AUDIENCE_AGE_35_44"
+  /// - "PLANNING_AUDIENCE_AGE_45_54"
+  /// - "PLANNING_AUDIENCE_AGE_55_64"
+  /// - "PLANNING_AUDIENCE_AGE_65_OR_MORE"
+  /// - "PLANNING_AUDIENCE_AGE_UNKNOWN"
+  core.String audienceAgeGroup;
+
+  /// Audience gender of this project.
+  /// Possible string values are:
+  /// - "PLANNING_AUDIENCE_GENDER_FEMALE"
+  /// - "PLANNING_AUDIENCE_GENDER_MALE"
+  core.String audienceGender;
+
+  /// Budget of this project in the currency specified by the current account.
+  /// The value stored in this field represents only the non-fractional amount.
+  /// For example, for USD, the smallest value that can be represented by this
+  /// field is 1 US dollar.
+  core.String budget;
+
+  /// Client billing code of this project.
+  core.String clientBillingCode;
+
+  /// Name of the project client.
+  core.String clientName;
+
+  /// End date of the project.
+  core.DateTime endDate;
+
+  /// ID of this project. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#project".
+  core.String kind;
+
+  /// Information about the most recent modification of this project.
+  LastModifiedInfo lastModifiedInfo;
+
+  /// Name of this project.
+  core.String name;
+
+  /// Overview of this project.
+  core.String overview;
+
+  /// Start date of the project.
+  core.DateTime startDate;
+
+  /// Subaccount ID of this project.
+  core.String subaccountId;
+
+  /// Number of clicks that the advertiser is targeting.
+  core.String targetClicks;
+
+  /// Number of conversions that the advertiser is targeting.
+  core.String targetConversions;
+
+  /// CPA that the advertiser is targeting.
+  core.String targetCpaNanos;
+
+  /// CPC that the advertiser is targeting.
+  core.String targetCpcNanos;
+
+  /// vCPM from Active View that the advertiser is targeting.
+  core.String targetCpmActiveViewNanos;
+
+  /// CPM that the advertiser is targeting.
+  core.String targetCpmNanos;
+
+  /// Number of impressions that the advertiser is targeting.
+  core.String targetImpressions;
+
+  Project();
+
+  Project.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("audienceAgeGroup")) {
+      audienceAgeGroup = _json["audienceAgeGroup"];
+    }
+    if (_json.containsKey("audienceGender")) {
+      audienceGender = _json["audienceGender"];
+    }
+    if (_json.containsKey("budget")) {
+      budget = _json["budget"];
+    }
+    if (_json.containsKey("clientBillingCode")) {
+      clientBillingCode = _json["clientBillingCode"];
+    }
+    if (_json.containsKey("clientName")) {
+      clientName = _json["clientName"];
+    }
+    if (_json.containsKey("endDate")) {
+      endDate = core.DateTime.parse(_json["endDate"]);
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lastModifiedInfo")) {
+      lastModifiedInfo =
+          new LastModifiedInfo.fromJson(_json["lastModifiedInfo"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("overview")) {
+      overview = _json["overview"];
+    }
+    if (_json.containsKey("startDate")) {
+      startDate = core.DateTime.parse(_json["startDate"]);
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("targetClicks")) {
+      targetClicks = _json["targetClicks"];
+    }
+    if (_json.containsKey("targetConversions")) {
+      targetConversions = _json["targetConversions"];
+    }
+    if (_json.containsKey("targetCpaNanos")) {
+      targetCpaNanos = _json["targetCpaNanos"];
+    }
+    if (_json.containsKey("targetCpcNanos")) {
+      targetCpcNanos = _json["targetCpcNanos"];
+    }
+    if (_json.containsKey("targetCpmActiveViewNanos")) {
+      targetCpmActiveViewNanos = _json["targetCpmActiveViewNanos"];
+    }
+    if (_json.containsKey("targetCpmNanos")) {
+      targetCpmNanos = _json["targetCpmNanos"];
+    }
+    if (_json.containsKey("targetImpressions")) {
+      targetImpressions = _json["targetImpressions"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (audienceAgeGroup != null) {
+      _json["audienceAgeGroup"] = audienceAgeGroup;
+    }
+    if (audienceGender != null) {
+      _json["audienceGender"] = audienceGender;
+    }
+    if (budget != null) {
+      _json["budget"] = budget;
+    }
+    if (clientBillingCode != null) {
+      _json["clientBillingCode"] = clientBillingCode;
+    }
+    if (clientName != null) {
+      _json["clientName"] = clientName;
+    }
+    if (endDate != null) {
+      _json["endDate"] =
+          "${(endDate).year.toString().padLeft(4, '0')}-${(endDate).month.toString().padLeft(2, '0')}-${(endDate).day.toString().padLeft(2, '0')}";
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lastModifiedInfo != null) {
+      _json["lastModifiedInfo"] = (lastModifiedInfo).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (overview != null) {
+      _json["overview"] = overview;
+    }
+    if (startDate != null) {
+      _json["startDate"] =
+          "${(startDate).year.toString().padLeft(4, '0')}-${(startDate).month.toString().padLeft(2, '0')}-${(startDate).day.toString().padLeft(2, '0')}";
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (targetClicks != null) {
+      _json["targetClicks"] = targetClicks;
+    }
+    if (targetConversions != null) {
+      _json["targetConversions"] = targetConversions;
+    }
+    if (targetCpaNanos != null) {
+      _json["targetCpaNanos"] = targetCpaNanos;
+    }
+    if (targetCpcNanos != null) {
+      _json["targetCpcNanos"] = targetCpcNanos;
+    }
+    if (targetCpmActiveViewNanos != null) {
+      _json["targetCpmActiveViewNanos"] = targetCpmActiveViewNanos;
+    }
+    if (targetCpmNanos != null) {
+      _json["targetCpmNanos"] = targetCpmNanos;
+    }
+    if (targetImpressions != null) {
+      _json["targetImpressions"] = targetImpressions;
+    }
+    return _json;
+  }
+}
+
+/// Project List Response
+class ProjectsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#projectsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  /// Project collection.
+  core.List<Project> projects;
+
+  ProjectsListResponse();
+
+  ProjectsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("projects")) {
+      projects = _json["projects"]
+          .map((value) => new Project.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (projects != null) {
+      _json["projects"] = projects.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Represents fields that are compatible to be selected for a report of type
+/// "REACH".
+class ReachReportCompatibleFields {
+  /// Dimensions which are compatible to be selected in the "dimensionFilters"
+  /// section of the report.
+  core.List<Dimension> dimensionFilters;
+
+  /// Dimensions which are compatible to be selected in the "dimensions" section
+  /// of the report.
+  core.List<Dimension> dimensions;
+
+  /// The kind of resource this is, in this case
+  /// dfareporting#reachReportCompatibleFields.
+  core.String kind;
+
+  /// Metrics which are compatible to be selected in the "metricNames" section
+  /// of the report.
+  core.List<Metric> metrics;
+
+  /// Metrics which are compatible to be selected as activity metrics to pivot
+  /// on in the "activities" section of the report.
+  core.List<Metric> pivotedActivityMetrics;
+
+  /// Metrics which are compatible to be selected in the
+  /// "reachByFrequencyMetricNames" section of the report.
+  core.List<Metric> reachByFrequencyMetrics;
+
+  ReachReportCompatibleFields();
+
+  ReachReportCompatibleFields.fromJson(core.Map _json) {
+    if (_json.containsKey("dimensionFilters")) {
+      dimensionFilters = _json["dimensionFilters"]
+          .map((value) => new Dimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("dimensions")) {
+      dimensions = _json["dimensions"]
+          .map((value) => new Dimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("metrics")) {
+      metrics =
+          _json["metrics"].map((value) => new Metric.fromJson(value)).toList();
+    }
+    if (_json.containsKey("pivotedActivityMetrics")) {
+      pivotedActivityMetrics = _json["pivotedActivityMetrics"]
+          .map((value) => new Metric.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("reachByFrequencyMetrics")) {
+      reachByFrequencyMetrics = _json["reachByFrequencyMetrics"]
+          .map((value) => new Metric.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 (dimensionFilters != null) {
+      _json["dimensionFilters"] =
+          dimensionFilters.map((value) => (value).toJson()).toList();
+    }
+    if (dimensions != null) {
+      _json["dimensions"] =
+          dimensions.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (metrics != null) {
+      _json["metrics"] = metrics.map((value) => (value).toJson()).toList();
+    }
+    if (pivotedActivityMetrics != null) {
+      _json["pivotedActivityMetrics"] =
+          pivotedActivityMetrics.map((value) => (value).toJson()).toList();
+    }
+    if (reachByFrequencyMetrics != null) {
+      _json["reachByFrequencyMetrics"] =
+          reachByFrequencyMetrics.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Represents a recipient.
+class Recipient {
+  /// The delivery type for the recipient.
+  /// Possible string values are:
+  /// - "ATTACHMENT"
+  /// - "LINK"
+  core.String deliveryType;
+
+  /// The email address of the recipient.
+  core.String email;
+
+  /// The kind of resource this is, in this case dfareporting#recipient.
+  core.String kind;
+
+  Recipient();
+
+  Recipient.fromJson(core.Map _json) {
+    if (_json.containsKey("deliveryType")) {
+      deliveryType = _json["deliveryType"];
+    }
+    if (_json.containsKey("email")) {
+      email = _json["email"];
+    }
+    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 (deliveryType != null) {
+      _json["deliveryType"] = deliveryType;
+    }
+    if (email != null) {
+      _json["email"] = email;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Contains information about a region that can be targeted by ads.
+class Region {
+  /// Country code of the country to which this region belongs.
+  core.String countryCode;
+
+  /// DART ID of the country to which this region belongs.
+  core.String countryDartId;
+
+  /// DART ID of this region.
+  core.String dartId;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#region".
+  core.String kind;
+
+  /// Name of this region.
+  core.String name;
+
+  /// Region code.
+  core.String regionCode;
+
+  Region();
+
+  Region.fromJson(core.Map _json) {
+    if (_json.containsKey("countryCode")) {
+      countryCode = _json["countryCode"];
+    }
+    if (_json.containsKey("countryDartId")) {
+      countryDartId = _json["countryDartId"];
+    }
+    if (_json.containsKey("dartId")) {
+      dartId = _json["dartId"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("regionCode")) {
+      regionCode = _json["regionCode"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (countryCode != null) {
+      _json["countryCode"] = countryCode;
+    }
+    if (countryDartId != null) {
+      _json["countryDartId"] = countryDartId;
+    }
+    if (dartId != null) {
+      _json["dartId"] = dartId;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (regionCode != null) {
+      _json["regionCode"] = regionCode;
+    }
+    return _json;
+  }
+}
+
+/// Region List Response
+class RegionsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#regionsListResponse".
+  core.String kind;
+
+  /// Region collection.
+  core.List<Region> regions;
+
+  RegionsListResponse();
+
+  RegionsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("regions")) {
+      regions =
+          _json["regions"].map((value) => new Region.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (regions != null) {
+      _json["regions"] = regions.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a remarketing list. Remarketing enables you to create
+/// lists of users who have performed specific actions on a site, then target
+/// ads to members of those lists. This resource can be used to manage
+/// remarketing lists that are owned by your advertisers. To see all remarketing
+/// lists that are visible to your advertisers, including those that are shared
+/// to your advertiser or account, use the TargetableRemarketingLists resource.
+class RemarketingList {
+  /// Account ID of this remarketing list. This is a read-only, auto-generated
+  /// field that is only returned in GET requests.
+  core.String accountId;
+
+  /// Whether this remarketing list is active.
+  core.bool active;
+
+  /// Dimension value for the advertiser ID that owns this remarketing list.
+  /// This is a required field.
+  core.String advertiserId;
+
+  /// Dimension value for the ID of the advertiser. This is a read-only,
+  /// auto-generated field.
+  DimensionValue advertiserIdDimensionValue;
+
+  /// Remarketing list description.
+  core.String description;
+
+  /// Remarketing list ID. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#remarketingList".
+  core.String kind;
+
+  /// Number of days that a user should remain in the remarketing list without
+  /// an impression. Acceptable values are 1 to 540, inclusive.
+  core.String lifeSpan;
+
+  /// Rule used to populate the remarketing list with users.
+  ListPopulationRule listPopulationRule;
+
+  /// Number of users currently in the list. This is a read-only field.
+  core.String listSize;
+
+  /// Product from which this remarketing list was originated.
+  /// Possible string values are:
+  /// - "REMARKETING_LIST_SOURCE_ADX"
+  /// - "REMARKETING_LIST_SOURCE_DBM"
+  /// - "REMARKETING_LIST_SOURCE_DFA"
+  /// - "REMARKETING_LIST_SOURCE_DFP"
+  /// - "REMARKETING_LIST_SOURCE_DMP"
+  /// - "REMARKETING_LIST_SOURCE_GA"
+  /// - "REMARKETING_LIST_SOURCE_GPLUS"
+  /// - "REMARKETING_LIST_SOURCE_OTHER"
+  /// - "REMARKETING_LIST_SOURCE_PLAY_STORE"
+  /// - "REMARKETING_LIST_SOURCE_XFP"
+  /// - "REMARKETING_LIST_SOURCE_YOUTUBE"
+  core.String listSource;
+
+  /// Name of the remarketing list. This is a required field. Must be no greater
+  /// than 128 characters long.
+  core.String name;
+
+  /// Subaccount ID of this remarketing list. This is a read-only,
+  /// auto-generated field that is only returned in GET requests.
+  core.String subaccountId;
+
+  RemarketingList();
+
+  RemarketingList.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("active")) {
+      active = _json["active"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("advertiserIdDimensionValue")) {
+      advertiserIdDimensionValue =
+          new DimensionValue.fromJson(_json["advertiserIdDimensionValue"]);
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lifeSpan")) {
+      lifeSpan = _json["lifeSpan"];
+    }
+    if (_json.containsKey("listPopulationRule")) {
+      listPopulationRule =
+          new ListPopulationRule.fromJson(_json["listPopulationRule"]);
+    }
+    if (_json.containsKey("listSize")) {
+      listSize = _json["listSize"];
+    }
+    if (_json.containsKey("listSource")) {
+      listSource = _json["listSource"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (active != null) {
+      _json["active"] = active;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (advertiserIdDimensionValue != null) {
+      _json["advertiserIdDimensionValue"] =
+          (advertiserIdDimensionValue).toJson();
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lifeSpan != null) {
+      _json["lifeSpan"] = lifeSpan;
+    }
+    if (listPopulationRule != null) {
+      _json["listPopulationRule"] = (listPopulationRule).toJson();
+    }
+    if (listSize != null) {
+      _json["listSize"] = listSize;
+    }
+    if (listSource != null) {
+      _json["listSource"] = listSource;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a remarketing list's sharing information. Sharing
+/// allows other accounts or advertisers to target to your remarketing lists.
+/// This resource can be used to manage remarketing list sharing to other
+/// accounts and advertisers.
+class RemarketingListShare {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#remarketingListShare".
+  core.String kind;
+
+  /// Remarketing list ID. This is a read-only, auto-generated field.
+  core.String remarketingListId;
+
+  /// Accounts that the remarketing list is shared with.
+  core.List<core.String> sharedAccountIds;
+
+  /// Advertisers that the remarketing list is shared with.
+  core.List<core.String> sharedAdvertiserIds;
+
+  RemarketingListShare();
+
+  RemarketingListShare.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("remarketingListId")) {
+      remarketingListId = _json["remarketingListId"];
+    }
+    if (_json.containsKey("sharedAccountIds")) {
+      sharedAccountIds = _json["sharedAccountIds"];
+    }
+    if (_json.containsKey("sharedAdvertiserIds")) {
+      sharedAdvertiserIds = _json["sharedAdvertiserIds"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (remarketingListId != null) {
+      _json["remarketingListId"] = remarketingListId;
+    }
+    if (sharedAccountIds != null) {
+      _json["sharedAccountIds"] = sharedAccountIds;
+    }
+    if (sharedAdvertiserIds != null) {
+      _json["sharedAdvertiserIds"] = sharedAdvertiserIds;
+    }
+    return _json;
+  }
+}
+
+/// Remarketing list response
+class RemarketingListsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#remarketingListsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  /// Remarketing list collection.
+  core.List<RemarketingList> remarketingLists;
+
+  RemarketingListsListResponse();
+
+  RemarketingListsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("remarketingLists")) {
+      remarketingLists = _json["remarketingLists"]
+          .map((value) => new RemarketingList.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (remarketingLists != null) {
+      _json["remarketingLists"] =
+          remarketingLists.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// The report criteria for a report of type "STANDARD".
+class ReportCriteria {
+  /// Activity group.
+  Activities activities;
+
+  /// Custom Rich Media Events group.
+  CustomRichMediaEvents customRichMediaEvents;
+
+  /// The date range for which this report should be run.
+  DateRange dateRange;
+
+  /// The list of filters on which dimensions are filtered.
+  /// Filters for different dimensions are ANDed, filters for the same dimension
+  /// are grouped together and ORed.
+  core.List<DimensionValue> dimensionFilters;
+
+  /// The list of standard dimensions the report should include.
+  core.List<SortedDimension> dimensions;
+
+  /// The list of names of metrics the report should include.
+  core.List<core.String> metricNames;
+
+  ReportCriteria();
+
+  ReportCriteria.fromJson(core.Map _json) {
+    if (_json.containsKey("activities")) {
+      activities = new Activities.fromJson(_json["activities"]);
+    }
+    if (_json.containsKey("customRichMediaEvents")) {
+      customRichMediaEvents =
+          new CustomRichMediaEvents.fromJson(_json["customRichMediaEvents"]);
+    }
+    if (_json.containsKey("dateRange")) {
+      dateRange = new DateRange.fromJson(_json["dateRange"]);
+    }
+    if (_json.containsKey("dimensionFilters")) {
+      dimensionFilters = _json["dimensionFilters"]
+          .map((value) => new DimensionValue.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("dimensions")) {
+      dimensions = _json["dimensions"]
+          .map((value) => new SortedDimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("metricNames")) {
+      metricNames = _json["metricNames"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (activities != null) {
+      _json["activities"] = (activities).toJson();
+    }
+    if (customRichMediaEvents != null) {
+      _json["customRichMediaEvents"] = (customRichMediaEvents).toJson();
+    }
+    if (dateRange != null) {
+      _json["dateRange"] = (dateRange).toJson();
+    }
+    if (dimensionFilters != null) {
+      _json["dimensionFilters"] =
+          dimensionFilters.map((value) => (value).toJson()).toList();
+    }
+    if (dimensions != null) {
+      _json["dimensions"] =
+          dimensions.map((value) => (value).toJson()).toList();
+    }
+    if (metricNames != null) {
+      _json["metricNames"] = metricNames;
+    }
+    return _json;
+  }
+}
+
+/// The report criteria for a report of type "CROSS_DIMENSION_REACH".
+class ReportCrossDimensionReachCriteria {
+  /// The list of dimensions the report should include.
+  core.List<SortedDimension> breakdown;
+
+  /// The date range this report should be run for.
+  DateRange dateRange;
+
+  /// The dimension option.
+  /// Possible string values are:
+  /// - "ADVERTISER"
+  /// - "CAMPAIGN"
+  /// - "SITE_BY_ADVERTISER"
+  /// - "SITE_BY_CAMPAIGN"
+  core.String dimension;
+
+  /// The list of filters on which dimensions are filtered.
+  core.List<DimensionValue> dimensionFilters;
+
+  /// The list of names of metrics the report should include.
+  core.List<core.String> metricNames;
+
+  /// The list of names of overlap metrics the report should include.
+  core.List<core.String> overlapMetricNames;
+
+  /// Whether the report is pivoted or not. Defaults to true.
+  core.bool pivoted;
+
+  ReportCrossDimensionReachCriteria();
+
+  ReportCrossDimensionReachCriteria.fromJson(core.Map _json) {
+    if (_json.containsKey("breakdown")) {
+      breakdown = _json["breakdown"]
+          .map((value) => new SortedDimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("dateRange")) {
+      dateRange = new DateRange.fromJson(_json["dateRange"]);
+    }
+    if (_json.containsKey("dimension")) {
+      dimension = _json["dimension"];
+    }
+    if (_json.containsKey("dimensionFilters")) {
+      dimensionFilters = _json["dimensionFilters"]
+          .map((value) => new DimensionValue.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("metricNames")) {
+      metricNames = _json["metricNames"];
+    }
+    if (_json.containsKey("overlapMetricNames")) {
+      overlapMetricNames = _json["overlapMetricNames"];
+    }
+    if (_json.containsKey("pivoted")) {
+      pivoted = _json["pivoted"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (breakdown != null) {
+      _json["breakdown"] = breakdown.map((value) => (value).toJson()).toList();
+    }
+    if (dateRange != null) {
+      _json["dateRange"] = (dateRange).toJson();
+    }
+    if (dimension != null) {
+      _json["dimension"] = dimension;
+    }
+    if (dimensionFilters != null) {
+      _json["dimensionFilters"] =
+          dimensionFilters.map((value) => (value).toJson()).toList();
+    }
+    if (metricNames != null) {
+      _json["metricNames"] = metricNames;
+    }
+    if (overlapMetricNames != null) {
+      _json["overlapMetricNames"] = overlapMetricNames;
+    }
+    if (pivoted != null) {
+      _json["pivoted"] = pivoted;
+    }
+    return _json;
+  }
+}
+
+/// The report's email delivery settings.
+class ReportDelivery {
+  /// Whether the report should be emailed to the report owner.
+  core.bool emailOwner;
+
+  /// The type of delivery for the owner to receive, if enabled.
+  /// Possible string values are:
+  /// - "ATTACHMENT"
+  /// - "LINK"
+  core.String emailOwnerDeliveryType;
+
+  /// The message to be sent with each email.
+  core.String message;
+
+  /// The list of recipients to which to email the report.
+  core.List<Recipient> recipients;
+
+  ReportDelivery();
+
+  ReportDelivery.fromJson(core.Map _json) {
+    if (_json.containsKey("emailOwner")) {
+      emailOwner = _json["emailOwner"];
+    }
+    if (_json.containsKey("emailOwnerDeliveryType")) {
+      emailOwnerDeliveryType = _json["emailOwnerDeliveryType"];
+    }
+    if (_json.containsKey("message")) {
+      message = _json["message"];
+    }
+    if (_json.containsKey("recipients")) {
+      recipients = _json["recipients"]
+          .map((value) => new Recipient.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 (emailOwner != null) {
+      _json["emailOwner"] = emailOwner;
+    }
+    if (emailOwnerDeliveryType != null) {
+      _json["emailOwnerDeliveryType"] = emailOwnerDeliveryType;
+    }
+    if (message != null) {
+      _json["message"] = message;
+    }
+    if (recipients != null) {
+      _json["recipients"] =
+          recipients.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// The properties of the report.
+class ReportFloodlightCriteriaReportProperties {
+  /// Include conversions that have no cookie, but do have an exposure path.
+  core.bool includeAttributedIPConversions;
+
+  /// Include conversions of users with a DoubleClick cookie but without an
+  /// exposure. That means the user did not click or see an ad from the
+  /// advertiser within the Floodlight group, or that the interaction happened
+  /// outside the lookback window.
+  core.bool includeUnattributedCookieConversions;
+
+  /// Include conversions that have no associated cookies and no exposures. It’s
+  /// therefore impossible to know how the user was exposed to your ads during
+  /// the lookback window prior to a conversion.
+  core.bool includeUnattributedIPConversions;
+
+  ReportFloodlightCriteriaReportProperties();
+
+  ReportFloodlightCriteriaReportProperties.fromJson(core.Map _json) {
+    if (_json.containsKey("includeAttributedIPConversions")) {
+      includeAttributedIPConversions = _json["includeAttributedIPConversions"];
+    }
+    if (_json.containsKey("includeUnattributedCookieConversions")) {
+      includeUnattributedCookieConversions =
+          _json["includeUnattributedCookieConversions"];
+    }
+    if (_json.containsKey("includeUnattributedIPConversions")) {
+      includeUnattributedIPConversions =
+          _json["includeUnattributedIPConversions"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (includeAttributedIPConversions != null) {
+      _json["includeAttributedIPConversions"] = includeAttributedIPConversions;
+    }
+    if (includeUnattributedCookieConversions != null) {
+      _json["includeUnattributedCookieConversions"] =
+          includeUnattributedCookieConversions;
+    }
+    if (includeUnattributedIPConversions != null) {
+      _json["includeUnattributedIPConversions"] =
+          includeUnattributedIPConversions;
+    }
+    return _json;
+  }
+}
+
+/// The report criteria for a report of type "FLOODLIGHT".
+class ReportFloodlightCriteria {
+  /// The list of custom rich media events to include.
+  core.List<DimensionValue> customRichMediaEvents;
+
+  /// The date range this report should be run for.
+  DateRange dateRange;
+
+  /// The list of filters on which dimensions are filtered.
+  /// Filters for different dimensions are ANDed, filters for the same dimension
+  /// are grouped together and ORed.
+  core.List<DimensionValue> dimensionFilters;
+
+  /// The list of dimensions the report should include.
+  core.List<SortedDimension> dimensions;
+
+  /// The floodlight ID for which to show data in this report. All advertisers
+  /// associated with that ID will automatically be added. The dimension of the
+  /// value needs to be 'dfa:floodlightConfigId'.
+  DimensionValue floodlightConfigId;
+
+  /// The list of names of metrics the report should include.
+  core.List<core.String> metricNames;
+
+  /// The properties of the report.
+  ReportFloodlightCriteriaReportProperties reportProperties;
+
+  ReportFloodlightCriteria();
+
+  ReportFloodlightCriteria.fromJson(core.Map _json) {
+    if (_json.containsKey("customRichMediaEvents")) {
+      customRichMediaEvents = _json["customRichMediaEvents"]
+          .map((value) => new DimensionValue.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("dateRange")) {
+      dateRange = new DateRange.fromJson(_json["dateRange"]);
+    }
+    if (_json.containsKey("dimensionFilters")) {
+      dimensionFilters = _json["dimensionFilters"]
+          .map((value) => new DimensionValue.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("dimensions")) {
+      dimensions = _json["dimensions"]
+          .map((value) => new SortedDimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("floodlightConfigId")) {
+      floodlightConfigId =
+          new DimensionValue.fromJson(_json["floodlightConfigId"]);
+    }
+    if (_json.containsKey("metricNames")) {
+      metricNames = _json["metricNames"];
+    }
+    if (_json.containsKey("reportProperties")) {
+      reportProperties = new ReportFloodlightCriteriaReportProperties.fromJson(
+          _json["reportProperties"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (customRichMediaEvents != null) {
+      _json["customRichMediaEvents"] =
+          customRichMediaEvents.map((value) => (value).toJson()).toList();
+    }
+    if (dateRange != null) {
+      _json["dateRange"] = (dateRange).toJson();
+    }
+    if (dimensionFilters != null) {
+      _json["dimensionFilters"] =
+          dimensionFilters.map((value) => (value).toJson()).toList();
+    }
+    if (dimensions != null) {
+      _json["dimensions"] =
+          dimensions.map((value) => (value).toJson()).toList();
+    }
+    if (floodlightConfigId != null) {
+      _json["floodlightConfigId"] = (floodlightConfigId).toJson();
+    }
+    if (metricNames != null) {
+      _json["metricNames"] = metricNames;
+    }
+    if (reportProperties != null) {
+      _json["reportProperties"] = (reportProperties).toJson();
+    }
+    return _json;
+  }
+}
+
+/// The properties of the report.
+class ReportPathToConversionCriteriaReportProperties {
+  /// DFA checks to see if a click interaction occurred within the specified
+  /// period of time before a conversion. By default the value is pulled from
+  /// Floodlight or you can manually enter a custom value. Valid values: 1-90.
+  core.int clicksLookbackWindow;
+
+  /// DFA checks to see if an impression interaction occurred within the
+  /// specified period of time before a conversion. By default the value is
+  /// pulled from Floodlight or you can manually enter a custom value. Valid
+  /// values: 1-90.
+  core.int impressionsLookbackWindow;
+
+  /// Deprecated: has no effect.
+  core.bool includeAttributedIPConversions;
+
+  /// Include conversions of users with a DoubleClick cookie but without an
+  /// exposure. That means the user did not click or see an ad from the
+  /// advertiser within the Floodlight group, or that the interaction happened
+  /// outside the lookback window.
+  core.bool includeUnattributedCookieConversions;
+
+  /// Include conversions that have no associated cookies and no exposures. It’s
+  /// therefore impossible to know how the user was exposed to your ads during
+  /// the lookback window prior to a conversion.
+  core.bool includeUnattributedIPConversions;
+
+  /// The maximum number of click interactions to include in the report.
+  /// Advertisers currently paying for E2C reports get up to 200 (100 clicks,
+  /// 100 impressions). If another advertiser in your network is paying for E2C,
+  /// you can have up to 5 total exposures per report.
+  core.int maximumClickInteractions;
+
+  /// The maximum number of click interactions to include in the report.
+  /// Advertisers currently paying for E2C reports get up to 200 (100 clicks,
+  /// 100 impressions). If another advertiser in your network is paying for E2C,
+  /// you can have up to 5 total exposures per report.
+  core.int maximumImpressionInteractions;
+
+  /// The maximum amount of time that can take place between interactions
+  /// (clicks or impressions) by the same user. Valid values: 1-90.
+  core.int maximumInteractionGap;
+
+  /// Enable pivoting on interaction path.
+  core.bool pivotOnInteractionPath;
+
+  ReportPathToConversionCriteriaReportProperties();
+
+  ReportPathToConversionCriteriaReportProperties.fromJson(core.Map _json) {
+    if (_json.containsKey("clicksLookbackWindow")) {
+      clicksLookbackWindow = _json["clicksLookbackWindow"];
+    }
+    if (_json.containsKey("impressionsLookbackWindow")) {
+      impressionsLookbackWindow = _json["impressionsLookbackWindow"];
+    }
+    if (_json.containsKey("includeAttributedIPConversions")) {
+      includeAttributedIPConversions = _json["includeAttributedIPConversions"];
+    }
+    if (_json.containsKey("includeUnattributedCookieConversions")) {
+      includeUnattributedCookieConversions =
+          _json["includeUnattributedCookieConversions"];
+    }
+    if (_json.containsKey("includeUnattributedIPConversions")) {
+      includeUnattributedIPConversions =
+          _json["includeUnattributedIPConversions"];
+    }
+    if (_json.containsKey("maximumClickInteractions")) {
+      maximumClickInteractions = _json["maximumClickInteractions"];
+    }
+    if (_json.containsKey("maximumImpressionInteractions")) {
+      maximumImpressionInteractions = _json["maximumImpressionInteractions"];
+    }
+    if (_json.containsKey("maximumInteractionGap")) {
+      maximumInteractionGap = _json["maximumInteractionGap"];
+    }
+    if (_json.containsKey("pivotOnInteractionPath")) {
+      pivotOnInteractionPath = _json["pivotOnInteractionPath"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (clicksLookbackWindow != null) {
+      _json["clicksLookbackWindow"] = clicksLookbackWindow;
+    }
+    if (impressionsLookbackWindow != null) {
+      _json["impressionsLookbackWindow"] = impressionsLookbackWindow;
+    }
+    if (includeAttributedIPConversions != null) {
+      _json["includeAttributedIPConversions"] = includeAttributedIPConversions;
+    }
+    if (includeUnattributedCookieConversions != null) {
+      _json["includeUnattributedCookieConversions"] =
+          includeUnattributedCookieConversions;
+    }
+    if (includeUnattributedIPConversions != null) {
+      _json["includeUnattributedIPConversions"] =
+          includeUnattributedIPConversions;
+    }
+    if (maximumClickInteractions != null) {
+      _json["maximumClickInteractions"] = maximumClickInteractions;
+    }
+    if (maximumImpressionInteractions != null) {
+      _json["maximumImpressionInteractions"] = maximumImpressionInteractions;
+    }
+    if (maximumInteractionGap != null) {
+      _json["maximumInteractionGap"] = maximumInteractionGap;
+    }
+    if (pivotOnInteractionPath != null) {
+      _json["pivotOnInteractionPath"] = pivotOnInteractionPath;
+    }
+    return _json;
+  }
+}
+
+/// The report criteria for a report of type "PATH_TO_CONVERSION".
+class ReportPathToConversionCriteria {
+  /// The list of 'dfa:activity' values to filter on.
+  core.List<DimensionValue> activityFilters;
+
+  /// The list of conversion dimensions the report should include.
+  core.List<SortedDimension> conversionDimensions;
+
+  /// The list of custom floodlight variables the report should include.
+  core.List<SortedDimension> customFloodlightVariables;
+
+  /// The list of custom rich media events to include.
+  core.List<DimensionValue> customRichMediaEvents;
+
+  /// The date range this report should be run for.
+  DateRange dateRange;
+
+  /// The floodlight ID for which to show data in this report. All advertisers
+  /// associated with that ID will automatically be added. The dimension of the
+  /// value needs to be 'dfa:floodlightConfigId'.
+  DimensionValue floodlightConfigId;
+
+  /// The list of names of metrics the report should include.
+  core.List<core.String> metricNames;
+
+  /// The list of per interaction dimensions the report should include.
+  core.List<SortedDimension> perInteractionDimensions;
+
+  /// The properties of the report.
+  ReportPathToConversionCriteriaReportProperties reportProperties;
+
+  ReportPathToConversionCriteria();
+
+  ReportPathToConversionCriteria.fromJson(core.Map _json) {
+    if (_json.containsKey("activityFilters")) {
+      activityFilters = _json["activityFilters"]
+          .map((value) => new DimensionValue.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("conversionDimensions")) {
+      conversionDimensions = _json["conversionDimensions"]
+          .map((value) => new SortedDimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("customFloodlightVariables")) {
+      customFloodlightVariables = _json["customFloodlightVariables"]
+          .map((value) => new SortedDimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("customRichMediaEvents")) {
+      customRichMediaEvents = _json["customRichMediaEvents"]
+          .map((value) => new DimensionValue.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("dateRange")) {
+      dateRange = new DateRange.fromJson(_json["dateRange"]);
+    }
+    if (_json.containsKey("floodlightConfigId")) {
+      floodlightConfigId =
+          new DimensionValue.fromJson(_json["floodlightConfigId"]);
+    }
+    if (_json.containsKey("metricNames")) {
+      metricNames = _json["metricNames"];
+    }
+    if (_json.containsKey("perInteractionDimensions")) {
+      perInteractionDimensions = _json["perInteractionDimensions"]
+          .map((value) => new SortedDimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("reportProperties")) {
+      reportProperties =
+          new ReportPathToConversionCriteriaReportProperties.fromJson(
+              _json["reportProperties"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (activityFilters != null) {
+      _json["activityFilters"] =
+          activityFilters.map((value) => (value).toJson()).toList();
+    }
+    if (conversionDimensions != null) {
+      _json["conversionDimensions"] =
+          conversionDimensions.map((value) => (value).toJson()).toList();
+    }
+    if (customFloodlightVariables != null) {
+      _json["customFloodlightVariables"] =
+          customFloodlightVariables.map((value) => (value).toJson()).toList();
+    }
+    if (customRichMediaEvents != null) {
+      _json["customRichMediaEvents"] =
+          customRichMediaEvents.map((value) => (value).toJson()).toList();
+    }
+    if (dateRange != null) {
+      _json["dateRange"] = (dateRange).toJson();
+    }
+    if (floodlightConfigId != null) {
+      _json["floodlightConfigId"] = (floodlightConfigId).toJson();
+    }
+    if (metricNames != null) {
+      _json["metricNames"] = metricNames;
+    }
+    if (perInteractionDimensions != null) {
+      _json["perInteractionDimensions"] =
+          perInteractionDimensions.map((value) => (value).toJson()).toList();
+    }
+    if (reportProperties != null) {
+      _json["reportProperties"] = (reportProperties).toJson();
+    }
+    return _json;
+  }
+}
+
+/// The report criteria for a report of type "REACH".
+class ReportReachCriteria {
+  /// Activity group.
+  Activities activities;
+
+  /// Custom Rich Media Events group.
+  CustomRichMediaEvents customRichMediaEvents;
+
+  /// The date range this report should be run for.
+  DateRange dateRange;
+
+  /// The list of filters on which dimensions are filtered.
+  /// Filters for different dimensions are ANDed, filters for the same dimension
+  /// are grouped together and ORed.
+  core.List<DimensionValue> dimensionFilters;
+
+  /// The list of dimensions the report should include.
+  core.List<SortedDimension> dimensions;
+
+  /// Whether to enable all reach dimension combinations in the report. Defaults
+  /// to false. If enabled, the date range of the report should be within the
+  /// last 42 days.
+  core.bool enableAllDimensionCombinations;
+
+  /// The list of names of metrics the report should include.
+  core.List<core.String> metricNames;
+
+  /// The list of names of  Reach By Frequency metrics the report should
+  /// include.
+  core.List<core.String> reachByFrequencyMetricNames;
+
+  ReportReachCriteria();
+
+  ReportReachCriteria.fromJson(core.Map _json) {
+    if (_json.containsKey("activities")) {
+      activities = new Activities.fromJson(_json["activities"]);
+    }
+    if (_json.containsKey("customRichMediaEvents")) {
+      customRichMediaEvents =
+          new CustomRichMediaEvents.fromJson(_json["customRichMediaEvents"]);
+    }
+    if (_json.containsKey("dateRange")) {
+      dateRange = new DateRange.fromJson(_json["dateRange"]);
+    }
+    if (_json.containsKey("dimensionFilters")) {
+      dimensionFilters = _json["dimensionFilters"]
+          .map((value) => new DimensionValue.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("dimensions")) {
+      dimensions = _json["dimensions"]
+          .map((value) => new SortedDimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("enableAllDimensionCombinations")) {
+      enableAllDimensionCombinations = _json["enableAllDimensionCombinations"];
+    }
+    if (_json.containsKey("metricNames")) {
+      metricNames = _json["metricNames"];
+    }
+    if (_json.containsKey("reachByFrequencyMetricNames")) {
+      reachByFrequencyMetricNames = _json["reachByFrequencyMetricNames"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (activities != null) {
+      _json["activities"] = (activities).toJson();
+    }
+    if (customRichMediaEvents != null) {
+      _json["customRichMediaEvents"] = (customRichMediaEvents).toJson();
+    }
+    if (dateRange != null) {
+      _json["dateRange"] = (dateRange).toJson();
+    }
+    if (dimensionFilters != null) {
+      _json["dimensionFilters"] =
+          dimensionFilters.map((value) => (value).toJson()).toList();
+    }
+    if (dimensions != null) {
+      _json["dimensions"] =
+          dimensions.map((value) => (value).toJson()).toList();
+    }
+    if (enableAllDimensionCombinations != null) {
+      _json["enableAllDimensionCombinations"] = enableAllDimensionCombinations;
+    }
+    if (metricNames != null) {
+      _json["metricNames"] = metricNames;
+    }
+    if (reachByFrequencyMetricNames != null) {
+      _json["reachByFrequencyMetricNames"] = reachByFrequencyMetricNames;
+    }
+    return _json;
+  }
+}
+
+/// The report's schedule. Can only be set if the report's 'dateRange' is a
+/// relative date range and the relative date range is not "TODAY".
+class ReportSchedule {
+  /// Whether the schedule is active or not. Must be set to either true or
+  /// false.
+  core.bool active;
+
+  /// Defines every how many days, weeks or months the report should be run.
+  /// Needs to be set when "repeats" is either "DAILY", "WEEKLY" or "MONTHLY".
+  core.int every;
+
+  /// The expiration date when the scheduled report stops running.
+  core.DateTime expirationDate;
+
+  /// The interval for which the report is repeated. Note:
+  /// - "DAILY" also requires field "every" to be set.
+  /// - "WEEKLY" also requires fields "every" and "repeatsOnWeekDays" to be set.
+  /// - "MONTHLY" also requires fields "every" and "runsOnDayOfMonth" to be set.
+  core.String repeats;
+
+  /// List of week days "WEEKLY" on which scheduled reports should run.
+  core.List<core.String> repeatsOnWeekDays;
+
+  /// Enum to define for "MONTHLY" scheduled reports whether reports should be
+  /// repeated on the same day of the month as "startDate" or the same day of
+  /// the week of the month.
+  /// Example: If 'startDate' is Monday, April 2nd 2012 (2012-04-02),
+  /// "DAY_OF_MONTH" would run subsequent reports on the 2nd of every Month, and
+  /// "WEEK_OF_MONTH" would run subsequent reports on the first Monday of the
+  /// month.
+  /// Possible string values are:
+  /// - "DAY_OF_MONTH"
+  /// - "WEEK_OF_MONTH"
+  core.String runsOnDayOfMonth;
+
+  /// Start date of date range for which scheduled reports should be run.
+  core.DateTime startDate;
+
+  ReportSchedule();
+
+  ReportSchedule.fromJson(core.Map _json) {
+    if (_json.containsKey("active")) {
+      active = _json["active"];
+    }
+    if (_json.containsKey("every")) {
+      every = _json["every"];
+    }
+    if (_json.containsKey("expirationDate")) {
+      expirationDate = core.DateTime.parse(_json["expirationDate"]);
+    }
+    if (_json.containsKey("repeats")) {
+      repeats = _json["repeats"];
+    }
+    if (_json.containsKey("repeatsOnWeekDays")) {
+      repeatsOnWeekDays = _json["repeatsOnWeekDays"];
+    }
+    if (_json.containsKey("runsOnDayOfMonth")) {
+      runsOnDayOfMonth = _json["runsOnDayOfMonth"];
+    }
+    if (_json.containsKey("startDate")) {
+      startDate = core.DateTime.parse(_json["startDate"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (active != null) {
+      _json["active"] = active;
+    }
+    if (every != null) {
+      _json["every"] = every;
+    }
+    if (expirationDate != null) {
+      _json["expirationDate"] =
+          "${(expirationDate).year.toString().padLeft(4, '0')}-${(expirationDate).month.toString().padLeft(2, '0')}-${(expirationDate).day.toString().padLeft(2, '0')}";
+    }
+    if (repeats != null) {
+      _json["repeats"] = repeats;
+    }
+    if (repeatsOnWeekDays != null) {
+      _json["repeatsOnWeekDays"] = repeatsOnWeekDays;
+    }
+    if (runsOnDayOfMonth != null) {
+      _json["runsOnDayOfMonth"] = runsOnDayOfMonth;
+    }
+    if (startDate != null) {
+      _json["startDate"] =
+          "${(startDate).year.toString().padLeft(4, '0')}-${(startDate).month.toString().padLeft(2, '0')}-${(startDate).day.toString().padLeft(2, '0')}";
+    }
+    return _json;
+  }
+}
+
+/// Represents a Report resource.
+class Report {
+  /// The account ID to which this report belongs.
+  core.String accountId;
+
+  /// The report criteria for a report of type "STANDARD".
+  ReportCriteria criteria;
+
+  /// The report criteria for a report of type "CROSS_DIMENSION_REACH".
+  ReportCrossDimensionReachCriteria crossDimensionReachCriteria;
+
+  /// The report's email delivery settings.
+  ReportDelivery delivery;
+
+  /// The eTag of this response for caching purposes.
+  core.String etag;
+
+  /// The filename used when generating report files for this report.
+  core.String fileName;
+
+  /// The report criteria for a report of type "FLOODLIGHT".
+  ReportFloodlightCriteria floodlightCriteria;
+
+  /// The output format of the report. If not specified, default format is
+  /// "CSV". Note that the actual format in the completed report file might
+  /// differ if for instance the report's size exceeds the format's
+  /// capabilities. "CSV" will then be the fallback format.
+  /// Possible string values are:
+  /// - "CSV"
+  /// - "EXCEL"
+  core.String format;
+
+  /// The unique ID identifying this report resource.
+  core.String id;
+
+  /// The kind of resource this is, in this case dfareporting#report.
+  core.String kind;
+
+  /// The timestamp (in milliseconds since epoch) of when this report was last
+  /// modified.
+  core.String lastModifiedTime;
+
+  /// The name of the report.
+  core.String name;
+
+  /// The user profile id of the owner of this report.
+  core.String ownerProfileId;
+
+  /// The report criteria for a report of type "PATH_TO_CONVERSION".
+  ReportPathToConversionCriteria pathToConversionCriteria;
+
+  /// The report criteria for a report of type "REACH".
+  ReportReachCriteria reachCriteria;
+
+  /// The report's schedule. Can only be set if the report's 'dateRange' is a
+  /// relative date range and the relative date range is not "TODAY".
+  ReportSchedule schedule;
+
+  /// The subaccount ID to which this report belongs if applicable.
+  core.String subAccountId;
+
+  /// The type of the report.
+  /// Possible string values are:
+  /// - "CROSS_DIMENSION_REACH"
+  /// - "FLOODLIGHT"
+  /// - "PATH_TO_CONVERSION"
+  /// - "REACH"
+  /// - "STANDARD"
+  core.String type;
+
+  Report();
+
+  Report.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("criteria")) {
+      criteria = new ReportCriteria.fromJson(_json["criteria"]);
+    }
+    if (_json.containsKey("crossDimensionReachCriteria")) {
+      crossDimensionReachCriteria =
+          new ReportCrossDimensionReachCriteria.fromJson(
+              _json["crossDimensionReachCriteria"]);
+    }
+    if (_json.containsKey("delivery")) {
+      delivery = new ReportDelivery.fromJson(_json["delivery"]);
+    }
+    if (_json.containsKey("etag")) {
+      etag = _json["etag"];
+    }
+    if (_json.containsKey("fileName")) {
+      fileName = _json["fileName"];
+    }
+    if (_json.containsKey("floodlightCriteria")) {
+      floodlightCriteria =
+          new ReportFloodlightCriteria.fromJson(_json["floodlightCriteria"]);
+    }
+    if (_json.containsKey("format")) {
+      format = _json["format"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lastModifiedTime")) {
+      lastModifiedTime = _json["lastModifiedTime"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("ownerProfileId")) {
+      ownerProfileId = _json["ownerProfileId"];
+    }
+    if (_json.containsKey("pathToConversionCriteria")) {
+      pathToConversionCriteria = new ReportPathToConversionCriteria.fromJson(
+          _json["pathToConversionCriteria"]);
+    }
+    if (_json.containsKey("reachCriteria")) {
+      reachCriteria = new ReportReachCriteria.fromJson(_json["reachCriteria"]);
+    }
+    if (_json.containsKey("schedule")) {
+      schedule = new ReportSchedule.fromJson(_json["schedule"]);
+    }
+    if (_json.containsKey("subAccountId")) {
+      subAccountId = _json["subAccountId"];
+    }
+    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 (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (criteria != null) {
+      _json["criteria"] = (criteria).toJson();
+    }
+    if (crossDimensionReachCriteria != null) {
+      _json["crossDimensionReachCriteria"] =
+          (crossDimensionReachCriteria).toJson();
+    }
+    if (delivery != null) {
+      _json["delivery"] = (delivery).toJson();
+    }
+    if (etag != null) {
+      _json["etag"] = etag;
+    }
+    if (fileName != null) {
+      _json["fileName"] = fileName;
+    }
+    if (floodlightCriteria != null) {
+      _json["floodlightCriteria"] = (floodlightCriteria).toJson();
+    }
+    if (format != null) {
+      _json["format"] = format;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lastModifiedTime != null) {
+      _json["lastModifiedTime"] = lastModifiedTime;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (ownerProfileId != null) {
+      _json["ownerProfileId"] = ownerProfileId;
+    }
+    if (pathToConversionCriteria != null) {
+      _json["pathToConversionCriteria"] = (pathToConversionCriteria).toJson();
+    }
+    if (reachCriteria != null) {
+      _json["reachCriteria"] = (reachCriteria).toJson();
+    }
+    if (schedule != null) {
+      _json["schedule"] = (schedule).toJson();
+    }
+    if (subAccountId != null) {
+      _json["subAccountId"] = subAccountId;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+/// Represents fields that are compatible to be selected for a report of type
+/// "STANDARD".
+class ReportCompatibleFields {
+  /// Dimensions which are compatible to be selected in the "dimensionFilters"
+  /// section of the report.
+  core.List<Dimension> dimensionFilters;
+
+  /// Dimensions which are compatible to be selected in the "dimensions" section
+  /// of the report.
+  core.List<Dimension> dimensions;
+
+  /// The kind of resource this is, in this case
+  /// dfareporting#reportCompatibleFields.
+  core.String kind;
+
+  /// Metrics which are compatible to be selected in the "metricNames" section
+  /// of the report.
+  core.List<Metric> metrics;
+
+  /// Metrics which are compatible to be selected as activity metrics to pivot
+  /// on in the "activities" section of the report.
+  core.List<Metric> pivotedActivityMetrics;
+
+  ReportCompatibleFields();
+
+  ReportCompatibleFields.fromJson(core.Map _json) {
+    if (_json.containsKey("dimensionFilters")) {
+      dimensionFilters = _json["dimensionFilters"]
+          .map((value) => new Dimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("dimensions")) {
+      dimensions = _json["dimensions"]
+          .map((value) => new Dimension.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("metrics")) {
+      metrics =
+          _json["metrics"].map((value) => new Metric.fromJson(value)).toList();
+    }
+    if (_json.containsKey("pivotedActivityMetrics")) {
+      pivotedActivityMetrics = _json["pivotedActivityMetrics"]
+          .map((value) => new Metric.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 (dimensionFilters != null) {
+      _json["dimensionFilters"] =
+          dimensionFilters.map((value) => (value).toJson()).toList();
+    }
+    if (dimensions != null) {
+      _json["dimensions"] =
+          dimensions.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (metrics != null) {
+      _json["metrics"] = metrics.map((value) => (value).toJson()).toList();
+    }
+    if (pivotedActivityMetrics != null) {
+      _json["pivotedActivityMetrics"] =
+          pivotedActivityMetrics.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Represents the list of reports.
+class ReportList {
+  /// The eTag of this response for caching purposes.
+  core.String etag;
+
+  /// The reports returned in this response.
+  core.List<Report> items;
+
+  /// The kind of list this is, in this case dfareporting#reportList.
+  core.String kind;
+
+  /// Continuation token used to page through reports. To retrieve the next page
+  /// of results, set the next request's "pageToken" to the value of this field.
+  /// The page token is only valid for a limited amount of time and should not
+  /// be persisted.
+  core.String nextPageToken;
+
+  ReportList();
+
+  ReportList.fromJson(core.Map _json) {
+    if (_json.containsKey("etag")) {
+      etag = _json["etag"];
+    }
+    if (_json.containsKey("items")) {
+      items =
+          _json["items"].map((value) => new Report.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 (items != null) {
+      _json["items"] = items.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Reporting Configuration
+class ReportsConfiguration {
+  /// Whether the exposure to conversion report is enabled. This report shows
+  /// detailed pathway information on up to 10 of the most recent ad exposures
+  /// seen by a user before converting.
+  core.bool exposureToConversionEnabled;
+
+  /// Default lookback windows for new advertisers in this account.
+  LookbackConfiguration lookbackConfiguration;
+
+  /// Report generation time zone ID of this account. This is a required field
+  /// that can only be changed by a superuser.
+  /// Acceptable values are:
+  ///
+  /// - "1" for "America/New_York"
+  /// - "2" for "Europe/London"
+  /// - "3" for "Europe/Paris"
+  /// - "4" for "Africa/Johannesburg"
+  /// - "5" for "Asia/Jerusalem"
+  /// - "6" for "Asia/Shanghai"
+  /// - "7" for "Asia/Hong_Kong"
+  /// - "8" for "Asia/Tokyo"
+  /// - "9" for "Australia/Sydney"
+  /// - "10" for "Asia/Dubai"
+  /// - "11" for "America/Los_Angeles"
+  /// - "12" for "Pacific/Auckland"
+  /// - "13" for "America/Sao_Paulo"
+  core.String reportGenerationTimeZoneId;
+
+  ReportsConfiguration();
+
+  ReportsConfiguration.fromJson(core.Map _json) {
+    if (_json.containsKey("exposureToConversionEnabled")) {
+      exposureToConversionEnabled = _json["exposureToConversionEnabled"];
+    }
+    if (_json.containsKey("lookbackConfiguration")) {
+      lookbackConfiguration =
+          new LookbackConfiguration.fromJson(_json["lookbackConfiguration"]);
+    }
+    if (_json.containsKey("reportGenerationTimeZoneId")) {
+      reportGenerationTimeZoneId = _json["reportGenerationTimeZoneId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (exposureToConversionEnabled != null) {
+      _json["exposureToConversionEnabled"] = exposureToConversionEnabled;
+    }
+    if (lookbackConfiguration != null) {
+      _json["lookbackConfiguration"] = (lookbackConfiguration).toJson();
+    }
+    if (reportGenerationTimeZoneId != null) {
+      _json["reportGenerationTimeZoneId"] = reportGenerationTimeZoneId;
+    }
+    return _json;
+  }
+}
+
+/// Rich Media Exit Override.
+class RichMediaExitOverride {
+  /// Click-through URL of this rich media exit override. Applicable if the
+  /// enabled field is set to true.
+  ClickThroughUrl clickThroughUrl;
+
+  /// Whether to use the clickThroughUrl. If false, the creative-level exit will
+  /// be used.
+  core.bool enabled;
+
+  /// ID for the override to refer to a specific exit in the creative.
+  core.String exitId;
+
+  RichMediaExitOverride();
+
+  RichMediaExitOverride.fromJson(core.Map _json) {
+    if (_json.containsKey("clickThroughUrl")) {
+      clickThroughUrl = new ClickThroughUrl.fromJson(_json["clickThroughUrl"]);
+    }
+    if (_json.containsKey("enabled")) {
+      enabled = _json["enabled"];
+    }
+    if (_json.containsKey("exitId")) {
+      exitId = _json["exitId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (clickThroughUrl != null) {
+      _json["clickThroughUrl"] = (clickThroughUrl).toJson();
+    }
+    if (enabled != null) {
+      _json["enabled"] = enabled;
+    }
+    if (exitId != null) {
+      _json["exitId"] = exitId;
+    }
+    return _json;
+  }
+}
+
+/// A rule associates an asset with a targeting template for asset-level
+/// targeting. Applicable to INSTREAM_VIDEO creatives.
+class Rule {
+  /// A creativeAssets[].id. This should refer to one of the parent assets in
+  /// this creative. This is a required field.
+  core.String assetId;
+
+  /// A user-friendly name for this rule. This is a required field.
+  core.String name;
+
+  /// A targeting template ID. The targeting from the targeting template will be
+  /// used to determine whether this asset should be served. This is a required
+  /// field.
+  core.String targetingTemplateId;
+
+  Rule();
+
+  Rule.fromJson(core.Map _json) {
+    if (_json.containsKey("assetId")) {
+      assetId = _json["assetId"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("targetingTemplateId")) {
+      targetingTemplateId = _json["targetingTemplateId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (assetId != null) {
+      _json["assetId"] = assetId;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (targetingTemplateId != null) {
+      _json["targetingTemplateId"] = targetingTemplateId;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a site.
+class Site {
+  /// Account ID of this site. This is a read-only field that can be left blank.
+  core.String accountId;
+
+  /// Whether this site is approved.
+  core.bool approved;
+
+  /// Directory site associated with this site. This is a required field that is
+  /// read-only after insertion.
+  core.String directorySiteId;
+
+  /// Dimension value for the ID of the directory site. This is a read-only,
+  /// auto-generated field.
+  DimensionValue directorySiteIdDimensionValue;
+
+  /// ID of this site. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Dimension value for the ID of this site. This is a read-only,
+  /// auto-generated field.
+  DimensionValue idDimensionValue;
+
+  /// Key name of this site. This is a read-only, auto-generated field.
+  core.String keyName;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#site".
+  core.String kind;
+
+  /// Name of this site.This is a required field. Must be less than 128
+  /// characters long. If this site is under a subaccount, the name must be
+  /// unique among sites of the same subaccount. Otherwise, this site is a
+  /// top-level site, and the name must be unique among top-level sites of the
+  /// same account.
+  core.String name;
+
+  /// Site contacts.
+  core.List<SiteContact> siteContacts;
+
+  /// Site-wide settings.
+  SiteSettings siteSettings;
+
+  /// Subaccount ID of this site. This is a read-only field that can be left
+  /// blank.
+  core.String subaccountId;
+
+  Site();
+
+  Site.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("approved")) {
+      approved = _json["approved"];
+    }
+    if (_json.containsKey("directorySiteId")) {
+      directorySiteId = _json["directorySiteId"];
+    }
+    if (_json.containsKey("directorySiteIdDimensionValue")) {
+      directorySiteIdDimensionValue =
+          new DimensionValue.fromJson(_json["directorySiteIdDimensionValue"]);
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("idDimensionValue")) {
+      idDimensionValue = new DimensionValue.fromJson(_json["idDimensionValue"]);
+    }
+    if (_json.containsKey("keyName")) {
+      keyName = _json["keyName"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("siteContacts")) {
+      siteContacts = _json["siteContacts"]
+          .map((value) => new SiteContact.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("siteSettings")) {
+      siteSettings = new SiteSettings.fromJson(_json["siteSettings"]);
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (approved != null) {
+      _json["approved"] = approved;
+    }
+    if (directorySiteId != null) {
+      _json["directorySiteId"] = directorySiteId;
+    }
+    if (directorySiteIdDimensionValue != null) {
+      _json["directorySiteIdDimensionValue"] =
+          (directorySiteIdDimensionValue).toJson();
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (idDimensionValue != null) {
+      _json["idDimensionValue"] = (idDimensionValue).toJson();
+    }
+    if (keyName != null) {
+      _json["keyName"] = keyName;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (siteContacts != null) {
+      _json["siteContacts"] =
+          siteContacts.map((value) => (value).toJson()).toList();
+    }
+    if (siteSettings != null) {
+      _json["siteSettings"] = (siteSettings).toJson();
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    return _json;
+  }
+}
+
+/// Site Contact
+class SiteContact {
+  /// Address of this site contact.
+  core.String address;
+
+  /// Site contact type.
+  /// Possible string values are:
+  /// - "SALES_PERSON"
+  /// - "TRAFFICKER"
+  core.String contactType;
+
+  /// Email address of this site contact. This is a required field.
+  core.String email;
+
+  /// First name of this site contact.
+  core.String firstName;
+
+  /// ID of this site contact. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Last name of this site contact.
+  core.String lastName;
+
+  /// Primary phone number of this site contact.
+  core.String phone;
+
+  /// Title or designation of this site contact.
+  core.String title;
+
+  SiteContact();
+
+  SiteContact.fromJson(core.Map _json) {
+    if (_json.containsKey("address")) {
+      address = _json["address"];
+    }
+    if (_json.containsKey("contactType")) {
+      contactType = _json["contactType"];
+    }
+    if (_json.containsKey("email")) {
+      email = _json["email"];
+    }
+    if (_json.containsKey("firstName")) {
+      firstName = _json["firstName"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("lastName")) {
+      lastName = _json["lastName"];
+    }
+    if (_json.containsKey("phone")) {
+      phone = _json["phone"];
+    }
+    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 (address != null) {
+      _json["address"] = address;
+    }
+    if (contactType != null) {
+      _json["contactType"] = contactType;
+    }
+    if (email != null) {
+      _json["email"] = email;
+    }
+    if (firstName != null) {
+      _json["firstName"] = firstName;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (lastName != null) {
+      _json["lastName"] = lastName;
+    }
+    if (phone != null) {
+      _json["phone"] = phone;
+    }
+    if (title != null) {
+      _json["title"] = title;
+    }
+    return _json;
+  }
+}
+
+/// Site Settings
+class SiteSettings {
+  /// Whether active view creatives are disabled for this site.
+  core.bool activeViewOptOut;
+
+  /// Whether this site opts out of ad blocking. When true, ad blocking is
+  /// disabled for all placements under the site, regardless of the individual
+  /// placement settings. When false, the campaign and placement settings take
+  /// effect.
+  core.bool adBlockingOptOut;
+
+  /// Site-wide creative settings.
+  CreativeSettings creativeSettings;
+
+  /// Whether new cookies are disabled for this site.
+  core.bool disableNewCookie;
+
+  /// Lookback window settings for this site.
+  LookbackConfiguration lookbackConfiguration;
+
+  /// Configuration settings for dynamic and image floodlight tags.
+  TagSetting tagSetting;
+
+  /// Whether Verification and ActiveView for in-stream video creatives are
+  /// disabled by default for new placements created under this site. This value
+  /// will be used to populate the placement.videoActiveViewOptOut field, when
+  /// no value is specified for the new placement.
+  core.bool videoActiveViewOptOutTemplate;
+
+  /// Default VPAID adapter setting for new placements created under this site.
+  /// This value will be used to populate the placements.vpaidAdapterChoice
+  /// field, when no value is specified for the new placement. Controls which
+  /// VPAID format the measurement adapter will use for in-stream video
+  /// creatives assigned to the placement. The publisher's specifications will
+  /// typically determine this setting. For VPAID creatives, the adapter format
+  /// will match the VPAID format (HTML5 VPAID creatives use the HTML5 adapter).
+  ///
+  /// Note: Flash is no longer supported. This field now defaults to HTML5 when
+  /// the following values are provided: FLASH, BOTH.
+  /// Possible string values are:
+  /// - "BOTH"
+  /// - "DEFAULT"
+  /// - "FLASH"
+  /// - "HTML5"
+  core.String vpaidAdapterChoiceTemplate;
+
+  SiteSettings();
+
+  SiteSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("activeViewOptOut")) {
+      activeViewOptOut = _json["activeViewOptOut"];
+    }
+    if (_json.containsKey("adBlockingOptOut")) {
+      adBlockingOptOut = _json["adBlockingOptOut"];
+    }
+    if (_json.containsKey("creativeSettings")) {
+      creativeSettings =
+          new CreativeSettings.fromJson(_json["creativeSettings"]);
+    }
+    if (_json.containsKey("disableNewCookie")) {
+      disableNewCookie = _json["disableNewCookie"];
+    }
+    if (_json.containsKey("lookbackConfiguration")) {
+      lookbackConfiguration =
+          new LookbackConfiguration.fromJson(_json["lookbackConfiguration"]);
+    }
+    if (_json.containsKey("tagSetting")) {
+      tagSetting = new TagSetting.fromJson(_json["tagSetting"]);
+    }
+    if (_json.containsKey("videoActiveViewOptOutTemplate")) {
+      videoActiveViewOptOutTemplate = _json["videoActiveViewOptOutTemplate"];
+    }
+    if (_json.containsKey("vpaidAdapterChoiceTemplate")) {
+      vpaidAdapterChoiceTemplate = _json["vpaidAdapterChoiceTemplate"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (activeViewOptOut != null) {
+      _json["activeViewOptOut"] = activeViewOptOut;
+    }
+    if (adBlockingOptOut != null) {
+      _json["adBlockingOptOut"] = adBlockingOptOut;
+    }
+    if (creativeSettings != null) {
+      _json["creativeSettings"] = (creativeSettings).toJson();
+    }
+    if (disableNewCookie != null) {
+      _json["disableNewCookie"] = disableNewCookie;
+    }
+    if (lookbackConfiguration != null) {
+      _json["lookbackConfiguration"] = (lookbackConfiguration).toJson();
+    }
+    if (tagSetting != null) {
+      _json["tagSetting"] = (tagSetting).toJson();
+    }
+    if (videoActiveViewOptOutTemplate != null) {
+      _json["videoActiveViewOptOutTemplate"] = videoActiveViewOptOutTemplate;
+    }
+    if (vpaidAdapterChoiceTemplate != null) {
+      _json["vpaidAdapterChoiceTemplate"] = vpaidAdapterChoiceTemplate;
+    }
+    return _json;
+  }
+}
+
+/// Site List Response
+class SitesListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#sitesListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  /// Site collection.
+  core.List<Site> sites;
+
+  SitesListResponse();
+
+  SitesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("sites")) {
+      sites = _json["sites"].map((value) => new Site.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (sites != null) {
+      _json["sites"] = sites.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Represents the dimensions of ads, placements, creatives, or creative assets.
+class Size {
+  /// Height of this size. Acceptable values are 0 to 32767, inclusive.
+  core.int height;
+
+  /// IAB standard size. This is a read-only, auto-generated field.
+  core.bool iab;
+
+  /// ID of this size. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#size".
+  core.String kind;
+
+  /// Width of this size. Acceptable values are 0 to 32767, inclusive.
+  core.int width;
+
+  Size();
+
+  Size.fromJson(core.Map _json) {
+    if (_json.containsKey("height")) {
+      height = _json["height"];
+    }
+    if (_json.containsKey("iab")) {
+      iab = _json["iab"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    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 (height != null) {
+      _json["height"] = height;
+    }
+    if (iab != null) {
+      _json["iab"] = iab;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (width != null) {
+      _json["width"] = width;
+    }
+    return _json;
+  }
+}
+
+/// Size List Response
+class SizesListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#sizesListResponse".
+  core.String kind;
+
+  /// Size collection.
+  core.List<Size> sizes;
+
+  SizesListResponse();
+
+  SizesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("sizes")) {
+      sizes = _json["sizes"].map((value) => new Size.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (sizes != null) {
+      _json["sizes"] = sizes.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Skippable Settings
+class SkippableSetting {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#skippableSetting".
+  core.String kind;
+
+  /// Amount of time to play videos served to this placement before counting a
+  /// view. Applicable when skippable is true.
+  VideoOffset progressOffset;
+
+  /// Amount of time to play videos served to this placement before the skip
+  /// button should appear. Applicable when skippable is true.
+  VideoOffset skipOffset;
+
+  /// Whether the user can skip creatives served to this placement.
+  core.bool skippable;
+
+  SkippableSetting();
+
+  SkippableSetting.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("progressOffset")) {
+      progressOffset = new VideoOffset.fromJson(_json["progressOffset"]);
+    }
+    if (_json.containsKey("skipOffset")) {
+      skipOffset = new VideoOffset.fromJson(_json["skipOffset"]);
+    }
+    if (_json.containsKey("skippable")) {
+      skippable = _json["skippable"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (progressOffset != null) {
+      _json["progressOffset"] = (progressOffset).toJson();
+    }
+    if (skipOffset != null) {
+      _json["skipOffset"] = (skipOffset).toJson();
+    }
+    if (skippable != null) {
+      _json["skippable"] = skippable;
+    }
+    return _json;
+  }
+}
+
+/// Represents a sorted dimension.
+class SortedDimension {
+  /// The kind of resource this is, in this case dfareporting#sortedDimension.
+  core.String kind;
+
+  /// The name of the dimension.
+  core.String name;
+
+  /// An optional sort order for the dimension column.
+  /// Possible string values are:
+  /// - "ASCENDING"
+  /// - "DESCENDING"
+  core.String sortOrder;
+
+  SortedDimension();
+
+  SortedDimension.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("sortOrder")) {
+      sortOrder = _json["sortOrder"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (sortOrder != null) {
+      _json["sortOrder"] = sortOrder;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a DCM subaccount.
+class Subaccount {
+  /// ID of the account that contains this subaccount. This is a read-only field
+  /// that can be left blank.
+  core.String accountId;
+
+  /// IDs of the available user role permissions for this subaccount.
+  core.List<core.String> availablePermissionIds;
+
+  /// ID of this subaccount. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#subaccount".
+  core.String kind;
+
+  /// Name of this subaccount. This is a required field. Must be less than 128
+  /// characters long and be unique among subaccounts of the same account.
+  core.String name;
+
+  Subaccount();
+
+  Subaccount.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("availablePermissionIds")) {
+      availablePermissionIds = _json["availablePermissionIds"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    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 (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (availablePermissionIds != null) {
+      _json["availablePermissionIds"] = availablePermissionIds;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Subaccount List Response
+class SubaccountsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#subaccountsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  /// Subaccount collection.
+  core.List<Subaccount> subaccounts;
+
+  SubaccountsListResponse();
+
+  SubaccountsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("subaccounts")) {
+      subaccounts = _json["subaccounts"]
+          .map((value) => new Subaccount.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (subaccounts != null) {
+      _json["subaccounts"] =
+          subaccounts.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Placement Tag Data
+class TagData {
+  /// Ad associated with this placement tag. Applicable only when format is
+  /// PLACEMENT_TAG_TRACKING.
+  core.String adId;
+
+  /// Tag string to record a click.
+  core.String clickTag;
+
+  /// Creative associated with this placement tag. Applicable only when format
+  /// is PLACEMENT_TAG_TRACKING.
+  core.String creativeId;
+
+  /// TagData tag format of this tag.
+  /// Possible string values are:
+  /// - "PLACEMENT_TAG_CLICK_COMMANDS"
+  /// - "PLACEMENT_TAG_IFRAME_ILAYER"
+  /// - "PLACEMENT_TAG_IFRAME_JAVASCRIPT"
+  /// - "PLACEMENT_TAG_IFRAME_JAVASCRIPT_LEGACY"
+  /// - "PLACEMENT_TAG_INSTREAM_VIDEO_PREFETCH"
+  /// - "PLACEMENT_TAG_INSTREAM_VIDEO_PREFETCH_VAST_3"
+  /// - "PLACEMENT_TAG_INSTREAM_VIDEO_PREFETCH_VAST_4"
+  /// - "PLACEMENT_TAG_INTERNAL_REDIRECT"
+  /// - "PLACEMENT_TAG_INTERSTITIAL_IFRAME_JAVASCRIPT"
+  /// - "PLACEMENT_TAG_INTERSTITIAL_IFRAME_JAVASCRIPT_LEGACY"
+  /// - "PLACEMENT_TAG_INTERSTITIAL_INTERNAL_REDIRECT"
+  /// - "PLACEMENT_TAG_INTERSTITIAL_JAVASCRIPT"
+  /// - "PLACEMENT_TAG_INTERSTITIAL_JAVASCRIPT_LEGACY"
+  /// - "PLACEMENT_TAG_JAVASCRIPT"
+  /// - "PLACEMENT_TAG_JAVASCRIPT_LEGACY"
+  /// - "PLACEMENT_TAG_STANDARD"
+  /// - "PLACEMENT_TAG_TRACKING"
+  /// - "PLACEMENT_TAG_TRACKING_IFRAME"
+  /// - "PLACEMENT_TAG_TRACKING_JAVASCRIPT"
+  core.String format;
+
+  /// Tag string for serving an ad.
+  core.String impressionTag;
+
+  TagData();
+
+  TagData.fromJson(core.Map _json) {
+    if (_json.containsKey("adId")) {
+      adId = _json["adId"];
+    }
+    if (_json.containsKey("clickTag")) {
+      clickTag = _json["clickTag"];
+    }
+    if (_json.containsKey("creativeId")) {
+      creativeId = _json["creativeId"];
+    }
+    if (_json.containsKey("format")) {
+      format = _json["format"];
+    }
+    if (_json.containsKey("impressionTag")) {
+      impressionTag = _json["impressionTag"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (adId != null) {
+      _json["adId"] = adId;
+    }
+    if (clickTag != null) {
+      _json["clickTag"] = clickTag;
+    }
+    if (creativeId != null) {
+      _json["creativeId"] = creativeId;
+    }
+    if (format != null) {
+      _json["format"] = format;
+    }
+    if (impressionTag != null) {
+      _json["impressionTag"] = impressionTag;
+    }
+    return _json;
+  }
+}
+
+/// Tag Settings
+class TagSetting {
+  /// Additional key-values to be included in tags. Each key-value pair must be
+  /// of the form key=value, and pairs must be separated by a semicolon (;).
+  /// Keys and values must not contain commas. For example, id=2;color=red is a
+  /// valid value for this field.
+  core.String additionalKeyValues;
+
+  /// Whether static landing page URLs should be included in the tags. This
+  /// setting applies only to placements.
+  core.bool includeClickThroughUrls;
+
+  /// Whether click-tracking string should be included in the tags.
+  core.bool includeClickTracking;
+
+  /// Option specifying how keywords are embedded in ad tags. This setting can
+  /// be used to specify whether keyword placeholders are inserted in placement
+  /// tags for this site. Publishers can then add keywords to those
+  /// placeholders.
+  /// Possible string values are:
+  /// - "GENERATE_SEPARATE_TAG_FOR_EACH_KEYWORD"
+  /// - "IGNORE"
+  /// - "PLACEHOLDER_WITH_LIST_OF_KEYWORDS"
+  core.String keywordOption;
+
+  TagSetting();
+
+  TagSetting.fromJson(core.Map _json) {
+    if (_json.containsKey("additionalKeyValues")) {
+      additionalKeyValues = _json["additionalKeyValues"];
+    }
+    if (_json.containsKey("includeClickThroughUrls")) {
+      includeClickThroughUrls = _json["includeClickThroughUrls"];
+    }
+    if (_json.containsKey("includeClickTracking")) {
+      includeClickTracking = _json["includeClickTracking"];
+    }
+    if (_json.containsKey("keywordOption")) {
+      keywordOption = _json["keywordOption"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (additionalKeyValues != null) {
+      _json["additionalKeyValues"] = additionalKeyValues;
+    }
+    if (includeClickThroughUrls != null) {
+      _json["includeClickThroughUrls"] = includeClickThroughUrls;
+    }
+    if (includeClickTracking != null) {
+      _json["includeClickTracking"] = includeClickTracking;
+    }
+    if (keywordOption != null) {
+      _json["keywordOption"] = keywordOption;
+    }
+    return _json;
+  }
+}
+
+/// Dynamic and Image Tag Settings.
+class TagSettings {
+  /// Whether dynamic floodlight tags are enabled.
+  core.bool dynamicTagEnabled;
+
+  /// Whether image tags are enabled.
+  core.bool imageTagEnabled;
+
+  TagSettings();
+
+  TagSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("dynamicTagEnabled")) {
+      dynamicTagEnabled = _json["dynamicTagEnabled"];
+    }
+    if (_json.containsKey("imageTagEnabled")) {
+      imageTagEnabled = _json["imageTagEnabled"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (dynamicTagEnabled != null) {
+      _json["dynamicTagEnabled"] = dynamicTagEnabled;
+    }
+    if (imageTagEnabled != null) {
+      _json["imageTagEnabled"] = imageTagEnabled;
+    }
+    return _json;
+  }
+}
+
+/// Target Window.
+class TargetWindow {
+  /// User-entered value.
+  core.String customHtml;
+
+  /// Type of browser window for which the backup image of the flash creative
+  /// can be displayed.
+  /// Possible string values are:
+  /// - "CURRENT_WINDOW"
+  /// - "CUSTOM"
+  /// - "NEW_WINDOW"
+  core.String targetWindowOption;
+
+  TargetWindow();
+
+  TargetWindow.fromJson(core.Map _json) {
+    if (_json.containsKey("customHtml")) {
+      customHtml = _json["customHtml"];
+    }
+    if (_json.containsKey("targetWindowOption")) {
+      targetWindowOption = _json["targetWindowOption"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (customHtml != null) {
+      _json["customHtml"] = customHtml;
+    }
+    if (targetWindowOption != null) {
+      _json["targetWindowOption"] = targetWindowOption;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a targetable remarketing list. Remarketing enables
+/// you to create lists of users who have performed specific actions on a site,
+/// then target ads to members of those lists. This resource is a read-only view
+/// of a remarketing list to be used to faciliate targeting ads to specific
+/// lists. Remarketing lists that are owned by your advertisers and those that
+/// are shared to your advertisers or account are accessible via this resource.
+/// To manage remarketing lists that are owned by your advertisers, use the
+/// RemarketingLists resource.
+class TargetableRemarketingList {
+  /// Account ID of this remarketing list. This is a read-only, auto-generated
+  /// field that is only returned in GET requests.
+  core.String accountId;
+
+  /// Whether this targetable remarketing list is active.
+  core.bool active;
+
+  /// Dimension value for the advertiser ID that owns this targetable
+  /// remarketing list.
+  core.String advertiserId;
+
+  /// Dimension value for the ID of the advertiser.
+  DimensionValue advertiserIdDimensionValue;
+
+  /// Targetable remarketing list description.
+  core.String description;
+
+  /// Targetable remarketing list ID.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#targetableRemarketingList".
+  core.String kind;
+
+  /// Number of days that a user should remain in the targetable remarketing
+  /// list without an impression.
+  core.String lifeSpan;
+
+  /// Number of users currently in the list. This is a read-only field.
+  core.String listSize;
+
+  /// Product from which this targetable remarketing list was originated.
+  /// Possible string values are:
+  /// - "REMARKETING_LIST_SOURCE_ADX"
+  /// - "REMARKETING_LIST_SOURCE_DBM"
+  /// - "REMARKETING_LIST_SOURCE_DFA"
+  /// - "REMARKETING_LIST_SOURCE_DFP"
+  /// - "REMARKETING_LIST_SOURCE_DMP"
+  /// - "REMARKETING_LIST_SOURCE_GA"
+  /// - "REMARKETING_LIST_SOURCE_GPLUS"
+  /// - "REMARKETING_LIST_SOURCE_OTHER"
+  /// - "REMARKETING_LIST_SOURCE_PLAY_STORE"
+  /// - "REMARKETING_LIST_SOURCE_XFP"
+  /// - "REMARKETING_LIST_SOURCE_YOUTUBE"
+  core.String listSource;
+
+  /// Name of the targetable remarketing list. Is no greater than 128 characters
+  /// long.
+  core.String name;
+
+  /// Subaccount ID of this remarketing list. This is a read-only,
+  /// auto-generated field that is only returned in GET requests.
+  core.String subaccountId;
+
+  TargetableRemarketingList();
+
+  TargetableRemarketingList.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("active")) {
+      active = _json["active"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("advertiserIdDimensionValue")) {
+      advertiserIdDimensionValue =
+          new DimensionValue.fromJson(_json["advertiserIdDimensionValue"]);
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("lifeSpan")) {
+      lifeSpan = _json["lifeSpan"];
+    }
+    if (_json.containsKey("listSize")) {
+      listSize = _json["listSize"];
+    }
+    if (_json.containsKey("listSource")) {
+      listSource = _json["listSource"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (active != null) {
+      _json["active"] = active;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (advertiserIdDimensionValue != null) {
+      _json["advertiserIdDimensionValue"] =
+          (advertiserIdDimensionValue).toJson();
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (lifeSpan != null) {
+      _json["lifeSpan"] = lifeSpan;
+    }
+    if (listSize != null) {
+      _json["listSize"] = listSize;
+    }
+    if (listSource != null) {
+      _json["listSource"] = listSource;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    return _json;
+  }
+}
+
+/// Targetable remarketing list response
+class TargetableRemarketingListsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#targetableRemarketingListsListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  /// Targetable remarketing list collection.
+  core.List<TargetableRemarketingList> targetableRemarketingLists;
+
+  TargetableRemarketingListsListResponse();
+
+  TargetableRemarketingListsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("targetableRemarketingLists")) {
+      targetableRemarketingLists = _json["targetableRemarketingLists"]
+          .map((value) => new TargetableRemarketingList.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (targetableRemarketingLists != null) {
+      _json["targetableRemarketingLists"] =
+          targetableRemarketingLists.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a targeting template. A targeting template
+/// encapsulates targeting information which can be reused across multiple ads.
+class TargetingTemplate {
+  /// Account ID of this targeting template. This field, if left unset, will be
+  /// auto-generated on insert and is read-only after insert.
+  core.String accountId;
+
+  /// Advertiser ID of this targeting template. This is a required field on
+  /// insert and is read-only after insert.
+  core.String advertiserId;
+
+  /// Dimension value for the ID of the advertiser. This is a read-only,
+  /// auto-generated field.
+  DimensionValue advertiserIdDimensionValue;
+
+  /// Time and day targeting criteria.
+  DayPartTargeting dayPartTargeting;
+
+  /// Geographical targeting criteria.
+  GeoTargeting geoTargeting;
+
+  /// ID of this targeting template. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Key-value targeting criteria.
+  KeyValueTargetingExpression keyValueTargetingExpression;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#targetingTemplate".
+  core.String kind;
+
+  /// Language targeting criteria.
+  LanguageTargeting languageTargeting;
+
+  /// Remarketing list targeting criteria.
+  ListTargetingExpression listTargetingExpression;
+
+  /// Name of this targeting template. This field is required. It must be less
+  /// than 256 characters long and unique within an advertiser.
+  core.String name;
+
+  /// Subaccount ID of this targeting template. This field, if left unset, will
+  /// be auto-generated on insert and is read-only after insert.
+  core.String subaccountId;
+
+  /// Technology platform targeting criteria.
+  TechnologyTargeting technologyTargeting;
+
+  TargetingTemplate();
+
+  TargetingTemplate.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("advertiserId")) {
+      advertiserId = _json["advertiserId"];
+    }
+    if (_json.containsKey("advertiserIdDimensionValue")) {
+      advertiserIdDimensionValue =
+          new DimensionValue.fromJson(_json["advertiserIdDimensionValue"]);
+    }
+    if (_json.containsKey("dayPartTargeting")) {
+      dayPartTargeting =
+          new DayPartTargeting.fromJson(_json["dayPartTargeting"]);
+    }
+    if (_json.containsKey("geoTargeting")) {
+      geoTargeting = new GeoTargeting.fromJson(_json["geoTargeting"]);
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("keyValueTargetingExpression")) {
+      keyValueTargetingExpression = new KeyValueTargetingExpression.fromJson(
+          _json["keyValueTargetingExpression"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("languageTargeting")) {
+      languageTargeting =
+          new LanguageTargeting.fromJson(_json["languageTargeting"]);
+    }
+    if (_json.containsKey("listTargetingExpression")) {
+      listTargetingExpression = new ListTargetingExpression.fromJson(
+          _json["listTargetingExpression"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+    if (_json.containsKey("technologyTargeting")) {
+      technologyTargeting =
+          new TechnologyTargeting.fromJson(_json["technologyTargeting"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (advertiserId != null) {
+      _json["advertiserId"] = advertiserId;
+    }
+    if (advertiserIdDimensionValue != null) {
+      _json["advertiserIdDimensionValue"] =
+          (advertiserIdDimensionValue).toJson();
+    }
+    if (dayPartTargeting != null) {
+      _json["dayPartTargeting"] = (dayPartTargeting).toJson();
+    }
+    if (geoTargeting != null) {
+      _json["geoTargeting"] = (geoTargeting).toJson();
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (keyValueTargetingExpression != null) {
+      _json["keyValueTargetingExpression"] =
+          (keyValueTargetingExpression).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (languageTargeting != null) {
+      _json["languageTargeting"] = (languageTargeting).toJson();
+    }
+    if (listTargetingExpression != null) {
+      _json["listTargetingExpression"] = (listTargetingExpression).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    if (technologyTargeting != null) {
+      _json["technologyTargeting"] = (technologyTargeting).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Targeting Template List Response
+class TargetingTemplatesListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#targetingTemplatesListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  /// Targeting template collection.
+  core.List<TargetingTemplate> targetingTemplates;
+
+  TargetingTemplatesListResponse();
+
+  TargetingTemplatesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("targetingTemplates")) {
+      targetingTemplates = _json["targetingTemplates"]
+          .map((value) => new TargetingTemplate.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (targetingTemplates != null) {
+      _json["targetingTemplates"] =
+          targetingTemplates.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Technology Targeting.
+class TechnologyTargeting {
+  /// Browsers that this ad targets. For each browser either set
+  /// browserVersionId or dartId along with the version numbers. If both are
+  /// specified, only browserVersionId will be used. The other fields are
+  /// populated automatically when the ad is inserted or updated.
+  core.List<Browser> browsers;
+
+  /// Connection types that this ad targets. For each connection type only id is
+  /// required. The other fields are populated automatically when the ad is
+  /// inserted or updated.
+  core.List<ConnectionType> connectionTypes;
+
+  /// Mobile carriers that this ad targets. For each mobile carrier only id is
+  /// required, and the other fields are populated automatically when the ad is
+  /// inserted or updated. If targeting a mobile carrier, do not set targeting
+  /// for any zip codes.
+  core.List<MobileCarrier> mobileCarriers;
+
+  /// Operating system versions that this ad targets. To target all versions,
+  /// use operatingSystems. For each operating system version, only id is
+  /// required. The other fields are populated automatically when the ad is
+  /// inserted or updated. If targeting an operating system version, do not set
+  /// targeting for the corresponding operating system in operatingSystems.
+  core.List<OperatingSystemVersion> operatingSystemVersions;
+
+  /// Operating systems that this ad targets. To target specific versions, use
+  /// operatingSystemVersions. For each operating system only dartId is
+  /// required. The other fields are populated automatically when the ad is
+  /// inserted or updated. If targeting an operating system, do not set
+  /// targeting for operating system versions for the same operating system.
+  core.List<OperatingSystem> operatingSystems;
+
+  /// Platform types that this ad targets. For example, desktop, mobile, or
+  /// tablet. For each platform type, only id is required, and the other fields
+  /// are populated automatically when the ad is inserted or updated.
+  core.List<PlatformType> platformTypes;
+
+  TechnologyTargeting();
+
+  TechnologyTargeting.fromJson(core.Map _json) {
+    if (_json.containsKey("browsers")) {
+      browsers = _json["browsers"]
+          .map((value) => new Browser.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("connectionTypes")) {
+      connectionTypes = _json["connectionTypes"]
+          .map((value) => new ConnectionType.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("mobileCarriers")) {
+      mobileCarriers = _json["mobileCarriers"]
+          .map((value) => new MobileCarrier.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("operatingSystemVersions")) {
+      operatingSystemVersions = _json["operatingSystemVersions"]
+          .map((value) => new OperatingSystemVersion.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("operatingSystems")) {
+      operatingSystems = _json["operatingSystems"]
+          .map((value) => new OperatingSystem.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("platformTypes")) {
+      platformTypes = _json["platformTypes"]
+          .map((value) => new PlatformType.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 (browsers != null) {
+      _json["browsers"] = browsers.map((value) => (value).toJson()).toList();
+    }
+    if (connectionTypes != null) {
+      _json["connectionTypes"] =
+          connectionTypes.map((value) => (value).toJson()).toList();
+    }
+    if (mobileCarriers != null) {
+      _json["mobileCarriers"] =
+          mobileCarriers.map((value) => (value).toJson()).toList();
+    }
+    if (operatingSystemVersions != null) {
+      _json["operatingSystemVersions"] =
+          operatingSystemVersions.map((value) => (value).toJson()).toList();
+    }
+    if (operatingSystems != null) {
+      _json["operatingSystems"] =
+          operatingSystems.map((value) => (value).toJson()).toList();
+    }
+    if (platformTypes != null) {
+      _json["platformTypes"] =
+          platformTypes.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Third Party Authentication Token
+class ThirdPartyAuthenticationToken {
+  /// Name of the third-party authentication token.
+  core.String name;
+
+  /// Value of the third-party authentication token. This is a read-only,
+  /// auto-generated field.
+  core.String value;
+
+  ThirdPartyAuthenticationToken();
+
+  ThirdPartyAuthenticationToken.fromJson(core.Map _json) {
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    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 (name != null) {
+      _json["name"] = name;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+/// Third-party Tracking URL.
+class ThirdPartyTrackingUrl {
+  /// Third-party URL type for in-stream video creatives.
+  /// Possible string values are:
+  /// - "CLICK_TRACKING"
+  /// - "IMPRESSION"
+  /// - "RICH_MEDIA_BACKUP_IMPRESSION"
+  /// - "RICH_MEDIA_IMPRESSION"
+  /// - "RICH_MEDIA_RM_IMPRESSION"
+  /// - "SURVEY"
+  /// - "VIDEO_COMPLETE"
+  /// - "VIDEO_CUSTOM"
+  /// - "VIDEO_FIRST_QUARTILE"
+  /// - "VIDEO_FULLSCREEN"
+  /// - "VIDEO_MIDPOINT"
+  /// - "VIDEO_MUTE"
+  /// - "VIDEO_PAUSE"
+  /// - "VIDEO_PROGRESS"
+  /// - "VIDEO_REWIND"
+  /// - "VIDEO_SKIP"
+  /// - "VIDEO_START"
+  /// - "VIDEO_STOP"
+  /// - "VIDEO_THIRD_QUARTILE"
+  core.String thirdPartyUrlType;
+
+  /// URL for the specified third-party URL type.
+  core.String url;
+
+  ThirdPartyTrackingUrl();
+
+  ThirdPartyTrackingUrl.fromJson(core.Map _json) {
+    if (_json.containsKey("thirdPartyUrlType")) {
+      thirdPartyUrlType = _json["thirdPartyUrlType"];
+    }
+    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 (thirdPartyUrlType != null) {
+      _json["thirdPartyUrlType"] = thirdPartyUrlType;
+    }
+    if (url != null) {
+      _json["url"] = url;
+    }
+    return _json;
+  }
+}
+
+/// Transcode Settings
+class TranscodeSetting {
+  /// Whitelist of video formats to be served to this placement. Set this list
+  /// to null or empty to serve all video formats.
+  core.List<core.int> enabledVideoFormats;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#transcodeSetting".
+  core.String kind;
+
+  TranscodeSetting();
+
+  TranscodeSetting.fromJson(core.Map _json) {
+    if (_json.containsKey("enabledVideoFormats")) {
+      enabledVideoFormats = _json["enabledVideoFormats"];
+    }
+    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 (enabledVideoFormats != null) {
+      _json["enabledVideoFormats"] = enabledVideoFormats;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// A Universal Ad ID as per the VAST 4.0 spec. Applicable to the following
+/// creative types: INSTREAM_VIDEO and VPAID.
+class UniversalAdId {
+  /// Registry used for the Ad ID value.
+  /// Possible string values are:
+  /// - "AD_ID.ORG"
+  /// - "CLEARCAST"
+  /// - "DCM"
+  /// - "OTHER"
+  core.String registry;
+
+  /// ID value for this creative. Only alphanumeric characters and the following
+  /// symbols are valid: "_/\-". Maximum length is 64 characters. Read only when
+  /// registry is DCM.
+  core.String value;
+
+  UniversalAdId();
+
+  UniversalAdId.fromJson(core.Map _json) {
+    if (_json.containsKey("registry")) {
+      registry = _json["registry"];
+    }
+    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 (registry != null) {
+      _json["registry"] = registry;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+/// User Defined Variable configuration.
+class UserDefinedVariableConfiguration {
+  /// Data type for the variable. This is a required field.
+  /// Possible string values are:
+  /// - "NUMBER"
+  /// - "STRING"
+  core.String dataType;
+
+  /// User-friendly name for the variable which will appear in reports. This is
+  /// a required field, must be less than 64 characters long, and cannot contain
+  /// the following characters: ""<>".
+  core.String reportName;
+
+  /// Variable name in the tag. This is a required field.
+  /// Possible string values are:
+  /// - "U1"
+  /// - "U10"
+  /// - "U100"
+  /// - "U11"
+  /// - "U12"
+  /// - "U13"
+  /// - "U14"
+  /// - "U15"
+  /// - "U16"
+  /// - "U17"
+  /// - "U18"
+  /// - "U19"
+  /// - "U2"
+  /// - "U20"
+  /// - "U21"
+  /// - "U22"
+  /// - "U23"
+  /// - "U24"
+  /// - "U25"
+  /// - "U26"
+  /// - "U27"
+  /// - "U28"
+  /// - "U29"
+  /// - "U3"
+  /// - "U30"
+  /// - "U31"
+  /// - "U32"
+  /// - "U33"
+  /// - "U34"
+  /// - "U35"
+  /// - "U36"
+  /// - "U37"
+  /// - "U38"
+  /// - "U39"
+  /// - "U4"
+  /// - "U40"
+  /// - "U41"
+  /// - "U42"
+  /// - "U43"
+  /// - "U44"
+  /// - "U45"
+  /// - "U46"
+  /// - "U47"
+  /// - "U48"
+  /// - "U49"
+  /// - "U5"
+  /// - "U50"
+  /// - "U51"
+  /// - "U52"
+  /// - "U53"
+  /// - "U54"
+  /// - "U55"
+  /// - "U56"
+  /// - "U57"
+  /// - "U58"
+  /// - "U59"
+  /// - "U6"
+  /// - "U60"
+  /// - "U61"
+  /// - "U62"
+  /// - "U63"
+  /// - "U64"
+  /// - "U65"
+  /// - "U66"
+  /// - "U67"
+  /// - "U68"
+  /// - "U69"
+  /// - "U7"
+  /// - "U70"
+  /// - "U71"
+  /// - "U72"
+  /// - "U73"
+  /// - "U74"
+  /// - "U75"
+  /// - "U76"
+  /// - "U77"
+  /// - "U78"
+  /// - "U79"
+  /// - "U8"
+  /// - "U80"
+  /// - "U81"
+  /// - "U82"
+  /// - "U83"
+  /// - "U84"
+  /// - "U85"
+  /// - "U86"
+  /// - "U87"
+  /// - "U88"
+  /// - "U89"
+  /// - "U9"
+  /// - "U90"
+  /// - "U91"
+  /// - "U92"
+  /// - "U93"
+  /// - "U94"
+  /// - "U95"
+  /// - "U96"
+  /// - "U97"
+  /// - "U98"
+  /// - "U99"
+  core.String variableType;
+
+  UserDefinedVariableConfiguration();
+
+  UserDefinedVariableConfiguration.fromJson(core.Map _json) {
+    if (_json.containsKey("dataType")) {
+      dataType = _json["dataType"];
+    }
+    if (_json.containsKey("reportName")) {
+      reportName = _json["reportName"];
+    }
+    if (_json.containsKey("variableType")) {
+      variableType = _json["variableType"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (dataType != null) {
+      _json["dataType"] = dataType;
+    }
+    if (reportName != null) {
+      _json["reportName"] = reportName;
+    }
+    if (variableType != null) {
+      _json["variableType"] = variableType;
+    }
+    return _json;
+  }
+}
+
+/// Represents a UserProfile resource.
+class UserProfile {
+  /// The account ID to which this profile belongs.
+  core.String accountId;
+
+  /// The account name this profile belongs to.
+  core.String accountName;
+
+  /// The eTag of this response for caching purposes.
+  core.String etag;
+
+  /// The kind of resource this is, in this case dfareporting#userProfile.
+  core.String kind;
+
+  /// The unique ID of the user profile.
+  core.String profileId;
+
+  /// The sub account ID this profile belongs to if applicable.
+  core.String subAccountId;
+
+  /// The sub account name this profile belongs to if applicable.
+  core.String subAccountName;
+
+  /// The user name.
+  core.String userName;
+
+  UserProfile();
+
+  UserProfile.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("accountName")) {
+      accountName = _json["accountName"];
+    }
+    if (_json.containsKey("etag")) {
+      etag = _json["etag"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("profileId")) {
+      profileId = _json["profileId"];
+    }
+    if (_json.containsKey("subAccountId")) {
+      subAccountId = _json["subAccountId"];
+    }
+    if (_json.containsKey("subAccountName")) {
+      subAccountName = _json["subAccountName"];
+    }
+    if (_json.containsKey("userName")) {
+      userName = _json["userName"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (accountName != null) {
+      _json["accountName"] = accountName;
+    }
+    if (etag != null) {
+      _json["etag"] = etag;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (profileId != null) {
+      _json["profileId"] = profileId;
+    }
+    if (subAccountId != null) {
+      _json["subAccountId"] = subAccountId;
+    }
+    if (subAccountName != null) {
+      _json["subAccountName"] = subAccountName;
+    }
+    if (userName != null) {
+      _json["userName"] = userName;
+    }
+    return _json;
+  }
+}
+
+/// Represents the list of user profiles.
+class UserProfileList {
+  /// The eTag of this response for caching purposes.
+  core.String etag;
+
+  /// The user profiles returned in this response.
+  core.List<UserProfile> items;
+
+  /// The kind of list this is, in this case dfareporting#userProfileList.
+  core.String kind;
+
+  UserProfileList();
+
+  UserProfileList.fromJson(core.Map _json) {
+    if (_json.containsKey("etag")) {
+      etag = _json["etag"];
+    }
+    if (_json.containsKey("items")) {
+      items = _json["items"]
+          .map((value) => new UserProfile.fromJson(value))
+          .toList();
+    }
+    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 (etag != null) {
+      _json["etag"] = etag;
+    }
+    if (items != null) {
+      _json["items"] = items.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of auser role, which is used to manage user access.
+class UserRole {
+  /// Account ID of this user role. This is a read-only field that can be left
+  /// blank.
+  core.String accountId;
+
+  /// Whether this is a default user role. Default user roles are created by the
+  /// system for the account/subaccount and cannot be modified or deleted. Each
+  /// default user role comes with a basic set of preassigned permissions.
+  core.bool defaultUserRole;
+
+  /// ID of this user role. This is a read-only, auto-generated field.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#userRole".
+  core.String kind;
+
+  /// Name of this user role. This is a required field. Must be less than 256
+  /// characters long. If this user role is under a subaccount, the name must be
+  /// unique among sites of the same subaccount. Otherwise, this user role is a
+  /// top-level user role, and the name must be unique among top-level user
+  /// roles of the same account.
+  core.String name;
+
+  /// ID of the user role that this user role is based on or copied from. This
+  /// is a required field.
+  core.String parentUserRoleId;
+
+  /// List of permissions associated with this user role.
+  core.List<UserRolePermission> permissions;
+
+  /// Subaccount ID of this user role. This is a read-only field that can be
+  /// left blank.
+  core.String subaccountId;
+
+  UserRole();
+
+  UserRole.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("defaultUserRole")) {
+      defaultUserRole = _json["defaultUserRole"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("parentUserRoleId")) {
+      parentUserRoleId = _json["parentUserRoleId"];
+    }
+    if (_json.containsKey("permissions")) {
+      permissions = _json["permissions"]
+          .map((value) => new UserRolePermission.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("subaccountId")) {
+      subaccountId = _json["subaccountId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (defaultUserRole != null) {
+      _json["defaultUserRole"] = defaultUserRole;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (parentUserRoleId != null) {
+      _json["parentUserRoleId"] = parentUserRoleId;
+    }
+    if (permissions != null) {
+      _json["permissions"] =
+          permissions.map((value) => (value).toJson()).toList();
+    }
+    if (subaccountId != null) {
+      _json["subaccountId"] = subaccountId;
+    }
+    return _json;
+  }
+}
+
+/// Contains properties of a user role permission.
+class UserRolePermission {
+  /// Levels of availability for a user role permission.
+  /// Possible string values are:
+  /// - "ACCOUNT_ALWAYS"
+  /// - "ACCOUNT_BY_DEFAULT"
+  /// - "NOT_AVAILABLE_BY_DEFAULT"
+  /// - "SUBACCOUNT_AND_ACCOUNT_ALWAYS"
+  /// - "SUBACCOUNT_AND_ACCOUNT_BY_DEFAULT"
+  core.String availability;
+
+  /// ID of this user role permission.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#userRolePermission".
+  core.String kind;
+
+  /// Name of this user role permission.
+  core.String name;
+
+  /// ID of the permission group that this user role permission belongs to.
+  core.String permissionGroupId;
+
+  UserRolePermission();
+
+  UserRolePermission.fromJson(core.Map _json) {
+    if (_json.containsKey("availability")) {
+      availability = _json["availability"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("permissionGroupId")) {
+      permissionGroupId = _json["permissionGroupId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (availability != null) {
+      _json["availability"] = availability;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (permissionGroupId != null) {
+      _json["permissionGroupId"] = permissionGroupId;
+    }
+    return _json;
+  }
+}
+
+/// Represents a grouping of related user role permissions.
+class UserRolePermissionGroup {
+  /// ID of this user role permission.
+  core.String id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#userRolePermissionGroup".
+  core.String kind;
+
+  /// Name of this user role permission group.
+  core.String name;
+
+  UserRolePermissionGroup();
+
+  UserRolePermissionGroup.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    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 (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// User Role Permission Group List Response
+class UserRolePermissionGroupsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#userRolePermissionGroupsListResponse".
+  core.String kind;
+
+  /// User role permission group collection.
+  core.List<UserRolePermissionGroup> userRolePermissionGroups;
+
+  UserRolePermissionGroupsListResponse();
+
+  UserRolePermissionGroupsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("userRolePermissionGroups")) {
+      userRolePermissionGroups = _json["userRolePermissionGroups"]
+          .map((value) => new UserRolePermissionGroup.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (userRolePermissionGroups != null) {
+      _json["userRolePermissionGroups"] =
+          userRolePermissionGroups.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// User Role Permission List Response
+class UserRolePermissionsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#userRolePermissionsListResponse".
+  core.String kind;
+
+  /// User role permission collection.
+  core.List<UserRolePermission> userRolePermissions;
+
+  UserRolePermissionsListResponse();
+
+  UserRolePermissionsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("userRolePermissions")) {
+      userRolePermissions = _json["userRolePermissions"]
+          .map((value) => new UserRolePermission.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (userRolePermissions != null) {
+      _json["userRolePermissions"] =
+          userRolePermissions.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// User Role List Response
+class UserRolesListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#userRolesListResponse".
+  core.String kind;
+
+  /// Pagination token to be used for the next list operation.
+  core.String nextPageToken;
+
+  /// User role collection.
+  core.List<UserRole> userRoles;
+
+  UserRolesListResponse();
+
+  UserRolesListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("userRoles")) {
+      userRoles = _json["userRoles"]
+          .map((value) => new UserRole.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (userRoles != null) {
+      _json["userRoles"] = userRoles.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Contains information about supported video formats.
+class VideoFormat {
+  /// File type of the video format.
+  /// Possible string values are:
+  /// - "FLV"
+  /// - "M3U8"
+  /// - "MP4"
+  /// - "THREEGPP"
+  /// - "WEBM"
+  core.String fileType;
+
+  /// ID of the video format.
+  core.int id;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#videoFormat".
+  core.String kind;
+
+  /// The resolution of this video format.
+  Size resolution;
+
+  /// The target bit rate of this video format.
+  core.int targetBitRate;
+
+  VideoFormat();
+
+  VideoFormat.fromJson(core.Map _json) {
+    if (_json.containsKey("fileType")) {
+      fileType = _json["fileType"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("resolution")) {
+      resolution = new Size.fromJson(_json["resolution"]);
+    }
+    if (_json.containsKey("targetBitRate")) {
+      targetBitRate = _json["targetBitRate"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (fileType != null) {
+      _json["fileType"] = fileType;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (resolution != null) {
+      _json["resolution"] = (resolution).toJson();
+    }
+    if (targetBitRate != null) {
+      _json["targetBitRate"] = targetBitRate;
+    }
+    return _json;
+  }
+}
+
+/// Video Format List Response
+class VideoFormatsListResponse {
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#videoFormatsListResponse".
+  core.String kind;
+
+  /// Video format collection.
+  core.List<VideoFormat> videoFormats;
+
+  VideoFormatsListResponse();
+
+  VideoFormatsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("videoFormats")) {
+      videoFormats = _json["videoFormats"]
+          .map((value) => new VideoFormat.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 (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (videoFormats != null) {
+      _json["videoFormats"] =
+          videoFormats.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Video Offset
+class VideoOffset {
+  /// Duration, as a percentage of video duration. Do not set when offsetSeconds
+  /// is set. Acceptable values are 0 to 100, inclusive.
+  core.int offsetPercentage;
+
+  /// Duration, in seconds. Do not set when offsetPercentage is set. Acceptable
+  /// values are 0 to 86399, inclusive.
+  core.int offsetSeconds;
+
+  VideoOffset();
+
+  VideoOffset.fromJson(core.Map _json) {
+    if (_json.containsKey("offsetPercentage")) {
+      offsetPercentage = _json["offsetPercentage"];
+    }
+    if (_json.containsKey("offsetSeconds")) {
+      offsetSeconds = _json["offsetSeconds"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (offsetPercentage != null) {
+      _json["offsetPercentage"] = offsetPercentage;
+    }
+    if (offsetSeconds != null) {
+      _json["offsetSeconds"] = offsetSeconds;
+    }
+    return _json;
+  }
+}
+
+/// Video Settings
+class VideoSettings {
+  /// Settings for the companion creatives of video creatives served to this
+  /// placement.
+  CompanionSetting companionSettings;
+
+  /// Identifies what kind of resource this is. Value: the fixed string
+  /// "dfareporting#videoSettings".
+  core.String kind;
+
+  /// Orientation of a video placement. If this value is set, placement will
+  /// return assets matching the specified orientation.
+  /// Possible string values are:
+  /// - "ANY"
+  /// - "LANDSCAPE"
+  /// - "PORTRAIT"
+  core.String orientation;
+
+  /// Settings for the skippability of video creatives served to this placement.
+  /// If this object is provided, the creative-level skippable settings will be
+  /// overridden.
+  SkippableSetting skippableSettings;
+
+  /// Settings for the transcodes of video creatives served to this placement.
+  /// If this object is provided, the creative-level transcode settings will be
+  /// overridden.
+  TranscodeSetting transcodeSettings;
+
+  VideoSettings();
+
+  VideoSettings.fromJson(core.Map _json) {
+    if (_json.containsKey("companionSettings")) {
+      companionSettings =
+          new CompanionSetting.fromJson(_json["companionSettings"]);
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("orientation")) {
+      orientation = _json["orientation"];
+    }
+    if (_json.containsKey("skippableSettings")) {
+      skippableSettings =
+          new SkippableSetting.fromJson(_json["skippableSettings"]);
+    }
+    if (_json.containsKey("transcodeSettings")) {
+      transcodeSettings =
+          new TranscodeSetting.fromJson(_json["transcodeSettings"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (companionSettings != null) {
+      _json["companionSettings"] = (companionSettings).toJson();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (orientation != null) {
+      _json["orientation"] = orientation;
+    }
+    if (skippableSettings != null) {
+      _json["skippableSettings"] = (skippableSettings).toJson();
+    }
+    if (transcodeSettings != null) {
+      _json["transcodeSettings"] = (transcodeSettings).toJson();
+    }
+    return _json;
+  }
+}
diff --git a/googleapis/lib/digitalassetlinks/v1.dart b/googleapis/lib/digitalassetlinks/v1.dart
new file mode 100644
index 0000000..b58bdf9
--- /dev/null
+++ b/googleapis/lib/digitalassetlinks/v1.dart
@@ -0,0 +1,822 @@
+// 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 '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_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
+  ///
+  /// [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
+  ///
+  /// [$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_certificate_sha256Fingerprint,
+      core.String source_web_site,
+      core.String source_androidApp_packageName,
+      core.String target_androidApp_packageName,
+      core.String source_androidApp_certificate_sha256Fingerprint,
+      core.String relation,
+      core.String target_web_site,
+      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_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 (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 ($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:
+  ///
+  /// [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
+  ///
+  /// [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).
+  ///
+  /// [$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 relation,
+      core.String source_web_site,
+      core.String source_androidApp_packageName,
+      core.String source_androidApp_certificate_sha256Fingerprint,
+      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 (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 (source_androidApp_certificate_sha256Fingerprint != null) {
+      _queryParams["source.androidApp.certificate.sha256Fingerprint"] = [
+        source_androidApp_certificate_sha256Fingerprint
+      ];
+    }
+    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/googleapis/lib/discovery/v1.dart b/googleapis/lib/discovery/v1.dart
index be3f0c8..9c6edf9 100644
--- a/googleapis/lib/discovery/v1.dart
+++ b/googleapis/lib/discovery/v1.dart
@@ -4,7 +4,6 @@
 
 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;
diff --git a/googleapis/lib/doubleclickbidmanager/v1.dart b/googleapis/lib/doubleclickbidmanager/v1.dart
index d7edc3f..4774b30 100644
--- a/googleapis/lib/doubleclickbidmanager/v1.dart
+++ b/googleapis/lib/doubleclickbidmanager/v1.dart
@@ -39,7 +39,7 @@
 
   LineitemsResourceApi(commons.ApiRequester client) : _requester = client;
 
-  /// Retrieves line items in CSV format.
+  /// Retrieves line items in CSV format. TrueView line items are not supported.
   ///
   /// [request] - The metadata request object.
   ///
@@ -84,7 +84,7 @@
         .then((data) => new DownloadLineItemsResponse.fromJson(data));
   }
 
-  /// Uploads line items in CSV format.
+  /// Uploads line items in CSV format. TrueView line items are not supported.
   ///
   /// [request] - The metadata request object.
   ///
@@ -543,6 +543,7 @@
   /// Filter type used to filter line items to fetch.
   /// Possible string values are:
   /// - "ADVERTISER_ID"
+  /// - "CAMPAIGN_ID"
   /// - "INSERTION_ORDER_ID"
   /// - "LINE_ITEM_ID"
   core.String filterType;
@@ -595,6 +596,9 @@
   /// Retrieved ads in SDF format.
   core.String ads;
 
+  /// Retrieved campaigns in SDF format.
+  core.String campaigns;
+
   /// Retrieved insertion orders in SDF format.
   core.String insertionOrders;
 
@@ -610,6 +614,9 @@
     if (_json.containsKey("ads")) {
       ads = _json["ads"];
     }
+    if (_json.containsKey("campaigns")) {
+      campaigns = _json["campaigns"];
+    }
     if (_json.containsKey("insertionOrders")) {
       insertionOrders = _json["insertionOrders"];
     }
@@ -627,6 +634,9 @@
     if (ads != null) {
       _json["ads"] = ads;
     }
+    if (campaigns != null) {
+      _json["campaigns"] = campaigns;
+    }
     if (insertionOrders != null) {
       _json["insertionOrders"] = insertionOrders;
     }
@@ -885,6 +895,7 @@
   /// - "TYPE_GENERAL"
   /// - "TYPE_INVENTORY_AVAILABILITY"
   /// - "TYPE_KEYWORD"
+  /// - "TYPE_LINEAR_TV_SEARCH_LIFT"
   /// - "TYPE_NIELSEN_AUDIENCE_PROFILE"
   /// - "TYPE_NIELSEN_DAILY_REACH_BUILD"
   /// - "TYPE_NIELSEN_ONLINE_GLOBAL_MARKET"
diff --git a/googleapis/lib/doubleclicksearch/v2.dart b/googleapis/lib/doubleclicksearch/v2.dart
index 5f4c828..e2759fb 100644
--- a/googleapis/lib/doubleclicksearch/v2.dart
+++ b/googleapis/lib/doubleclicksearch/v2.dart
@@ -1826,7 +1826,7 @@
 
   ReportRow();
 
-  ReportRow.fromJson(core.Map _json) {
+  ReportRow.fromJson(core.Map<core.String, core.dynamic> _json) {
     _json.forEach((core.String key, value) {
       this[key] = value;
     });
diff --git a/googleapis/lib/drive/v2.dart b/googleapis/lib/drive/v2.dart
index 8b06f51..7008d39 100644
--- a/googleapis/lib/drive/v2.dart
+++ b/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.
@@ -2713,6 +2720,11 @@
   /// [supportsTeamDrives] - Whether the requesting application supports Team
   /// Drives.
   ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then the requester
+  /// will be granted access if they are an administrator of the domain to which
+  /// the item belongs.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2722,7 +2734,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 delete(core.String fileId, core.String permissionId,
-      {core.bool supportsTeamDrives, core.String $fields}) {
+      {core.bool supportsTeamDrives,
+      core.bool useDomainAdminAccess,
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2739,6 +2753,9 @@
     if (supportsTeamDrives != null) {
       _queryParams["supportsTeamDrives"] = ["${supportsTeamDrives}"];
     }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2770,6 +2787,11 @@
   /// [supportsTeamDrives] - Whether the requesting application supports Team
   /// Drives.
   ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then the requester
+  /// will be granted access if they are an administrator of the domain to which
+  /// the item belongs.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2781,7 +2803,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<Permission> get(core.String fileId, core.String permissionId,
-      {core.bool supportsTeamDrives, core.String $fields}) {
+      {core.bool supportsTeamDrives,
+      core.bool useDomainAdminAccess,
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2798,6 +2822,9 @@
     if (supportsTeamDrives != null) {
       _queryParams["supportsTeamDrives"] = ["${supportsTeamDrives}"];
     }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2867,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
@@ -2876,6 +2904,11 @@
   /// [supportsTeamDrives] - Whether the requesting application supports Team
   /// Drives.
   ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then the requester
+  /// will be granted access if they are an administrator of the domain to which
+  /// the item belongs.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2890,6 +2923,7 @@
       {core.String emailMessage,
       core.bool sendNotificationEmails,
       core.bool supportsTeamDrives,
+      core.bool useDomainAdminAccess,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -2913,6 +2947,9 @@
     if (supportsTeamDrives != null) {
       _queryParams["supportsTeamDrives"] = ["${supportsTeamDrives}"];
     }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2947,6 +2984,11 @@
   /// [supportsTeamDrives] - Whether the requesting application supports Team
   /// Drives.
   ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then the requester
+  /// will be granted access if they are an administrator of the domain to which
+  /// the item belongs.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2961,6 +3003,7 @@
       {core.int maxResults,
       core.String pageToken,
       core.bool supportsTeamDrives,
+      core.bool useDomainAdminAccess,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -2981,6 +3024,9 @@
     if (supportsTeamDrives != null) {
       _queryParams["supportsTeamDrives"] = ["${supportsTeamDrives}"];
     }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -3015,6 +3061,11 @@
   /// current owners to writers. Does nothing if the specified role is not
   /// 'owner'.
   ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then the requester
+  /// will be granted access if they are an administrator of the domain to which
+  /// the item belongs.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -3030,6 +3081,7 @@
       {core.bool removeExpiration,
       core.bool supportsTeamDrives,
       core.bool transferOwnership,
+      core.bool useDomainAdminAccess,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -3056,6 +3108,9 @@
     if (transferOwnership != null) {
       _queryParams["transferOwnership"] = ["${transferOwnership}"];
     }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -3093,6 +3148,11 @@
   /// current owners to writers. Does nothing if the specified role is not
   /// 'owner'.
   ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then the requester
+  /// will be granted access if they are an administrator of the domain to which
+  /// the item belongs.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -3108,6 +3168,7 @@
       {core.bool removeExpiration,
       core.bool supportsTeamDrives,
       core.bool transferOwnership,
+      core.bool useDomainAdminAccess,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -3134,6 +3195,9 @@
     if (transferOwnership != null) {
       _queryParams["transferOwnership"] = ["${transferOwnership}"];
     }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -4355,6 +4419,11 @@
   ///
   /// [teamDriveId] - The ID of the Team Drive
   ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then the requester
+  /// will be granted access if they are an administrator of the domain to which
+  /// the Team Drive belongs.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -4365,7 +4434,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<TeamDrive> get(core.String teamDriveId, {core.String $fields}) {
+  async.Future<TeamDrive> get(core.String teamDriveId,
+      {core.bool useDomainAdminAccess, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -4376,6 +4446,9 @@
     if (teamDriveId == null) {
       throw new core.ArgumentError("Parameter teamDriveId is required.");
     }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -4453,6 +4526,12 @@
   ///
   /// [pageToken] - Page token for Team Drives.
   ///
+  /// [q] - Query string for searching Team Drives.
+  ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then all Team Drives
+  /// of the domain in which the requester is an administrator are returned.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -4464,7 +4543,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<TeamDriveList> list(
-      {core.int maxResults, core.String pageToken, core.String $fields}) {
+      {core.int maxResults,
+      core.String pageToken,
+      core.String q,
+      core.bool useDomainAdminAccess,
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -4478,6 +4561,12 @@
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (q != null) {
+      _queryParams["q"] = [q];
+    }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -4807,6 +4896,9 @@
   /// specific type takes precedence.
   core.List<AboutAdditionalRoleInfo> additionalRoleInfo;
 
+  /// Whether the user can create Team Drives.
+  core.bool canCreateTeamDrives;
+
   /// The domain sharing policy for the current user. Possible values are:
   /// - allowed
   /// - allowedWithWarning
@@ -4897,6 +4989,9 @@
           .map((value) => new AboutAdditionalRoleInfo.fromJson(value))
           .toList();
     }
+    if (_json.containsKey("canCreateTeamDrives")) {
+      canCreateTeamDrives = _json["canCreateTeamDrives"];
+    }
     if (_json.containsKey("domainSharingPolicy")) {
       domainSharingPolicy = _json["domainSharingPolicy"];
     }
@@ -4990,6 +5085,9 @@
       _json["additionalRoleInfo"] =
           additionalRoleInfo.map((value) => (value).toJson()).toList();
     }
+    if (canCreateTeamDrives != null) {
+      _json["canCreateTeamDrives"] = canCreateTeamDrives;
+    }
     if (domainSharingPolicy != null) {
       _json["domainSharingPolicy"] = domainSharingPolicy;
     }
@@ -7040,9 +7138,11 @@
   core.List<User> owners;
 
   /// Collection of parent folders which contain this file.
-  /// Setting this field will put the file in all of the provided folders. On
-  /// insert, if no folders are provided, the file will be placed in the default
-  /// root folder.
+  /// If not specified as part of an insert request, the file will be placed
+  /// directly in the user's My Drive folder. If not specified as part of a copy
+  /// request, the file will inherit any discoverable parents of the source
+  /// file. Update requests can also use the addParents and removeParents
+  /// parameters to modify the parents list.
   core.List<ParentReference> parents;
 
   /// List of permission IDs for users with access to this file.
@@ -7886,7 +7986,8 @@
   /// - They can only be set on user and group permissions
   /// - The date must be in the future
   /// - The date cannot be more than a year in the future
-  /// - The date can only be set on drive.permissions.update requests
+  /// - The date can only be set on drive.permissions.update or
+  /// drive.permissions.patch requests
   core.DateTime expirationDate;
 
   /// The ID of the user this permission refers to, and identical to the
@@ -8791,6 +8892,9 @@
   /// drive.teamdrives.update request that does not set themeId.
   core.String colorRgb;
 
+  /// The time at which the Team Drive was created (RFC 3339 date-time).
+  core.DateTime createdDate;
+
   /// The ID of this Team Drive which is also the ID of the top level folder for
   /// this Team Drive.
   core.String id;
@@ -8825,6 +8929,9 @@
     if (_json.containsKey("colorRgb")) {
       colorRgb = _json["colorRgb"];
     }
+    if (_json.containsKey("createdDate")) {
+      createdDate = core.DateTime.parse(_json["createdDate"]);
+    }
     if (_json.containsKey("id")) {
       id = _json["id"];
     }
@@ -8854,6 +8961,9 @@
     if (colorRgb != null) {
       _json["colorRgb"] = colorRgb;
     }
+    if (createdDate != null) {
+      _json["createdDate"] = (createdDate).toIso8601String();
+    }
     if (id != null) {
       _json["id"] = id;
     }
diff --git a/googleapis/lib/drive/v3.dart b/googleapis/lib/drive/v3.dart
index 6403438..3d8645d 100644
--- a/googleapis/lib/drive/v3.dart
+++ b/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,
@@ -1539,6 +1540,11 @@
   /// and downgrade the current owner to a writer. This parameter is required as
   /// an acknowledgement of the side effect.
   ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then the requester
+  /// will be granted access if they are an administrator of the domain to which
+  /// the item belongs.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1554,6 +1560,7 @@
       core.bool sendNotificationEmail,
       core.bool supportsTeamDrives,
       core.bool transferOwnership,
+      core.bool useDomainAdminAccess,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1580,6 +1587,9 @@
     if (transferOwnership != null) {
       _queryParams["transferOwnership"] = ["${transferOwnership}"];
     }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1606,6 +1616,11 @@
   /// [supportsTeamDrives] - Whether the requesting application supports Team
   /// Drives.
   ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then the requester
+  /// will be granted access if they are an administrator of the domain to which
+  /// the item belongs.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1615,7 +1630,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 delete(core.String fileId, core.String permissionId,
-      {core.bool supportsTeamDrives, core.String $fields}) {
+      {core.bool supportsTeamDrives,
+      core.bool useDomainAdminAccess,
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1632,6 +1649,9 @@
     if (supportsTeamDrives != null) {
       _queryParams["supportsTeamDrives"] = ["${supportsTeamDrives}"];
     }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1663,6 +1683,11 @@
   /// [supportsTeamDrives] - Whether the requesting application supports Team
   /// Drives.
   ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then the requester
+  /// will be granted access if they are an administrator of the domain to which
+  /// the item belongs.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1674,7 +1699,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<Permission> get(core.String fileId, core.String permissionId,
-      {core.bool supportsTeamDrives, core.String $fields}) {
+      {core.bool supportsTeamDrives,
+      core.bool useDomainAdminAccess,
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1691,6 +1718,9 @@
     if (supportsTeamDrives != null) {
       _queryParams["supportsTeamDrives"] = ["${supportsTeamDrives}"];
     }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1728,6 +1758,11 @@
   /// [supportsTeamDrives] - Whether the requesting application supports Team
   /// Drives.
   ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then the requester
+  /// will be granted access if they are an administrator of the domain to which
+  /// the item belongs.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1742,6 +1777,7 @@
       {core.int pageSize,
       core.String pageToken,
       core.bool supportsTeamDrives,
+      core.bool useDomainAdminAccess,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1762,6 +1798,9 @@
     if (supportsTeamDrives != null) {
       _queryParams["supportsTeamDrives"] = ["${supportsTeamDrives}"];
     }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1796,6 +1835,11 @@
   /// and downgrade the current owner to a writer. This parameter is required as
   /// an acknowledgement of the side effect.
   ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then the requester
+  /// will be granted access if they are an administrator of the domain to which
+  /// the item belongs.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1811,6 +1855,7 @@
       {core.bool removeExpiration,
       core.bool supportsTeamDrives,
       core.bool transferOwnership,
+      core.bool useDomainAdminAccess,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1837,6 +1882,9 @@
     if (transferOwnership != null) {
       _queryParams["transferOwnership"] = ["${transferOwnership}"];
     }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2536,6 +2584,11 @@
   ///
   /// [teamDriveId] - The ID of the Team Drive
   ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then the requester
+  /// will be granted access if they are an administrator of the domain to which
+  /// the Team Drive belongs.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2546,7 +2599,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<TeamDrive> get(core.String teamDriveId, {core.String $fields}) {
+  async.Future<TeamDrive> get(core.String teamDriveId,
+      {core.bool useDomainAdminAccess, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2557,6 +2611,9 @@
     if (teamDriveId == null) {
       throw new core.ArgumentError("Parameter teamDriveId is required.");
     }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2581,6 +2638,12 @@
   ///
   /// [pageToken] - Page token for Team Drives.
   ///
+  /// [q] - Query string for searching Team Drives.
+  ///
+  /// [useDomainAdminAccess] - Whether the request should be treated as if it
+  /// was issued by a domain administrator; if set to true, then all Team Drives
+  /// of the domain in which the requester is an administrator are returned.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2592,7 +2655,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<TeamDriveList> list(
-      {core.int pageSize, core.String pageToken, core.String $fields}) {
+      {core.int pageSize,
+      core.String pageToken,
+      core.String q,
+      core.bool useDomainAdminAccess,
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2606,6 +2673,12 @@
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (q != null) {
+      _queryParams["q"] = [q];
+    }
+    if (useDomainAdminAccess != null) {
+      _queryParams["useDomainAdminAccess"] = ["${useDomainAdminAccess}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2766,6 +2839,9 @@
   /// Whether the user has installed the requesting app.
   core.bool appInstalled;
 
+  /// Whether the user can create Team Drives.
+  core.bool canCreateTeamDrives;
+
   /// A map of source MIME type to possible targets for all supported exports.
   core.Map<core.String, core.List<core.String>> exportFormats;
 
@@ -2801,6 +2877,9 @@
     if (_json.containsKey("appInstalled")) {
       appInstalled = _json["appInstalled"];
     }
+    if (_json.containsKey("canCreateTeamDrives")) {
+      canCreateTeamDrives = _json["canCreateTeamDrives"];
+    }
     if (_json.containsKey("exportFormats")) {
       exportFormats = _json["exportFormats"];
     }
@@ -2838,6 +2917,9 @@
     if (appInstalled != null) {
       _json["appInstalled"] = appInstalled;
     }
+    if (canCreateTeamDrives != null) {
+      _json["canCreateTeamDrives"] = canCreateTeamDrives;
+    }
     if (exportFormats != null) {
       _json["exportFormats"] = exportFormats;
     }
@@ -4001,8 +4083,10 @@
 
   /// The IDs of the parent folders which contain the file.
   /// If not specified as part of a create request, the file will be placed
-  /// directly in the My Drive folder. Update requests must use the addParents
-  /// and removeParents parameters to modify the values.
+  /// directly in the user's My Drive folder. If not specified as part of a copy
+  /// request, the file will inherit any discoverable parents of the source
+  /// file. Update requests must use the addParents and removeParents parameters
+  /// to modify the parents list.
   core.List<core.String> parents;
 
   /// List of permission IDs for users with access to this file.
@@ -5372,6 +5456,9 @@
   /// drive.teamdrives.update request that does not set themeId.
   core.String colorRgb;
 
+  /// The time at which the Team Drive was created (RFC 3339 date-time).
+  core.DateTime createdTime;
+
   /// The ID of this Team Drive which is also the ID of the top level folder for
   /// this Team Drive.
   core.String id;
@@ -5407,6 +5494,9 @@
     if (_json.containsKey("colorRgb")) {
       colorRgb = _json["colorRgb"];
     }
+    if (_json.containsKey("createdTime")) {
+      createdTime = core.DateTime.parse(_json["createdTime"]);
+    }
     if (_json.containsKey("id")) {
       id = _json["id"];
     }
@@ -5436,6 +5526,9 @@
     if (colorRgb != null) {
       _json["colorRgb"] = colorRgb;
     }
+    if (createdTime != null) {
+      _json["createdTime"] = (createdTime).toIso8601String();
+    }
     if (id != null) {
       _json["id"] = id;
     }
diff --git a/googleapis/lib/firebasedynamiclinks/v1.dart b/googleapis/lib/firebasedynamiclinks/v1.dart
index 60ce398..7cbdea5 100644
--- a/googleapis/lib/firebasedynamiclinks/v1.dart
+++ b/googleapis/lib/firebasedynamiclinks/v1.dart
@@ -397,6 +397,16 @@
   /// Device language code setting.
   core.String languageCode;
 
+  /// Device language code setting obtained by executing JavaScript code in
+  /// WebView.
+  core.String languageCodeFromWebview;
+
+  /// Device language code raw setting.
+  /// iOS does returns language code in different format than iOS WebView.
+  /// For example WebView returns en_US, but iOS returns en-US.
+  /// Field below will return raw value returned by iOS.
+  core.String languageCodeRaw;
+
   /// Device display resolution height.
   core.String screenResolutionHeight;
 
@@ -415,6 +425,12 @@
     if (_json.containsKey("languageCode")) {
       languageCode = _json["languageCode"];
     }
+    if (_json.containsKey("languageCodeFromWebview")) {
+      languageCodeFromWebview = _json["languageCodeFromWebview"];
+    }
+    if (_json.containsKey("languageCodeRaw")) {
+      languageCodeRaw = _json["languageCodeRaw"];
+    }
     if (_json.containsKey("screenResolutionHeight")) {
       screenResolutionHeight = _json["screenResolutionHeight"];
     }
@@ -435,6 +451,12 @@
     if (languageCode != null) {
       _json["languageCode"] = languageCode;
     }
+    if (languageCodeFromWebview != null) {
+      _json["languageCodeFromWebview"] = languageCodeFromWebview;
+    }
+    if (languageCodeRaw != null) {
+      _json["languageCodeRaw"] = languageCodeRaw;
+    }
     if (screenResolutionHeight != null) {
       _json["screenResolutionHeight"] = screenResolutionHeight;
     }
diff --git a/googleapis/lib/firebaseremoteconfig/v1.dart b/googleapis/lib/firebaseremoteconfig/v1.dart
index c37c96f..031982b 100644
--- a/googleapis/lib/firebaseremoteconfig/v1.dart
+++ b/googleapis/lib/firebaseremoteconfig/v1.dart
@@ -168,7 +168,7 @@
 /// *
 /// The RemoteConfig consists of a list of conditions (which can be
 /// thought of as named "if" statements) and a map of parameters (parameter key
-/// to a stucture containing an optional default value, as well as a optional
+/// to a structure containing an optional default value, as well as a optional
 /// submap of (condition name to value when that condition is true).
 class RemoteConfig {
   /// The list of named conditions. The order *does* affect the semantics.
@@ -236,6 +236,14 @@
 /// are
 /// part of a single RemoteConfig template.
 class RemoteConfigCondition {
+  /// DO NOT USE. Implementation removed and will not be added unless requested.
+  /// A description for this Condition. Length must be less than or equal to
+  /// 100 characters (or more precisely, unicode code points, which is defined
+  /// in
+  /// java/com/google/wireless/android/config/ConstsExporter.java).
+  /// A description may contain any Unicode characters
+  core.String description;
+
   /// Required.
   core.String expression;
 
@@ -272,6 +280,9 @@
   RemoteConfigCondition();
 
   RemoteConfigCondition.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
     if (_json.containsKey("expression")) {
       expression = _json["expression"];
     }
@@ -286,6 +297,9 @@
   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;
     }
@@ -314,6 +328,14 @@
   /// evaluate to <code>true</code>.
   RemoteConfigParameterValue defaultValue;
 
+  /// Optional.
+  /// A description for this Parameter. Length must be less than or equal to
+  /// 100 characters (or more precisely, unicode code points, which is defined
+  /// in
+  /// java/com/google/wireless/android/config/ConstsExporter.java).
+  /// A description may contain any Unicode characters
+  core.String description;
+
   RemoteConfigParameter();
 
   RemoteConfigParameter.fromJson(core.Map _json) {
@@ -328,6 +350,9 @@
       defaultValue =
           new RemoteConfigParameterValue.fromJson(_json["defaultValue"]);
     }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -341,6 +366,9 @@
     if (defaultValue != null) {
       _json["defaultValue"] = (defaultValue).toJson();
     }
+    if (description != null) {
+      _json["description"] = description;
+    }
     return _json;
   }
 }
diff --git a/googleapis/lib/firebaserules/v1.dart b/googleapis/lib/firebaserules/v1.dart
index 4f0b6ad..fa3651c 100644
--- a/googleapis/lib/firebaserules/v1.dart
+++ b/googleapis/lib/firebaserules/v1.dart
@@ -367,6 +367,14 @@
   /// 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
+  /// the releases, the caller should iterate until the `page_token` on the
+  /// response is empty.
+  ///
   /// [filter] - `Release` filter. The list method supports filters with
   /// restrictions on the
   /// `Release.name`, `Release.ruleset_name`, and `Release.test_suite_name`.
@@ -394,14 +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.
-  ///
-  /// [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
-  /// the releases, the caller should iterate until the `page_token` on the
-  /// response is empty.
-  ///
   /// [$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.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();
@@ -427,15 +427,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];
     }
@@ -505,83 +505,6 @@
         downloadOptions: _downloadOptions);
     return _response.then((data) => new Release.fromJson(data));
   }
-
-  /// Update a `Release`.
-  ///
-  /// Only updates to the `ruleset_name` and `test_suite_name` fields will be
-  /// honored. `Release` rename is not supported. To create a `Release` use the
-  /// CreateRelease method.
-  ///
-  /// [request] - The metadata request object.
-  ///
-  /// Request parameters:
-  ///
-  /// [name] - Resource name for the `Release`.
-  ///
-  /// `Release` names may be structured `app1/prod/v2` or flat `app1_prod_v2`
-  /// which affords developers a great deal of flexibility in mapping the name
-  /// to the style that best fits their existing development practices. For
-  /// example, a name could refer to an environment, an app, a version, or some
-  /// combination of three.
-  ///
-  /// In the table below, for the project name `projects/foo`, the following
-  /// relative release paths show how flat and structured names might be chosen
-  /// to match a desired development / deployment strategy.
-  ///
-  /// Use Case     | Flat Name           | Structured Name
-  /// -------------|---------------------|----------------
-  /// Environments | releases/qa         | releases/qa
-  /// Apps         | releases/app1_qa    | releases/app1/qa
-  /// Versions     | releases/app1_v2_qa | releases/app1/v2/qa
-  ///
-  /// The delimiter between the release name path elements can be almost
-  /// anything
-  /// and it should work equally well with the release name list filter, but in
-  /// many ways the structured paths provide a clearer picture of the
-  /// relationship between `Release` instances.
-  ///
-  /// Format: `projects/{project_id}/releases/{release_id}`
-  /// Value must have pattern "^projects/[^/]+/releases/.+$".
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [Release].
-  ///
-  /// 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<Release> update(Release 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');
-
-    var _response = _requester.request(_url, "PUT",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new Release.fromJson(data));
-  }
 }
 
 class ProjectsRulesetsResourceApi {
@@ -753,6 +676,14 @@
   /// Format: `projects/{project_id}`
   /// Value must have pattern "^projects/[^/]+$".
   ///
+  /// [pageToken] - Next page token for loading the next batch of `Ruleset`
+  /// 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 less
+  /// than `page_size` due to the size of the output. To traverse all of the
+  /// releases, caller should iterate until the `page_token` is empty.
+  ///
   /// [filter] - `Ruleset` filter. The list method supports filters with
   /// restrictions on
   /// `Ruleset.name`.
@@ -762,14 +693,6 @@
   ///
   /// Example: `create_time > date("2017-01-01") AND name=UUID-*`
   ///
-  /// [pageToken] - Next page token for loading the next batch of `Ruleset`
-  /// 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 less
-  /// than `page_size` due to the size of the output. To traverse all of the
-  /// releases, caller should iterate until the `page_token` is empty.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -781,9 +704,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<ListRulesetsResponse> 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();
@@ -795,15 +718,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];
     }
diff --git a/googleapis/lib/fusiontables/v2.dart b/googleapis/lib/fusiontables/v2.dart
index 86e8538..8de057b 100644
--- a/googleapis/lib/fusiontables/v2.dart
+++ b/googleapis/lib/fusiontables/v2.dart
@@ -1336,6 +1336,50 @@
     return _response.then((data) => new Table.fromJson(data));
   }
 
+  /// Replaces rows of the table with the rows of the spreadsheet that is first
+  /// imported from. Current rows remain visible until all replacement rows are
+  /// ready.
+  ///
+  /// Request parameters:
+  ///
+  /// [tableId] - Table whose rows will be replaced from the spreadsheet.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Task].
+  ///
+  /// 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<Task> refetchSheet(core.String tableId, {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 (tableId == null) {
+      throw new core.ArgumentError("Parameter tableId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'tables/' + commons.Escaper.ecapeVariable('$tableId') + '/refetch';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Task.fromJson(data));
+  }
+
   /// Replaces rows of an existing table. Current rows remain visible until all
   /// replacement rows are ready.
   ///
diff --git a/googleapis/lib/games/v1.dart b/googleapis/lib/games/v1.dart
index 95730b8..ad39db4 100644
--- a/googleapis/lib/games/v1.dart
+++ b/googleapis/lib/games/v1.dart
@@ -68,8 +68,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -91,8 +89,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<AchievementDefinitionsListResponse> list(
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.int maxResults,
       core.String pageToken,
       core.String $fields}) {
@@ -103,9 +100,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -146,8 +140,6 @@
   ///
   /// [stepsToIncrement] - The number of steps to increment.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [requestId] - A randomly generated numeric ID for each request specified
   /// by the caller. This number is used at the server to ensure that the
   /// request is handled correctly across retries.
@@ -164,9 +156,7 @@
   /// this method will complete with the same error.
   async.Future<AchievementIncrementResponse> increment(
       core.String achievementId, core.int stepsToIncrement,
-      {core.String consistencyToken,
-      core.String requestId,
-      core.String $fields}) {
+      {core.String requestId, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -181,9 +171,6 @@
       throw new core.ArgumentError("Parameter stepsToIncrement is required.");
     }
     _queryParams["stepsToIncrement"] = ["${stepsToIncrement}"];
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (requestId != null) {
       _queryParams["requestId"] = [requestId];
     }
@@ -213,8 +200,6 @@
   /// [playerId] - A player ID. A value of me may be used in place of the
   /// authenticated player's ID.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -244,8 +229,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<PlayerAchievementListResponse> list(core.String playerId,
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.int maxResults,
       core.String pageToken,
       core.String state,
@@ -260,9 +244,6 @@
     if (playerId == null) {
       throw new core.ArgumentError("Parameter playerId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -300,8 +281,6 @@
   ///
   /// [achievementId] - The ID of the achievement used by this method.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -313,7 +292,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<AchievementRevealResponse> reveal(core.String achievementId,
-      {core.String consistencyToken, core.String $fields}) {
+      {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -324,9 +303,6 @@
     if (achievementId == null) {
       throw new core.ArgumentError("Parameter achievementId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -356,8 +332,6 @@
   ///
   /// [steps] - The minimum value to set the steps to.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -370,7 +344,7 @@
   /// this method will complete with the same error.
   async.Future<AchievementSetStepsAtLeastResponse> setStepsAtLeast(
       core.String achievementId, core.int steps,
-      {core.String consistencyToken, core.String $fields}) {
+      {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -385,9 +359,6 @@
       throw new core.ArgumentError("Parameter steps is required.");
     }
     _queryParams["steps"] = ["${steps}"];
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -412,8 +383,6 @@
   ///
   /// [achievementId] - The ID of the achievement used by this method.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -425,7 +394,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<AchievementUnlockResponse> unlock(core.String achievementId,
-      {core.String consistencyToken, core.String $fields}) {
+      {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -436,9 +405,6 @@
     if (achievementId == null) {
       throw new core.ArgumentError("Parameter achievementId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -463,8 +429,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -477,8 +441,7 @@
   /// this method will complete with the same error.
   async.Future<AchievementUpdateMultipleResponse> updateMultiple(
       AchievementUpdateMultipleRequest request,
-      {core.String consistencyToken,
-      core.String $fields}) {
+      {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -489,9 +452,6 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -523,8 +483,6 @@
   /// [applicationId] - The application ID from the Google Play developer
   /// console.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -546,10 +504,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<Application> get(core.String applicationId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String platformType,
-      core.String $fields}) {
+      {core.String language, core.String platformType, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -560,9 +515,6 @@
     if (applicationId == null) {
       throw new core.ArgumentError("Parameter applicationId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -589,8 +541,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -599,7 +549,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 played({core.String consistencyToken, core.String $fields}) {
+  async.Future played({core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -607,9 +557,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -636,8 +583,6 @@
   /// [applicationId] - The application ID from the Google Play developer
   /// console.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -649,7 +594,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<ApplicationVerifyResponse> verify(core.String applicationId,
-      {core.String consistencyToken, core.String $fields}) {
+      {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -660,9 +605,6 @@
     if (applicationId == null) {
       throw new core.ArgumentError("Parameter applicationId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -692,8 +634,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -715,8 +655,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<PlayerEventListResponse> listByPlayer(
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.int maxResults,
       core.String pageToken,
       core.String $fields}) {
@@ -727,9 +666,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -758,8 +694,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -781,8 +715,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<EventDefinitionListResponse> listDefinitions(
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.int maxResults,
       core.String pageToken,
       core.String $fields}) {
@@ -793,9 +726,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -828,8 +758,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -844,9 +772,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<EventUpdateResponse> record(EventRecordRequest request,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -857,9 +783,6 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -890,8 +813,6 @@
   ///
   /// [leaderboardId] - The ID of the leaderboard.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -906,9 +827,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<Leaderboard> get(core.String leaderboardId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -919,9 +838,6 @@
     if (leaderboardId == null) {
       throw new core.ArgumentError("Parameter leaderboardId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -944,8 +860,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -967,8 +881,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<LeaderboardListResponse> list(
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.int maxResults,
       core.String pageToken,
       core.String $fields}) {
@@ -979,9 +892,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -1016,8 +926,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1028,8 +936,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<MetagameConfig> getMetagameConfig(
-      {core.String consistencyToken, core.String $fields}) {
+  async.Future<MetagameConfig> getMetagameConfig({core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1037,9 +944,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1068,8 +972,6 @@
   /// Possible string values are:
   /// - "all" : Retrieve data for all categories. This is the default.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -1092,8 +994,7 @@
   /// this method will complete with the same error.
   async.Future<CategoryListResponse> listCategoriesByPlayer(
       core.String playerId, core.String collection,
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.int maxResults,
       core.String pageToken,
       core.String $fields}) {
@@ -1110,9 +1011,6 @@
     if (collection == null) {
       throw new core.ArgumentError("Parameter collection is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -1154,8 +1052,6 @@
   /// [playerId] - A player ID. A value of me may be used in place of the
   /// authenticated player's ID.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -1170,9 +1066,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<Player> get(core.String playerId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1183,9 +1077,6 @@
     if (playerId == null) {
       throw new core.ArgumentError("Parameter playerId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -1220,8 +1111,6 @@
   /// - "visible" : Retrieve a list of players in the user's social graph that
   /// are visible to this game.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -1243,8 +1132,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<PlayerListResponse> list(core.String collection,
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.int maxResults,
       core.String pageToken,
       core.String $fields}) {
@@ -1258,9 +1146,6 @@
     if (collection == null) {
       throw new core.ArgumentError("Parameter collection is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -1298,8 +1183,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1308,8 +1191,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 remove(PushTokenId request,
-      {core.String consistencyToken, core.String $fields}) {
+  async.Future remove(PushTokenId request, {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1320,9 +1202,6 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1346,8 +1225,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1356,8 +1233,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 update(PushToken request,
-      {core.String consistencyToken, core.String $fields}) {
+  async.Future update(PushToken request, {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1368,9 +1244,6 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1407,8 +1280,6 @@
   /// [requestId] - A numeric ID to ensure that the request is handled correctly
   /// across retries. Your client application must generate this ID randomly.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1419,7 +1290,7 @@
   /// this method will complete with the same error.
   async.Future claim(
       core.String questId, core.String milestoneId, core.String requestId,
-      {core.String consistencyToken, core.String $fields}) {
+      {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1437,9 +1308,6 @@
       throw new core.ArgumentError("Parameter requestId is required.");
     }
     _queryParams["requestId"] = [requestId];
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1474,8 +1342,6 @@
   ///
   /// [questId] - The ID of the quest.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -1490,9 +1356,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<Quest> accept(core.String questId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1503,9 +1367,6 @@
     if (questId == null) {
       throw new core.ArgumentError("Parameter questId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -1532,8 +1393,6 @@
   /// [playerId] - A player ID. A value of me may be used in place of the
   /// authenticated player's ID.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -1556,8 +1415,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<QuestListResponse> list(core.String playerId,
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.int maxResults,
       core.String pageToken,
       core.String $fields}) {
@@ -1571,9 +1429,6 @@
     if (playerId == null) {
       throw new core.ArgumentError("Parameter playerId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -1616,8 +1471,6 @@
   /// - "IOS" - Client is running the iOS SDK.
   /// - "WEB_APP" - Client is running as a Web App.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1629,7 +1482,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<RevisionCheckResponse> check(core.String clientRevision,
-      {core.String consistencyToken, core.String $fields}) {
+      {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1641,9 +1494,6 @@
       throw new core.ArgumentError("Parameter clientRevision is required.");
     }
     _queryParams["clientRevision"] = [clientRevision];
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1672,8 +1522,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -1688,9 +1536,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<Room> create(RoomCreateRequest request,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1701,9 +1547,6 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -1729,8 +1572,6 @@
   ///
   /// [roomId] - The ID of the room.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -1745,9 +1586,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<Room> decline(core.String roomId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1758,9 +1597,6 @@
     if (roomId == null) {
       throw new core.ArgumentError("Parameter roomId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -1786,8 +1622,6 @@
   ///
   /// [roomId] - The ID of the room.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1796,8 +1630,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 dismiss(core.String roomId,
-      {core.String consistencyToken, core.String $fields}) {
+  async.Future dismiss(core.String roomId, {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1808,9 +1641,6 @@
     if (roomId == null) {
       throw new core.ArgumentError("Parameter roomId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1834,8 +1664,6 @@
   ///
   /// [roomId] - The ID of the room.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -1850,9 +1678,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<Room> get(core.String roomId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1863,9 +1689,6 @@
     if (roomId == null) {
       throw new core.ArgumentError("Parameter roomId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -1893,8 +1716,6 @@
   ///
   /// [roomId] - The ID of the room.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -1909,9 +1730,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<Room> join(RoomJoinRequest request, core.String roomId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1925,9 +1744,6 @@
     if (roomId == null) {
       throw new core.ArgumentError("Parameter roomId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -1955,8 +1771,6 @@
   ///
   /// [roomId] - The ID of the room.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -1971,9 +1785,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<Room> leave(RoomLeaveRequest request, core.String roomId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1987,9 +1799,6 @@
     if (roomId == null) {
       throw new core.ArgumentError("Parameter roomId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -2012,8 +1821,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -2035,8 +1842,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<RoomList> list(
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.int maxResults,
       core.String pageToken,
       core.String $fields}) {
@@ -2047,9 +1853,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -2084,8 +1887,6 @@
   ///
   /// [roomId] - The ID of the room.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -2101,9 +1902,7 @@
   /// this method will complete with the same error.
   async.Future<RoomStatus> reportStatus(
       RoomP2PStatuses request, core.String roomId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2117,9 +1916,6 @@
     if (roomId == null) {
       throw new core.ArgumentError("Parameter roomId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -2167,8 +1963,6 @@
   /// - "DAILY" : List the top scores for the current day.
   /// - "WEEKLY" : List the top scores for the current week.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [includeRankType] - The types of ranks to return. If the parameter is
   /// omitted, no ranks will be returned.
   /// Possible string values are:
@@ -2199,8 +1993,7 @@
   /// this method will complete with the same error.
   async.Future<PlayerLeaderboardScoreListResponse> get(
       core.String playerId, core.String leaderboardId, core.String timeSpan,
-      {core.String consistencyToken,
-      core.String includeRankType,
+      {core.String includeRankType,
       core.String language,
       core.int maxResults,
       core.String pageToken,
@@ -2221,9 +2014,6 @@
     if (timeSpan == null) {
       throw new core.ArgumentError("Parameter timeSpan is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (includeRankType != null) {
       _queryParams["includeRankType"] = [includeRankType];
     }
@@ -2275,8 +2065,6 @@
   /// - "DAILY" : List the top scores for the current day.
   /// - "WEEKLY" : List the top scores for the current week.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -2299,8 +2087,7 @@
   /// this method will complete with the same error.
   async.Future<LeaderboardScores> list(
       core.String leaderboardId, core.String collection, core.String timeSpan,
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.int maxResults,
       core.String pageToken,
       core.String $fields}) {
@@ -2321,9 +2108,6 @@
       throw new core.ArgumentError("Parameter timeSpan is required.");
     }
     _queryParams["timeSpan"] = [timeSpan];
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -2369,8 +2153,6 @@
   /// - "DAILY" : List the top scores for the current day.
   /// - "WEEKLY" : List the top scores for the current week.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -2401,8 +2183,7 @@
   /// this method will complete with the same error.
   async.Future<LeaderboardScores> listWindow(
       core.String leaderboardId, core.String collection, core.String timeSpan,
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.int maxResults,
       core.String pageToken,
       core.int resultsAbove,
@@ -2425,9 +2206,6 @@
       throw new core.ArgumentError("Parameter timeSpan is required.");
     }
     _queryParams["timeSpan"] = [timeSpan];
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -2474,8 +2252,6 @@
   /// value. For time, the score represents elapsed time in milliseconds. For
   /// currency, the score represents a value in micro units.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -2496,10 +2272,7 @@
   /// this method will complete with the same error.
   async.Future<PlayerScoreResponse> submit(
       core.String leaderboardId, core.String score,
-      {core.String consistencyToken,
-      core.String language,
-      core.String scoreTag,
-      core.String $fields}) {
+      {core.String language, core.String scoreTag, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2514,9 +2287,6 @@
       throw new core.ArgumentError("Parameter score is required.");
     }
     _queryParams["score"] = [score];
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -2546,8 +2316,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -2563,8 +2331,7 @@
   /// this method will complete with the same error.
   async.Future<PlayerScoreListResponse> submitMultiple(
       PlayerScoreSubmissionList request,
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -2576,9 +2343,6 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -2609,8 +2373,6 @@
   ///
   /// [snapshotId] - The ID of the snapshot.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -2625,9 +2387,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<Snapshot> get(core.String snapshotId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2638,9 +2398,6 @@
     if (snapshotId == null) {
       throw new core.ArgumentError("Parameter snapshotId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -2667,8 +2424,6 @@
   /// [playerId] - A player ID. A value of me may be used in place of the
   /// authenticated player's ID.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -2690,8 +2445,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<SnapshotListResponse> list(core.String playerId,
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.int maxResults,
       core.String pageToken,
       core.String $fields}) {
@@ -2705,9 +2459,6 @@
     if (playerId == null) {
       throw new core.ArgumentError("Parameter playerId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -2746,8 +2497,6 @@
   ///
   /// [matchId] - The ID of the match.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2756,8 +2505,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 cancel(core.String matchId,
-      {core.String consistencyToken, core.String $fields}) {
+  async.Future cancel(core.String matchId, {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2768,9 +2516,6 @@
     if (matchId == null) {
       throw new core.ArgumentError("Parameter matchId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2796,8 +2541,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -2812,9 +2555,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<TurnBasedMatch> create(TurnBasedMatchCreateRequest request,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2825,9 +2566,6 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -2852,8 +2590,6 @@
   ///
   /// [matchId] - The ID of the match.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -2868,9 +2604,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<TurnBasedMatch> decline(core.String matchId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2881,9 +2615,6 @@
     if (matchId == null) {
       throw new core.ArgumentError("Parameter matchId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -2911,8 +2642,6 @@
   ///
   /// [matchId] - The ID of the match.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -2921,8 +2650,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 dismiss(core.String matchId,
-      {core.String consistencyToken, core.String $fields}) {
+  async.Future dismiss(core.String matchId, {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2933,9 +2661,6 @@
     if (matchId == null) {
       throw new core.ArgumentError("Parameter matchId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2965,8 +2690,6 @@
   ///
   /// [matchId] - The ID of the match.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -2982,9 +2705,7 @@
   /// this method will complete with the same error.
   async.Future<TurnBasedMatch> finish(
       TurnBasedMatchResults request, core.String matchId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2998,9 +2719,6 @@
     if (matchId == null) {
       throw new core.ArgumentError("Parameter matchId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -3027,8 +2745,6 @@
   ///
   /// [matchId] - The ID of the match.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [includeMatchData] - Get match data along with metadata.
   ///
   /// [language] - The preferred language to use for strings returned by this
@@ -3045,10 +2761,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<TurnBasedMatch> get(core.String matchId,
-      {core.String consistencyToken,
-      core.bool includeMatchData,
-      core.String language,
-      core.String $fields}) {
+      {core.bool includeMatchData, core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -3059,9 +2772,6 @@
     if (matchId == null) {
       throw new core.ArgumentError("Parameter matchId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (includeMatchData != null) {
       _queryParams["includeMatchData"] = ["${includeMatchData}"];
     }
@@ -3089,8 +2799,6 @@
   ///
   /// [matchId] - The ID of the match.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -3105,9 +2813,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<TurnBasedMatch> join(core.String matchId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -3118,9 +2824,6 @@
     if (matchId == null) {
       throw new core.ArgumentError("Parameter matchId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -3148,8 +2851,6 @@
   ///
   /// [matchId] - The ID of the match.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -3164,9 +2865,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<TurnBasedMatch> leave(core.String matchId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -3177,9 +2876,6 @@
     if (matchId == null) {
       throw new core.ArgumentError("Parameter matchId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -3209,8 +2905,6 @@
   ///
   /// [matchVersion] - The version of the match being updated.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -3231,8 +2925,7 @@
   /// this method will complete with the same error.
   async.Future<TurnBasedMatch> leaveTurn(
       core.String matchId, core.int matchVersion,
-      {core.String consistencyToken,
-      core.String language,
+      {core.String language,
       core.String pendingParticipantId,
       core.String $fields}) {
     var _url = null;
@@ -3249,9 +2942,6 @@
       throw new core.ArgumentError("Parameter matchVersion is required.");
     }
     _queryParams["matchVersion"] = ["${matchVersion}"];
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -3279,8 +2969,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [includeMatchData] - True if match data should be returned in the
   /// response. Note that not all data will necessarily be returned if
   /// include_match_data is true; the server may decide to only return data for
@@ -3313,8 +3001,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<TurnBasedMatchList> list(
-      {core.String consistencyToken,
-      core.bool includeMatchData,
+      {core.bool includeMatchData,
       core.String language,
       core.int maxCompletedMatches,
       core.int maxResults,
@@ -3327,9 +3014,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (includeMatchData != null) {
       _queryParams["includeMatchData"] = ["${includeMatchData}"];
     }
@@ -3369,8 +3053,6 @@
   ///
   /// [matchId] - The ID of the match.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -3389,10 +3071,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<TurnBasedMatchRematch> rematch(core.String matchId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String requestId,
-      core.String $fields}) {
+      {core.String language, core.String requestId, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -3403,9 +3082,6 @@
     if (matchId == null) {
       throw new core.ArgumentError("Parameter matchId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
@@ -3436,8 +3112,6 @@
   ///
   /// Request parameters:
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [includeMatchData] - True if match data should be returned in the
   /// response. Note that not all data will necessarily be returned if
   /// include_match_data is true; the server may decide to only return data for
@@ -3470,8 +3144,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<TurnBasedMatchSync> sync(
-      {core.String consistencyToken,
-      core.bool includeMatchData,
+      {core.bool includeMatchData,
       core.String language,
       core.int maxCompletedMatches,
       core.int maxResults,
@@ -3484,9 +3157,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (includeMatchData != null) {
       _queryParams["includeMatchData"] = ["${includeMatchData}"];
     }
@@ -3525,8 +3195,6 @@
   ///
   /// [matchId] - The ID of the match.
   ///
-  /// [consistencyToken] - The last-seen mutation timestamp.
-  ///
   /// [language] - The preferred language to use for strings returned by this
   /// method.
   ///
@@ -3542,9 +3210,7 @@
   /// this method will complete with the same error.
   async.Future<TurnBasedMatch> takeTurn(
       TurnBasedMatchTurn request, core.String matchId,
-      {core.String consistencyToken,
-      core.String language,
-      core.String $fields}) {
+      {core.String language, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -3558,9 +3224,6 @@
     if (matchId == null) {
       throw new core.ArgumentError("Parameter matchId is required.");
     }
-    if (consistencyToken != null) {
-      _queryParams["consistencyToken"] = [consistencyToken];
-    }
     if (language != null) {
       _queryParams["language"] = [language];
     }
diff --git a/googleapis/lib/genomics/v1.dart b/googleapis/lib/genomics/v1.dart
index 4ac889a..647ce69 100644
--- a/googleapis/lib/genomics/v1.dart
+++ b/googleapis/lib/genomics/v1.dart
@@ -1986,6 +1986,10 @@
   /// [readGroupSetId] - Required. The ID of the read group set over which
   /// coverage is requested.
   ///
+  /// [referenceName] - The name of the reference to query, within the reference
+  /// set associated
+  /// with this query. Optional.
+  ///
   /// [end] - The end position of the range on the reference, 0-based exclusive.
   /// If
   /// specified, `referenceName` must also be specified. If unset or 0, defaults
@@ -2013,10 +2017,6 @@
   /// `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.
-  ///
   /// [$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 end,
+      {core.String referenceName,
+      core.String end,
       core.String pageToken,
       core.int pageSize,
       core.String start,
       core.String targetBucketWidth,
-      core.String referenceName,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -2045,6 +2045,9 @@
     if (readGroupSetId == null) {
       throw new core.ArgumentError("Parameter readGroupSetId is required.");
     }
+    if (referenceName != null) {
+      _queryParams["referenceName"] = [referenceName];
+    }
     if (end != null) {
       _queryParams["end"] = [end];
     }
@@ -2060,9 +2063,6 @@
     if (targetBucketWidth != null) {
       _queryParams["targetBucketWidth"] = [targetBucketWidth];
     }
-    if (referenceName != null) {
-      _queryParams["referenceName"] = [referenceName];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -5076,7 +5076,7 @@
 ///     }
 ///
 /// For a description of IAM and its features, see the
-/// [IAM developer's guide](https://cloud.google.com/iam).
+/// [IAM developer's guide](https://cloud.google.com/iam/docs).
 class Policy {
   /// Associates a list of `members` to a `role`.
   /// `bindings` with no members will result in an error.
@@ -5103,7 +5103,7 @@
         convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
   }
 
-  /// Version of the `Policy`. The default version is 0.
+  /// Deprecated.
   core.int version;
 
   Policy();
diff --git a/googleapis/lib/gmail/v1.dart b/googleapis/lib/gmail/v1.dart
index 7fa5dfe..037e2e2 100644
--- a/googleapis/lib/gmail/v1.dart
+++ b/googleapis/lib/gmail/v1.dart
@@ -4346,6 +4346,10 @@
 /// Labels are used to categorize messages and threads within the user's
 /// mailbox.
 class Label {
+  /// The color to assign to the label. Color is only available for labels that
+  /// have their type set to user.
+  LabelColor color;
+
   /// The immutable ID of the label.
   core.String id;
 
@@ -4394,6 +4398,9 @@
   Label();
 
   Label.fromJson(core.Map _json) {
+    if (_json.containsKey("color")) {
+      color = new LabelColor.fromJson(_json["color"]);
+    }
     if (_json.containsKey("id")) {
       id = _json["id"];
     }
@@ -4426,6 +4433,9 @@
   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 (id != null) {
       _json["id"] = id;
     }
@@ -4457,6 +4467,57 @@
   }
 }
 
+class LabelColor {
+  /// The background color represented as hex string #RRGGBB (ex #000000). This
+  /// field is required in order to set the color of a label. Only the following
+  /// predefined set of color values are allowed:
+  /// #000000, #434343, #666666, #999999, #cccccc, #efefef, #f3f3f3, #ffffff,
+  /// #fb4c2f, #ffad47, #fad165, #16a766, #43d692, #4a86e8, #a479e2, #f691b3,
+  /// #f6c5be, #ffe6c7, #fef1d1, #b9e4d0, #c6f3de, #c9daf8, #e4d7f5, #fcdee8,
+  /// #efa093, #ffd6a2, #fce8b3, #89d3b2, #a0eac9, #a4c2f4, #d0bcf1, #fbc8d9,
+  /// #e66550, #ffbc6b, #fcda83, #44b984, #68dfa9, #6d9eeb, #b694e8, #f7a7c0,
+  /// #cc3a21, #eaa041, #f2c960, #149e60, #3dc789, #3c78d8, #8e63ce, #e07798,
+  /// #ac2b16, #cf8933, #d5ae49, #0b804b, #2a9c68, #285bac, #653e9b, #b65775,
+  /// #822111, #a46a21, #aa8831, #076239, #1a764d, #1c4587, #41236d, #83334c
+  core.String backgroundColor;
+
+  /// The text color of the label, represented as hex string. This field is
+  /// required in order to set the color of a label. Only the following
+  /// predefined set of color values are allowed:
+  /// #000000, #434343, #666666, #999999, #cccccc, #efefef, #f3f3f3, #ffffff,
+  /// #fb4c2f, #ffad47, #fad165, #16a766, #43d692, #4a86e8, #a479e2, #f691b3,
+  /// #f6c5be, #ffe6c7, #fef1d1, #b9e4d0, #c6f3de, #c9daf8, #e4d7f5, #fcdee8,
+  /// #efa093, #ffd6a2, #fce8b3, #89d3b2, #a0eac9, #a4c2f4, #d0bcf1, #fbc8d9,
+  /// #e66550, #ffbc6b, #fcda83, #44b984, #68dfa9, #6d9eeb, #b694e8, #f7a7c0,
+  /// #cc3a21, #eaa041, #f2c960, #149e60, #3dc789, #3c78d8, #8e63ce, #e07798,
+  /// #ac2b16, #cf8933, #d5ae49, #0b804b, #2a9c68, #285bac, #653e9b, #b65775,
+  /// #822111, #a46a21, #aa8831, #076239, #1a764d, #1c4587, #41236d, #83334c
+  core.String textColor;
+
+  LabelColor();
+
+  LabelColor.fromJson(core.Map _json) {
+    if (_json.containsKey("backgroundColor")) {
+      backgroundColor = _json["backgroundColor"];
+    }
+    if (_json.containsKey("textColor")) {
+      textColor = _json["textColor"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (backgroundColor != null) {
+      _json["backgroundColor"] = backgroundColor;
+    }
+    if (textColor != null) {
+      _json["textColor"] = textColor;
+    }
+    return _json;
+  }
+}
+
 class ListDraftsResponse {
   /// List of drafts.
   core.List<Draft> drafts;
diff --git a/googleapis/lib/groupsmigration/v1.dart b/googleapis/lib/groupsmigration/v1.dart
index 83abcca..13fe1b5 100644
--- a/googleapis/lib/groupsmigration/v1.dart
+++ b/googleapis/lib/groupsmigration/v1.dart
@@ -4,7 +4,6 @@
 
 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;
diff --git a/googleapis/lib/iam/v1.dart b/googleapis/lib/iam/v1.dart
index bfd8a8a..bbbc983 100644
--- a/googleapis/lib/iam/v1.dart
+++ b/googleapis/lib/iam/v1.dart
@@ -24,6 +24,8 @@
 
   final commons.ApiRequester _requester;
 
+  IamPoliciesResourceApi get iamPolicies =>
+      new IamPoliciesResourceApi(_requester);
   OrganizationsResourceApi get organizations =>
       new OrganizationsResourceApi(_requester);
   PermissionsResourceApi get permissions =>
@@ -38,6 +40,58 @@
             new commons.ApiRequester(client, rootUrl, servicePath, USER_AGENT);
 }
 
+class IamPoliciesResourceApi {
+  final commons.ApiRequester _requester;
+
+  IamPoliciesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Returns a list of services that support service level audit logging
+  /// configuration for the given resource.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [QueryAuditableServicesResponse].
+  ///
+  /// 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<QueryAuditableServicesResponse> queryAuditableServices(
+      QueryAuditableServicesRequest 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 = 'v1/iamPolicies:queryAuditableServices';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new QueryAuditableServicesResponse.fromJson(data));
+  }
+}
+
 class OrganizationsResourceApi {
   final commons.ApiRequester _requester;
 
@@ -1652,6 +1706,14 @@
   ///
   /// Request parameters:
   ///
+  /// [showDeleted] - Include Roles that have been deleted.
+  ///
+  /// [pageToken] - Optional pagination token returned in an earlier
+  /// ListRolesResponse.
+  ///
+  /// [pageSize] - Optional limit on the number of roles to include in the
+  /// response.
+  ///
   /// [view] - Optional view for the returned Role objects.
   /// Possible string values are:
   /// - "BASIC" : A BASIC.
@@ -1663,14 +1725,6 @@
   /// `organizations/{ORGANIZATION_ID}`
   /// `projects/{PROJECT_ID}`
   ///
-  /// [showDeleted] - Include Roles that have been deleted.
-  ///
-  /// [pageToken] - Optional pagination token returned in an earlier
-  /// ListRolesResponse.
-  ///
-  /// [pageSize] - Optional limit on the number of roles to include in the
-  /// response.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1682,11 +1736,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<ListRolesResponse> list(
-      {core.String view,
-      core.String parent,
-      core.bool showDeleted,
+      {core.bool showDeleted,
       core.String pageToken,
       core.int pageSize,
+      core.String view,
+      core.String parent,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1695,12 +1749,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (view != null) {
-      _queryParams["view"] = [view];
-    }
-    if (parent != null) {
-      _queryParams["parent"] = [parent];
-    }
     if (showDeleted != null) {
       _queryParams["showDeleted"] = ["${showDeleted}"];
     }
@@ -1710,6 +1758,12 @@
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (view != null) {
+      _queryParams["view"] = [view];
+    }
+    if (parent != null) {
+      _queryParams["parent"] = [parent];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1774,6 +1828,94 @@
   }
 }
 
+/// Specifies the audit configuration for a service.
+/// The configuration determines which permission types are logged, and what
+/// identities, if any, are exempted from logging.
+/// An AuditConfig must have one or more AuditLogConfigs.
+///
+/// If there are AuditConfigs for both `allServices` and a specific service,
+/// the union of the two AuditConfigs is used for that service: the log_types
+/// specified in each AuditConfig are enabled, and the exempted_members in each
+/// AuditLogConfig are exempted.
+///
+/// Example Policy with multiple AuditConfigs:
+///
+///     {
+///       "audit_configs": [
+///         {
+///           "service": "allServices"
+///           "audit_log_configs": [
+///             {
+///               "log_type": "DATA_READ",
+///               "exempted_members": [
+///                 "user:foo@gmail.com"
+///               ]
+///             },
+///             {
+///               "log_type": "DATA_WRITE",
+///             },
+///             {
+///               "log_type": "ADMIN_READ",
+///             }
+///           ]
+///         },
+///         {
+///           "service": "fooservice.googleapis.com"
+///           "audit_log_configs": [
+///             {
+///               "log_type": "DATA_READ",
+///             },
+///             {
+///               "log_type": "DATA_WRITE",
+///               "exempted_members": [
+///                 "user:bar@gmail.com"
+///               ]
+///             }
+///           ]
+///         }
+///       ]
+///     }
+///
+/// For fooservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ
+/// logging. It also exempts foo@gmail.com from DATA_READ logging, and
+/// bar@gmail.com from DATA_WRITE logging.
+class AuditConfig {
+  /// The configuration for logging of each type of permission.
+  /// Next ID: 4
+  core.List<AuditLogConfig> auditLogConfigs;
+
+  /// Specifies a service that will be enabled for audit logging.
+  /// For example, `storage.googleapis.com`, `cloudsql.googleapis.com`.
+  /// `allServices` is a special value that covers all services.
+  core.String service;
+
+  AuditConfig();
+
+  AuditConfig.fromJson(core.Map _json) {
+    if (_json.containsKey("auditLogConfigs")) {
+      auditLogConfigs = _json["auditLogConfigs"]
+          .map((value) => new AuditLogConfig.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("service")) {
+      service = _json["service"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (auditLogConfigs != null) {
+      _json["auditLogConfigs"] =
+          auditLogConfigs.map((value) => (value).toJson()).toList();
+    }
+    if (service != null) {
+      _json["service"] = service;
+    }
+    return _json;
+  }
+}
+
 /// Audit log information specific to Cloud IAM. This message is serialized
 /// as an `Any` type in the `ServiceData` message of an
 /// `AuditLog` message.
@@ -1799,6 +1941,87 @@
   }
 }
 
+/// Provides the configuration for logging a type of permissions.
+/// Example:
+///
+///     {
+///       "audit_log_configs": [
+///         {
+///           "log_type": "DATA_READ",
+///           "exempted_members": [
+///             "user:foo@gmail.com"
+///           ]
+///         },
+///         {
+///           "log_type": "DATA_WRITE",
+///         }
+///       ]
+///     }
+///
+/// This enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting
+/// foo@gmail.com from DATA_READ logging.
+class AuditLogConfig {
+  /// Specifies the identities that do not cause logging for this type of
+  /// permission.
+  /// Follows the same format of Binding.members.
+  core.List<core.String> exemptedMembers;
+
+  /// The log type that this config enables.
+  /// Possible string values are:
+  /// - "LOG_TYPE_UNSPECIFIED" : Default case. Should never be this.
+  /// - "ADMIN_READ" : Admin reads. Example: CloudIAM getIamPolicy
+  /// - "DATA_WRITE" : Data writes. Example: CloudSQL Users create
+  /// - "DATA_READ" : Data reads. Example: CloudSQL Users list
+  core.String logType;
+
+  AuditLogConfig();
+
+  AuditLogConfig.fromJson(core.Map _json) {
+    if (_json.containsKey("exemptedMembers")) {
+      exemptedMembers = _json["exemptedMembers"];
+    }
+    if (_json.containsKey("logType")) {
+      logType = _json["logType"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (exemptedMembers != null) {
+      _json["exemptedMembers"] = exemptedMembers;
+    }
+    if (logType != null) {
+      _json["logType"] = logType;
+    }
+    return _json;
+  }
+}
+
+/// Contains information about an auditable service.
+class AuditableService {
+  /// Public name of the service.
+  /// For example, the service name for Cloud IAM is 'iam.googleapis.com'.
+  core.String name;
+
+  AuditableService();
+
+  AuditableService.fromJson(core.Map _json) {
+    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 (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
 /// Associates `members` with a `role`.
 class Binding {
   /// Specifies the identities requesting access for a Cloud Platform resource.
@@ -1865,12 +2088,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 +2104,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 +2118,6 @@
     if (action != null) {
       _json["action"] = action;
     }
-    if (condition != null) {
-      _json["condition"] = (condition).toJson();
-    }
     if (member != null) {
       _json["member"] = member;
     }
@@ -1960,8 +2171,9 @@
   /// - "KEY_ALG_RSA_2048" : 2k RSA Key.
   core.String keyAlgorithm;
 
-  /// The output format of the private key. `GOOGLE_CREDENTIALS_FILE` is the
-  /// default output format.
+  /// The output format of the private key. The default value is
+  /// `TYPE_GOOGLE_CREDENTIALS_FILE`, which is the Google Credentials File
+  /// format.
   /// Possible string values are:
   /// - "TYPE_UNSPECIFIED" : Unspecified. Equivalent to
   /// `TYPE_GOOGLE_CREDENTIALS_FILE`.
@@ -2053,68 +2265,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
@@ -2211,6 +2361,9 @@
 
 /// A permission which can be included by a role.
 class Permission {
+  /// The service API associated with the permission is not enabled.
+  core.bool apiDisabled;
+
   /// The current custom role support level.
   /// Possible string values are:
   /// - "SUPPORTED" : Permission is fully supported for custom role use.
@@ -2242,6 +2395,9 @@
   Permission();
 
   Permission.fromJson(core.Map _json) {
+    if (_json.containsKey("apiDisabled")) {
+      apiDisabled = _json["apiDisabled"];
+    }
     if (_json.containsKey("customRolesSupportLevel")) {
       customRolesSupportLevel = _json["customRolesSupportLevel"];
     }
@@ -2265,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 (apiDisabled != null) {
+      _json["apiDisabled"] = apiDisabled;
+    }
     if (customRolesSupportLevel != null) {
       _json["customRolesSupportLevel"] = customRolesSupportLevel;
     }
@@ -2319,8 +2478,11 @@
 ///     }
 ///
 /// For a description of IAM and its features, see the
-/// [IAM developer's guide](https://cloud.google.com/iam).
+/// [IAM developer's guide](https://cloud.google.com/iam/docs).
 class Policy {
+  /// Specifies cloud audit logging configuration for this policy.
+  core.List<AuditConfig> auditConfigs;
+
   /// Associates a list of `members` to a `role`.
   /// `bindings` with no members will result in an error.
   core.List<Binding> bindings;
@@ -2346,12 +2508,17 @@
         convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
   }
 
-  /// Version of the `Policy`. The default version is 0.
+  /// Deprecated.
   core.int version;
 
   Policy();
 
   Policy.fromJson(core.Map _json) {
+    if (_json.containsKey("auditConfigs")) {
+      auditConfigs = _json["auditConfigs"]
+          .map((value) => new AuditConfig.fromJson(value))
+          .toList();
+    }
     if (_json.containsKey("bindings")) {
       bindings = _json["bindings"]
           .map((value) => new Binding.fromJson(value))
@@ -2368,6 +2535,10 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (auditConfigs != null) {
+      _json["auditConfigs"] =
+          auditConfigs.map((value) => (value).toJson()).toList();
+    }
     if (bindings != null) {
       _json["bindings"] = bindings.map((value) => (value).toJson()).toList();
     }
@@ -2407,6 +2578,59 @@
   }
 }
 
+/// A request to get the list of auditable services for a resource.
+class QueryAuditableServicesRequest {
+  /// Required. The full resource name to query from the list of auditable
+  /// services.
+  ///
+  /// The name follows the Google Cloud Platform resource format.
+  /// For example, a Cloud Platform project with id `my-project` will be named
+  /// `//cloudresourcemanager.googleapis.com/projects/my-project`.
+  core.String fullResourceName;
+
+  QueryAuditableServicesRequest();
+
+  QueryAuditableServicesRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("fullResourceName")) {
+      fullResourceName = _json["fullResourceName"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (fullResourceName != null) {
+      _json["fullResourceName"] = fullResourceName;
+    }
+    return _json;
+  }
+}
+
+/// A response containing a list of auditable services for a resource.
+class QueryAuditableServicesResponse {
+  /// The auditable services for a resource.
+  core.List<AuditableService> services;
+
+  QueryAuditableServicesResponse();
+
+  QueryAuditableServicesResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("services")) {
+      services = _json["services"]
+          .map((value) => new AuditableService.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 (services != null) {
+      _json["services"] = services.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
 /// The grantable role query request.
 class QueryGrantableRolesRequest {
   /// Required. The full resource name to query from the list of grantable
@@ -2694,9 +2918,8 @@
 /// `unique_id`.
 ///
 /// If the account already exists, the account's resource name is returned
-/// in util::Status's ResourceInfo.resource_name in the format of
-/// projects/{PROJECT_ID}/serviceAccounts/{ACCOUNT}. The caller can
-/// use the name in other methods to access the account.
+/// in the format of projects/{PROJECT_ID}/serviceAccounts/{ACCOUNT}. The caller
+/// can use the name in other methods to access the account.
 ///
 /// All other methods can identify the service account using the format
 /// `projects/{PROJECT_ID}/serviceAccounts/{ACCOUNT}`.
@@ -2733,7 +2956,7 @@
   /// `projects/{PROJECT_ID}/serviceAccounts/{ACCOUNT}`.
   core.String name;
 
-  /// @OutputOnly. The OAuth2 client id for the service account.
+  /// @OutputOnly The OAuth2 client id for the service account.
   /// This is used in conjunction with the OAuth2 clientconfig API to make
   /// three legged OAuth2 (3LO) flows to access the data of Google users.
   core.String oauth2ClientId;
@@ -2937,12 +3160,23 @@
   /// might reject them.
   Policy policy;
 
+  /// OPTIONAL: A FieldMask specifying which fields of the policy to modify.
+  /// Only
+  /// the fields in the mask will be modified. If no mask is provided, the
+  /// following default mask is used:
+  /// paths: "bindings, etag"
+  /// This field is only used by Cloud IAM.
+  core.String updateMask;
+
   SetIamPolicyRequest();
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey("policy")) {
       policy = new Policy.fromJson(_json["policy"]);
     }
+    if (_json.containsKey("updateMask")) {
+      updateMask = _json["updateMask"];
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -2951,6 +3185,9 @@
     if (policy != null) {
       _json["policy"] = (policy).toJson();
     }
+    if (updateMask != null) {
+      _json["updateMask"] = updateMask;
+    }
     return _json;
   }
 }
diff --git a/googleapis/lib/identitytoolkit/v3.dart b/googleapis/lib/identitytoolkit/v3.dart
index d0c24f7..48f5779 100644
--- a/googleapis/lib/identitytoolkit/v3.dart
+++ b/googleapis/lib/identitytoolkit/v3.dart
@@ -1839,7 +1839,8 @@
 
   IdentitytoolkitRelyingpartyGetPublicKeysResponse();
 
-  IdentitytoolkitRelyingpartyGetPublicKeysResponse.fromJson(core.Map _json) {
+  IdentitytoolkitRelyingpartyGetPublicKeysResponse.fromJson(
+      core.Map<core.String, core.dynamic> _json) {
     _json.forEach((core.String key, value) {
       this[key] = value;
     });
diff --git a/googleapis/lib/kgsearch/v1.dart b/googleapis/lib/kgsearch/v1.dart
index 82d79ef..6ab490f 100644
--- a/googleapis/lib/kgsearch/v1.dart
+++ b/googleapis/lib/kgsearch/v1.dart
@@ -4,7 +4,6 @@
 
 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;
@@ -38,6 +37,8 @@
   ///
   /// Request parameters:
   ///
+  /// [indent] - Enables indenting of json results.
+  ///
   /// [languages] - The list of language codes (defined in ISO 693) to run the
   /// query with,
   /// e.g. 'en'.
@@ -57,8 +58,6 @@
   /// (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 +69,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.List<core.String> languages,
+      {core.bool indent,
+      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.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -85,6 +84,9 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
+    if (indent != null) {
+      _queryParams["indent"] = ["${indent}"];
+    }
     if (languages != null) {
       _queryParams["languages"] = languages;
     }
@@ -103,9 +105,6 @@
     if (types != null) {
       _queryParams["types"] = types;
     }
-    if (indent != null) {
-      _queryParams["indent"] = ["${indent}"];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/googleapis/lib/language/v1.dart b/googleapis/lib/language/v1.dart
index 35cb836..2f3e72a 100644
--- a/googleapis/lib/language/v1.dart
+++ b/googleapis/lib/language/v1.dart
@@ -268,6 +268,49 @@
         downloadOptions: _downloadOptions);
     return _response.then((data) => new AnnotateTextResponse.fromJson(data));
   }
+
+  /// Classifies a document into categories.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ClassifyTextResponse].
+  ///
+  /// 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<ClassifyTextResponse> classifyText(ClassifyTextRequest 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 = 'v1/documents:classifyText';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ClassifyTextResponse.fromJson(data));
+  }
 }
 
 /// The entity analysis request message.
@@ -683,6 +726,9 @@
 
 /// The text annotations response message.
 class AnnotateTextResponse {
+  /// Categories identified in the input document.
+  core.List<ClassificationCategory> categories;
+
   /// The overall sentiment for the document. Populated if the user enables
   /// AnnotateTextRequest.Features.extract_document_sentiment.
   Sentiment documentSentiment;
@@ -709,6 +755,11 @@
   AnnotateTextResponse();
 
   AnnotateTextResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("categories")) {
+      categories = _json["categories"]
+          .map((value) => new ClassificationCategory.fromJson(value))
+          .toList();
+    }
     if (_json.containsKey("documentSentiment")) {
       documentSentiment = new Sentiment.fromJson(_json["documentSentiment"]);
     }
@@ -733,6 +784,10 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (categories != null) {
+      _json["categories"] =
+          categories.map((value) => (value).toJson()).toList();
+    }
     if (documentSentiment != null) {
       _json["documentSentiment"] = (documentSentiment).toJson();
     }
@@ -752,6 +807,88 @@
   }
 }
 
+/// Represents a category returned from the text classifier.
+class ClassificationCategory {
+  /// The classifier's confidence of the category. Number represents how certain
+  /// the classifier is that this category represents the given text.
+  core.double confidence;
+
+  /// The name of the category representing the document.
+  core.String name;
+
+  ClassificationCategory();
+
+  ClassificationCategory.fromJson(core.Map _json) {
+    if (_json.containsKey("confidence")) {
+      confidence = _json["confidence"];
+    }
+    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 (confidence != null) {
+      _json["confidence"] = confidence;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// The document classification request message.
+class ClassifyTextRequest {
+  /// Input document.
+  Document document;
+
+  ClassifyTextRequest();
+
+  ClassifyTextRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("document")) {
+      document = new Document.fromJson(_json["document"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (document != null) {
+      _json["document"] = (document).toJson();
+    }
+    return _json;
+  }
+}
+
+/// The document classification response message.
+class ClassifyTextResponse {
+  /// Categories representing the input document.
+  core.List<ClassificationCategory> categories;
+
+  ClassifyTextResponse();
+
+  ClassifyTextResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("categories")) {
+      categories = _json["categories"]
+          .map((value) => new ClassificationCategory.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 (categories != null) {
+      _json["categories"] =
+          categories.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
 /// Represents dependency parse tree information for a token. (For more
 /// information on dependency labels, see
 /// http://www.aclweb.org/anthology/P13-2017
@@ -1088,6 +1225,9 @@
 /// All available features for sentiment, syntax, and semantic analysis.
 /// Setting each one to true will enable that specific analysis for the input.
 class Features {
+  /// Classify the full document into categories.
+  core.bool classifyText;
+
   /// Extract document-level sentiment.
   core.bool extractDocumentSentiment;
 
@@ -1103,6 +1243,9 @@
   Features();
 
   Features.fromJson(core.Map _json) {
+    if (_json.containsKey("classifyText")) {
+      classifyText = _json["classifyText"];
+    }
     if (_json.containsKey("extractDocumentSentiment")) {
       extractDocumentSentiment = _json["extractDocumentSentiment"];
     }
@@ -1120,6 +1263,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (classifyText != null) {
+      _json["classifyText"] = classifyText;
+    }
     if (extractDocumentSentiment != null) {
       _json["extractDocumentSentiment"] = extractDocumentSentiment;
     }
diff --git a/googleapis/lib/logging/v2.dart b/googleapis/lib/logging/v2.dart
index 13563c1..f63fffc 100644
--- a/googleapis/lib/logging/v2.dart
+++ b/googleapis/lib/logging/v2.dart
@@ -41,12 +41,15 @@
   BillingAccountsResourceApi get billingAccounts =>
       new BillingAccountsResourceApi(_requester);
   EntriesResourceApi get entries => new EntriesResourceApi(_requester);
+  ExclusionsResourceApi get exclusions => new ExclusionsResourceApi(_requester);
   FoldersResourceApi get folders => new FoldersResourceApi(_requester);
+  LogsResourceApi get logs => new LogsResourceApi(_requester);
   MonitoredResourceDescriptorsResourceApi get monitoredResourceDescriptors =>
       new MonitoredResourceDescriptorsResourceApi(_requester);
   OrganizationsResourceApi get organizations =>
       new OrganizationsResourceApi(_requester);
   ProjectsResourceApi get projects => new ProjectsResourceApi(_requester);
+  SinksResourceApi get sinks => new SinksResourceApi(_requester);
 
   LoggingApi(http.Client client,
       {core.String rootUrl: "https://logging.googleapis.com/",
@@ -672,15 +675,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.
   ///
@@ -692,7 +695,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;
@@ -703,12 +706,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];
     }
@@ -995,6 +998,297 @@
   }
 }
 
+class ExclusionsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ExclusionsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Creates a new exclusion in a specified parent resource. Only log entries
+  /// belonging to that resource can be excluded. You can have up to 10
+  /// exclusions in a resource.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Required. The parent resource in which to create the exclusion:
+  /// "projects/[PROJECT_ID]"
+  /// "organizations/[ORGANIZATION_ID]"
+  /// "billingAccounts/[BILLING_ACCOUNT_ID]"
+  /// "folders/[FOLDER_ID]"
+  /// Examples: "projects/my-logging-project", "organizations/123456789".
+  /// Value must have pattern "^[^/]+/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [LogExclusion].
+  ///
+  /// 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<LogExclusion> create(LogExclusion 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 = 'v2/' +
+        commons.Escaper.ecapeVariableReserved('$parent') +
+        '/exclusions';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new LogExclusion.fromJson(data));
+  }
+
+  /// Deletes an exclusion.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Required. The resource name of an existing exclusion to delete:
+  /// "projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]"
+  /// "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]"
+  /// "billingAccounts/[BILLING_ACCOUNT_ID]/exclusions/[EXCLUSION_ID]"
+  /// "folders/[FOLDER_ID]/exclusions/[EXCLUSION_ID]"
+  /// Example: "projects/my-project-id/exclusions/my-exclusion-id".
+  /// Value must have pattern "^[^/]+/[^/]+/exclusions/[^/]+$".
+  ///
+  /// [$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 = 'v2/' + 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 description of an exclusion.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Required. The resource name of an existing exclusion:
+  /// "projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]"
+  /// "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]"
+  /// "billingAccounts/[BILLING_ACCOUNT_ID]/exclusions/[EXCLUSION_ID]"
+  /// "folders/[FOLDER_ID]/exclusions/[EXCLUSION_ID]"
+  /// Example: "projects/my-project-id/exclusions/my-exclusion-id".
+  /// Value must have pattern "^[^/]+/[^/]+/exclusions/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [LogExclusion].
+  ///
+  /// 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<LogExclusion> 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 = 'v2/' + 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 LogExclusion.fromJson(data));
+  }
+
+  /// Lists all the exclusions in a parent resource.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Required. The parent resource whose exclusions are to be
+  /// listed.
+  /// "projects/[PROJECT_ID]"
+  /// "organizations/[ORGANIZATION_ID]"
+  /// "billingAccounts/[BILLING_ACCOUNT_ID]"
+  /// "folders/[FOLDER_ID]"
+  ///
+  /// 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.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListExclusionsResponse].
+  ///
+  /// 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<ListExclusionsResponse> list(core.String parent,
+      {core.int pageSize, 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 (parent == null) {
+      throw new core.ArgumentError("Parameter parent is required.");
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v2/' +
+        commons.Escaper.ecapeVariableReserved('$parent') +
+        '/exclusions';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListExclusionsResponse.fromJson(data));
+  }
+
+  /// Changes one or more properties of an existing exclusion.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Required. The resource name of the exclusion to update:
+  /// "projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]"
+  /// "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]"
+  /// "billingAccounts/[BILLING_ACCOUNT_ID]/exclusions/[EXCLUSION_ID]"
+  /// "folders/[FOLDER_ID]/exclusions/[EXCLUSION_ID]"
+  /// Example: "projects/my-project-id/exclusions/my-exclusion-id".
+  /// Value must have pattern "^[^/]+/[^/]+/exclusions/[^/]+$".
+  ///
+  /// [updateMask] - Required. A nonempty list of fields to change in the
+  /// existing exclusion. New values for the fields are taken from the
+  /// corresponding fields in the LogExclusion included in this request. Fields
+  /// not mentioned in update_mask are not changed and are ignored in the
+  /// request.For example, to change the filter and description of an exclusion,
+  /// specify an update_mask of "filter,description".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [LogExclusion].
+  ///
+  /// 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<LogExclusion> patch(LogExclusion 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 = 'v2/' + 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 LogExclusion.fromJson(data));
+  }
+}
+
 class FoldersResourceApi {
   final commons.ApiRequester _requester;
 
@@ -1835,17 +2129,77 @@
   }
 }
 
-class MonitoredResourceDescriptorsResourceApi {
+class LogsResourceApi {
   final commons.ApiRequester _requester;
 
-  MonitoredResourceDescriptorsResourceApi(commons.ApiRequester client)
-      : _requester = client;
+  LogsResourceApi(commons.ApiRequester client) : _requester = client;
 
-  /// Lists the descriptors for monitored resource types used by Stackdriver
-  /// Logging.
+  /// Deletes all the log entries in a log. The log reappears if it receives new
+  /// entries. Log entries written shortly before the delete operation might not
+  /// be deleted.
   ///
   /// Request parameters:
   ///
+  /// [logName] - Required. The resource name of the log to delete:
+  /// "projects/[PROJECT_ID]/logs/[LOG_ID]"
+  /// "organizations/[ORGANIZATION_ID]/logs/[LOG_ID]"
+  /// "billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]"
+  /// "folders/[FOLDER_ID]/logs/[LOG_ID]"
+  /// [LOG_ID] must be URL-encoded. For example,
+  /// "projects/my-project-id/logs/syslog",
+  /// "organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity".
+  /// For more information about log names, see LogEntry.
+  /// Value must have pattern "^[^/]+/[^/]+/logs/[^/]+$".
+  ///
+  /// [$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 logName, {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 (logName == null) {
+      throw new core.ArgumentError("Parameter logName is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v2/' + commons.Escaper.ecapeVariableReserved('$logName');
+
+    var _response = _requester.request(_url, "DELETE",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Empty.fromJson(data));
+  }
+
+  /// Lists the logs in projects, organizations, folders, or billing accounts.
+  /// Only logs that have entries are listed.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Required. The resource name that owns the logs:
+  /// "projects/[PROJECT_ID]"
+  /// "organizations/[ORGANIZATION_ID]"
+  /// "billingAccounts/[BILLING_ACCOUNT_ID]"
+  /// "folders/[FOLDER_ID]"
+  ///
+  /// Value must have pattern "^[^/]+/[^/]+$".
+  ///
   /// [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
@@ -1858,14 +2212,14 @@
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
-  /// Completes with a [ListMonitoredResourceDescriptorsResponse].
+  /// Completes with a [ListLogsResponse].
   ///
   /// 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<ListMonitoredResourceDescriptorsResponse> list(
+  async.Future<ListLogsResponse> list(core.String parent,
       {core.String pageToken, core.int pageSize, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1874,6 +2228,9 @@
     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];
     }
@@ -1884,6 +2241,67 @@
       _queryParams["fields"] = [$fields];
     }
 
+    _url = 'v2/' + commons.Escaper.ecapeVariableReserved('$parent') + '/logs';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListLogsResponse.fromJson(data));
+  }
+}
+
+class MonitoredResourceDescriptorsResourceApi {
+  final commons.ApiRequester _requester;
+
+  MonitoredResourceDescriptorsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Lists the descriptors for monitored resource types used by Stackdriver
+  /// Logging.
+  ///
+  /// 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.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListMonitoredResourceDescriptorsResponse].
+  ///
+  /// 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<ListMonitoredResourceDescriptorsResponse> list(
+      {core.int pageSize, 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 (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
     _url = 'v2/monitoredResourceDescriptors';
 
     var _response = _requester.request(_url, "GET",
@@ -2083,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.
   ///
@@ -2103,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;
@@ -2114,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];
     }
@@ -2274,15 +2692,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.
   ///
@@ -2294,7 +2712,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;
@@ -2305,12 +2723,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];
     }
@@ -3118,15 +3536,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.
   ///
@@ -3138,7 +3556,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;
@@ -3149,12 +3567,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];
     }
@@ -3620,15 +4038,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.
   ///
@@ -3640,7 +4058,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;
@@ -3651,12 +4069,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];
     }
@@ -3847,6 +4265,332 @@
   }
 }
 
+class SinksResourceApi {
+  final commons.ApiRequester _requester;
+
+  SinksResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Creates a sink that exports specified log entries to a destination. The
+  /// export of newly-ingested log entries begins immediately, unless the sink's
+  /// writer_identity is not permitted to write to the destination. A sink can
+  /// export log entries only from the resource owning the sink.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Required. The resource in which to create the sink:
+  /// "projects/[PROJECT_ID]"
+  /// "organizations/[ORGANIZATION_ID]"
+  /// "billingAccounts/[BILLING_ACCOUNT_ID]"
+  /// "folders/[FOLDER_ID]"
+  /// Examples: "projects/my-logging-project", "organizations/123456789".
+  /// Value must have pattern "^[^/]+/[^/]+$".
+  ///
+  /// [uniqueWriterIdentity] - Optional. Determines the kind of IAM identity
+  /// returned as writer_identity in the new sink. If this value is omitted or
+  /// set to false, and if the sink's parent is a project, then the value
+  /// returned as writer_identity is the same group or service account used by
+  /// Stackdriver Logging before the addition of writer identities to this API.
+  /// The sink's destination must be in the same project as the sink itself.If
+  /// this field is set to true, or if the sink is owned by a non-project
+  /// resource such as an organization, then the value of writer_identity will
+  /// be a unique service account used only for exports from the new sink. For
+  /// more information, see writer_identity in LogSink.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [LogSink].
+  ///
+  /// 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<LogSink> create(LogSink request, core.String parent,
+      {core.bool uniqueWriterIdentity, 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 (uniqueWriterIdentity != null) {
+      _queryParams["uniqueWriterIdentity"] = ["${uniqueWriterIdentity}"];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v2/' + commons.Escaper.ecapeVariableReserved('$parent') + '/sinks';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new LogSink.fromJson(data));
+  }
+
+  /// Deletes a sink. If the sink has a unique writer_identity, then that
+  /// service account is also deleted.
+  ///
+  /// Request parameters:
+  ///
+  /// [sinkName] - Required. The full resource name of the sink to delete,
+  /// including the parent resource and the sink identifier:
+  /// "projects/[PROJECT_ID]/sinks/[SINK_ID]"
+  /// "organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]"
+  /// "billingAccounts/[BILLING_ACCOUNT_ID]/sinks/[SINK_ID]"
+  /// "folders/[FOLDER_ID]/sinks/[SINK_ID]"
+  /// Example: "projects/my-project-id/sinks/my-sink-id".
+  /// Value must have pattern "^[^/]+/[^/]+/sinks/[^/]+$".
+  ///
+  /// [$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 sinkName, {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 (sinkName == null) {
+      throw new core.ArgumentError("Parameter sinkName is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v2/' + commons.Escaper.ecapeVariableReserved('$sinkName');
+
+    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 a sink.
+  ///
+  /// Request parameters:
+  ///
+  /// [sinkName] - Required. The resource name of the sink:
+  /// "projects/[PROJECT_ID]/sinks/[SINK_ID]"
+  /// "organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]"
+  /// "billingAccounts/[BILLING_ACCOUNT_ID]/sinks/[SINK_ID]"
+  /// "folders/[FOLDER_ID]/sinks/[SINK_ID]"
+  /// Example: "projects/my-project-id/sinks/my-sink-id".
+  /// Value must have pattern "^[^/]+/[^/]+/sinks/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [LogSink].
+  ///
+  /// 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<LogSink> get(core.String sinkName, {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 (sinkName == null) {
+      throw new core.ArgumentError("Parameter sinkName is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v2/' + commons.Escaper.ecapeVariableReserved('$sinkName');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new LogSink.fromJson(data));
+  }
+
+  /// Lists sinks.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Required. The parent resource whose sinks are to be listed:
+  /// "projects/[PROJECT_ID]"
+  /// "organizations/[ORGANIZATION_ID]"
+  /// "billingAccounts/[BILLING_ACCOUNT_ID]"
+  /// "folders/[FOLDER_ID]"
+  ///
+  /// 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.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListSinksResponse].
+  ///
+  /// 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<ListSinksResponse> list(core.String parent,
+      {core.int pageSize, 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 (parent == null) {
+      throw new core.ArgumentError("Parameter parent is required.");
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v2/' + commons.Escaper.ecapeVariableReserved('$parent') + '/sinks';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListSinksResponse.fromJson(data));
+  }
+
+  /// Updates a sink. This method replaces the following fields in the existing
+  /// sink with values from the new sink: destination, and filter. The updated
+  /// sink might also have a new writer_identity; see the unique_writer_identity
+  /// field.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [sinkName] - Required. The full resource name of the sink to update,
+  /// including the parent resource and the sink identifier:
+  /// "projects/[PROJECT_ID]/sinks/[SINK_ID]"
+  /// "organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]"
+  /// "billingAccounts/[BILLING_ACCOUNT_ID]/sinks/[SINK_ID]"
+  /// "folders/[FOLDER_ID]/sinks/[SINK_ID]"
+  /// Example: "projects/my-project-id/sinks/my-sink-id".
+  /// Value must have pattern "^[^/]+/[^/]+/sinks/[^/]+$".
+  ///
+  /// [uniqueWriterIdentity] - Optional. See sinks.create for a description of
+  /// this field. When updating a sink, the effect of this field on the value of
+  /// writer_identity in the updated sink depends on both the old and new values
+  /// of this field:
+  /// If the old and new values of this field are both false or both true, then
+  /// there is no change to the sink's writer_identity.
+  /// If the old value is false and the new value is true, then writer_identity
+  /// is changed to a unique service account.
+  /// It is an error if the old value is true and the new value is set to false
+  /// or defaulted to false.
+  ///
+  /// [updateMask] - Optional. Field mask that specifies the fields in sink that
+  /// need an update. A sink field will be overwritten if, and only if, it is in
+  /// the update mask. name and output only fields cannot be updated.An empty
+  /// updateMask is temporarily treated as using the following mask for
+  /// backwards compatibility purposes:  destination,filter,includeChildren At
+  /// some point in the future, behavior will be removed and specifying an empty
+  /// updateMask will be an error.For a detailed FieldMask definition, see
+  /// https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmaskExample:
+  /// updateMask=filter.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [LogSink].
+  ///
+  /// 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<LogSink> update(LogSink request, core.String sinkName,
+      {core.bool uniqueWriterIdentity,
+      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 (sinkName == null) {
+      throw new core.ArgumentError("Parameter sinkName is required.");
+    }
+    if (uniqueWriterIdentity != null) {
+      _queryParams["uniqueWriterIdentity"] = ["${uniqueWriterIdentity}"];
+    }
+    if (updateMask != null) {
+      _queryParams["updateMask"] = [updateMask];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v2/' + commons.Escaper.ecapeVariableReserved('$sinkName');
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new LogSink.fromJson(data));
+  }
+}
+
 /// BucketOptions describes the bucket boundaries used to create a histogram for
 /// the distribution. The buckets can be in a linear sequence, an exponential
 /// sequence, or each bucket can be specified explicitly. BucketOptions does not
@@ -4650,6 +5394,12 @@
   /// if any.
   LogEntrySourceLocation sourceLocation;
 
+  /// Optional. The span ID within the trace associated with the log entry. For
+  /// Stackdriver Trace spans, this is the same format that the Stackdriver
+  /// Trace API v2 uses: a 16-character hexadecimal encoding of an 8-byte array,
+  /// such as <code>"000000000000004a"</code>.
+  core.String spanId;
+
   /// The log entry payload, represented as a Unicode string (UTF-8).
   core.String textPayload;
 
@@ -4658,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
@@ -4705,6 +5456,9 @@
       sourceLocation =
           new LogEntrySourceLocation.fromJson(_json["sourceLocation"]);
     }
+    if (_json.containsKey("spanId")) {
+      spanId = _json["spanId"];
+    }
     if (_json.containsKey("textPayload")) {
       textPayload = _json["textPayload"];
     }
@@ -4752,6 +5506,9 @@
     if (sourceLocation != null) {
       _json["sourceLocation"] = (sourceLocation).toJson();
     }
+    if (spanId != null) {
+      _json["spanId"] = spanId;
+    }
     if (textPayload != null) {
       _json["textPayload"] = textPayload;
     }
@@ -5339,14 +6096,13 @@
   /// Ki kibi (2**10)
   /// Mi mebi (2**20)
   /// Gi gibi (2**30)
-  /// Ti tebi (2**40)GrammarThe grammar includes the dimensionless unit 1, such
-  /// as 1/s.The grammar also includes these connectors:
+  /// Ti tebi (2**40)GrammarThe grammar also includes these connectors:
   /// / division (as an infix operator, e.g. 1/s).
   /// . multiplication (as an infix operator, e.g. GBy.d)The grammar for a unit
   /// is as follows:
   /// Expression = Component { "." Component } { "/" Component } ;
   ///
-  /// Component = [ PREFIX ] UNIT [ Annotation ]
+  /// Component = ( [ PREFIX ] UNIT | "%" ) [ Annotation ]
   ///           | Annotation
   ///           | "1"
   ///           ;
@@ -5358,6 +6114,9 @@
   /// == By/s.
   /// NAME is a sequence of non-blank printable ASCII characters not  containing
   /// '{' or '}'.
+  /// 1 represents dimensionless value 1, such as in 1/s.
+  /// % represents dimensionless value 1/100, and annotates values giving  a
+  /// percentage.
   core.String unit;
 
   /// Whether the measurement is an integer, a floating-point number, etc. Some
@@ -5968,6 +6727,11 @@
 
 /// The parameters to WriteLogEntries.
 class WriteLogEntriesRequest {
+  /// Optional. If true, the request should expect normal response, but the
+  /// entries won't be persisted nor exported. Useful for checking whether the
+  /// logging API endpoints are working properly before sending valuable data.
+  core.bool dryRun;
+
   /// Required. The log entries to send to Stackdriver Logging. The order of log
   /// entries in this list does not matter. Values supplied in this method's
   /// log_name, resource, and labels fields are copied into those log entries in
@@ -5979,10 +6743,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
@@ -6021,6 +6786,9 @@
   WriteLogEntriesRequest();
 
   WriteLogEntriesRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("dryRun")) {
+      dryRun = _json["dryRun"];
+    }
     if (_json.containsKey("entries")) {
       entries = _json["entries"]
           .map((value) => new LogEntry.fromJson(value))
@@ -6043,6 +6811,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (dryRun != null) {
+      _json["dryRun"] = dryRun;
+    }
     if (entries != null) {
       _json["entries"] = entries.map((value) => (value).toJson()).toList();
     }
diff --git a/googleapis/lib/manufacturers/v1.dart b/googleapis/lib/manufacturers/v1.dart
index b1b3a07..dad088c 100644
--- a/googleapis/lib/manufacturers/v1.dart
+++ b/googleapis/lib/manufacturers/v1.dart
@@ -191,12 +191,12 @@
   /// `account_id` - The ID of the Manufacturer Center account.
   /// Value must have pattern "^accounts/[^/]+$".
   ///
+  /// [pageToken] - The token returned by the previous request.
+  ///
   /// [pageSize] - Maximum number of product statuses to return in the response,
   /// used for
   /// paging.
   ///
-  /// [pageToken] - The token returned by the previous request.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -208,7 +208,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<ListProductsResponse> 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;
@@ -219,12 +219,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];
     }
@@ -241,18 +241,19 @@
     return _response.then((data) => new ListProductsResponse.fromJson(data));
   }
 
-  /// Inserts or updates the product in a Manufacturer Center account.
+  /// Uploads the product in a Manufacturer Center account.
   ///
   /// The checks at upload time are minimal. All required attributes need to be
   /// present for a product to be valid. Issues may show up later
-  /// after the API has accepted an update for a product and it is possible to
+  /// after the API has accepted a new upload for a product and it is possible
+  /// to
   /// overwrite an existing valid product with an invalid product. To detect
   /// this, you should retrieve the product and check it for issues once the
-  /// updated version is available.
+  /// new version is available.
   ///
-  /// Inserted or updated products first need to be processed before they can be
+  /// Uploaded products first need to be processed before they can be
   /// retrieved. Until then, new products will be unavailable, and retrieval
-  /// of updated products will return the original state of the product.
+  /// of uploaded products will return the original state of the product.
   ///
   /// [request] - The metadata request object.
   ///
@@ -279,15 +280,15 @@
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
-  /// Completes with a [Product].
+  /// 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<Product> update(
-      Product request, core.String parent, core.String name,
+  async.Future<Empty> uploadProduct(
+      Attributes request, core.String parent, core.String name,
       {core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -320,7 +321,7 @@
         uploadOptions: _uploadOptions,
         uploadMedia: _uploadMedia,
         downloadOptions: _downloadOptions);
-    return _response.then((data) => new Product.fromJson(data));
+    return _response.then((data) => new Empty.fromJson(data));
   }
 }
 
@@ -883,7 +884,7 @@
   /// https://support.google.com/manufacturers/answer/6124116.
   core.String attribute;
 
-  /// Description of the issue.
+  /// Longer description of the issue focused on how to resolve it.
   core.String description;
 
   /// The severity of the issue.
diff --git a/googleapis/lib/ml/v1.dart b/googleapis/lib/ml/v1.dart
index d663c66..10fafaa 100644
--- a/googleapis/lib/ml/v1.dart
+++ b/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 =>
@@ -92,8 +94,9 @@
   }
 
   /// Performs prediction on the data in the request.
-  ///
-  /// **** REMOVE FROM GENERATED DOCUMENTATION
+  /// Cloud ML Engine implements a custom `predict` verb on top of an HTTP POST
+  /// 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.
   ///
@@ -348,12 +351,24 @@
 
   /// 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.
   ///
@@ -534,6 +549,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/[^/]+$".
+  ///
+  /// [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.
+  ///
+  /// [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.
+  ///
+  /// [$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.int pageSize, 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 (parent == null) {
+      throw new core.ArgumentError("Parameter parent is required.");
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    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;
 
@@ -746,12 +879,20 @@
   /// 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
   /// listed.
   /// 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 models to retrieve per "page" of
   /// results. If there
   /// are more remaining results than this number, the response message will
@@ -759,10 +900,7 @@
   ///
   /// The default value is 20, and the maximum page size is 100.
   ///
-  /// [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.
+  /// [filter] - Optional. Specifies the subset of models to retrieve.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -775,7 +913,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<GoogleCloudMlV1ListModelsResponse> list(core.String parent,
-      {core.int pageSize, core.String pageToken, core.String $fields}) {
+      {core.String pageToken,
+      core.int pageSize,
+      core.String filter,
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -786,11 +927,14 @@
     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 (filter != null) {
+      _queryParams["filter"] = [filter];
     }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
@@ -833,13 +977,9 @@
   ///         "name":"version_1"
   ///       }
   ///     }
-  /// In this example, the model is blindly overwritten since no etag is given.
   ///
-  /// To adopt etag mechanism, include `etag` field in the mask, and include the
-  /// `etag` value in your model resource.
-  ///
-  /// Currently the supported update masks are `description`,
-  /// `default_version.name`, `labels`, and `etag`.
+  /// Currently the supported update masks are `description` and
+  /// `default_version.name`.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1173,9 +1313,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:
   ///
@@ -1194,6 +1337,8 @@
   ///
   /// The default value is 20, and the maximum page size is 100.
   ///
+  /// [filter] - Optional. Specifies the subset of versions to retrieve.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1205,7 +1350,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<GoogleCloudMlV1ListVersionsResponse> list(core.String parent,
-      {core.String pageToken, core.int pageSize, core.String $fields}) {
+      {core.String pageToken,
+      core.int pageSize,
+      core.String filter,
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1222,6 +1370,9 @@
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1260,14 +1411,8 @@
   ///     {
   ///       "description": "foo"
   ///     }
-  /// In this example, the version is blindly overwritten since no etag is
-  /// given.
   ///
-  /// To adopt etag mechanism, include `etag` field in the mask, and include the
-  /// `etag` value in your version resource.
-  ///
-  /// Currently the only supported update masks are `description`, `labels`, and
-  /// `etag`.
+  /// Currently the only supported update mask is`description`.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -1546,12 +1691,12 @@
   /// [name] - The name of the operation's parent resource.
   /// 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.
   ///
@@ -1563,9 +1708,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<GoogleLongrunningListOperationsResponse> 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();
@@ -1577,15 +1722,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];
     }
@@ -1780,6 +1925,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.
@@ -1827,6 +2008,9 @@
   /// The hyperparameters given to this trial.
   core.Map<core.String, core.String> hyperparameters;
 
+  /// True if the trial is stopped early.
+  core.bool isTrialStoppedEarly;
+
   /// The trial id for these results.
   core.String trialId;
 
@@ -1848,6 +2032,9 @@
     if (_json.containsKey("hyperparameters")) {
       hyperparameters = _json["hyperparameters"];
     }
+    if (_json.containsKey("isTrialStoppedEarly")) {
+      isTrialStoppedEarly = _json["isTrialStoppedEarly"];
+    }
     if (_json.containsKey("trialId")) {
       trialId = _json["trialId"];
     }
@@ -1866,6 +2053,9 @@
     if (hyperparameters != null) {
       _json["hyperparameters"] = hyperparameters;
     }
+    if (isTrialStoppedEarly != null) {
+      _json["isTrialStoppedEarly"] = isTrialStoppedEarly;
+    }
     if (trialId != null) {
       _json["trialId"] = trialId;
     }
@@ -1875,6 +2065,10 @@
 
 /// Represents a set of hyperparameters to optimize.
 class GoogleCloudMlV1HyperparameterSpec {
+  /// Optional. Indicates if the hyperparameter tuning job enables auto trial
+  /// early stopping.
+  core.bool enableTrialEarlyStopping;
+
   /// Required. The type of goal to use for tuning. Available types are
   /// `MAXIMIZE` and `MINIMIZE`.
   ///
@@ -1915,9 +2109,17 @@
   /// Required. The set of parameters to tune.
   core.List<GoogleCloudMlV1ParameterSpec> params;
 
+  /// Optional. The prior hyperparameter tuning job id that users hope to
+  /// continue with. The job id will be used to find the corresponding vizier
+  /// study guid and resume the study.
+  core.String resumePreviousJobId;
+
   GoogleCloudMlV1HyperparameterSpec();
 
   GoogleCloudMlV1HyperparameterSpec.fromJson(core.Map _json) {
+    if (_json.containsKey("enableTrialEarlyStopping")) {
+      enableTrialEarlyStopping = _json["enableTrialEarlyStopping"];
+    }
     if (_json.containsKey("goal")) {
       goal = _json["goal"];
     }
@@ -1935,11 +2137,17 @@
           .map((value) => new GoogleCloudMlV1ParameterSpec.fromJson(value))
           .toList();
     }
+    if (_json.containsKey("resumePreviousJobId")) {
+      resumePreviousJobId = _json["resumePreviousJobId"];
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (enableTrialEarlyStopping != null) {
+      _json["enableTrialEarlyStopping"] = enableTrialEarlyStopping;
+    }
     if (goal != null) {
       _json["goal"] = goal;
     }
@@ -1955,13 +2163,14 @@
     if (params != null) {
       _json["params"] = params.map((value) => (value).toJson()).toList();
     }
+    if (resumePreviousJobId != null) {
+      _json["resumePreviousJobId"] = resumePreviousJobId;
+    }
     return _json;
   }
 }
 
 /// Represents a training or prediction job.
-///
-/// Next ID: 16
 class GoogleCloudMlV1Job {
   /// Output only. When the job was created.
   core.String createTime;
@@ -2117,6 +2326,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.
@@ -2187,6 +2430,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,
@@ -2218,8 +2493,6 @@
 /// A model can have multiple versions, each of which is a deployed, trained
 /// model ready to receive prediction requests. The model itself is just a
 /// container.
-///
-/// Next ID: 8
 class GoogleCloudMlV1Model {
   /// Output only. The default version of the model. This version will be used
   /// to
@@ -2244,6 +2517,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.
@@ -2296,8 +2571,6 @@
 }
 
 /// Represents the metadata of the long-running operation.
-///
-/// Next ID: 9
 class GoogleCloudMlV1OperationMetadata {
   /// The time the operation was submitted.
   core.String createTime;
@@ -2319,8 +2592,12 @@
   /// - "DELETE_MODEL" : An operation to delete an existing model.
   /// - "UPDATE_MODEL" : An operation to update an existing model.
   /// - "UPDATE_VERSION" : An operation to update an existing version.
+  /// - "UPDATE_CONFIG" : An operation to update project configuration.
   core.String operationType;
 
+  /// Contains the project number associated with the operation.
+  core.String projectNumber;
+
   /// The time operation processing started.
   core.String startTime;
 
@@ -2345,6 +2622,9 @@
     if (_json.containsKey("operationType")) {
       operationType = _json["operationType"];
     }
+    if (_json.containsKey("projectNumber")) {
+      projectNumber = _json["projectNumber"];
+    }
     if (_json.containsKey("startTime")) {
       startTime = _json["startTime"];
     }
@@ -2371,6 +2651,9 @@
     if (operationType != null) {
       _json["operationType"] = operationType;
     }
+    if (projectNumber != null) {
+      _json["projectNumber"] = projectNumber;
+    }
     if (startTime != null) {
       _json["startTime"] = startTime;
     }
@@ -2496,193 +2779,6 @@
 }
 
 /// Request for predictions to be issued against a trained model.
-///
-/// The body of the request is a single JSON object with a single top-level
-/// field:
-///
-/// <dl>
-///   <dt>instances</dt>
-///   <dd>A JSON array containing values representing the instances to use for
-///       prediction.</dd>
-/// </dl>
-///
-/// The structure of each element of the instances list is determined by your
-/// model's input definition. Instances can include named inputs or can contain
-/// only unlabeled values.
-///
-/// Not all data includes named inputs. Some instances will be simple
-/// JSON values (boolean, number, or string). However, instances are often lists
-/// of simple values, or complex nested lists. Here are some examples of request
-/// bodies:
-///
-/// CSV data with each row encoded as a string value:
-/// <pre>
-/// {"instances": ["1.0,true,\\"x\\"", "-2.0,false,\\"y\\""]}
-/// </pre>
-/// Plain text:
-/// <pre>
-/// {"instances": ["the quick brown fox", "la bruja le dio"]}
-/// </pre>
-/// Sentences encoded as lists of words (vectors of strings):
-/// <pre>
-/// {
-///   "instances": [
-///     ["the","quick","brown"],
-///     ["la","bruja","le"],
-///     ...
-///   ]
-/// }
-/// </pre>
-/// Floating point scalar values:
-/// <pre>
-/// {"instances": [0.0, 1.1, 2.2]}
-/// </pre>
-/// Vectors of integers:
-/// <pre>
-/// {
-///   "instances": [
-///     [0, 1, 2],
-///     [3, 4, 5],
-///     ...
-///   ]
-/// }
-/// </pre>
-/// Tensors (in this case, two-dimensional tensors):
-/// <pre>
-/// {
-///   "instances": [
-///     [
-///       [0, 1, 2],
-///       [3, 4, 5]
-///     ],
-///     ...
-///   ]
-/// }
-/// </pre>
-/// Images can be represented different ways. In this encoding scheme the first
-/// two dimensions represent the rows and columns of the image, and the third
-/// contains lists (vectors) of the R, G, and B values for each pixel.
-/// <pre>
-/// {
-///   "instances": [
-///     [
-///       [
-///         [138, 30, 66],
-///         [130, 20, 56],
-///         ...
-///       ],
-///       [
-///         [126, 38, 61],
-///         [122, 24, 57],
-///         ...
-///       ],
-///       ...
-///     ],
-///     ...
-///   ]
-/// }
-/// </pre>
-/// JSON strings must be encoded as UTF-8. To send binary data, you must
-/// base64-encode the data and mark it as binary. To mark a JSON string
-/// as binary, replace it with a JSON object with a single attribute named
-/// `b64`:
-/// <pre>{"b64": "..."} </pre>
-/// For example:
-///
-/// Two Serialized tf.Examples (fake data, for illustrative purposes only):
-/// <pre>
-/// {"instances": [{"b64": "X5ad6u"}, {"b64": "IA9j4nx"}]}
-/// </pre>
-/// Two JPEG image byte strings (fake data, for illustrative purposes only):
-/// <pre>
-/// {"instances": [{"b64": "ASa8asdf"}, {"b64": "JLK7ljk3"}]}
-/// </pre>
-/// If your data includes named references, format each instance as a JSON
-/// object
-/// with the named references as the keys:
-///
-/// JSON input data to be preprocessed:
-/// <pre>
-/// {
-///   "instances": [
-///     {
-///       "a": 1.0,
-///       "b": true,
-///       "c": "x"
-///     },
-///     {
-///       "a": -2.0,
-///       "b": false,
-///       "c": "y"
-///     }
-///   ]
-/// }
-/// </pre>
-/// Some models have an underlying TensorFlow graph that accepts multiple input
-/// tensors. In this case, you should use the names of JSON name/value pairs to
-/// identify the input tensors, as shown in the following exmaples:
-///
-/// For a graph with input tensor aliases "tag" (string) and "image"
-/// (base64-encoded string):
-/// <pre>
-/// {
-///   "instances": [
-///     {
-///       "tag": "beach",
-///       "image": {"b64": "ASa8asdf"}
-///     },
-///     {
-///       "tag": "car",
-///       "image": {"b64": "JLK7ljk3"}
-///     }
-///   ]
-/// }
-/// </pre>
-/// For a graph with input tensor aliases "tag" (string) and "image"
-/// (3-dimensional array of 8-bit ints):
-/// <pre>
-/// {
-///   "instances": [
-///     {
-///       "tag": "beach",
-///       "image": [
-///         [
-///           [138, 30, 66],
-///           [130, 20, 56],
-///           ...
-///         ],
-///         [
-///           [126, 38, 61],
-///           [122, 24, 57],
-///           ...
-///         ],
-///         ...
-///       ]
-///     },
-///     {
-///       "tag": "car",
-///       "image": [
-///         [
-///           [255, 0, 102],
-///           [255, 0, 97],
-///           ...
-///         ],
-///         [
-///           [254, 1, 101],
-///           [254, 2, 93],
-///           ...
-///         ],
-///         ...
-///       ]
-///     },
-///     ...
-///   ]
-/// }
-/// </pre>
-/// If the call is successful, the response body will contain one prediction
-/// entry per instance in the request body. If prediction fails for any
-/// instance, the response body will contain no predictions and will contian
-/// a single error entry instead.
 class GoogleCloudMlV1PredictRequest {
   ///
   /// Required. The prediction request body.
@@ -2717,10 +2813,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.
@@ -2742,6 +2840,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
@@ -2751,6 +2851,16 @@
   /// such as when the model is specified by uri.
   core.String runtimeVersion;
 
+  /// Optional. The name of the signature defined in the SavedModel to use for
+  /// this job. Please refer to
+  /// [SavedModel](https://tensorflow.github.io/serving/serving_basic.html)
+  /// for information about how to use signatures.
+  ///
+  /// Defaults to
+  /// [DEFAULT_SERVING_SIGNATURE_DEF_KEY](https://www.tensorflow.org/api_docs/python/tf/saved_model/signature_constants)
+  /// , which is "serving_default".
+  core.String signatureName;
+
   /// Use this field if you want to specify a Google Cloud Storage path for
   /// the model to use.
   core.String uri;
@@ -2789,6 +2899,9 @@
     if (_json.containsKey("runtimeVersion")) {
       runtimeVersion = _json["runtimeVersion"];
     }
+    if (_json.containsKey("signatureName")) {
+      signatureName = _json["signatureName"];
+    }
     if (_json.containsKey("uri")) {
       uri = _json["uri"];
     }
@@ -2824,6 +2937,9 @@
     if (runtimeVersion != null) {
       _json["runtimeVersion"] = runtimeVersion;
     }
+    if (signatureName != null) {
+      _json["signatureName"] = signatureName;
+    }
     if (uri != null) {
       _json["uri"] = uri;
     }
@@ -2898,7 +3014,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;
@@ -2948,15 +3070,34 @@
   ///   <dt>standard_gpu</dt>
   ///   <dd>
   /// A machine equivalent to <code suppresswarning="true">standard</code> that
-  ///   also includes a
+  ///   also includes a single NVIDIA Tesla K80 GPU. See more about
   ///   <a href="/ml-engine/docs/how-tos/using-gpus">
-  ///   GPU that you can use in your trainer</a>.
+  ///   using GPUs for training your model</a>.
   ///   </dd>
   ///   <dt>complex_model_m_gpu</dt>
   ///   <dd>
   ///   A machine equivalent to
   ///   <code suppresswarning="true">complex_model_m</code> that also includes
-  ///   four GPUs.
+  ///   four NVIDIA Tesla K80 GPUs.
+  ///   </dd>
+  ///   <dt>complex_model_l_gpu</dt>
+  ///   <dd>
+  ///   A machine equivalent to
+  ///   <code suppresswarning="true">complex_model_l</code> that also includes
+  ///   eight NVIDIA Tesla K80 GPUs.
+  ///   </dd>
+  ///   <dt>standard_p100</dt>
+  ///   <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 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 Beta launch stage.
   ///   </dd>
   /// </dl>
   ///
@@ -2989,7 +3130,15 @@
   /// Required. The Python module name to run after installing the packages.
   core.String pythonModule;
 
+  /// Optional. The version of Python used in training. If not set, the default
+  /// 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
@@ -3078,6 +3227,9 @@
     if (_json.containsKey("pythonModule")) {
       pythonModule = _json["pythonModule"];
     }
+    if (_json.containsKey("pythonVersion")) {
+      pythonVersion = _json["pythonVersion"];
+    }
     if (_json.containsKey("region")) {
       region = _json["region"];
     }
@@ -3122,6 +3274,9 @@
     if (pythonModule != null) {
       _json["pythonModule"] = pythonModule;
     }
+    if (pythonVersion != null) {
+      _json["pythonVersion"] = pythonVersion;
+    }
     if (region != null) {
       _json["region"] = region;
     }
@@ -3203,7 +3358,6 @@
 /// information about all of the versions of a given model by calling
 /// [projects.models.versions.list](/ml-engine/reference/rest/v1/projects.models.versions/list).
 ///
-/// Next ID: 19
 /// LINT.IfChange
 class GoogleCloudMlV1Version {
   /// Automatically scale the number of nodes used to serve the model in
@@ -3266,10 +3420,17 @@
   /// Possible string values are:
   /// - "UNKNOWN" : The version state is unspecified.
   /// - "READY" : The version is ready for prediction.
-  /// - "CREATING" : The version is in the process of creation.
+  /// - "CREATING" : The version is being created. New UpdateVersion and
+  /// DeleteVersion
+  /// requests will fail if a version is in the CREATING state.
   /// - "FAILED" : The version failed to be created, possibly cancelled.
   /// `error_message` should contain the details of the failure.
-  /// - "DELETING" : The version is in the process of deletion.
+  /// - "DELETING" : The version is being deleted. New UpdateVersion and
+  /// DeleteVersion
+  /// requests will fail if a version is in the DELETING state.
+  /// - "UPDATING" : The version is being updated. New UpdateVersion and
+  /// DeleteVersion
+  /// requests will fail if a version is in the UPDATING state.
   core.String state;
 
   GoogleCloudMlV1Version();
@@ -3352,167 +3513,8 @@
   }
 }
 
-/// Specifies the audit configuration for a service.
-/// The configuration determines which permission types are logged, and what
-/// identities, if any, are exempted from logging.
-/// An AuditConfig must have one or more AuditLogConfigs.
-///
-/// If there are AuditConfigs for both `allServices` and a specific service,
-/// the union of the two AuditConfigs is used for that service: the log_types
-/// specified in each AuditConfig are enabled, and the exempted_members in each
-/// AuditConfig are exempted.
-///
-/// Example Policy with multiple AuditConfigs:
-///
-///     {
-///       "audit_configs": [
-///         {
-///           "service": "allServices"
-///           "audit_log_configs": [
-///             {
-///               "log_type": "DATA_READ",
-///               "exempted_members": [
-///                 "user:foo@gmail.com"
-///               ]
-///             },
-///             {
-///               "log_type": "DATA_WRITE",
-///             },
-///             {
-///               "log_type": "ADMIN_READ",
-///             }
-///           ]
-///         },
-///         {
-///           "service": "fooservice.googleapis.com"
-///           "audit_log_configs": [
-///             {
-///               "log_type": "DATA_READ",
-///             },
-///             {
-///               "log_type": "DATA_WRITE",
-///               "exempted_members": [
-///                 "user:bar@gmail.com"
-///               ]
-///             }
-///           ]
-///         }
-///       ]
-///     }
-///
-/// For fooservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ
-/// logging. It also exempts foo@gmail.com from DATA_READ logging, and
-/// bar@gmail.com from DATA_WRITE logging.
-class GoogleIamV1AuditConfig {
-  /// The configuration for logging of each type of permission.
-  /// Next ID: 4
-  core.List<GoogleIamV1AuditLogConfig> auditLogConfigs;
-  core.List<core.String> exemptedMembers;
-
-  /// Specifies a service that will be enabled for audit logging.
-  /// For example, `storage.googleapis.com`, `cloudsql.googleapis.com`.
-  /// `allServices` is a special value that covers all services.
-  core.String service;
-
-  GoogleIamV1AuditConfig();
-
-  GoogleIamV1AuditConfig.fromJson(core.Map _json) {
-    if (_json.containsKey("auditLogConfigs")) {
-      auditLogConfigs = _json["auditLogConfigs"]
-          .map((value) => new GoogleIamV1AuditLogConfig.fromJson(value))
-          .toList();
-    }
-    if (_json.containsKey("exemptedMembers")) {
-      exemptedMembers = _json["exemptedMembers"];
-    }
-    if (_json.containsKey("service")) {
-      service = _json["service"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (auditLogConfigs != null) {
-      _json["auditLogConfigs"] =
-          auditLogConfigs.map((value) => (value).toJson()).toList();
-    }
-    if (exemptedMembers != null) {
-      _json["exemptedMembers"] = exemptedMembers;
-    }
-    if (service != null) {
-      _json["service"] = service;
-    }
-    return _json;
-  }
-}
-
-/// Provides the configuration for logging a type of permissions.
-/// Example:
-///
-///     {
-///       "audit_log_configs": [
-///         {
-///           "log_type": "DATA_READ",
-///           "exempted_members": [
-///             "user:foo@gmail.com"
-///           ]
-///         },
-///         {
-///           "log_type": "DATA_WRITE",
-///         }
-///       ]
-///     }
-///
-/// This enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting
-/// foo@gmail.com from DATA_READ logging.
-class GoogleIamV1AuditLogConfig {
-  /// Specifies the identities that do not cause logging for this type of
-  /// permission.
-  /// Follows the same format of Binding.members.
-  core.List<core.String> exemptedMembers;
-
-  /// The log type that this config enables.
-  /// Possible string values are:
-  /// - "LOG_TYPE_UNSPECIFIED" : Default case. Should never be this.
-  /// - "ADMIN_READ" : Admin reads. Example: CloudIAM getIamPolicy
-  /// - "DATA_WRITE" : Data writes. Example: CloudSQL Users create
-  /// - "DATA_READ" : Data reads. Example: CloudSQL Users list
-  core.String logType;
-
-  GoogleIamV1AuditLogConfig();
-
-  GoogleIamV1AuditLogConfig.fromJson(core.Map _json) {
-    if (_json.containsKey("exemptedMembers")) {
-      exemptedMembers = _json["exemptedMembers"];
-    }
-    if (_json.containsKey("logType")) {
-      logType = _json["logType"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (exemptedMembers != null) {
-      _json["exemptedMembers"] = exemptedMembers;
-    }
-    if (logType != null) {
-      _json["logType"] = logType;
-    }
-    return _json;
-  }
-}
-
 /// Associates `members` with a `role`.
 class GoogleIamV1Binding {
-  /// The condition that is associated with this binding.
-  /// NOTE: an unsatisfied condition will not allow user access via current
-  /// binding. Different bindings, including their conditions, are examined
-  /// independently.
-  /// This field is GOOGLE_INTERNAL.
-  GoogleTypeExpr condition;
-
   /// Specifies the identities requesting access for a Cloud Platform resource.
   /// `members` can have the following values:
   ///
@@ -3545,9 +3547,6 @@
   GoogleIamV1Binding();
 
   GoogleIamV1Binding.fromJson(core.Map _json) {
-    if (_json.containsKey("condition")) {
-      condition = new GoogleTypeExpr.fromJson(_json["condition"]);
-    }
     if (_json.containsKey("members")) {
       members = _json["members"];
     }
@@ -3559,9 +3558,6 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
-    if (condition != null) {
-      _json["condition"] = (condition).toJson();
-    }
     if (members != null) {
       _json["members"] = members;
     }
@@ -3604,11 +3600,8 @@
 ///     }
 ///
 /// For a description of IAM and its features, see the
-/// [IAM developer's guide](https://cloud.google.com/iam).
+/// [IAM developer's guide](https://cloud.google.com/iam/docs).
 class GoogleIamV1Policy {
-  /// Specifies cloud audit logging configuration for this policy.
-  core.List<GoogleIamV1AuditConfig> auditConfigs;
-
   /// Associates a list of `members` to a `role`.
   /// `bindings` with no members will result in an error.
   core.List<GoogleIamV1Binding> bindings;
@@ -3634,19 +3627,12 @@
         convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
   }
 
-  core.bool iamOwned;
-
-  /// Version of the `Policy`. The default version is 0.
+  /// Deprecated.
   core.int version;
 
   GoogleIamV1Policy();
 
   GoogleIamV1Policy.fromJson(core.Map _json) {
-    if (_json.containsKey("auditConfigs")) {
-      auditConfigs = _json["auditConfigs"]
-          .map((value) => new GoogleIamV1AuditConfig.fromJson(value))
-          .toList();
-    }
     if (_json.containsKey("bindings")) {
       bindings = _json["bindings"]
           .map((value) => new GoogleIamV1Binding.fromJson(value))
@@ -3655,9 +3641,6 @@
     if (_json.containsKey("etag")) {
       etag = _json["etag"];
     }
-    if (_json.containsKey("iamOwned")) {
-      iamOwned = _json["iamOwned"];
-    }
     if (_json.containsKey("version")) {
       version = _json["version"];
     }
@@ -3666,19 +3649,12 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
-    if (auditConfigs != null) {
-      _json["auditConfigs"] =
-          auditConfigs.map((value) => (value).toJson()).toList();
-    }
     if (bindings != null) {
       _json["bindings"] = bindings.map((value) => (value).toJson()).toList();
     }
     if (etag != null) {
       _json["etag"] = etag;
     }
-    if (iamOwned != null) {
-      _json["iamOwned"] = iamOwned;
-    }
     if (version != null) {
       _json["version"] = version;
     }
@@ -3694,23 +3670,12 @@
   /// might reject them.
   GoogleIamV1Policy policy;
 
-  /// OPTIONAL: A FieldMask specifying which fields of the policy to modify.
-  /// Only
-  /// the fields in the mask will be modified. If no mask is provided, the
-  /// following default mask is used:
-  /// paths: "bindings, etag"
-  /// This field is only used by Cloud IAM.
-  core.String updateMask;
-
   GoogleIamV1SetIamPolicyRequest();
 
   GoogleIamV1SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey("policy")) {
       policy = new GoogleIamV1Policy.fromJson(_json["policy"]);
     }
-    if (_json.containsKey("updateMask")) {
-      updateMask = _json["updateMask"];
-    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -3719,9 +3684,6 @@
     if (policy != null) {
       _json["policy"] = (policy).toJson();
     }
-    if (updateMask != null) {
-      _json["updateMask"] = updateMask;
-    }
     return _json;
   }
 }
@@ -4014,65 +3976,3 @@
     return _json;
   }
 }
-
-/// Represents an expression text. Example:
-///
-///     title: "User account presence"
-///     description: "Determines whether the request has a user account"
-///     expression: "size(request.user) > 0"
-class GoogleTypeExpr {
-  /// 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;
-
-  GoogleTypeExpr();
-
-  GoogleTypeExpr.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;
-  }
-}
diff --git a/googleapis/lib/monitoring/v3.dart b/googleapis/lib/monitoring/v3.dart
index 424bc1a..6ac2f38 100644
--- a/googleapis/lib/monitoring/v3.dart
+++ b/googleapis/lib/monitoring/v3.dart
@@ -290,17 +290,6 @@
   /// "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
-  /// returned by the childrenOfGroup filter, and includes children-of-children,
-  /// and so forth.
-  ///
   /// [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
@@ -316,6 +305,17 @@
   /// 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.
+  ///
+  /// [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
+  /// returned by the childrenOfGroup filter, and includes children-of-children,
+  /// and so forth.
+  ///
   /// [$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 childrenOfGroup,
-      core.String descendantsOfGroup,
-      core.String pageToken,
+      {core.String pageToken,
       core.int pageSize,
       core.String ancestorsOfGroup,
+      core.String childrenOfGroup,
+      core.String descendantsOfGroup,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -343,12 +343,6 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
-    if (childrenOfGroup != null) {
-      _queryParams["childrenOfGroup"] = [childrenOfGroup];
-    }
-    if (descendantsOfGroup != null) {
-      _queryParams["descendantsOfGroup"] = [descendantsOfGroup];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
@@ -358,6 +352,12 @@
     if (ancestorsOfGroup != null) {
       _queryParams["ancestorsOfGroup"] = [ancestorsOfGroup];
     }
+    if (childrenOfGroup != null) {
+      _queryParams["childrenOfGroup"] = [childrenOfGroup];
+    }
+    if (descendantsOfGroup != null) {
+      _queryParams["descendantsOfGroup"] = [descendantsOfGroup];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -461,13 +461,13 @@
   /// 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.
-  ///
   /// [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.
   ///
@@ -482,8 +482,8 @@
       {core.String interval_endTime,
       core.String filter,
       core.String pageToken,
-      core.int pageSize,
       core.String interval_startTime,
+      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -504,12 +504,12 @@
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
     if (interval_startTime != null) {
       _queryParams["interval.startTime"] = [interval_startTime];
     }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -956,9 +956,36 @@
   /// "projects/{project_id_or_number}".
   /// Value must have pattern "^projects/[^/]+$".
   ///
-  /// [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_groupByFields] - The set of fields to preserve when
+  /// crossSeriesReducer is specified. The groupByFields determine how the time
+  /// series are partitioned into subsets prior to applying the aggregation
+  /// function. Each subset contains time series that have the same value for
+  /// each of the grouping fields. Each individual time series is a member of
+  /// exactly one subset. The crossSeriesReducer is applied to each subset of
+  /// time series. It is not possible to reduce across different resource types,
+  /// so this field implicitly contains resource.type. Fields not specified in
+  /// groupByFields are aggregated away. If groupByFields is not specified and
+  /// all the time series have the same resource type, then the time series are
+  /// 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] - Unsupported: must be left blank. The points in each time
+  /// series are returned in reverse time order.
   ///
   /// [aggregation_crossSeriesReducer] - The approach to be used to combine time
   /// series. Not all reducer functions may be applied to all time series,
@@ -977,6 +1004,7 @@
   /// - "REDUCE_STDDEV" : A REDUCE_STDDEV.
   /// - "REDUCE_COUNT" : A REDUCE_COUNT.
   /// - "REDUCE_COUNT_TRUE" : A REDUCE_COUNT_TRUE.
+  /// - "REDUCE_COUNT_FALSE" : A REDUCE_COUNT_FALSE.
   /// - "REDUCE_FRACTION_TRUE" : A REDUCE_FRACTION_TRUE.
   /// - "REDUCE_PERCENTILE_99" : A REDUCE_PERCENTILE_99.
   /// - "REDUCE_PERCENTILE_95" : A REDUCE_PERCENTILE_95.
@@ -1015,11 +1043,13 @@
   /// - "ALIGN_SUM" : A ALIGN_SUM.
   /// - "ALIGN_STDDEV" : A ALIGN_STDDEV.
   /// - "ALIGN_COUNT_TRUE" : A ALIGN_COUNT_TRUE.
+  /// - "ALIGN_COUNT_FALSE" : A ALIGN_COUNT_FALSE.
   /// - "ALIGN_FRACTION_TRUE" : A ALIGN_FRACTION_TRUE.
   /// - "ALIGN_PERCENTILE_99" : A ALIGN_PERCENTILE_99.
   /// - "ALIGN_PERCENTILE_95" : A ALIGN_PERCENTILE_95.
   /// - "ALIGN_PERCENTILE_50" : A ALIGN_PERCENTILE_50.
   /// - "ALIGN_PERCENTILE_05" : A ALIGN_PERCENTILE_05.
+  /// - "ALIGN_PERCENT_CHANGE" : A ALIGN_PERCENT_CHANGE.
   ///
   /// [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
@@ -1030,34 +1060,6 @@
   /// - "FULL" : A FULL.
   /// - "HEADERS" : A HEADERS.
   ///
-  /// [aggregation_groupByFields] - The set of fields to preserve when
-  /// crossSeriesReducer is specified. The groupByFields determine how the time
-  /// series are partitioned into subsets prior to applying the aggregation
-  /// function. Each subset contains time series that have the same value for
-  /// each of the grouping fields. Each individual time series is a member of
-  /// exactly one subset. The crossSeriesReducer is applied to each subset of
-  /// time series. It is not possible to reduce across different resource types,
-  /// so this field implicitly contains resource.type. Fields not specified in
-  /// groupByFields are aggregated away. If groupByFields is not specified and
-  /// all the time series have the same resource type, then the time series are
-  /// 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.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1069,17 +1071,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 orderBy,
+      {core.List<core.String> aggregation_groupByFields,
+      core.String interval_endTime,
+      core.String aggregation_alignmentPeriod,
+      core.int pageSize,
+      core.String orderBy,
       core.String aggregation_crossSeriesReducer,
       core.String filter,
       core.String pageToken,
       core.String aggregation_perSeriesAligner,
       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 $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1091,6 +1093,20 @@
     if (name == null) {
       throw new core.ArgumentError("Parameter name is required.");
     }
+    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];
     }
@@ -1116,20 +1132,6 @@
     if (view != null) {
       _queryParams["view"] = [view];
     }
-    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 ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1159,8 +1161,8 @@
   ///
   /// Request parameters:
   ///
-  /// [parent] - The project in which to create the uptime check. The format
-  /// is:projects/[PROJECT_ID].
+  /// [parent] - The project in which to create the uptime check. The format  is
+  /// projects/[PROJECT_ID].
   /// Value must have pattern "^projects/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -1212,8 +1214,8 @@
   ///
   /// Request parameters:
   ///
-  /// [name] - The uptime check configuration to delete. The format
-  /// isprojects/[PROJECT_ID]/uptimeCheckConfigs/[UPTIME_CHECK_ID].
+  /// [name] - The uptime check configuration to delete. The format  is
+  /// projects/[PROJECT_ID]/uptimeCheckConfigs/[UPTIME_CHECK_ID].
   /// Value must have pattern "^projects/[^/]+/uptimeCheckConfigs/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -1256,8 +1258,8 @@
   ///
   /// Request parameters:
   ///
-  /// [name] - The uptime check configuration to retrieve. The format
-  /// isprojects/[PROJECT_ID]/uptimeCheckConfigs/[UPTIME_CHECK_ID].
+  /// [name] - The uptime check configuration to retrieve. The format  is
+  /// projects/[PROJECT_ID]/uptimeCheckConfigs/[UPTIME_CHECK_ID].
   /// Value must have pattern "^projects/[^/]+/uptimeCheckConfigs/[^/]+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -1302,7 +1304,7 @@
   /// Request parameters:
   ///
   /// [parent] - The project whose uptime check configurations are listed. The
-  /// format isprojects/[PROJECT_ID].
+  /// format  is projects/[PROJECT_ID].
   /// Value must have pattern "^projects/[^/]+$".
   ///
   /// [pageToken] - If this field is not empty then it must contain the
@@ -1381,9 +1383,6 @@
   /// configuration. If this field is empty, then the current configuration is
   /// completely replaced with the new configuration.
   ///
-  /// [name1] - The uptime check configuration to update. The format
-  /// isprojects/[PROJECT_ID]/uptimeCheckConfigs/[UPTIME_CHECK_ID].
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1396,7 +1395,7 @@
   /// this method will complete with the same error.
   async.Future<UptimeCheckConfig> patch(
       UptimeCheckConfig request, core.String name,
-      {core.String updateMask, core.String name1, core.String $fields}) {
+      {core.String updateMask, core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1413,9 +1412,6 @@
     if (updateMask != null) {
       _queryParams["updateMask"] = [updateMask];
     }
-    if (name1 != null) {
-      _queryParams["name1"] = [name1];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -2359,7 +2355,8 @@
   /// desired values as described at
   /// https://www.w3.org/Protocols/rfc2616/rfc2616.txt (page 31). Entering two
   /// separate headers with the same key in a Create call will cause the first
-  /// to be overwritten by the second.
+  /// to be overwritten by the second. The maximum number of headers allowed is
+  /// 100.
   core.Map<core.String, core.String> headers;
 
   /// Boolean specifiying whether to encrypt the header information. Encryption
@@ -2430,6 +2427,67 @@
   }
 }
 
+/// Nimbus InternalCheckers.
+class InternalChecker {
+  /// The checker ID.
+  core.String checkerId;
+
+  /// The checker's human-readable name.
+  core.String displayName;
+
+  /// The GCP zone the uptime check should egress from. Only respected for
+  /// internal uptime checks, where internal_network is specified.
+  core.String gcpZone;
+
+  /// The internal network to perform this uptime check on.
+  core.String network;
+
+  /// The GCP project ID. Not necessarily the same as the project_id for the
+  /// config.
+  core.String projectId;
+
+  InternalChecker();
+
+  InternalChecker.fromJson(core.Map _json) {
+    if (_json.containsKey("checkerId")) {
+      checkerId = _json["checkerId"];
+    }
+    if (_json.containsKey("displayName")) {
+      displayName = _json["displayName"];
+    }
+    if (_json.containsKey("gcpZone")) {
+      gcpZone = _json["gcpZone"];
+    }
+    if (_json.containsKey("network")) {
+      network = _json["network"];
+    }
+    if (_json.containsKey("projectId")) {
+      projectId = _json["projectId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (checkerId != null) {
+      _json["checkerId"] = checkerId;
+    }
+    if (displayName != null) {
+      _json["displayName"] = displayName;
+    }
+    if (gcpZone != null) {
+      _json["gcpZone"] = gcpZone;
+    }
+    if (network != null) {
+      _json["network"] = network;
+    }
+    if (projectId != null) {
+      _json["projectId"] = projectId;
+    }
+    return _json;
+  }
+}
+
 /// A description of a label.
 class LabelDescriptor {
   /// A human-readable description for the label.
@@ -2722,6 +2780,10 @@
   /// request message's page_token field).
   core.String nextPageToken;
 
+  /// The total number of uptime check configurations for the project,
+  /// irrespective of any pagination.
+  core.int totalSize;
+
   /// The returned uptime check configurations.
   core.List<UptimeCheckConfig> uptimeCheckConfigs;
 
@@ -2731,6 +2793,9 @@
     if (_json.containsKey("nextPageToken")) {
       nextPageToken = _json["nextPageToken"];
     }
+    if (_json.containsKey("totalSize")) {
+      totalSize = _json["totalSize"];
+    }
     if (_json.containsKey("uptimeCheckConfigs")) {
       uptimeCheckConfigs = _json["uptimeCheckConfigs"]
           .map((value) => new UptimeCheckConfig.fromJson(value))
@@ -2744,6 +2809,9 @@
     if (nextPageToken != null) {
       _json["nextPageToken"] = nextPageToken;
     }
+    if (totalSize != null) {
+      _json["totalSize"] = totalSize;
+    }
     if (uptimeCheckConfigs != null) {
       _json["uptimeCheckConfigs"] =
           uptimeCheckConfigs.map((value) => (value).toJson()).toList();
@@ -2871,54 +2939,11 @@
   /// "appengine.googleapis.com/http/server/response_latencies"
   core.String type;
 
-  /// The unit in which the metric value is reported. It is only applicable if
-  /// the value_type is INT64, DOUBLE, or DISTRIBUTION. The supported units are
-  /// a subset of The Unified Code for Units of Measure
-  /// (http://unitsofmeasure.org/ucum.html) standard:Basic units (UNIT)
-  /// bit bit
-  /// By byte
-  /// s second
-  /// min minute
-  /// h hour
-  /// d dayPrefixes (PREFIX)
-  /// k kilo (10**3)
-  /// M mega (10**6)
-  /// G giga (10**9)
-  /// T tera (10**12)
-  /// P peta (10**15)
-  /// E exa (10**18)
-  /// Z zetta (10**21)
-  /// Y yotta (10**24)
-  /// m milli (10**-3)
-  /// u micro (10**-6)
-  /// n nano (10**-9)
-  /// p pico (10**-12)
-  /// f femto (10**-15)
-  /// a atto (10**-18)
-  /// z zepto (10**-21)
-  /// y yocto (10**-24)
-  /// Ki kibi (2**10)
-  /// Mi mebi (2**20)
-  /// Gi gibi (2**30)
-  /// Ti tebi (2**40)GrammarThe grammar includes the dimensionless unit 1, such
-  /// as 1/s.The grammar also includes these connectors:
-  /// / division (as an infix operator, e.g. 1/s).
-  /// . multiplication (as an infix operator, e.g. GBy.d)The grammar for a unit
-  /// is as follows:
-  /// Expression = Component { "." Component } { "/" Component } ;
-  ///
-  /// Component = [ PREFIX ] UNIT [ Annotation ]
-  ///           | Annotation
-  ///           | "1"
-  ///           ;
-  ///
-  /// Annotation = "{" NAME "}" ;
-  /// Notes:
-  /// Annotation is just a comment if it follows a UNIT and is  equivalent to 1
-  /// if it is used alone. For examples,  {requests}/s == 1/s, By{transmitted}/s
-  /// == By/s.
-  /// NAME is a sequence of non-blank printable ASCII characters not  containing
-  /// '{' or '}'.
+  /// Optional. The unit in which the metric value is reported. For example,
+  /// kBy/s means kilobytes/sec, and 1 is the dimensionless unit. The supported
+  /// units are a subset of The Unified Code for Units of Measure standard
+  /// (http://unitsofmeasure.org/ucum.html).<br><br> This field is part of the
+  /// metric's documentation, but it is ignored by Stackdriver.
   core.String unit;
 
   /// Whether the measurement is an integer, a floating-point number, etc. Some
@@ -3124,6 +3149,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 {
@@ -3247,8 +3320,9 @@
   /// 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).
-  /// - "AWS_ELB_LOAD_BALANCER" : A group of AWS load balancers.
+  /// - "INSTANCE" : A group of instances from Google Cloud Platform (GCP) or
+  /// Amazon Web Services (AWS).
+  /// - "AWS_ELB_LOAD_BALANCER" : A group of Amazon ELB load balancers.
   core.String resourceType;
 
   ResourceGroup();
@@ -3447,6 +3521,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;
@@ -3469,13 +3548,13 @@
   /// and sets a new start time for the following points.
   core.String metricKind;
 
-  /// The data points of this time series. When listing time series, the order
-  /// of the points is specified by the list method.When creating a time series,
-  /// this field must contain exactly one point and the point's type must be the
-  /// same as the value type of the associated metric. If the associated
-  /// metric's descriptor must be auto-created, then the value type of the
-  /// descriptor is determined by the point's type, which must be BOOL, INT64,
-  /// DOUBLE, or DISTRIBUTION.
+  /// The data points of this time series. When listing time series, points are
+  /// returned in reverse time order.When creating a time series, this field
+  /// must contain exactly one point and the point's type must be the same as
+  /// the value type of the associated metric. If the associated metric's
+  /// descriptor must be auto-created, then the value type of the descriptor is
+  /// determined by the point's type, which must be BOOL, INT64, DOUBLE, or
+  /// DISTRIBUTION.
   core.List<Point> points;
 
   /// The associated monitored resource. Custom metrics can use only certain
@@ -3502,6 +3581,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"]);
     }
@@ -3523,6 +3605,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();
     }
@@ -3694,7 +3779,18 @@
   /// Contains information needed to make an HTTP or HTTPS check.
   HttpCheck httpCheck;
 
-  /// The monitored resource associated with the configuration.
+  /// The internal checkers that this check will egress from. If is_internal is
+  /// true and this list is empty, the check will egress from all
+  /// InternalCheckers configured for the project that owns this CheckConfig.
+  core.List<InternalChecker> internalCheckers;
+
+  /// Denotes whether this is a check that egresses from InternalCheckers.
+  core.bool isInternal;
+
+  /// The monitored resource (https://cloud.google.com/monitoring/api/resources)
+  /// associated with the configuration. The following monitored resource types
+  /// are supported for uptime checks:  uptime_url  gce_instance  gae_app
+  /// aws_ec2_instance  aws_elb_load_balancer
   MonitoredResource monitoredResource;
 
   /// A unique resource name for this UptimeCheckConfig. The format
@@ -3703,8 +3799,9 @@
   /// the resource name is assigned by the server and included in the response.
   core.String name;
 
-  /// How often the uptime check is performed. Currently, only 1, 5, 10, and 15
-  /// minutes are supported. Required.
+  /// How often, in seconds, the uptime check is performed. Currently, the only
+  /// supported values are 60s (1 minute), 300s (5 minutes), 600s (10 minutes),
+  /// and 900s (15 minutes). Required.
   core.String period;
 
   /// The group resource associated with the configuration.
@@ -3737,6 +3834,14 @@
     if (_json.containsKey("httpCheck")) {
       httpCheck = new HttpCheck.fromJson(_json["httpCheck"]);
     }
+    if (_json.containsKey("internalCheckers")) {
+      internalCheckers = _json["internalCheckers"]
+          .map((value) => new InternalChecker.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("isInternal")) {
+      isInternal = _json["isInternal"];
+    }
     if (_json.containsKey("monitoredResource")) {
       monitoredResource =
           new MonitoredResource.fromJson(_json["monitoredResource"]);
@@ -3774,6 +3879,13 @@
     if (httpCheck != null) {
       _json["httpCheck"] = (httpCheck).toJson();
     }
+    if (internalCheckers != null) {
+      _json["internalCheckers"] =
+          internalCheckers.map((value) => (value).toJson()).toList();
+    }
+    if (isInternal != null) {
+      _json["isInternal"] = isInternal;
+    }
     if (monitoredResource != null) {
       _json["monitoredResource"] = (monitoredResource).toJson();
     }
diff --git a/googleapis/lib/oauth2/v2.dart b/googleapis/lib/oauth2/v2.dart
index 1c334d7..92eab9e 100644
--- a/googleapis/lib/oauth2/v2.dart
+++ b/googleapis/lib/oauth2/v2.dart
@@ -4,7 +4,6 @@
 
 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;
diff --git a/googleapis/lib/oslogin/v1.dart b/googleapis/lib/oslogin/v1.dart
new file mode 100644
index 0000000..2bceb0a
--- /dev/null
+++ b/googleapis/lib/oslogin/v1.dart
@@ -0,0 +1,597 @@
+// This is a generated file (see the discoveryapis_generator project).
+
+library googleapis.oslogin.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 oslogin/v1';
+
+/// Manages OS login configuration for Google account users.
+class OsloginApi {
+  /// View and manage your data across Google Cloud Platform services
+  static const CloudPlatformScope =
+      "https://www.googleapis.com/auth/cloud-platform";
+
+  /// View and manage your Google Compute Engine resources
+  static const ComputeScope = "https://www.googleapis.com/auth/compute";
+
+  final commons.ApiRequester _requester;
+
+  UsersResourceApi get users => new UsersResourceApi(_requester);
+
+  OsloginApi(http.Client client,
+      {core.String rootUrl: "https://oslogin.googleapis.com/",
+      core.String servicePath: ""})
+      : _requester =
+            new commons.ApiRequester(client, rootUrl, servicePath, USER_AGENT);
+}
+
+class UsersResourceApi {
+  final commons.ApiRequester _requester;
+
+  UsersProjectsResourceApi get projects =>
+      new UsersProjectsResourceApi(_requester);
+  UsersSshPublicKeysResourceApi get sshPublicKeys =>
+      new UsersSshPublicKeysResourceApi(_requester);
+
+  UsersResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Retrieves the profile information used for logging in to a virtual machine
+  /// on Google Compute Engine.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - The unique ID for the user in format `users/{user}`.
+  /// Value must have pattern "^users/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [LoginProfile].
+  ///
+  /// 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<LoginProfile> getLoginProfile(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') +
+        '/loginProfile';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new LoginProfile.fromJson(data));
+  }
+
+  /// Adds an SSH public key and returns the profile information. Default POSIX
+  /// account information is set when no username and UID exist as part of the
+  /// login profile.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - The unique ID for the user in format `users/{user}`.
+  /// Value must have pattern "^users/[^/]+$".
+  ///
+  /// [projectId] - The project ID of the Google Cloud Platform project.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ImportSshPublicKeyResponse].
+  ///
+  /// 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<ImportSshPublicKeyResponse> importSshPublicKey(
+      SshPublicKey request, core.String parent,
+      {core.String projectId, 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 (projectId != null) {
+      _queryParams["projectId"] = [projectId];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' +
+        commons.Escaper.ecapeVariableReserved('$parent') +
+        ':importSshPublicKey';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new ImportSshPublicKeyResponse.fromJson(data));
+  }
+}
+
+class UsersProjectsResourceApi {
+  final commons.ApiRequester _requester;
+
+  UsersProjectsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Deletes a POSIX account.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - A reference to the POSIX account to update. POSIX accounts are
+  /// identified
+  /// by the project ID they are associated with. A reference to the POSIX
+  /// account is in format `users/{user}/projects/{project}`.
+  /// Value must have pattern "^users/[^/]+/projects/[^/]+$".
+  ///
+  /// [$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));
+  }
+}
+
+class UsersSshPublicKeysResourceApi {
+  final commons.ApiRequester _requester;
+
+  UsersSshPublicKeysResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Deletes an SSH public key.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - The fingerprint of the public key to update. Public keys are
+  /// identified by
+  /// their SHA-256 fingerprint. The fingerprint of the public key is in format
+  /// `users/{user}/sshPublicKeys/{fingerprint}`.
+  /// Value must have pattern "^users/[^/]+/sshPublicKeys/[^/]+$".
+  ///
+  /// [$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));
+  }
+
+  /// Retrieves an SSH public key.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - The fingerprint of the public key to retrieve. Public keys are
+  /// identified
+  /// by their SHA-256 fingerprint. The fingerprint of the public key is in
+  /// format `users/{user}/sshPublicKeys/{fingerprint}`.
+  /// Value must have pattern "^users/[^/]+/sshPublicKeys/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [SshPublicKey].
+  ///
+  /// 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<SshPublicKey> 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 SshPublicKey.fromJson(data));
+  }
+
+  /// Updates an SSH public key and returns the profile information. This method
+  /// supports patch semantics.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - The fingerprint of the public key to update. Public keys are
+  /// identified by
+  /// their SHA-256 fingerprint. The fingerprint of the public key is in format
+  /// `users/{user}/sshPublicKeys/{fingerprint}`.
+  /// Value must have pattern "^users/[^/]+/sshPublicKeys/[^/]+$".
+  ///
+  /// [updateMask] - Mask to control which fields get updated. Updates all if
+  /// not present.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [SshPublicKey].
+  ///
+  /// 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<SshPublicKey> patch(SshPublicKey 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 SshPublicKey.fromJson(data));
+  }
+}
+
+/// 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 response message for importing an SSH public key.
+class ImportSshPublicKeyResponse {
+  /// The login profile information for the user.
+  LoginProfile loginProfile;
+
+  ImportSshPublicKeyResponse();
+
+  ImportSshPublicKeyResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("loginProfile")) {
+      loginProfile = new LoginProfile.fromJson(_json["loginProfile"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (loginProfile != null) {
+      _json["loginProfile"] = (loginProfile).toJson();
+    }
+    return _json;
+  }
+}
+
+/// The user profile information used for logging in to a virtual machine on
+/// Google Compute Engine.
+class LoginProfile {
+  /// A unique user ID.
+  core.String name;
+
+  /// The list of POSIX accounts associated with the user.
+  core.List<PosixAccount> posixAccounts;
+
+  /// A map from SSH public key fingerprint to the associated key object.
+  core.Map<core.String, SshPublicKey> sshPublicKeys;
+
+  LoginProfile();
+
+  LoginProfile.fromJson(core.Map _json) {
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("posixAccounts")) {
+      posixAccounts = _json["posixAccounts"]
+          .map((value) => new PosixAccount.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("sshPublicKeys")) {
+      sshPublicKeys =
+          commons.mapMap<core.Map<core.String, core.Object>, SshPublicKey>(
+              _json["sshPublicKeys"],
+              (core.Map<core.String, core.Object> item) =>
+                  new SshPublicKey.fromJson(item));
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (posixAccounts != null) {
+      _json["posixAccounts"] =
+          posixAccounts.map((value) => (value).toJson()).toList();
+    }
+    if (sshPublicKeys != null) {
+      _json["sshPublicKeys"] =
+          commons.mapMap<SshPublicKey, core.Map<core.String, core.Object>>(
+              sshPublicKeys, (SshPublicKey item) => (item).toJson());
+    }
+    return _json;
+  }
+}
+
+/// The POSIX account information associated with a Google account.
+class PosixAccount {
+  /// Output only. A POSIX account identifier.
+  core.String accountId;
+
+  /// The GECOS (user information) entry for this account.
+  core.String gecos;
+
+  /// The default group ID.
+  core.String gid;
+
+  /// The path to the home directory for this account.
+  core.String homeDirectory;
+
+  /// Only one POSIX account can be marked as primary.
+  core.bool primary;
+
+  /// The path to the logic shell for this account.
+  core.String shell;
+
+  /// System identifier for which account the username or uid applies to.
+  /// By default, the empty value is used.
+  core.String systemId;
+
+  /// The user ID.
+  core.String uid;
+
+  /// The username of the POSIX account.
+  core.String username;
+
+  PosixAccount();
+
+  PosixAccount.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("gecos")) {
+      gecos = _json["gecos"];
+    }
+    if (_json.containsKey("gid")) {
+      gid = _json["gid"];
+    }
+    if (_json.containsKey("homeDirectory")) {
+      homeDirectory = _json["homeDirectory"];
+    }
+    if (_json.containsKey("primary")) {
+      primary = _json["primary"];
+    }
+    if (_json.containsKey("shell")) {
+      shell = _json["shell"];
+    }
+    if (_json.containsKey("systemId")) {
+      systemId = _json["systemId"];
+    }
+    if (_json.containsKey("uid")) {
+      uid = _json["uid"];
+    }
+    if (_json.containsKey("username")) {
+      username = _json["username"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (gecos != null) {
+      _json["gecos"] = gecos;
+    }
+    if (gid != null) {
+      _json["gid"] = gid;
+    }
+    if (homeDirectory != null) {
+      _json["homeDirectory"] = homeDirectory;
+    }
+    if (primary != null) {
+      _json["primary"] = primary;
+    }
+    if (shell != null) {
+      _json["shell"] = shell;
+    }
+    if (systemId != null) {
+      _json["systemId"] = systemId;
+    }
+    if (uid != null) {
+      _json["uid"] = uid;
+    }
+    if (username != null) {
+      _json["username"] = username;
+    }
+    return _json;
+  }
+}
+
+/// The SSH public key information associated with a Google account.
+class SshPublicKey {
+  /// An expiration time in microseconds since epoch.
+  core.String expirationTimeUsec;
+
+  /// Output only. The SHA-256 fingerprint of the SSH public key.
+  core.String fingerprint;
+
+  /// Public key text in SSH format, defined by
+  /// <a href="https://www.ietf.org/rfc/rfc4253.txt" target="_blank">RFC4253</a>
+  /// section 6.6.
+  core.String key;
+
+  SshPublicKey();
+
+  SshPublicKey.fromJson(core.Map _json) {
+    if (_json.containsKey("expirationTimeUsec")) {
+      expirationTimeUsec = _json["expirationTimeUsec"];
+    }
+    if (_json.containsKey("fingerprint")) {
+      fingerprint = _json["fingerprint"];
+    }
+    if (_json.containsKey("key")) {
+      key = _json["key"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (expirationTimeUsec != null) {
+      _json["expirationTimeUsec"] = expirationTimeUsec;
+    }
+    if (fingerprint != null) {
+      _json["fingerprint"] = fingerprint;
+    }
+    if (key != null) {
+      _json["key"] = key;
+    }
+    return _json;
+  }
+}
diff --git a/googleapis/lib/pagespeedonline/v1.dart b/googleapis/lib/pagespeedonline/v1.dart
index ee1ae6f..49256f7 100644
--- a/googleapis/lib/pagespeedonline/v1.dart
+++ b/googleapis/lib/pagespeedonline/v1.dart
@@ -734,6 +734,9 @@
 }
 
 class Result {
+  /// The captcha verify result
+  core.String captchaResult;
+
   /// Localized PageSpeed results. Contains a ruleResults entry for each
   /// PageSpeed rule instantiated and run by the server.
   ResultFormattedResults formattedResults;
@@ -774,6 +777,9 @@
   Result();
 
   Result.fromJson(core.Map _json) {
+    if (_json.containsKey("captchaResult")) {
+      captchaResult = _json["captchaResult"];
+    }
     if (_json.containsKey("formattedResults")) {
       formattedResults =
           new ResultFormattedResults.fromJson(_json["formattedResults"]);
@@ -810,6 +816,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (captchaResult != null) {
+      _json["captchaResult"] = captchaResult;
+    }
     if (formattedResults != null) {
       _json["formattedResults"] = (formattedResults).toJson();
     }
diff --git a/googleapis/lib/pagespeedonline/v2.dart b/googleapis/lib/pagespeedonline/v2.dart
index da50002..07964cc 100644
--- a/googleapis/lib/pagespeedonline/v2.dart
+++ b/googleapis/lib/pagespeedonline/v2.dart
@@ -832,6 +832,9 @@
 }
 
 class Result {
+  /// The captcha verify result
+  core.String captchaResult;
+
   /// Localized PageSpeed results. Contains a ruleResults entry for each
   /// PageSpeed rule instantiated and run by the server.
   ResultFormattedResults formattedResults;
@@ -870,6 +873,9 @@
   Result();
 
   Result.fromJson(core.Map _json) {
+    if (_json.containsKey("captchaResult")) {
+      captchaResult = _json["captchaResult"];
+    }
     if (_json.containsKey("formattedResults")) {
       formattedResults =
           new ResultFormattedResults.fromJson(_json["formattedResults"]);
@@ -910,6 +916,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (captchaResult != null) {
+      _json["captchaResult"] = captchaResult;
+    }
     if (formattedResults != null) {
       _json["formattedResults"] = (formattedResults).toJson();
     }
diff --git a/googleapis/lib/partners/v2.dart b/googleapis/lib/partners/v2.dart
index 4f54b0c..cc974e6 100644
--- a/googleapis/lib/partners/v2.dart
+++ b/googleapis/lib/partners/v2.dart
@@ -23,7 +23,6 @@
   ClientMessagesResourceApi get clientMessages =>
       new ClientMessagesResourceApi(_requester);
   CompaniesResourceApi get companies => new CompaniesResourceApi(_requester);
-  ExamsResourceApi get exams => new ExamsResourceApi(_requester);
   LeadsResourceApi get leads => new LeadsResourceApi(_requester);
   OffersResourceApi get offers => new OffersResourceApi(_requester);
   UserEventsResourceApi get userEvents => new UserEventsResourceApi(_requester);
@@ -48,17 +47,6 @@
   ///
   /// Request parameters:
   ///
-  /// [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 +77,17 @@
   ///
   /// [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 +99,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_userOverrides_ipAddress,
-      core.List<core.String> requestMetadata_experimentIds,
-      core.String requestMetadata_trafficSource_trafficSubId,
-      core.String requestMetadata_partnersSessionId,
+      {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 $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -117,20 +116,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (requestMetadata_userOverrides_ipAddress != null) {
-      _queryParams["requestMetadata.userOverrides.ipAddress"] = [
-        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 (requestMetadata_partnersSessionId != null) {
       _queryParams["requestMetadata.partnersSessionId"] = [
         requestMetadata_partnersSessionId
@@ -155,6 +140,20 @@
     if (requestMetadata_locale != null) {
       _queryParams["requestMetadata.locale"] = [requestMetadata_locale];
     }
+    if (requestMetadata_userOverrides_ipAddress != null) {
+      _queryParams["requestMetadata.userOverrides.ipAddress"] = [
+        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];
     }
@@ -244,13 +243,13 @@
   /// [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.
-  ///
   /// [currencyCode] - If the company's budget is in a different currency code
   /// than this one, then
   /// the converted budget is converted to this currency code.
   ///
+  /// [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
@@ -273,13 +272,13 @@
   /// - "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 for sorting the company's addresses by
   /// proximity.
   /// If not given, the geo-located address of the request is used.
   /// Used when order_by is set.
   ///
-  /// [requestMetadata_locale] - Locale to use for the current request.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -293,15 +292,15 @@
   async.Future<GetCompanyResponse> get(core.String companyId,
       {core.String requestMetadata_trafficSource_trafficSourceId,
       core.String requestMetadata_userOverrides_ipAddress,
-      core.List<core.String> requestMetadata_experimentIds,
       core.String currencyCode,
+      core.List<core.String> requestMetadata_experimentIds,
       core.String requestMetadata_trafficSource_trafficSubId,
       core.String orderBy,
       core.String requestMetadata_partnersSessionId,
       core.String requestMetadata_userOverrides_userId,
       core.String view,
-      core.String address,
       core.String requestMetadata_locale,
+      core.String address,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -323,13 +322,13 @@
         requestMetadata_userOverrides_ipAddress
       ];
     }
+    if (currencyCode != null) {
+      _queryParams["currencyCode"] = [currencyCode];
+    }
     if (requestMetadata_experimentIds != null) {
       _queryParams["requestMetadata.experimentIds"] =
           requestMetadata_experimentIds;
     }
-    if (currencyCode != null) {
-      _queryParams["currencyCode"] = [currencyCode];
-    }
     if (requestMetadata_trafficSource_trafficSubId != null) {
       _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
         requestMetadata_trafficSource_trafficSubId
@@ -351,12 +350,12 @@
     if (view != null) {
       _queryParams["view"] = [view];
     }
-    if (address != null) {
-      _queryParams["address"] = [address];
-    }
     if (requestMetadata_locale != null) {
       _queryParams["requestMetadata.locale"] = [requestMetadata_locale];
     }
+    if (address != null) {
+      _queryParams["address"] = [address];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -425,12 +424,12 @@
   /// [maxMonthlyBudget_currencyCode] - The 3-letter currency code defined in
   /// ISO 4217.
   ///
-  /// [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.
   ///
+  /// [minMonthlyBudget_currencyCode] - The 3-letter currency code defined in
+  /// ISO 4217.
+  ///
   /// [view] - The view of the `Company` resource to be returned. This must not
   /// be
   /// `COMPANY_VIEW_UNSPECIFIED`.
@@ -438,11 +437,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.
   ///
@@ -466,11 +465,6 @@
   /// [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.
@@ -478,6 +472,11 @@
   /// 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.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -502,18 +501,18 @@
       core.String orderBy,
       core.List<core.String> specializations,
       core.String maxMonthlyBudget_currencyCode,
-      core.String minMonthlyBudget_currencyCode,
       core.String requestMetadata_userOverrides_userId,
+      core.String minMonthlyBudget_currencyCode,
       core.String view,
-      core.String address,
       core.String requestMetadata_locale,
+      core.String address,
       core.String minMonthlyBudget_units,
       core.int maxMonthlyBudget_nanos,
       core.List<core.String> services,
       core.String requestMetadata_trafficSource_trafficSourceId,
       core.String maxMonthlyBudget_units,
-      core.String requestMetadata_trafficSource_trafficSubId,
       core.int minMonthlyBudget_nanos,
+      core.String requestMetadata_trafficSource_trafficSubId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -568,25 +567,25 @@
         maxMonthlyBudget_currencyCode
       ];
     }
-    if (minMonthlyBudget_currencyCode != null) {
-      _queryParams["minMonthlyBudget.currencyCode"] = [
-        minMonthlyBudget_currencyCode
-      ];
-    }
     if (requestMetadata_userOverrides_userId != null) {
       _queryParams["requestMetadata.userOverrides.userId"] = [
         requestMetadata_userOverrides_userId
       ];
     }
+    if (minMonthlyBudget_currencyCode != null) {
+      _queryParams["minMonthlyBudget.currencyCode"] = [
+        minMonthlyBudget_currencyCode
+      ];
+    }
     if (view != null) {
       _queryParams["view"] = [view];
     }
-    if (address != null) {
-      _queryParams["address"] = [address];
-    }
     if (requestMetadata_locale != null) {
       _queryParams["requestMetadata.locale"] = [requestMetadata_locale];
     }
+    if (address != null) {
+      _queryParams["address"] = [address];
+    }
     if (minMonthlyBudget_units != null) {
       _queryParams["minMonthlyBudget.units"] = [minMonthlyBudget_units];
     }
@@ -604,14 +603,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 ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -685,131 +684,6 @@
   }
 }
 
-class ExamsResourceApi {
-  final commons.ApiRequester _requester;
-
-  ExamsResourceApi(commons.ApiRequester client) : _requester = client;
-
-  /// Gets an Exam Token for a Partner's user to take an exam in the Exams
-  /// System
-  ///
-  /// Request parameters:
-  ///
-  /// [examType] - The exam type we are requesting a token for.
-  /// Possible string values are:
-  /// - "CERTIFICATION_EXAM_TYPE_UNSPECIFIED" : A
-  /// CERTIFICATION_EXAM_TYPE_UNSPECIFIED.
-  /// - "CET_ADWORDS_FUNDAMENTALS" : A CET_ADWORDS_FUNDAMENTALS.
-  /// - "CET_ADWORDS_ADVANCED_SEARCH" : A CET_ADWORDS_ADVANCED_SEARCH.
-  /// - "CET_ADWORDS_ADVANCED_DISPLAY" : A CET_ADWORDS_ADVANCED_DISPLAY.
-  /// - "CET_VIDEO_ADS" : A CET_VIDEO_ADS.
-  /// - "CET_DOUBLECLICK" : A CET_DOUBLECLICK.
-  /// - "CET_ANALYTICS" : A CET_ANALYTICS.
-  /// - "CET_SHOPPING" : A CET_SHOPPING.
-  /// - "CET_MOBILE" : A CET_MOBILE.
-  /// - "CET_DIGITAL_SALES" : A CET_DIGITAL_SALES.
-  /// - "CET_MOBILE_SITES" : A CET_MOBILE_SITES.
-  ///
-  /// [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.
-  ///
-  /// [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.
-  ///
-  /// Completes with a [ExamToken].
-  ///
-  /// 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<ExamToken> getToken(core.String examType,
-      {core.String requestMetadata_partnersSessionId,
-      core.String requestMetadata_userOverrides_userId,
-      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();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = commons.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (examType == null) {
-      throw new core.ArgumentError("Parameter examType 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];
-    }
-    if (requestMetadata_userOverrides_ipAddress != null) {
-      _queryParams["requestMetadata.userOverrides.ipAddress"] = [
-        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];
-    }
-
-    _url = 'v2/exams/' + commons.Escaper.ecapeVariable('$examType') + '/token';
-
-    var _response = _requester.request(_url, "GET",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new ExamToken.fromJson(data));
-  }
-}
-
 class LeadsResourceApi {
   final commons.ApiRequester _requester;
 
@@ -820,6 +694,26 @@
   ///
   /// Request parameters:
   ///
+  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
+  ///
+  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
+  /// instead of the user's ID.
+  ///
+  /// [pageToken] - A token identifying a page of results that the server
+  /// returns.
+  /// Typically, this is the value of `ListLeadsResponse.next_page_token`
+  /// returned from the previous call to
+  /// ListLeads.
+  ///
+  /// [pageSize] - Requested page size. Server may return fewer leads than
+  /// requested.
+  /// If unspecified, server picks an appropriate default.
+  ///
+  /// [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
@@ -836,26 +730,6 @@
   /// [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`
-  /// returned from the previous call to
-  /// ListLeads.
-  ///
-  /// [pageSize] - Requested page size. Server may return fewer leads than
-  /// requested.
-  /// If unspecified, server picks an appropriate default.
-  ///
-  /// [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.
   ///
@@ -867,16 +741,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 requestMetadata_locale,
+      {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 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,6 +759,27 @@
     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
+      ];
+    }
     if (requestMetadata_locale != null) {
       _queryParams["requestMetadata.locale"] = [requestMetadata_locale];
     }
@@ -905,27 +800,6 @@
     if (orderBy != null) {
       _queryParams["orderBy"] = [orderBy];
     }
-    if (requestMetadata_userOverrides_userId != null) {
-      _queryParams["requestMetadata.userOverrides.userId"] = [
-        requestMetadata_userOverrides_userId
-      ];
-    }
-    if (requestMetadata_partnersSessionId != null) {
-      _queryParams["requestMetadata.partnersSessionId"] = [
-        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,6 +828,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
@@ -972,11 +851,6 @@
   /// 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.
   ///
@@ -988,13 +862,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_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_userOverrides_userId,
-      core.String requestMetadata_partnersSessionId,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1003,6 +877,16 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
+    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
@@ -1025,16 +909,6 @@
         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];
     }
@@ -1061,6 +935,13 @@
   ///
   /// Request parameters:
   ///
+  /// [requestMetadata_partnersSessionId] - Google Partners session ID.
+  ///
+  /// [requestMetadata_userOverrides_userId] - Logged-in user ID to impersonate
+  /// instead of the user's ID.
+  ///
+  /// [pageToken] - Token to retrieve a specific page.
+  ///
   /// [pageSize] - Maximum number of rows to return per page.
   ///
   /// [requestMetadata_trafficSource_trafficSourceId] - Identifier to indicate
@@ -1073,12 +954,12 @@
   /// [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_experimentIds] - Experiment IDs the current request
+  /// belongs to.
+  ///
   /// [orderBy] - Comma-separated list of fields to order by, e.g.:
   /// "foo,bar,baz".
   /// Use "foo desc" to sort descending.
@@ -1091,13 +972,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.
-  ///
-  /// [pageToken] - Token to retrieve a specific page.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1109,17 +983,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.int pageSize,
+      {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.bool entireCompany,
+      core.List<core.String> requestMetadata_experimentIds,
       core.String orderBy,
       core.String requestMetadata_trafficSource_trafficSubId,
-      core.String requestMetadata_partnersSessionId,
-      core.String requestMetadata_userOverrides_userId,
-      core.String pageToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1128,6 +1002,19 @@
     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}"];
     }
@@ -1144,13 +1031,13 @@
         requestMetadata_userOverrides_ipAddress
       ];
     }
+    if (entireCompany != null) {
+      _queryParams["entireCompany"] = ["${entireCompany}"];
+    }
     if (requestMetadata_experimentIds != null) {
       _queryParams["requestMetadata.experimentIds"] =
           requestMetadata_experimentIds;
     }
-    if (entireCompany != null) {
-      _queryParams["entireCompany"] = ["${entireCompany}"];
-    }
     if (orderBy != null) {
       _queryParams["orderBy"] = [orderBy];
     }
@@ -1159,19 +1046,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 ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1247,16 +1121,6 @@
   ///
   /// 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
-  /// traffic to us.
-  ///
   /// [requestMetadata_locale] - Locale to use for the current request.
   ///
   /// [requestMetadata_userOverrides_ipAddress] - IP address to use instead of
@@ -1270,6 +1134,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.
   ///
@@ -1281,13 +1155,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<ListUserStatesResponse> list(
-      {core.String requestMetadata_userOverrides_userId,
-      core.String requestMetadata_partnersSessionId,
-      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();
@@ -1296,21 +1170,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    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];
     }
@@ -1328,6 +1187,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];
     }
@@ -1366,11 +1240,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.
+  ///
   /// [requestMetadata_trafficSource_trafficSourceId] - Identifier to indicate
   /// where the traffic comes from.
   /// An identifier has multiple letters created by a team which redirected the
@@ -1395,8 +1269,8 @@
       CompanyRelation request, core.String userId,
       {core.List<core.String> requestMetadata_experimentIds,
       core.String requestMetadata_trafficSource_trafficSubId,
-      core.String requestMetadata_partnersSessionId,
       core.String requestMetadata_userOverrides_userId,
+      core.String requestMetadata_partnersSessionId,
       core.String requestMetadata_trafficSource_trafficSourceId,
       core.String requestMetadata_locale,
       core.String requestMetadata_userOverrides_ipAddress,
@@ -1423,16 +1297,16 @@
         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 (requestMetadata_trafficSource_trafficSourceId != null) {
       _queryParams["requestMetadata.trafficSource.trafficSourceId"] = [
         requestMetadata_trafficSource_trafficSourceId
@@ -1470,6 +1344,11 @@
   /// [userId] - The ID of the user. Can be set to <code>me</code> to mean
   /// the currently authenticated user.
   ///
+  /// [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.
   ///
@@ -1488,11 +1367,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.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1504,13 +1378,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.List<core.String> requestMetadata_experimentIds,
+      {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 requestMetadata_locale,
-      core.String requestMetadata_userOverrides_ipAddress,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1522,6 +1396,14 @@
     if (userId == null) {
       throw new core.ArgumentError("Parameter userId is required.");
     }
+    if (requestMetadata_locale != null) {
+      _queryParams["requestMetadata.locale"] = [requestMetadata_locale];
+    }
+    if (requestMetadata_userOverrides_ipAddress != null) {
+      _queryParams["requestMetadata.userOverrides.ipAddress"] = [
+        requestMetadata_userOverrides_ipAddress
+      ];
+    }
     if (requestMetadata_experimentIds != null) {
       _queryParams["requestMetadata.experimentIds"] =
           requestMetadata_experimentIds;
@@ -1546,14 +1428,6 @@
         requestMetadata_trafficSource_trafficSourceId
       ];
     }
-    if (requestMetadata_locale != null) {
-      _queryParams["requestMetadata.locale"] = [requestMetadata_locale];
-    }
-    if (requestMetadata_userOverrides_ipAddress != null) {
-      _queryParams["requestMetadata.userOverrides.ipAddress"] = [
-        requestMetadata_userOverrides_ipAddress
-      ];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1579,6 +1453,11 @@
   /// the currently
   /// authenticated user.
   ///
+  /// [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.
   ///
@@ -1603,11 +1482,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.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1619,14 +1493,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 requestMetadata_userOverrides_userId,
+      {core.String requestMetadata_trafficSource_trafficSubId,
+      core.String requestMetadata_userOverrides_userId,
       core.String requestMetadata_partnersSessionId,
       core.String userView,
       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();
@@ -1638,6 +1512,11 @@
     if (userId == null) {
       throw new core.ArgumentError("Parameter userId 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
@@ -1668,11 +1547,6 @@
       _queryParams["requestMetadata.experimentIds"] =
           requestMetadata_experimentIds;
     }
-    if (requestMetadata_trafficSource_trafficSubId != null) {
-      _queryParams["requestMetadata.trafficSource.trafficSubId"] = [
-        requestMetadata_trafficSource_trafficSubId
-      ];
-    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1695,11 +1569,11 @@
   ///
   /// Request parameters:
   ///
+  /// [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.
-  ///
   /// [requestMetadata_trafficSource_trafficSourceId] - Identifier to indicate
   /// where the traffic comes from.
   /// An identifier has multiple letters created by a team which redirected the
@@ -1729,8 +1603,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<UserProfile> updateProfile(UserProfile request,
-      {core.String requestMetadata_userOverrides_userId,
-      core.String requestMetadata_partnersSessionId,
+      {core.String requestMetadata_partnersSessionId,
+      core.String requestMetadata_userOverrides_userId,
       core.String requestMetadata_trafficSource_trafficSourceId,
       core.String requestMetadata_locale,
       core.String requestMetadata_userOverrides_ipAddress,
@@ -1747,16 +1621,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_userOverrides_userId != null) {
+      _queryParams["requestMetadata.userOverrides.userId"] = [
+        requestMetadata_userOverrides_userId
+      ];
+    }
     if (requestMetadata_trafficSource_trafficSourceId != null) {
       _queryParams["requestMetadata.trafficSource.trafficSourceId"] = [
         requestMetadata_trafficSource_trafficSourceId
@@ -1805,16 +1679,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.
   ///
@@ -1828,6 +1692,16 @@
   ///
   /// [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.
+  ///
+  /// [requestMetadata_userOverrides_ipAddress] - IP address to use instead of
+  /// the user's geo-located IP address.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1839,13 +1713,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<GetPartnersStatusResponse> getPartnersstatus(
-      {core.String requestMetadata_trafficSource_trafficSourceId,
-      core.String requestMetadata_locale,
-      core.String requestMetadata_userOverrides_ipAddress,
-      core.List<core.String> requestMetadata_experimentIds,
+      {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 $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1854,19 +1728,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    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
-      ];
-    }
     if (requestMetadata_experimentIds != null) {
       _queryParams["requestMetadata.experimentIds"] =
           requestMetadata_experimentIds;
@@ -1886,6 +1747,19 @@
         requestMetadata_partnersSessionId
       ];
     }
+    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
+      ];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1909,22 +1783,11 @@
   ///
   /// Request parameters:
   ///
-  /// [updateMask] - Standard field mask for the set of fields to be updated.
-  /// Required with at least 1 value in FieldMask's paths.
-  ///
-  /// [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
   /// 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
@@ -1935,6 +1798,17 @@
   /// [requestMetadata_userOverrides_ipAddress] - IP address to use instead of
   /// the user's geo-located IP address.
   ///
+  /// [updateMask] - Standard field mask for the set of fields to be updated.
+  /// Required with at least 1 value in FieldMask's paths.
+  ///
+  /// [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.
   ///
@@ -1946,14 +1820,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<Company> updateCompanies(Company request,
-      {core.String updateMask,
-      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 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();
@@ -1965,16 +1839,9 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
-    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 (requestMetadata_userOverrides_userId != null) {
+      _queryParams["requestMetadata.userOverrides.userId"] = [
+        requestMetadata_userOverrides_userId
       ];
     }
     if (requestMetadata_partnersSessionId != null) {
@@ -1982,11 +1849,6 @@
         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
@@ -2000,6 +1862,18 @@
         requestMetadata_userOverrides_ipAddress
       ];
     }
+    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];
     }
@@ -3481,59 +3355,6 @@
   }
 }
 
-/// A token that allows a user to take an exam.
-class ExamToken {
-  /// The id of the exam the token is for.
-  core.String examId;
-
-  /// The type of the exam the token belongs to.
-  /// Possible string values are:
-  /// - "CERTIFICATION_EXAM_TYPE_UNSPECIFIED" : Unchosen.
-  /// - "CET_ADWORDS_FUNDAMENTALS" : Adwords Fundamentals exam.
-  /// - "CET_ADWORDS_ADVANCED_SEARCH" : AdWords advanced search exam.
-  /// - "CET_ADWORDS_ADVANCED_DISPLAY" : AdWords advanced display exam.
-  /// - "CET_VIDEO_ADS" : VideoAds exam.
-  /// - "CET_DOUBLECLICK" : DoubleClick exam.
-  /// - "CET_ANALYTICS" : Analytics exam.
-  /// - "CET_SHOPPING" : Shopping exam.
-  /// - "CET_MOBILE" : Mobile exam.
-  /// - "CET_DIGITAL_SALES" : Digital Sales exam.
-  /// - "CET_MOBILE_SITES" : Mobile Sites exam.
-  core.String examType;
-
-  /// The token, only present if the user has access to the exam.
-  core.String token;
-
-  ExamToken();
-
-  ExamToken.fromJson(core.Map _json) {
-    if (_json.containsKey("examId")) {
-      examId = _json["examId"];
-    }
-    if (_json.containsKey("examType")) {
-      examType = _json["examType"];
-    }
-    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 (examId != null) {
-      _json["examId"] = examId;
-    }
-    if (examType != null) {
-      _json["examType"] = examType;
-    }
-    if (token != null) {
-      _json["token"] = token;
-    }
-    return _json;
-  }
-}
-
 /// Response message for GetCompany.
 class GetCompanyResponse {
   /// The company.
@@ -3732,40 +3553,6 @@
 /// specified otherwise, this must conform to the
 /// <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
 /// standard</a>. Values must be within normalized ranges.
-///
-/// Example of normalization code in Python:
-///
-///     def NormalizeLongitude(longitude):
-///       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
-///       q, r = divmod(longitude, 360.0)
-///       if r > 180.0 or (r == 180.0 and q <= -1.0):
-///         return r - 360.0
-///       return r
-///
-///     def NormalizeLatLng(latitude, longitude):
-///       """Wraps decimal degrees latitude and longitude to
-///       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
-///       r = latitude % 360.0
-///       if r <= 90.0:
-///         return r, NormalizeLongitude(longitude)
-///       elif r >= 270.0:
-///         return r - 360, NormalizeLongitude(longitude)
-///       else:
-///         return 180 - r, NormalizeLongitude(longitude + 180.0)
-///
-///     assert 180.0 == NormalizeLongitude(180.0)
-///     assert -180.0 == NormalizeLongitude(-180.0)
-///     assert -179.0 == NormalizeLongitude(181.0)
-///     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
-///     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
-///     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
-///     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
-///     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
-///     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
-///     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
-///     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
-///     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
-///     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
 class LatLng {
   /// The latitude in degrees. It must be in the range [-90.0, +90.0].
   core.double latitude;
diff --git a/googleapis/lib/people/v1.dart b/googleapis/lib/people/v1.dart
index 2d2fa70..73d3a89 100644
--- a/googleapis/lib/people/v1.dart
+++ b/googleapis/lib/people/v1.dart
@@ -273,16 +273,16 @@
   ///
   /// Request parameters:
   ///
-  /// [syncToken] - A sync token, returned by a previous call to
-  /// `contactgroups.list`.
-  /// Only resources changed since the sync token was created will be returned.
-  ///
   /// [pageToken] - The next_page_token value returned from a previous call to
   /// [ListContactGroups](/people/api/rest/v1/contactgroups/list).
   /// Requests the next page of resources.
   ///
   /// [pageSize] - The maximum number of resources to return.
   ///
+  /// [syncToken] - A sync token, returned by a previous call to
+  /// `contactgroups.list`.
+  /// Only resources changed since the sync token was created will be returned.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -294,9 +294,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<ListContactGroupsResponse> list(
-      {core.String syncToken,
-      core.String pageToken,
+      {core.String pageToken,
       core.int pageSize,
+      core.String syncToken,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -305,15 +305,15 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (syncToken != null) {
-      _queryParams["syncToken"] = [syncToken];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (syncToken != null) {
+      _queryParams["syncToken"] = [syncToken];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -869,22 +869,25 @@
   ///
   /// [requestSyncToken] - Whether the response should include a sync token,
   /// which can be used to get
-  /// all changes since the last request.
+  /// all changes since the last request. For subsequent sync requests use the
+  /// `sync_token` param instead. Initial sync requests that specify
+  /// `request_sync_token` have an additional rate limit.
   ///
   /// [pageToken] - The token of the page to be returned.
   ///
+  /// [pageSize] - The number of connections to include in the response. Valid
+  /// values are
+  /// between 1 and 2000, inclusive. Defaults to 100.
+  ///
   /// [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`.
   ///
-  /// [pageSize] - The number of connections to include in the response. Valid
-  /// values are
-  /// between 1 and 2000, inclusive. Defaults to 100.
-  ///
-  /// [syncToken] - A sync token, returned by a previous call to
+  /// [syncToken] - A sync token returned by a previous call to
   /// `people.connections.list`.
   /// Only resources changed since the sync token was created will be returned.
+  /// Sync requests that specify `sync_token` have an additional rate limit.
   ///
   /// [personFields] - **Required.** A field mask to restrict which fields on
   /// each person are
@@ -932,8 +935,8 @@
       {core.String sortOrder,
       core.bool requestSyncToken,
       core.String pageToken,
-      core.String requestMask_includeField,
       core.int pageSize,
+      core.String requestMask_includeField,
       core.String syncToken,
       core.String personFields,
       core.String $fields}) {
@@ -956,12 +959,12 @@
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
-    if (requestMask_includeField != null) {
-      _queryParams["requestMask.includeField"] = [requestMask_includeField];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (requestMask_includeField != null) {
+      _queryParams["requestMask.includeField"] = [requestMask_includeField];
+    }
     if (syncToken != null) {
       _queryParams["syncToken"] = [syncToken];
     }
diff --git a/googleapis/lib/playmoviespartner/v1.dart b/googleapis/lib/playmoviespartner/v1.dart
deleted file mode 100644
index e4eb8c9..0000000
--- a/googleapis/lib/playmoviespartner/v1.dart
+++ /dev/null
@@ -1,1686 +0,0 @@
-// This is a generated file (see the discoveryapis_generator project).
-
-library googleapis.playmoviespartner.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 playmoviespartner/v1';
-
-/// Gets the delivery status of titles for Google Play Movies Partners.
-class PlaymoviespartnerApi {
-  /// View the digital assets you publish on Google Play Movies and TV
-  static const PlaymoviesPartnerReadonlyScope =
-      "https://www.googleapis.com/auth/playmovies_partner.readonly";
-
-  final commons.ApiRequester _requester;
-
-  AccountsResourceApi get accounts => new AccountsResourceApi(_requester);
-
-  PlaymoviespartnerApi(http.Client client,
-      {core.String rootUrl: "https://playmoviespartner.googleapis.com/",
-      core.String servicePath: ""})
-      : _requester =
-            new commons.ApiRequester(client, rootUrl, servicePath, USER_AGENT);
-}
-
-class AccountsResourceApi {
-  final commons.ApiRequester _requester;
-
-  AccountsAvailsResourceApi get avails =>
-      new AccountsAvailsResourceApi(_requester);
-  AccountsOrdersResourceApi get orders =>
-      new AccountsOrdersResourceApi(_requester);
-  AccountsStoreInfosResourceApi get storeInfos =>
-      new AccountsStoreInfosResourceApi(_requester);
-
-  AccountsResourceApi(commons.ApiRequester client) : _requester = client;
-}
-
-class AccountsAvailsResourceApi {
-  final commons.ApiRequester _requester;
-
-  AccountsAvailsResourceApi(commons.ApiRequester client) : _requester = client;
-
-  /// Get an Avail given its avail group id and avail id.
-  ///
-  /// Request parameters:
-  ///
-  /// [accountId] - REQUIRED. See _General rules_ for more information about
-  /// this field.
-  ///
-  /// [availId] - REQUIRED. Avail ID.
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [Avail].
-  ///
-  /// 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<Avail> get(core.String accountId, core.String availId,
-      {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 (accountId == null) {
-      throw new core.ArgumentError("Parameter accountId is required.");
-    }
-    if (availId == null) {
-      throw new core.ArgumentError("Parameter availId is required.");
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'v1/accounts/' +
-        commons.Escaper.ecapeVariable('$accountId') +
-        '/avails/' +
-        commons.Escaper.ecapeVariable('$availId');
-
-    var _response = _requester.request(_url, "GET",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new Avail.fromJson(data));
-  }
-
-  /// List Avails owned or managed by the partner.
-  ///
-  /// See _Authentication and Authorization rules_ and
-  /// _List methods rules_ for more information about this method.
-  ///
-  /// Request parameters:
-  ///
-  /// [accountId] - REQUIRED. See _General rules_ for more information about
-  /// this field.
-  ///
-  /// [title] - Filter that matches Avails with a `title_internal_alias`,
-  /// `series_title_internal_alias`, `season_title_internal_alias`,
-  /// or `episode_title_internal_alias` that contains the given
-  /// case-insensitive title.
-  ///
-  /// [pageToken] - See _List methods rules_ for info about this field.
-  ///
-  /// [videoIds] - Filter Avails that match any of the given `video_id`s.
-  ///
-  /// [pageSize] - See _List methods rules_ for info about this field.
-  ///
-  /// [altIds] - Filter Avails that match (case-insensitive) any of the given
-  /// partner-specific custom ids.
-  ///
-  /// [pphNames] - See _List methods rules_ for info about this field.
-  ///
-  /// [altId] - Filter Avails that match a case-insensitive, partner-specific
-  /// custom id.
-  /// NOTE: this field is deprecated and will be removed on V2; `alt_ids`
-  /// should be used instead.
-  ///
-  /// [studioNames] - See _List methods rules_ for info about this field.
-  ///
-  /// [territories] - Filter Avails that match (case-insensitive) any of the
-  /// given country codes,
-  /// using the "ISO 3166-1 alpha-2" format (examples: "US", "us", "Us").
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [ListAvailsResponse].
-  ///
-  /// 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<ListAvailsResponse> list(core.String accountId,
-      {core.String title,
-      core.String pageToken,
-      core.List<core.String> videoIds,
-      core.int pageSize,
-      core.List<core.String> altIds,
-      core.List<core.String> pphNames,
-      core.String altId,
-      core.List<core.String> studioNames,
-      core.List<core.String> territories,
-      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 (accountId == null) {
-      throw new core.ArgumentError("Parameter accountId is required.");
-    }
-    if (title != null) {
-      _queryParams["title"] = [title];
-    }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
-    if (videoIds != null) {
-      _queryParams["videoIds"] = videoIds;
-    }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
-    if (altIds != null) {
-      _queryParams["altIds"] = altIds;
-    }
-    if (pphNames != null) {
-      _queryParams["pphNames"] = pphNames;
-    }
-    if (altId != null) {
-      _queryParams["altId"] = [altId];
-    }
-    if (studioNames != null) {
-      _queryParams["studioNames"] = studioNames;
-    }
-    if (territories != null) {
-      _queryParams["territories"] = territories;
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'v1/accounts/' +
-        commons.Escaper.ecapeVariable('$accountId') +
-        '/avails';
-
-    var _response = _requester.request(_url, "GET",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new ListAvailsResponse.fromJson(data));
-  }
-}
-
-class AccountsOrdersResourceApi {
-  final commons.ApiRequester _requester;
-
-  AccountsOrdersResourceApi(commons.ApiRequester client) : _requester = client;
-
-  /// Get an Order given its id.
-  ///
-  /// See _Authentication and Authorization rules_ and
-  /// _Get methods rules_ for more information about this method.
-  ///
-  /// Request parameters:
-  ///
-  /// [accountId] - REQUIRED. See _General rules_ for more information about
-  /// this field.
-  ///
-  /// [orderId] - REQUIRED. Order ID.
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [Order].
-  ///
-  /// 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<Order> get(core.String accountId, 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 (accountId == null) {
-      throw new core.ArgumentError("Parameter accountId is required.");
-    }
-    if (orderId == null) {
-      throw new core.ArgumentError("Parameter orderId is required.");
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'v1/accounts/' +
-        commons.Escaper.ecapeVariable('$accountId') +
-        '/orders/' +
-        commons.Escaper.ecapeVariable('$orderId');
-
-    var _response = _requester.request(_url, "GET",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new Order.fromJson(data));
-  }
-
-  /// List Orders owned or managed by the partner.
-  ///
-  /// See _Authentication and Authorization rules_ and
-  /// _List methods rules_ for more information about this method.
-  ///
-  /// Request parameters:
-  ///
-  /// [accountId] - REQUIRED. See _General rules_ for more information about
-  /// this field.
-  ///
-  /// [videoIds] - Filter Orders that match any of the given `video_id`s.
-  ///
-  /// [customId] - Filter Orders that match a case-insensitive, partner-specific
-  /// custom id.
-  ///
-  /// [pageToken] - See _List methods rules_ for info about this field.
-  ///
-  /// [pageSize] - See _List methods rules_ for info about this field.
-  ///
-  /// [pphNames] - See _List methods rules_ for info about this field.
-  ///
-  /// [status] - Filter Orders that match one of the given status.
-  ///
-  /// [name] - Filter that matches Orders with a `name`, `show`, `season` or
-  /// `episode`
-  /// that contains the given case-insensitive name.
-  ///
-  /// [studioNames] - See _List methods rules_ for info about this field.
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [ListOrdersResponse].
-  ///
-  /// 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<ListOrdersResponse> list(core.String accountId,
-      {core.List<core.String> videoIds,
-      core.String customId,
-      core.String pageToken,
-      core.int pageSize,
-      core.List<core.String> pphNames,
-      core.List<core.String> status,
-      core.String name,
-      core.List<core.String> studioNames,
-      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 (accountId == null) {
-      throw new core.ArgumentError("Parameter accountId is required.");
-    }
-    if (videoIds != null) {
-      _queryParams["videoIds"] = videoIds;
-    }
-    if (customId != null) {
-      _queryParams["customId"] = [customId];
-    }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
-    if (pphNames != null) {
-      _queryParams["pphNames"] = pphNames;
-    }
-    if (status != null) {
-      _queryParams["status"] = status;
-    }
-    if (name != null) {
-      _queryParams["name"] = [name];
-    }
-    if (studioNames != null) {
-      _queryParams["studioNames"] = studioNames;
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'v1/accounts/' +
-        commons.Escaper.ecapeVariable('$accountId') +
-        '/orders';
-
-    var _response = _requester.request(_url, "GET",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new ListOrdersResponse.fromJson(data));
-  }
-}
-
-class AccountsStoreInfosResourceApi {
-  final commons.ApiRequester _requester;
-
-  AccountsStoreInfosCountryResourceApi get country =>
-      new AccountsStoreInfosCountryResourceApi(_requester);
-
-  AccountsStoreInfosResourceApi(commons.ApiRequester client)
-      : _requester = client;
-
-  /// List StoreInfos owned or managed by the partner.
-  ///
-  /// See _Authentication and Authorization rules_ and
-  /// _List methods rules_ for more information about this method.
-  ///
-  /// Request parameters:
-  ///
-  /// [accountId] - REQUIRED. See _General rules_ for more information about
-  /// this field.
-  ///
-  /// [seasonIds] - Filter StoreInfos that match any of the given `season_id`s.
-  ///
-  /// [videoIds] - Filter StoreInfos that match any of the given `video_id`s.
-  ///
-  /// [videoId] - Filter StoreInfos that match a given `video_id`.
-  /// NOTE: this field is deprecated and will be removed on V2; `video_ids`
-  /// should be used instead.
-  ///
-  /// [pageToken] - See _List methods rules_ for info about this field.
-  ///
-  /// [pageSize] - See _List methods rules_ for info about this field.
-  ///
-  /// [mids] - Filter StoreInfos that match any of the given `mid`s.
-  ///
-  /// [pphNames] - See _List methods rules_ for info about this field.
-  ///
-  /// [countries] - Filter StoreInfos that match (case-insensitive) any of the
-  /// given country
-  /// codes, using the "ISO 3166-1 alpha-2" format (examples: "US", "us", "Us").
-  ///
-  /// [name] - Filter that matches StoreInfos with a `name` or `show_name`
-  /// that contains the given case-insensitive name.
-  ///
-  /// [studioNames] - See _List methods rules_ for info about this field.
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [ListStoreInfosResponse].
-  ///
-  /// 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<ListStoreInfosResponse> list(core.String accountId,
-      {core.List<core.String> seasonIds,
-      core.List<core.String> videoIds,
-      core.String videoId,
-      core.String pageToken,
-      core.int pageSize,
-      core.List<core.String> mids,
-      core.List<core.String> pphNames,
-      core.List<core.String> countries,
-      core.String name,
-      core.List<core.String> studioNames,
-      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 (accountId == null) {
-      throw new core.ArgumentError("Parameter accountId is required.");
-    }
-    if (seasonIds != null) {
-      _queryParams["seasonIds"] = seasonIds;
-    }
-    if (videoIds != null) {
-      _queryParams["videoIds"] = videoIds;
-    }
-    if (videoId != null) {
-      _queryParams["videoId"] = [videoId];
-    }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
-    if (mids != null) {
-      _queryParams["mids"] = mids;
-    }
-    if (pphNames != null) {
-      _queryParams["pphNames"] = pphNames;
-    }
-    if (countries != null) {
-      _queryParams["countries"] = countries;
-    }
-    if (name != null) {
-      _queryParams["name"] = [name];
-    }
-    if (studioNames != null) {
-      _queryParams["studioNames"] = studioNames;
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'v1/accounts/' +
-        commons.Escaper.ecapeVariable('$accountId') +
-        '/storeInfos';
-
-    var _response = _requester.request(_url, "GET",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new ListStoreInfosResponse.fromJson(data));
-  }
-}
-
-class AccountsStoreInfosCountryResourceApi {
-  final commons.ApiRequester _requester;
-
-  AccountsStoreInfosCountryResourceApi(commons.ApiRequester client)
-      : _requester = client;
-
-  /// Get a StoreInfo given its video id and country.
-  ///
-  /// See _Authentication and Authorization rules_ and
-  /// _Get methods rules_ for more information about this method.
-  ///
-  /// Request parameters:
-  ///
-  /// [accountId] - REQUIRED. See _General rules_ for more information about
-  /// this field.
-  ///
-  /// [videoId] - REQUIRED. Video ID.
-  ///
-  /// [country] - REQUIRED. Edit country.
-  ///
-  /// [$fields] - Selector specifying which fields to include in a partial
-  /// response.
-  ///
-  /// Completes with a [StoreInfo].
-  ///
-  /// 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<StoreInfo> get(
-      core.String accountId, core.String videoId, core.String country,
-      {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 (accountId == null) {
-      throw new core.ArgumentError("Parameter accountId is required.");
-    }
-    if (videoId == null) {
-      throw new core.ArgumentError("Parameter videoId is required.");
-    }
-    if (country == null) {
-      throw new core.ArgumentError("Parameter country is required.");
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'v1/accounts/' +
-        commons.Escaper.ecapeVariable('$accountId') +
-        '/storeInfos/' +
-        commons.Escaper.ecapeVariable('$videoId') +
-        '/country/' +
-        commons.Escaper.ecapeVariable('$country');
-
-    var _response = _requester.request(_url, "GET",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new StoreInfo.fromJson(data));
-  }
-}
-
-/// An Avail describes the Availability Window of a specific Edit in a given
-/// country, which means the period Google is allowed to sell or rent the Edit.
-///
-/// Avails are exposed in EMA format Version 1.6b (available at
-/// http://www.movielabs.com/md/avails/)
-///
-/// Studios can see the Avails for the Titles they own.
-/// Post-production houses cannot see any Avails.
-class Avail {
-  /// Other identifier referring to the Edit, as defined by partner.
-  /// Example: "GOOGLER_2006"
-  core.String altId;
-
-  /// ID internally generated by Google to uniquely identify an Avail.
-  /// Not part of EMA Specs.
-  core.String availId;
-
-  /// Communicating an exempt category as defined by FCC regulations.
-  /// It is not required for non-US Avails.
-  /// Example: "1"
-  core.String captionExemption;
-
-  /// Communicating if caption file will be delivered.
-  core.bool captionIncluded;
-
-  /// Title Identifier. This should be the Title Level EIDR.
-  /// Example: "10.5240/1489-49A2-3956-4B2D-FE16-5".
-  core.String contentId;
-
-  /// The name of the studio that owns the Edit referred in the Avail.
-  /// This is the equivalent of `studio_name` in other resources, but it follows
-  /// the EMA nomenclature.
-  /// Example: "Google Films".
-  core.String displayName;
-
-  /// Manifestation Identifier. This should be the Manifestation
-  /// Level EIDR.
-  /// Example: "10.2340/1489-49A2-3956-4B2D-FE16-7"
-  core.String encodeId;
-
-  /// End of term in YYYY-MM-DD format in the timezone of the country
-  /// of the Avail.
-  /// "Open" if no end date is available.
-  /// Example: "2019-02-17"
-  core.String end;
-
-  /// Other identifier referring to the episode, as defined by partner.
-  /// Only available on TV avails.
-  /// Example: "rs_googlers_s1_3".
-  core.String episodeAltId;
-
-  /// The number assigned to the episode within a season.
-  /// Only available on TV Avails.
-  /// Example: "3".
-  core.String episodeNumber;
-
-  /// OPTIONAL.TV Only. Title used by involved parties to refer to this episode.
-  /// Only available on TV Avails.
-  /// Example: "Coding at Google".
-  core.String episodeTitleInternalAlias;
-
-  /// Indicates the format profile covered by the transaction.
-  /// Possible string values are:
-  /// - "FORMAT_PROFILE_UNSPECIFIED" : Value could not be determined, please
-  /// contact technical support if
-  /// it should.
-  /// - "SD" : Standard-definition format.
-  /// - "HD" : High-definition format.
-  /// - "UHD" : 4K UHD.
-  core.String formatProfile;
-
-  /// Type of transaction.
-  /// Possible string values are:
-  /// - "LICENSE_TYPE_UNSPECIFIED" : Value could not be determined, please
-  /// contact technical support if
-  /// it should.
-  /// - "EST" : Electronic Sell Through - purchase policy for unlimited viewing.
-  /// - "VOD" : Video On Demand - rental policy for temporary viewing.
-  /// - "SVOD" : Subscription Video On Demand - used for subscription platforms.
-  /// Not supported on Google Play.
-  /// - "POEST" : Pre-order Electronic Sell Through - pre-order purchase only
-  /// window.
-  core.String licenseType;
-
-  /// Name of the post-production houses that manage the Avail.
-  /// Not part of EMA Specs.
-  core.List<core.String> pphNames;
-
-  /// Type of pricing that should be applied to this Avail
-  /// based on how the partner classify them.
-  /// Example: "Tier", "WSP", "SRP", or "Category".
-  core.String priceType;
-
-  /// Value to be applied to the pricing type.
-  /// Example: "4" or "2.99"
-  core.String priceValue;
-
-  /// Edit Identifier. This should be the Edit Level EIDR.
-  /// Example: "10.2340/1489-49A2-3956-4B2D-FE16-6"
-  core.String productId;
-
-  /// Value representing the rating reason.
-  /// Rating reasons should be formatted as per
-  /// [EMA ratings spec](http://www.movielabs.com/md/ratings/)
-  /// and comma-separated for inclusion of multiple reasons.
-  /// Example: "L, S, V"
-  core.String ratingReason;
-
-  /// Rating system applied to the version of title within territory
-  /// of Avail.
-  /// Rating systems should be formatted as per
-  /// [EMA ratings spec](http://www.movielabs.com/md/ratings/)
-  /// Example: "MPAA"
-  core.String ratingSystem;
-
-  /// Value representing the rating.
-  /// Ratings should be formatted as per http://www.movielabs.com/md/ratings/
-  /// Example: "PG"
-  core.String ratingValue;
-
-  /// Release date of the Title in earliest released territory.
-  /// Typically it is just the year, but it is free-form as per EMA spec.
-  /// Examples: "1979", "Oct 2014"
-  core.String releaseDate;
-
-  /// Other identifier referring to the season, as defined by partner.
-  /// Only available on TV avails.
-  /// Example: "rs_googlers_s1".
-  core.String seasonAltId;
-
-  /// The number assigned to the season within a series.
-  /// Only available on TV Avails.
-  /// Example: "1".
-  core.String seasonNumber;
-
-  /// Title used by involved parties to refer to this season.
-  /// Only available on TV Avails.
-  /// Example: "Googlers, The".
-  core.String seasonTitleInternalAlias;
-
-  /// Other identifier referring to the series, as defined by partner.
-  /// Only available on TV avails.
-  /// Example: "rs_googlers".
-  core.String seriesAltId;
-
-  /// Title used by involved parties to refer to this series.
-  /// Only available on TV Avails.
-  /// Example: "Googlers, The".
-  core.String seriesTitleInternalAlias;
-
-  /// Start of term in YYYY-MM-DD format in the timezone of the
-  /// country of the Avail.
-  /// Example: "2013-05-14".
-  core.String start;
-
-  /// Spoken language of the intended audience.
-  /// Language shall be encoded in accordance with RFC 5646.
-  /// Example: "fr".
-  core.String storeLanguage;
-
-  /// First date an Edit could be publically announced as becoming
-  /// available at a specific future date in territory of Avail.
-  /// *Not* the Avail start date or pre-order start date.
-  /// Format is YYYY-MM-DD.
-  /// Only available for pre-orders.
-  /// Example: "2012-12-10"
-  core.String suppressionLiftDate;
-
-  /// ISO 3166-1 alpha-2 country code for the country or territory
-  /// of this Avail.
-  /// For Avails, we use Territory in lieu of Country to comply with
-  /// EMA specifications.
-  /// But please note that Territory and Country identify the same thing.
-  /// Example: "US".
-  core.String territory;
-
-  /// Title used by involved parties to refer to this content.
-  /// Example: "Googlers, The".
-  /// Only available on Movie Avails.
-  core.String titleInternalAlias;
-
-  /// Google-generated ID identifying the video linked to this Avail, once
-  /// delivered.
-  /// Not part of EMA Specs.
-  /// Example: 'gtry456_xc'
-  core.String videoId;
-
-  /// Work type as enumerated in EMA.
-  /// Possible string values are:
-  /// - "TITLE_TYPE_UNSPECIFIED" : Value could not be determined, please contact
-  /// technical support if
-  /// it should.
-  /// - "MOVIE" : A movie picture.
-  /// - "SEASON" : A season of a TV show.
-  /// - "EPISODE" : An episode of a TV show.
-  /// - "BUNDLE" : A collection of movies, i.e. "Googlers 1 and Googlers, the
-  /// return"
-  core.String workType;
-
-  Avail();
-
-  Avail.fromJson(core.Map _json) {
-    if (_json.containsKey("altId")) {
-      altId = _json["altId"];
-    }
-    if (_json.containsKey("availId")) {
-      availId = _json["availId"];
-    }
-    if (_json.containsKey("captionExemption")) {
-      captionExemption = _json["captionExemption"];
-    }
-    if (_json.containsKey("captionIncluded")) {
-      captionIncluded = _json["captionIncluded"];
-    }
-    if (_json.containsKey("contentId")) {
-      contentId = _json["contentId"];
-    }
-    if (_json.containsKey("displayName")) {
-      displayName = _json["displayName"];
-    }
-    if (_json.containsKey("encodeId")) {
-      encodeId = _json["encodeId"];
-    }
-    if (_json.containsKey("end")) {
-      end = _json["end"];
-    }
-    if (_json.containsKey("episodeAltId")) {
-      episodeAltId = _json["episodeAltId"];
-    }
-    if (_json.containsKey("episodeNumber")) {
-      episodeNumber = _json["episodeNumber"];
-    }
-    if (_json.containsKey("episodeTitleInternalAlias")) {
-      episodeTitleInternalAlias = _json["episodeTitleInternalAlias"];
-    }
-    if (_json.containsKey("formatProfile")) {
-      formatProfile = _json["formatProfile"];
-    }
-    if (_json.containsKey("licenseType")) {
-      licenseType = _json["licenseType"];
-    }
-    if (_json.containsKey("pphNames")) {
-      pphNames = _json["pphNames"];
-    }
-    if (_json.containsKey("priceType")) {
-      priceType = _json["priceType"];
-    }
-    if (_json.containsKey("priceValue")) {
-      priceValue = _json["priceValue"];
-    }
-    if (_json.containsKey("productId")) {
-      productId = _json["productId"];
-    }
-    if (_json.containsKey("ratingReason")) {
-      ratingReason = _json["ratingReason"];
-    }
-    if (_json.containsKey("ratingSystem")) {
-      ratingSystem = _json["ratingSystem"];
-    }
-    if (_json.containsKey("ratingValue")) {
-      ratingValue = _json["ratingValue"];
-    }
-    if (_json.containsKey("releaseDate")) {
-      releaseDate = _json["releaseDate"];
-    }
-    if (_json.containsKey("seasonAltId")) {
-      seasonAltId = _json["seasonAltId"];
-    }
-    if (_json.containsKey("seasonNumber")) {
-      seasonNumber = _json["seasonNumber"];
-    }
-    if (_json.containsKey("seasonTitleInternalAlias")) {
-      seasonTitleInternalAlias = _json["seasonTitleInternalAlias"];
-    }
-    if (_json.containsKey("seriesAltId")) {
-      seriesAltId = _json["seriesAltId"];
-    }
-    if (_json.containsKey("seriesTitleInternalAlias")) {
-      seriesTitleInternalAlias = _json["seriesTitleInternalAlias"];
-    }
-    if (_json.containsKey("start")) {
-      start = _json["start"];
-    }
-    if (_json.containsKey("storeLanguage")) {
-      storeLanguage = _json["storeLanguage"];
-    }
-    if (_json.containsKey("suppressionLiftDate")) {
-      suppressionLiftDate = _json["suppressionLiftDate"];
-    }
-    if (_json.containsKey("territory")) {
-      territory = _json["territory"];
-    }
-    if (_json.containsKey("titleInternalAlias")) {
-      titleInternalAlias = _json["titleInternalAlias"];
-    }
-    if (_json.containsKey("videoId")) {
-      videoId = _json["videoId"];
-    }
-    if (_json.containsKey("workType")) {
-      workType = _json["workType"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (altId != null) {
-      _json["altId"] = altId;
-    }
-    if (availId != null) {
-      _json["availId"] = availId;
-    }
-    if (captionExemption != null) {
-      _json["captionExemption"] = captionExemption;
-    }
-    if (captionIncluded != null) {
-      _json["captionIncluded"] = captionIncluded;
-    }
-    if (contentId != null) {
-      _json["contentId"] = contentId;
-    }
-    if (displayName != null) {
-      _json["displayName"] = displayName;
-    }
-    if (encodeId != null) {
-      _json["encodeId"] = encodeId;
-    }
-    if (end != null) {
-      _json["end"] = end;
-    }
-    if (episodeAltId != null) {
-      _json["episodeAltId"] = episodeAltId;
-    }
-    if (episodeNumber != null) {
-      _json["episodeNumber"] = episodeNumber;
-    }
-    if (episodeTitleInternalAlias != null) {
-      _json["episodeTitleInternalAlias"] = episodeTitleInternalAlias;
-    }
-    if (formatProfile != null) {
-      _json["formatProfile"] = formatProfile;
-    }
-    if (licenseType != null) {
-      _json["licenseType"] = licenseType;
-    }
-    if (pphNames != null) {
-      _json["pphNames"] = pphNames;
-    }
-    if (priceType != null) {
-      _json["priceType"] = priceType;
-    }
-    if (priceValue != null) {
-      _json["priceValue"] = priceValue;
-    }
-    if (productId != null) {
-      _json["productId"] = productId;
-    }
-    if (ratingReason != null) {
-      _json["ratingReason"] = ratingReason;
-    }
-    if (ratingSystem != null) {
-      _json["ratingSystem"] = ratingSystem;
-    }
-    if (ratingValue != null) {
-      _json["ratingValue"] = ratingValue;
-    }
-    if (releaseDate != null) {
-      _json["releaseDate"] = releaseDate;
-    }
-    if (seasonAltId != null) {
-      _json["seasonAltId"] = seasonAltId;
-    }
-    if (seasonNumber != null) {
-      _json["seasonNumber"] = seasonNumber;
-    }
-    if (seasonTitleInternalAlias != null) {
-      _json["seasonTitleInternalAlias"] = seasonTitleInternalAlias;
-    }
-    if (seriesAltId != null) {
-      _json["seriesAltId"] = seriesAltId;
-    }
-    if (seriesTitleInternalAlias != null) {
-      _json["seriesTitleInternalAlias"] = seriesTitleInternalAlias;
-    }
-    if (start != null) {
-      _json["start"] = start;
-    }
-    if (storeLanguage != null) {
-      _json["storeLanguage"] = storeLanguage;
-    }
-    if (suppressionLiftDate != null) {
-      _json["suppressionLiftDate"] = suppressionLiftDate;
-    }
-    if (territory != null) {
-      _json["territory"] = territory;
-    }
-    if (titleInternalAlias != null) {
-      _json["titleInternalAlias"] = titleInternalAlias;
-    }
-    if (videoId != null) {
-      _json["videoId"] = videoId;
-    }
-    if (workType != null) {
-      _json["workType"] = workType;
-    }
-    return _json;
-  }
-}
-
-/// Response to the 'ListAvails' method.
-class ListAvailsResponse {
-  /// List of Avails that match the request criteria.
-  core.List<Avail> avails;
-
-  /// See _List methods rules_ for info about this field.
-  core.String nextPageToken;
-
-  /// See _List methods rules_ for more information about this field.
-  core.int totalSize;
-
-  ListAvailsResponse();
-
-  ListAvailsResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("avails")) {
-      avails =
-          _json["avails"].map((value) => new Avail.fromJson(value)).toList();
-    }
-    if (_json.containsKey("nextPageToken")) {
-      nextPageToken = _json["nextPageToken"];
-    }
-    if (_json.containsKey("totalSize")) {
-      totalSize = _json["totalSize"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (avails != null) {
-      _json["avails"] = avails.map((value) => (value).toJson()).toList();
-    }
-    if (nextPageToken != null) {
-      _json["nextPageToken"] = nextPageToken;
-    }
-    if (totalSize != null) {
-      _json["totalSize"] = totalSize;
-    }
-    return _json;
-  }
-}
-
-/// Response to the 'ListOrders' method.
-class ListOrdersResponse {
-  /// See _List methods rules_ for info about this field.
-  core.String nextPageToken;
-
-  /// List of Orders that match the request criteria.
-  core.List<Order> orders;
-
-  /// See _List methods rules_ for more information about this field.
-  core.int totalSize;
-
-  ListOrdersResponse();
-
-  ListOrdersResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("nextPageToken")) {
-      nextPageToken = _json["nextPageToken"];
-    }
-    if (_json.containsKey("orders")) {
-      orders =
-          _json["orders"].map((value) => new Order.fromJson(value)).toList();
-    }
-    if (_json.containsKey("totalSize")) {
-      totalSize = _json["totalSize"];
-    }
-  }
-
-  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 (orders != null) {
-      _json["orders"] = orders.map((value) => (value).toJson()).toList();
-    }
-    if (totalSize != null) {
-      _json["totalSize"] = totalSize;
-    }
-    return _json;
-  }
-}
-
-/// Response to the 'ListStoreInfos' method.
-class ListStoreInfosResponse {
-  /// See 'List methods rules' for info about this field.
-  core.String nextPageToken;
-
-  /// List of StoreInfos that match the request criteria.
-  core.List<StoreInfo> storeInfos;
-
-  /// See _List methods rules_ for more information about this field.
-  core.int totalSize;
-
-  ListStoreInfosResponse();
-
-  ListStoreInfosResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("nextPageToken")) {
-      nextPageToken = _json["nextPageToken"];
-    }
-    if (_json.containsKey("storeInfos")) {
-      storeInfos = _json["storeInfos"]
-          .map((value) => new StoreInfo.fromJson(value))
-          .toList();
-    }
-    if (_json.containsKey("totalSize")) {
-      totalSize = _json["totalSize"];
-    }
-  }
-
-  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 (storeInfos != null) {
-      _json["storeInfos"] =
-          storeInfos.map((value) => (value).toJson()).toList();
-    }
-    if (totalSize != null) {
-      _json["totalSize"] = totalSize;
-    }
-    return _json;
-  }
-}
-
-/// An Order tracks the fulfillment of an Edit when delivered using the
-/// legacy, non-component-based delivery.
-///
-/// Each Order is uniquely identified by an `order_id`, which is generated
-/// by Google.
-///
-/// Externally, Orders can also be identified by partners using its `custom_id`
-/// (when provided).
-class Order {
-  /// Timestamp when the Order was approved.
-  core.String approvedTime;
-
-  /// YouTube Channel ID that should be used to fulfill the Order.
-  /// Example: "UCRG64darCZhb".
-  core.String channelId;
-
-  /// YouTube Channel Name that should be used to fulfill the Order.
-  /// Example: "Google_channel".
-  core.String channelName;
-
-  /// Countries where the Order is available,
-  /// using the "ISO 3166-1 alpha-2" format (example: "US").
-  core.List<core.String> countries;
-
-  /// ID that can be used to externally identify an Order.
-  /// This ID is provided by partners when submitting the Avails.
-  /// Example: 'GOOGLER_2006'
-  core.String customId;
-
-  /// Timestamp of the earliest start date of the Avails
-  /// linked to this Order.
-  core.String earliestAvailStartTime;
-
-  /// Default Episode name,
-  /// usually in the language of the country of origin.
-  /// Only available for TV Edits
-  /// Example: "Googlers, The - Pilot".
-  core.String episodeName;
-
-  /// Legacy Order priority, as defined by Google.
-  /// Example: 'P0'
-  core.String legacyPriority;
-
-  /// Default Edit name,
-  /// usually in the language of the country of origin.
-  /// Example: "Googlers, The".
-  core.String name;
-
-  /// A simpler representation of the priority.
-  /// Possible string values are:
-  /// - "NORMALIZED_PRIORITY_UNSPECIFIED" : Value could not be determined,
-  /// please contact technical support if
-  /// it should.
-  /// - "LOW_PRIORITY" : A low-priority asset, typically from a library movie.
-  /// - "HIGH_PRIORITY" : A high-priority asset, typically from a new release or
-  /// box office hit.
-  core.String normalizedPriority;
-
-  /// ID internally generated by Google to uniquely identify an Order.
-  /// Example: 'abcde12_x'
-  core.String orderId;
-
-  /// Timestamp when the Order was created.
-  core.String orderedTime;
-
-  /// Name of the post-production house that manages the Edit ordered.
-  core.String pphName;
-
-  /// Order priority, as defined by Google.
-  /// The higher the value, the higher the priority.
-  /// Example: 90
-  core.double priority;
-
-  /// Timestamp when the Order was fulfilled.
-  core.String receivedTime;
-
-  /// Field explaining why an Order has been rejected.
-  /// Example: "Trailer audio is 2ch mono, please re-deliver in stereo".
-  core.String rejectionNote;
-
-  /// Default Season name,
-  /// usually in the language of the country of origin.
-  /// Only available for TV Edits
-  /// Example: "Googlers, The - A Brave New World".
-  core.String seasonName;
-
-  /// Default Show name,
-  /// usually in the language of the country of origin.
-  /// Only available for TV Edits
-  /// Example: "Googlers, The".
-  core.String showName;
-
-  /// High-level status of the order.
-  /// Possible string values are:
-  /// - "STATUS_UNSPECIFIED" : Value could not be determined, please contact
-  /// technical support if
-  /// it should.
-  /// - "STATUS_APPROVED" : Approved by Google.
-  /// - "STATUS_FAILED" : Waiting for partner to re-deliver the asset after a
-  /// rejection by Google.
-  /// - "STATUS_PROCESSING" : Waiting for Google to process the asset.
-  /// - "STATUS_UNFULFILLED" : Waiting for partner to deliver the asset.
-  /// - "STATUS_NOT_AVAILABLE" : Used when Status is not available (i.e: Orders
-  /// for TV Seasons).
-  core.String status;
-
-  /// Detailed status of the order
-  /// Possible string values are:
-  /// - "ORDER_STATUS_UNSPECIFIED" : Value could not be determined, please
-  /// contact technical support if
-  /// it should.
-  /// - "ORDER_STATUS_QC_APPROVED" : Approved by Google's Quality Control team.
-  /// - "ORDER_STATUS_QC_REJECTION" : Rejected by Google's Quality Control team,
-  /// pending partner redelivery.
-  /// - "ORDER_STATUS_INTERNAL_FIX" : Internal error while processing the Order.
-  /// - "ORDER_STATUS_OPEN_ORDER" : Waiting for initial delivery from partner.
-  /// - "ORDER_STATUS_NOT_AVAILABLE" : Used on Orders that do not have Status,
-  /// like TV Seasons.
-  /// - "ORDER_STATUS_AWAITING_REDELIVERY" : Waiting for re-delivery from
-  /// partner.
-  /// - "ORDER_STATUS_READY_FOR_QC" : Asset was delivered by partner, but is
-  /// being reviewed by Google's
-  /// Quality Control team.
-  /// - "ORDER_STATUS_FILE_PROCESSING" : Waiting for Google to process the
-  /// asset.
-  core.String statusDetail;
-
-  /// Name of the studio that owns the Edit ordered.
-  core.String studioName;
-
-  /// Type of the Edit linked to the Order.
-  /// Possible string values are:
-  /// - "TITLE_TYPE_UNSPECIFIED" : Value could not be determined, please contact
-  /// technical support if
-  /// it should.
-  /// - "MOVIE" : A movie picture.
-  /// - "SEASON" : A season of a TV show.
-  /// - "EPISODE" : An episode of a TV show.
-  /// - "BUNDLE" : A collection of movies, i.e. "Googlers 1 and Googlers, the
-  /// return"
-  core.String type;
-
-  /// Google-generated ID identifying the video linked to this Order, once
-  /// delivered.
-  /// Example: 'gtry456_xc'.
-  core.String videoId;
-
-  Order();
-
-  Order.fromJson(core.Map _json) {
-    if (_json.containsKey("approvedTime")) {
-      approvedTime = _json["approvedTime"];
-    }
-    if (_json.containsKey("channelId")) {
-      channelId = _json["channelId"];
-    }
-    if (_json.containsKey("channelName")) {
-      channelName = _json["channelName"];
-    }
-    if (_json.containsKey("countries")) {
-      countries = _json["countries"];
-    }
-    if (_json.containsKey("customId")) {
-      customId = _json["customId"];
-    }
-    if (_json.containsKey("earliestAvailStartTime")) {
-      earliestAvailStartTime = _json["earliestAvailStartTime"];
-    }
-    if (_json.containsKey("episodeName")) {
-      episodeName = _json["episodeName"];
-    }
-    if (_json.containsKey("legacyPriority")) {
-      legacyPriority = _json["legacyPriority"];
-    }
-    if (_json.containsKey("name")) {
-      name = _json["name"];
-    }
-    if (_json.containsKey("normalizedPriority")) {
-      normalizedPriority = _json["normalizedPriority"];
-    }
-    if (_json.containsKey("orderId")) {
-      orderId = _json["orderId"];
-    }
-    if (_json.containsKey("orderedTime")) {
-      orderedTime = _json["orderedTime"];
-    }
-    if (_json.containsKey("pphName")) {
-      pphName = _json["pphName"];
-    }
-    if (_json.containsKey("priority")) {
-      priority = _json["priority"];
-    }
-    if (_json.containsKey("receivedTime")) {
-      receivedTime = _json["receivedTime"];
-    }
-    if (_json.containsKey("rejectionNote")) {
-      rejectionNote = _json["rejectionNote"];
-    }
-    if (_json.containsKey("seasonName")) {
-      seasonName = _json["seasonName"];
-    }
-    if (_json.containsKey("showName")) {
-      showName = _json["showName"];
-    }
-    if (_json.containsKey("status")) {
-      status = _json["status"];
-    }
-    if (_json.containsKey("statusDetail")) {
-      statusDetail = _json["statusDetail"];
-    }
-    if (_json.containsKey("studioName")) {
-      studioName = _json["studioName"];
-    }
-    if (_json.containsKey("type")) {
-      type = _json["type"];
-    }
-    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 (approvedTime != null) {
-      _json["approvedTime"] = approvedTime;
-    }
-    if (channelId != null) {
-      _json["channelId"] = channelId;
-    }
-    if (channelName != null) {
-      _json["channelName"] = channelName;
-    }
-    if (countries != null) {
-      _json["countries"] = countries;
-    }
-    if (customId != null) {
-      _json["customId"] = customId;
-    }
-    if (earliestAvailStartTime != null) {
-      _json["earliestAvailStartTime"] = earliestAvailStartTime;
-    }
-    if (episodeName != null) {
-      _json["episodeName"] = episodeName;
-    }
-    if (legacyPriority != null) {
-      _json["legacyPriority"] = legacyPriority;
-    }
-    if (name != null) {
-      _json["name"] = name;
-    }
-    if (normalizedPriority != null) {
-      _json["normalizedPriority"] = normalizedPriority;
-    }
-    if (orderId != null) {
-      _json["orderId"] = orderId;
-    }
-    if (orderedTime != null) {
-      _json["orderedTime"] = orderedTime;
-    }
-    if (pphName != null) {
-      _json["pphName"] = pphName;
-    }
-    if (priority != null) {
-      _json["priority"] = priority;
-    }
-    if (receivedTime != null) {
-      _json["receivedTime"] = receivedTime;
-    }
-    if (rejectionNote != null) {
-      _json["rejectionNote"] = rejectionNote;
-    }
-    if (seasonName != null) {
-      _json["seasonName"] = seasonName;
-    }
-    if (showName != null) {
-      _json["showName"] = showName;
-    }
-    if (status != null) {
-      _json["status"] = status;
-    }
-    if (statusDetail != null) {
-      _json["statusDetail"] = statusDetail;
-    }
-    if (studioName != null) {
-      _json["studioName"] = studioName;
-    }
-    if (type != null) {
-      _json["type"] = type;
-    }
-    if (videoId != null) {
-      _json["videoId"] = videoId;
-    }
-    return _json;
-  }
-}
-
-/// Information about a playable sequence (video) associated with an Edit
-/// and available at the Google Play Store.
-///
-/// Internally, each StoreInfo is uniquely identified by a `video_id`
-/// and `country`.
-///
-/// Externally, Title-level EIDR or Edit-level EIDR, if provided,
-/// can also be used to identify a specific title or edit in a country.
-class StoreInfo {
-  /// Audio tracks available for this Edit.
-  core.List<core.String> audioTracks;
-
-  /// Country where Edit is available in ISO 3166-1 alpha-2 country
-  /// code.
-  /// Example: "US".
-  core.String country;
-
-  /// Edit-level EIDR ID.
-  /// Example: "10.5240/1489-49A2-3956-4B2D-FE16-6".
-  core.String editLevelEidr;
-
-  /// The number assigned to the episode within a season.
-  /// Only available on TV Edits.
-  /// Example: "1".
-  core.String episodeNumber;
-
-  /// Whether the Edit has a 5.1 channel audio track.
-  core.bool hasAudio51;
-
-  /// Whether the Edit has a EST offer.
-  core.bool hasEstOffer;
-
-  /// Whether the Edit has a HD offer.
-  core.bool hasHdOffer;
-
-  /// Whether the Edit has info cards.
-  core.bool hasInfoCards;
-
-  /// Whether the Edit has a SD offer.
-  core.bool hasSdOffer;
-
-  /// Whether the Edit has a VOD offer.
-  core.bool hasVodOffer;
-
-  /// Timestamp when the Edit went live on the Store.
-  core.String liveTime;
-
-  /// Knowledge Graph ID associated to this Edit, if available.
-  /// This ID links the Edit to its knowledge entity, externally accessible
-  /// at http://freebase.com.
-  /// In the absense of Title EIDR or Edit EIDR, this ID helps link together
-  /// multiple Edits across countries.
-  /// Example: '/m/0ffx29'
-  core.String mid;
-
-  /// Default Edit name, usually in the language of the country of
-  /// origin.
-  /// Example: "Googlers, The".
-  core.String name;
-
-  /// Name of the post-production houses that manage the Edit.
-  core.List<core.String> pphNames;
-
-  /// Google-generated ID identifying the season linked to the Edit.
-  /// Only available for TV Edits.
-  /// Example: 'ster23ex'
-  core.String seasonId;
-
-  /// Default Season name, usually in the language of the country of
-  /// origin.
-  /// Only available for TV Edits
-  /// Example: "Googlers, The - A Brave New World".
-  core.String seasonName;
-
-  /// The number assigned to the season within a show.
-  /// Only available on TV Edits.
-  /// Example: "1".
-  core.String seasonNumber;
-
-  /// Google-generated ID identifying the show linked to the Edit.
-  /// Only available for TV Edits.
-  /// Example: 'et2hsue_x'
-  core.String showId;
-
-  /// Default Show name, usually in the language of the country of
-  /// origin.
-  /// Only available for TV Edits
-  /// Example: "Googlers, The".
-  core.String showName;
-
-  /// Name of the studio that owns the Edit ordered.
-  core.String studioName;
-
-  /// Subtitles available for this Edit.
-  core.List<core.String> subtitles;
-
-  /// Title-level EIDR ID.
-  /// Example: "10.5240/1489-49A2-3956-4B2D-FE16-5".
-  core.String titleLevelEidr;
-
-  /// Google-generated ID identifying the trailer linked to the Edit.
-  /// Example: 'bhd_4e_cx'
-  core.String trailerId;
-
-  /// Edit type, like Movie, Episode or Season.
-  /// Possible string values are:
-  /// - "TITLE_TYPE_UNSPECIFIED" : Value could not be determined, please contact
-  /// technical support if
-  /// it should.
-  /// - "MOVIE" : A movie picture.
-  /// - "SEASON" : A season of a TV show.
-  /// - "EPISODE" : An episode of a TV show.
-  /// - "BUNDLE" : A collection of movies, i.e. "Googlers 1 and Googlers, the
-  /// return"
-  core.String type;
-
-  /// Google-generated ID identifying the video linked to the Edit.
-  /// Example: 'gtry456_xc'
-  core.String videoId;
-
-  StoreInfo();
-
-  StoreInfo.fromJson(core.Map _json) {
-    if (_json.containsKey("audioTracks")) {
-      audioTracks = _json["audioTracks"];
-    }
-    if (_json.containsKey("country")) {
-      country = _json["country"];
-    }
-    if (_json.containsKey("editLevelEidr")) {
-      editLevelEidr = _json["editLevelEidr"];
-    }
-    if (_json.containsKey("episodeNumber")) {
-      episodeNumber = _json["episodeNumber"];
-    }
-    if (_json.containsKey("hasAudio51")) {
-      hasAudio51 = _json["hasAudio51"];
-    }
-    if (_json.containsKey("hasEstOffer")) {
-      hasEstOffer = _json["hasEstOffer"];
-    }
-    if (_json.containsKey("hasHdOffer")) {
-      hasHdOffer = _json["hasHdOffer"];
-    }
-    if (_json.containsKey("hasInfoCards")) {
-      hasInfoCards = _json["hasInfoCards"];
-    }
-    if (_json.containsKey("hasSdOffer")) {
-      hasSdOffer = _json["hasSdOffer"];
-    }
-    if (_json.containsKey("hasVodOffer")) {
-      hasVodOffer = _json["hasVodOffer"];
-    }
-    if (_json.containsKey("liveTime")) {
-      liveTime = _json["liveTime"];
-    }
-    if (_json.containsKey("mid")) {
-      mid = _json["mid"];
-    }
-    if (_json.containsKey("name")) {
-      name = _json["name"];
-    }
-    if (_json.containsKey("pphNames")) {
-      pphNames = _json["pphNames"];
-    }
-    if (_json.containsKey("seasonId")) {
-      seasonId = _json["seasonId"];
-    }
-    if (_json.containsKey("seasonName")) {
-      seasonName = _json["seasonName"];
-    }
-    if (_json.containsKey("seasonNumber")) {
-      seasonNumber = _json["seasonNumber"];
-    }
-    if (_json.containsKey("showId")) {
-      showId = _json["showId"];
-    }
-    if (_json.containsKey("showName")) {
-      showName = _json["showName"];
-    }
-    if (_json.containsKey("studioName")) {
-      studioName = _json["studioName"];
-    }
-    if (_json.containsKey("subtitles")) {
-      subtitles = _json["subtitles"];
-    }
-    if (_json.containsKey("titleLevelEidr")) {
-      titleLevelEidr = _json["titleLevelEidr"];
-    }
-    if (_json.containsKey("trailerId")) {
-      trailerId = _json["trailerId"];
-    }
-    if (_json.containsKey("type")) {
-      type = _json["type"];
-    }
-    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 (audioTracks != null) {
-      _json["audioTracks"] = audioTracks;
-    }
-    if (country != null) {
-      _json["country"] = country;
-    }
-    if (editLevelEidr != null) {
-      _json["editLevelEidr"] = editLevelEidr;
-    }
-    if (episodeNumber != null) {
-      _json["episodeNumber"] = episodeNumber;
-    }
-    if (hasAudio51 != null) {
-      _json["hasAudio51"] = hasAudio51;
-    }
-    if (hasEstOffer != null) {
-      _json["hasEstOffer"] = hasEstOffer;
-    }
-    if (hasHdOffer != null) {
-      _json["hasHdOffer"] = hasHdOffer;
-    }
-    if (hasInfoCards != null) {
-      _json["hasInfoCards"] = hasInfoCards;
-    }
-    if (hasSdOffer != null) {
-      _json["hasSdOffer"] = hasSdOffer;
-    }
-    if (hasVodOffer != null) {
-      _json["hasVodOffer"] = hasVodOffer;
-    }
-    if (liveTime != null) {
-      _json["liveTime"] = liveTime;
-    }
-    if (mid != null) {
-      _json["mid"] = mid;
-    }
-    if (name != null) {
-      _json["name"] = name;
-    }
-    if (pphNames != null) {
-      _json["pphNames"] = pphNames;
-    }
-    if (seasonId != null) {
-      _json["seasonId"] = seasonId;
-    }
-    if (seasonName != null) {
-      _json["seasonName"] = seasonName;
-    }
-    if (seasonNumber != null) {
-      _json["seasonNumber"] = seasonNumber;
-    }
-    if (showId != null) {
-      _json["showId"] = showId;
-    }
-    if (showName != null) {
-      _json["showName"] = showName;
-    }
-    if (studioName != null) {
-      _json["studioName"] = studioName;
-    }
-    if (subtitles != null) {
-      _json["subtitles"] = subtitles;
-    }
-    if (titleLevelEidr != null) {
-      _json["titleLevelEidr"] = titleLevelEidr;
-    }
-    if (trailerId != null) {
-      _json["trailerId"] = trailerId;
-    }
-    if (type != null) {
-      _json["type"] = type;
-    }
-    if (videoId != null) {
-      _json["videoId"] = videoId;
-    }
-    return _json;
-  }
-}
diff --git a/googleapis/lib/plus/v1.dart b/googleapis/lib/plus/v1.dart
index f65f000..49f7120 100644
--- a/googleapis/lib/plus/v1.dart
+++ b/googleapis/lib/plus/v1.dart
@@ -4,7 +4,6 @@
 
 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;
diff --git a/googleapis/lib/poly/v1.dart b/googleapis/lib/poly/v1.dart
new file mode 100644
index 0000000..db78c58
--- /dev/null
+++ b/googleapis/lib/poly/v1.dart
@@ -0,0 +1,983 @@
+// This is a generated file (see the discoveryapis_generator project).
+
+library googleapis.poly.v1;
+
+import 'dart:core' as core;
+import 'dart:async' as async;
+
+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 poly/v1';
+
+/// The Poly API provides read-only access to assets hosted on <a
+/// href="https://poly.google.com">poly.google.com</a>.
+class PolyApi {
+  final commons.ApiRequester _requester;
+
+  AssetsResourceApi get assets => new AssetsResourceApi(_requester);
+  UsersResourceApi get users => new UsersResourceApi(_requester);
+
+  PolyApi(http.Client client,
+      {core.String rootUrl: "https://poly.googleapis.com/",
+      core.String servicePath: ""})
+      : _requester =
+            new commons.ApiRequester(client, rootUrl, servicePath, USER_AGENT);
+}
+
+class AssetsResourceApi {
+  final commons.ApiRequester _requester;
+
+  AssetsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Returns detailed information about an asset given its name.
+  /// PRIVATE assets are returned only if
+  /// the currently authenticated user (via OAuth token) is the author of the
+  /// asset.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Required. An asset's name in the form `assets/{ASSET_ID}`.
+  /// Value must have pattern "^assets/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Asset].
+  ///
+  /// 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<Asset> 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 Asset.fromJson(data));
+  }
+
+  /// Lists all public, remixable assets. These are assets with an access level
+  /// of
+  /// PUBLIC and published under the
+  /// CC-By license.
+  ///
+  /// Request parameters:
+  ///
+  /// [category] - Filter assets based on the specified category. Supported
+  /// values are:
+  /// `animals`, `architecture`, `art`, `food`, `nature`, `objects`, `people`,
+  /// `scenes`,
+  /// `technology`, and `transport`.
+  ///
+  /// [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.
+  ///
+  /// [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.
+  ///
+  /// [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,
+  /// description, and tags. Multiple keywords should be
+  /// separated by spaces.
+  ///
+  /// [orderBy] - Specifies an ordering for assets. Acceptable values are:
+  /// `BEST`, `NEWEST`, `OLDEST`. Defaults to `BEST`, which ranks assets
+  /// based on a combination of popularity and other features.
+  ///
+  /// [format] - Return only assets with the matching format. Acceptable values
+  /// are:
+  /// `BLOCKS`, `FBX`, `GLTF`, `GLTF2`, `OBJ`, `TILT`.
+  ///
+  /// [curated] - Return only assets that have been curated by the Poly team.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListAssetsResponse].
+  ///
+  /// 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<ListAssetsResponse> list(
+      {core.String category,
+      core.String maxComplexity,
+      core.String pageToken,
+      core.int pageSize,
+      core.String keywords,
+      core.String orderBy,
+      core.String format,
+      core.bool curated,
+      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 (category != null) {
+      _queryParams["category"] = [category];
+    }
+    if (maxComplexity != null) {
+      _queryParams["maxComplexity"] = [maxComplexity];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (keywords != null) {
+      _queryParams["keywords"] = [keywords];
+    }
+    if (orderBy != null) {
+      _queryParams["orderBy"] = [orderBy];
+    }
+    if (format != null) {
+      _queryParams["format"] = [format];
+    }
+    if (curated != null) {
+      _queryParams["curated"] = ["${curated}"];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/assets';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListAssetsResponse.fromJson(data));
+  }
+}
+
+class UsersResourceApi {
+  final commons.ApiRequester _requester;
+
+  UsersAssetsResourceApi get assets => new UsersAssetsResourceApi(_requester);
+  UsersLikedassetsResourceApi get likedassets =>
+      new UsersLikedassetsResourceApi(_requester);
+
+  UsersResourceApi(commons.ApiRequester client) : _requester = client;
+}
+
+class UsersAssetsResourceApi {
+  final commons.ApiRequester _requester;
+
+  UsersAssetsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Lists assets authored by the given user. Only the value 'me', representing
+  /// the currently-authenticated user, is supported. May include assets with an
+  /// access level of PRIVATE or
+  /// UNLISTED and assets which are
+  /// All Rights Reserved for the
+  /// currently-authenticated user.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - A valid user id. Currently, only the special value 'me',
+  /// representing the
+  /// currently-authenticated user is supported. To use 'me', you must pass
+  /// an OAuth token with the request.
+  /// Value must have pattern "^users/[^/]+$".
+  ///
+  /// [orderBy] - Specifies an ordering for assets. Acceptable values are:
+  /// `BEST`, `NEWEST`, `OLDEST`. Defaults to `BEST`, which ranks assets
+  /// based on a combination of popularity and other features.
+  ///
+  /// [format] - Return only assets with the matching format. Acceptable values
+  /// are:
+  /// `BLOCKS`, `FBX`, `GLTF`, `GLTF2`, `OBJ`, and `TILT`.
+  ///
+  /// [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.
+  ///
+  /// [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:
+  /// - "VISIBILITY_UNSPECIFIED" : A VISIBILITY_UNSPECIFIED.
+  /// - "PUBLISHED" : A PUBLISHED.
+  /// - "PRIVATE" : A PRIVATE.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListUserAssetsResponse].
+  ///
+  /// 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<ListUserAssetsResponse> list(core.String name,
+      {core.String orderBy,
+      core.String format,
+      core.String pageToken,
+      core.int pageSize,
+      core.String visibility,
+      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 (orderBy != null) {
+      _queryParams["orderBy"] = [orderBy];
+    }
+    if (format != null) {
+      _queryParams["format"] = [format];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (visibility != null) {
+      _queryParams["visibility"] = [visibility];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$name') + '/assets';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListUserAssetsResponse.fromJson(data));
+  }
+}
+
+class UsersLikedassetsResourceApi {
+  final commons.ApiRequester _requester;
+
+  UsersLikedassetsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Lists assets that the user has liked. Only the value 'me', representing
+  /// the currently-authenticated user, is supported. May include assets with an
+  /// access level of UNLISTED.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - A valid user id. Currently, only the special value 'me',
+  /// representing the
+  /// currently-authenticated user is supported. To use 'me', you must pass
+  /// an OAuth token with the request.
+  /// Value must have pattern "^users/[^/]+$".
+  ///
+  /// [orderBy] - Specifies an ordering for assets. Acceptable values are:
+  /// `BEST`, `NEWEST`, `OLDEST`, 'LIKED_TIME'. Defaults to `LIKED_TIME`, which
+  /// ranks assets based on how recently they were liked.
+  ///
+  /// [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.
+  ///
+  /// [pageSize] - The maximum number of assets to be returned. This value must
+  /// be between `1`
+  /// and `100`. Defaults to `20`.
+  ///
+  /// [format] - Return only assets with the matching format. Acceptable values
+  /// are:
+  /// `BLOCKS`, `FBX`, `GLTF`, `GLTF2`, `OBJ`, `TILT`.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListLikedAssetsResponse].
+  ///
+  /// 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<ListLikedAssetsResponse> list(core.String name,
+      {core.String orderBy,
+      core.String pageToken,
+      core.int pageSize,
+      core.String format,
+      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 (orderBy != null) {
+      _queryParams["orderBy"] = [orderBy];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (format != null) {
+      _queryParams["format"] = [format];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url =
+        'v1/' + commons.Escaper.ecapeVariableReserved('$name') + '/likedassets';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListLikedAssetsResponse.fromJson(data));
+  }
+}
+
+/// Represents and describes an asset in the Poly library. An asset is a 3D
+/// model
+/// or scene created using [Tilt Brush](//www.tiltbrush.com),
+/// [Blocks](//vr.google.com/blocks/), or any 3D program that produces a file
+/// that can be upload to Poly.
+class Asset {
+  /// The author's publicly visible name. Use this name when giving credit to
+  /// the
+  /// author. For more information, see [Licensing](/poly/discover/licensing).
+  core.String authorName;
+
+  /// For published assets, the time when the asset was published.
+  /// For unpublished assets, the time when the asset was created.
+  core.String createTime;
+
+  /// The human-readable description, set by the asset's author.
+  core.String description;
+
+  /// The human-readable name, set by the asset's author.
+  core.String displayName;
+
+  /// A list of Formats where each
+  /// format describes one representation of the asset.
+  core.List<Format> formats;
+
+  /// Whether this asset has been curated by the Poly team.
+  core.bool isCurated;
+
+  /// The license under which the author has made the asset available
+  /// for use, if any.
+  /// Possible string values are:
+  /// - "UNKNOWN" : Unknown license value.
+  /// - "CREATIVE_COMMONS_BY" : Creative Commons CC-BY 3.0.
+  /// https://creativecommons.org/licenses/by/3.0/
+  /// - "ALL_RIGHTS_RESERVED" : Unlicensed: All Rights Reserved by the author.
+  /// Unlicensed assets are
+  /// **not** returned by List Assets.
+  core.String license;
+
+  /// Application-defined opaque metadata for this asset. This field is only
+  /// returned when querying for the signed-in user's own assets, not for public
+  /// assets. This string is limited to 1K chars. It is up to the creator of
+  /// the asset to define the format for this string (for example, JSON).
+  core.String metadata;
+
+  /// The unique identifier for the asset in the form:
+  /// `assets/{ASSET_ID}`.
+  core.String name;
+
+  /// Hints for displaying the asset. Note that these parameters are not
+  /// immutable; the author of an asset may change them post-publication.
+  PresentationParams presentationParams;
+
+  /// The thumbnail image for the asset.
+  File thumbnail;
+
+  /// The time when the asset was last modified. For published assets, whose
+  /// contents are immutable, the update time changes only when metadata
+  /// properties, such as visibility, are updated.
+  core.String updateTime;
+
+  /// The visibility of the asset and who can access it.
+  /// Possible string values are:
+  /// - "VISIBILITY_UNSPECIFIED" : Unknown (and invalid) visibility.
+  /// - "PRIVATE" : Access to the asset and its underlying files and resources
+  /// is restricted to
+  /// the author.
+  /// **Authentication:** You must supply an OAuth token that corresponds to the
+  /// author's account.
+  /// - "UNLISTED" : Access to the asset and its underlying files and resources
+  /// is available to
+  /// anyone with the asset's name. Unlisted assets are **not**
+  /// returned by List Assets.
+  /// - "PUBLIC" : Access to the asset and its underlying files and resources is
+  /// available
+  /// to anyone.
+  core.String visibility;
+
+  Asset();
+
+  Asset.fromJson(core.Map _json) {
+    if (_json.containsKey("authorName")) {
+      authorName = _json["authorName"];
+    }
+    if (_json.containsKey("createTime")) {
+      createTime = _json["createTime"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("displayName")) {
+      displayName = _json["displayName"];
+    }
+    if (_json.containsKey("formats")) {
+      formats =
+          _json["formats"].map((value) => new Format.fromJson(value)).toList();
+    }
+    if (_json.containsKey("isCurated")) {
+      isCurated = _json["isCurated"];
+    }
+    if (_json.containsKey("license")) {
+      license = _json["license"];
+    }
+    if (_json.containsKey("metadata")) {
+      metadata = _json["metadata"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("presentationParams")) {
+      presentationParams =
+          new PresentationParams.fromJson(_json["presentationParams"]);
+    }
+    if (_json.containsKey("thumbnail")) {
+      thumbnail = new File.fromJson(_json["thumbnail"]);
+    }
+    if (_json.containsKey("updateTime")) {
+      updateTime = _json["updateTime"];
+    }
+    if (_json.containsKey("visibility")) {
+      visibility = _json["visibility"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (authorName != null) {
+      _json["authorName"] = authorName;
+    }
+    if (createTime != null) {
+      _json["createTime"] = createTime;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (displayName != null) {
+      _json["displayName"] = displayName;
+    }
+    if (formats != null) {
+      _json["formats"] = formats.map((value) => (value).toJson()).toList();
+    }
+    if (isCurated != null) {
+      _json["isCurated"] = isCurated;
+    }
+    if (license != null) {
+      _json["license"] = license;
+    }
+    if (metadata != null) {
+      _json["metadata"] = metadata;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (presentationParams != null) {
+      _json["presentationParams"] = (presentationParams).toJson();
+    }
+    if (thumbnail != null) {
+      _json["thumbnail"] = (thumbnail).toJson();
+    }
+    if (updateTime != null) {
+      _json["updateTime"] = updateTime;
+    }
+    if (visibility != null) {
+      _json["visibility"] = visibility;
+    }
+    return _json;
+  }
+}
+
+/// Represents a file in Poly, which can be a root,
+/// resource, or thumbnail file.
+class File {
+  /// The MIME content-type, such as `image/png`.
+  /// For more information, see
+  /// [MIME
+  /// types](//developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types).
+  core.String contentType;
+
+  /// The path of the resource file relative to the root file.
+  /// For root or thumbnail files, this is just the filename.
+  core.String relativePath;
+
+  /// The URL where the file data can be retrieved.
+  core.String url;
+
+  File();
+
+  File.fromJson(core.Map _json) {
+    if (_json.containsKey("contentType")) {
+      contentType = _json["contentType"];
+    }
+    if (_json.containsKey("relativePath")) {
+      relativePath = _json["relativePath"];
+    }
+    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 (contentType != null) {
+      _json["contentType"] = contentType;
+    }
+    if (relativePath != null) {
+      _json["relativePath"] = relativePath;
+    }
+    if (url != null) {
+      _json["url"] = url;
+    }
+    return _json;
+  }
+}
+
+/// The same asset can be represented in different formats, for example,
+/// a [WaveFront .obj](//en.wikipedia.org/wiki/Wavefront_.obj_file) file with
+/// its
+/// corresponding .mtl file or a [Khronos glTF](//www.khronos.org/gltf) file
+/// with its corresponding .glb binary data. A format refers to a specific
+/// representation of an asset and contains all information needed to
+/// retrieve and describe this representation.
+class Format {
+  /// Complexity stats about this representation of the asset.
+  FormatComplexity formatComplexity;
+
+  /// A short string that identifies the format type of this representation.
+  /// Possible values are: `FBX`, `GLTF`, `GLTF2`, `OBJ`, and `TILT`.
+  core.String formatType;
+
+  /// A list of dependencies of the root element. May include, but is not
+  /// limited to, materials, textures, and shader programs.
+  core.List<File> resources;
+
+  /// The root of the file hierarchy. This will always be populated.
+  /// For some format_types - such as `TILT`, which are self-contained -
+  /// this is all of the data.
+  ///
+  /// Other types - such as `OBJ` - often reference other data elements.
+  /// These are contained in the resources field.
+  File root;
+
+  Format();
+
+  Format.fromJson(core.Map _json) {
+    if (_json.containsKey("formatComplexity")) {
+      formatComplexity =
+          new FormatComplexity.fromJson(_json["formatComplexity"]);
+    }
+    if (_json.containsKey("formatType")) {
+      formatType = _json["formatType"];
+    }
+    if (_json.containsKey("resources")) {
+      resources =
+          _json["resources"].map((value) => new File.fromJson(value)).toList();
+    }
+    if (_json.containsKey("root")) {
+      root = new File.fromJson(_json["root"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (formatComplexity != null) {
+      _json["formatComplexity"] = (formatComplexity).toJson();
+    }
+    if (formatType != null) {
+      _json["formatType"] = formatType;
+    }
+    if (resources != null) {
+      _json["resources"] = resources.map((value) => (value).toJson()).toList();
+    }
+    if (root != null) {
+      _json["root"] = (root).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Information on the complexity of this Format.
+class FormatComplexity {
+  /// A non-negative integer that represents the level of detail (LOD) of this
+  /// format relative to other formats of the same asset with the same
+  /// format_type.
+  /// This hint allows you to sort formats from the most-detailed (0) to
+  /// least-detailed (integers greater than 0).
+  core.int lodHint;
+
+  /// The estimated number of triangles.
+  core.String triangleCount;
+
+  FormatComplexity();
+
+  FormatComplexity.fromJson(core.Map _json) {
+    if (_json.containsKey("lodHint")) {
+      lodHint = _json["lodHint"];
+    }
+    if (_json.containsKey("triangleCount")) {
+      triangleCount = _json["triangleCount"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (lodHint != null) {
+      _json["lodHint"] = lodHint;
+    }
+    if (triangleCount != null) {
+      _json["triangleCount"] = triangleCount;
+    }
+    return _json;
+  }
+}
+
+/// A response message from a request to list.
+class ListAssetsResponse {
+  /// A list of assets that match the criteria specified in the request.
+  core.List<Asset> assets;
+
+  /// The continuation token for retrieving the next page. If empty,
+  /// indicates that there are no more pages. To get the next page, submit the
+  /// same request specifying this value as the
+  /// page_token.
+  core.String nextPageToken;
+
+  /// The total number of assets in the list, without pagination.
+  core.int totalSize;
+
+  ListAssetsResponse();
+
+  ListAssetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("assets")) {
+      assets =
+          _json["assets"].map((value) => new Asset.fromJson(value)).toList();
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("totalSize")) {
+      totalSize = _json["totalSize"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (assets != null) {
+      _json["assets"] = assets.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (totalSize != null) {
+      _json["totalSize"] = totalSize;
+    }
+    return _json;
+  }
+}
+
+/// A response message from a request to list.
+class ListLikedAssetsResponse {
+  /// A list of assets that match the criteria specified in the request.
+  core.List<Asset> assets;
+
+  /// The continuation token for retrieving the next page. If empty,
+  /// indicates that there are no more pages. To get the next page, submit the
+  /// same request specifying this value as the
+  /// page_token.
+  core.String nextPageToken;
+
+  /// The total number of assets in the list, without pagination.
+  core.int totalSize;
+
+  ListLikedAssetsResponse();
+
+  ListLikedAssetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("assets")) {
+      assets =
+          _json["assets"].map((value) => new Asset.fromJson(value)).toList();
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("totalSize")) {
+      totalSize = _json["totalSize"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (assets != null) {
+      _json["assets"] = assets.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (totalSize != null) {
+      _json["totalSize"] = totalSize;
+    }
+    return _json;
+  }
+}
+
+/// A response message from a request to list.
+class ListUserAssetsResponse {
+  /// The continuation token for retrieving the next page. If empty,
+  /// indicates that there are no more pages. To get the next page, submit the
+  /// same request specifying this value as the
+  /// page_token.
+  core.String nextPageToken;
+
+  /// The total number of assets in the list, without pagination.
+  core.int totalSize;
+
+  /// A list of UserAssets matching the request.
+  core.List<UserAsset> userAssets;
+
+  ListUserAssetsResponse();
+
+  ListUserAssetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("totalSize")) {
+      totalSize = _json["totalSize"];
+    }
+    if (_json.containsKey("userAssets")) {
+      userAssets = _json["userAssets"]
+          .map((value) => new UserAsset.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 (totalSize != null) {
+      _json["totalSize"] = totalSize;
+    }
+    if (userAssets != null) {
+      _json["userAssets"] =
+          userAssets.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Hints for displaying the asset, based on information available when the
+/// asset
+/// was uploaded.
+class PresentationParams {
+  /// The materials' diffuse/albedo color. This does not apply to vertex colors
+  /// or texture maps.
+  /// Possible string values are:
+  /// - "UNKNOWN" : Invalid color value.
+  /// - "LINEAR" : Linear color values. Default.
+  /// - "GAMMA" : Colors should be converted to linear by assuming gamma = 2.0.
+  core.String colorSpace;
+
+  /// A rotation that should be applied to the object root to make it upright.
+  /// More precisely, this quaternion transforms from "object space" (the space
+  /// in which the object is defined) to "presentation space", a coordinate
+  /// system where +Y is up, +X is right, -Z is forward. For example, if
+  /// the object is the Eiffel Tower, in its local coordinate system the
+  /// object might be laid out such that the base of the tower is on the
+  /// YZ plane and the tip of the tower is towards positive X. In this case
+  /// this quaternion would specify a rotation (of 90 degrees about the Z
+  /// axis) such that in the presentation space the base of the tower is
+  /// aligned with the XZ plane, and the tip of the tower lies towards +Y.
+  ///
+  /// This rotation is unrelated to the object's pose in the web preview,
+  /// which is just a camera position setting and is *not* reflected in this
+  /// rotation.
+  ///
+  /// Please note: this is applicable only to the gLTF.
+  Quaternion orientingRotation;
+
+  PresentationParams();
+
+  PresentationParams.fromJson(core.Map _json) {
+    if (_json.containsKey("colorSpace")) {
+      colorSpace = _json["colorSpace"];
+    }
+    if (_json.containsKey("orientingRotation")) {
+      orientingRotation = new Quaternion.fromJson(_json["orientingRotation"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (colorSpace != null) {
+      _json["colorSpace"] = colorSpace;
+    }
+    if (orientingRotation != null) {
+      _json["orientingRotation"] = (orientingRotation).toJson();
+    }
+    return _json;
+  }
+}
+
+/// A [Quaternion](//en.wikipedia.org/wiki/Quaternion). Please note: if in the
+/// response you see "w: 1" and nothing else this is the default value of
+/// [0, 0, 0, 1] where x,y, and z are 0.
+class Quaternion {
+  /// The scalar component.
+  core.double w;
+
+  /// The x component.
+  core.double x;
+
+  /// The y component.
+  core.double y;
+
+  /// The z component.
+  core.double z;
+
+  Quaternion();
+
+  Quaternion.fromJson(core.Map _json) {
+    if (_json.containsKey("w")) {
+      w = _json["w"];
+    }
+    if (_json.containsKey("x")) {
+      x = _json["x"];
+    }
+    if (_json.containsKey("y")) {
+      y = _json["y"];
+    }
+    if (_json.containsKey("z")) {
+      z = _json["z"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (w != null) {
+      _json["w"] = w;
+    }
+    if (x != null) {
+      _json["x"] = x;
+    }
+    if (y != null) {
+      _json["y"] = y;
+    }
+    if (z != null) {
+      _json["z"] = z;
+    }
+    return _json;
+  }
+}
+
+/// Data about the user's asset.
+class UserAsset {
+  /// An Asset.
+  Asset asset;
+
+  UserAsset();
+
+  UserAsset.fromJson(core.Map _json) {
+    if (_json.containsKey("asset")) {
+      asset = new Asset.fromJson(_json["asset"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (asset != null) {
+      _json["asset"] = (asset).toJson();
+    }
+    return _json;
+  }
+}
diff --git a/googleapis/lib/pubsub/v1.dart b/googleapis/lib/pubsub/v1.dart
index d585fe8..3d4783b 100644
--- a/googleapis/lib/pubsub/v1.dart
+++ b/googleapis/lib/pubsub/v1.dart
@@ -54,6 +54,169 @@
   ProjectsSnapshotsResourceApi(commons.ApiRequester client)
       : _requester = client;
 
+  /// Creates a snapshot from the requested subscription.
+  /// If the snapshot already exists, returns `ALREADY_EXISTS`.
+  /// If the requested subscription doesn't exist, returns `NOT_FOUND`.
+  /// If the backlog in the subscription is too old -- and the resulting
+  /// snapshot
+  /// would expire in less than 1 hour -- then `FAILED_PRECONDITION` is
+  /// returned.
+  /// See also the `Snapshot.expire_time` field.
+  ///
+  /// If the name is not provided in the request, the server will assign a
+  /// random
+  /// name for this snapshot on the same project as the subscription, conforming
+  /// to the
+  /// [resource name
+  /// format](https://cloud.google.com/pubsub/docs/overview#names). The
+  /// generated
+  /// name is populated in the returned Snapshot object. Note that for REST API
+  /// requests, you must specify a name in the request.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Optional user-provided name for this snapshot.
+  /// If the name is not provided in the request, the server will assign a
+  /// random
+  /// name for this snapshot on the same project as the subscription.
+  /// Note that for REST API requests, you must specify a name.
+  /// Format is `projects/{project}/snapshots/{snap}`.
+  /// Value must have pattern "^projects/[^/]+/snapshots/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Snapshot].
+  ///
+  /// 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<Snapshot> create(CreateSnapshotRequest 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');
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Snapshot.fromJson(data));
+  }
+
+  /// Removes an existing snapshot. All messages retained in the snapshot
+  /// are immediately dropped. After a snapshot is deleted, a new one may be
+  /// created with the same name, but the new one has no association with the
+  /// old
+  /// snapshot or its subscription, unless the same subscription is specified.
+  ///
+  /// Request parameters:
+  ///
+  /// [snapshot] - The name of the snapshot to delete.
+  /// Format is `projects/{project}/snapshots/{snap}`.
+  /// Value must have pattern "^projects/[^/]+/snapshots/[^/]+$".
+  ///
+  /// [$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 snapshot, {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 (snapshot == null) {
+      throw new core.ArgumentError("Parameter snapshot is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$snapshot');
+
+    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 configuration details of a snapshot.
+  ///
+  /// Request parameters:
+  ///
+  /// [snapshot] - The name of the snapshot to get.
+  /// Format is `projects/{project}/snapshots/{snap}`.
+  /// Value must have pattern "^projects/[^/]+/snapshots/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Snapshot].
+  ///
+  /// 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<Snapshot> get(core.String snapshot, {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 (snapshot == null) {
+      throw new core.ArgumentError("Parameter snapshot is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$snapshot');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Snapshot.fromJson(data));
+  }
+
   /// Gets the access control policy for a resource.
   /// Returns an empty policy if the resource exists and does not have a policy
   /// set.
@@ -104,6 +267,116 @@
     return _response.then((data) => new Policy.fromJson(data));
   }
 
+  /// Lists the existing snapshots.
+  ///
+  /// Request parameters:
+  ///
+  /// [project] - The name of the cloud project that snapshots belong to.
+  /// Format is `projects/{project}`.
+  /// Value must have pattern "^projects/[^/]+$".
+  ///
+  /// [pageToken] - The value returned by the last `ListSnapshotsResponse`;
+  /// indicates that this
+  /// is a continuation of a prior `ListSnapshots` call, and that the system
+  /// should return the next page of data.
+  ///
+  /// [pageSize] - Maximum number of snapshots to return.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListSnapshotsResponse].
+  ///
+  /// 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<ListSnapshotsResponse> list(core.String project,
+      {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 (project == null) {
+      throw new core.ArgumentError("Parameter project 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('$project') +
+        '/snapshots';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListSnapshotsResponse.fromJson(data));
+  }
+
+  /// Updates an existing snapshot. Note that certain properties of a
+  /// snapshot are not modifiable.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - The name of the snapshot.
+  /// Value must have pattern "^projects/[^/]+/snapshots/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Snapshot].
+  ///
+  /// 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<Snapshot> patch(UpdateSnapshotRequest 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');
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Snapshot.fromJson(data));
+  }
+
   /// Sets the access control policy on the specified resource. Replaces any
   /// existing policy.
   ///
@@ -504,13 +777,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.
   ///
@@ -522,7 +795,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;
@@ -533,12 +806,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];
     }
@@ -672,6 +945,62 @@
     return _response.then((data) => new Empty.fromJson(data));
   }
 
+  /// Updates an existing subscription. Note that certain properties of a
+  /// subscription, such as its topic, are not modifiable.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - The name of the subscription. It must have the format
+  /// `"projects/{project}/subscriptions/{subscription}"`. `{subscription}` must
+  /// start with a letter, and contain only letters (`[A-Za-z]`), numbers
+  /// (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
+  /// plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
+  /// in length, and it must not start with `"goog"`.
+  /// Value must have pattern "^projects/[^/]+/subscriptions/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Subscription].
+  ///
+  /// 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<Subscription> patch(
+      UpdateSubscriptionRequest 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');
+
+    var _response = _requester.request(_url, "PATCH",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Subscription.fromJson(data));
+  }
+
   /// Pulls messages from the server. Returns an empty list if there are no
   /// messages available in the backlog. The server may return `UNAVAILABLE` if
   /// there are too many concurrent pull requests pending for the given
@@ -727,6 +1056,58 @@
     return _response.then((data) => new PullResponse.fromJson(data));
   }
 
+  /// Seeks an existing subscription to a point in time or to a given snapshot,
+  /// whichever is provided in the request.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [subscription] - The subscription to affect.
+  /// Value must have pattern "^projects/[^/]+/subscriptions/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [SeekResponse].
+  ///
+  /// 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<SeekResponse> seek(SeekRequest request, core.String subscription,
+      {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 (subscription == null) {
+      throw new core.ArgumentError("Parameter subscription is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' +
+        commons.Escaper.ecapeVariableReserved('$subscription') +
+        ':seek';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new SeekResponse.fromJson(data));
+  }
+
   /// Sets the access control policy on the specified resource. Replaces any
   /// existing policy.
   ///
@@ -847,6 +1228,8 @@
 class ProjectsTopicsResourceApi {
   final commons.ApiRequester _requester;
 
+  ProjectsTopicsSnapshotsResourceApi get snapshots =>
+      new ProjectsTopicsSnapshotsResourceApi(_requester);
   ProjectsTopicsSubscriptionsResourceApi get subscriptions =>
       new ProjectsTopicsSubscriptionsResourceApi(_requester);
 
@@ -1056,13 +1439,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.
   ///
@@ -1074,7 +1457,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.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;
@@ -1085,12 +1468,12 @@
     if (project == null) {
       throw new core.ArgumentError("Parameter project 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];
     }
@@ -1277,13 +1660,80 @@
   }
 }
 
+class ProjectsTopicsSnapshotsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ProjectsTopicsSnapshotsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Lists the names of the snapshots on this topic.
+  ///
+  /// Request parameters:
+  ///
+  /// [topic] - The name of the topic that snapshots are attached to.
+  /// Format is `projects/{project}/topics/{topic}`.
+  /// Value must have pattern "^projects/[^/]+/topics/[^/]+$".
+  ///
+  /// [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.
+  ///
+  /// Completes with a [ListTopicSnapshotsResponse].
+  ///
+  /// 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<ListTopicSnapshotsResponse> list(core.String topic,
+      {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 (topic == null) {
+      throw new core.ArgumentError("Parameter topic 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('$topic') + '/snapshots';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new ListTopicSnapshotsResponse.fromJson(data));
+  }
+}
+
 class ProjectsTopicsSubscriptionsResourceApi {
   final commons.ApiRequester _requester;
 
   ProjectsTopicsSubscriptionsResourceApi(commons.ApiRequester client)
       : _requester = client;
 
-  /// Lists the name of the subscriptions for this topic.
+  /// Lists the names of the subscriptions on this topic.
   ///
   /// Request parameters:
   ///
@@ -1291,13 +1741,13 @@
   /// Format is `projects/{project}/topics/{topic}`.
   /// Value must have pattern "^projects/[^/]+/topics/[^/]+$".
   ///
-  /// [pageSize] - Maximum number of subscription names to return.
-  ///
   /// [pageToken] - The value returned by the last
   /// `ListTopicSubscriptionsResponse`; indicates
   /// that this is a continuation of a prior `ListTopicSubscriptions` call, and
   /// that the system should return the next page of data.
   ///
+  /// [pageSize] - Maximum number of subscription names to return.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1309,7 +1759,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<ListTopicSubscriptionsResponse> list(core.String topic,
-      {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;
@@ -1320,12 +1770,12 @@
     if (topic == null) {
       throw new core.ArgumentError("Parameter topic 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];
     }
@@ -1425,6 +1875,37 @@
   }
 }
 
+/// Request for the `CreateSnapshot` method.
+class CreateSnapshotRequest {
+  /// The subscription whose backlog the snapshot retains.
+  /// Specifically, the created snapshot is guaranteed to retain:
+  ///  (a) The existing backlog on the subscription. More precisely, this is
+  ///      defined as the messages in the subscription's backlog that are
+  ///      unacknowledged upon the successful completion of the
+  ///      `CreateSnapshot` request; as well as:
+  ///  (b) Any messages published to the subscription's topic following the
+  ///      successful completion of the CreateSnapshot request.
+  /// Format is `projects/{project}/subscriptions/{sub}`.
+  core.String subscription;
+
+  CreateSnapshotRequest();
+
+  CreateSnapshotRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("subscription")) {
+      subscription = _json["subscription"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (subscription != null) {
+      _json["subscription"] = subscription;
+    }
+    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:
@@ -1446,6 +1927,41 @@
   }
 }
 
+/// Response for the `ListSnapshots` method.
+class ListSnapshotsResponse {
+  /// If not empty, indicates that there may be more snapshot that match the
+  /// request; this value should be passed in a new `ListSnapshotsRequest`.
+  core.String nextPageToken;
+
+  /// The resulting snapshots.
+  core.List<Snapshot> snapshots;
+
+  ListSnapshotsResponse();
+
+  ListSnapshotsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("snapshots")) {
+      snapshots = _json["snapshots"]
+          .map((value) => new Snapshot.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 (snapshots != null) {
+      _json["snapshots"] = snapshots.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
 /// Response for the `ListSubscriptions` method.
 class ListSubscriptionsResponse {
   /// If not empty, indicates that there may be more subscriptions that match
@@ -1483,6 +1999,40 @@
   }
 }
 
+/// Response for the `ListTopicSnapshots` method.
+class ListTopicSnapshotsResponse {
+  /// If not empty, indicates that there may be more snapshots that match
+  /// the request; this value should be passed in a new
+  /// `ListTopicSnapshotsRequest` to get more snapshots.
+  core.String nextPageToken;
+
+  /// The names of the snapshots that match the request.
+  core.List<core.String> snapshots;
+
+  ListTopicSnapshotsResponse();
+
+  ListTopicSnapshotsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("snapshots")) {
+      snapshots = _json["snapshots"];
+    }
+  }
+
+  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 (snapshots != null) {
+      _json["snapshots"] = snapshots;
+    }
+    return _json;
+  }
+}
+
 /// Response for the `ListTopicSubscriptions` method.
 class ListTopicSubscriptionsResponse {
   /// If not empty, indicates that there may be more subscriptions that match
@@ -1649,7 +2199,7 @@
 ///     }
 ///
 /// For a description of IAM and its features, see the
-/// [IAM developer's guide](https://cloud.google.com/iam).
+/// [IAM developer's guide](https://cloud.google.com/iam/docs).
 class Policy {
   /// Associates a list of `members` to a `role`.
   /// `bindings` with no members will result in an error.
@@ -1676,7 +2226,7 @@
         convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
   }
 
-  /// Version of the `Policy`. The default version is 0.
+  /// Deprecated.
   core.int version;
 
   Policy();
@@ -1977,6 +2527,62 @@
   }
 }
 
+/// Request for the `Seek` method.
+class SeekRequest {
+  /// The snapshot to seek to. The snapshot's topic must be the same as that of
+  /// the provided subscription.
+  /// Format is `projects/{project}/snapshots/{snap}`.
+  core.String snapshot;
+
+  /// The time to seek to.
+  /// Messages retained in the subscription that were published before this
+  /// time are marked as acknowledged, and messages retained in the
+  /// subscription that were published after this time are marked as
+  /// unacknowledged. Note that this operation affects only those messages
+  /// retained in the subscription (configured by the combination of
+  /// `message_retention_duration` and `retain_acked_messages`). For example,
+  /// if `time` corresponds to a point before the message retention
+  /// window (or to a point before the system's notion of the subscription
+  /// creation time), only retained messages will be marked as unacknowledged,
+  /// and already-expunged messages will not be restored.
+  core.String time;
+
+  SeekRequest();
+
+  SeekRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("snapshot")) {
+      snapshot = _json["snapshot"];
+    }
+    if (_json.containsKey("time")) {
+      time = _json["time"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (snapshot != null) {
+      _json["snapshot"] = snapshot;
+    }
+    if (time != null) {
+      _json["time"] = time;
+    }
+    return _json;
+  }
+}
+
+class SeekResponse {
+  SeekResponse();
+
+  SeekResponse.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;
+  }
+}
+
 /// Request message for `SetIamPolicy` method.
 class SetIamPolicyRequest {
   /// REQUIRED: The complete policy to be applied to the `resource`. The size of
@@ -2003,6 +2609,59 @@
   }
 }
 
+/// A snapshot resource.
+class Snapshot {
+  /// The snapshot is guaranteed to exist up until this time.
+  /// A newly-created snapshot expires no later than 7 days from the time of its
+  /// creation. Its exact lifetime is determined at creation by the existing
+  /// backlog in the source subscription. Specifically, the lifetime of the
+  /// snapshot is `7 days - (age of oldest unacked message in the
+  /// subscription)`.
+  /// For example, consider a subscription whose oldest unacked message is 3
+  /// days
+  /// old. If a snapshot is created from this subscription, the snapshot --
+  /// which
+  /// will always capture this 3-day-old backlog as long as the snapshot
+  /// exists -- will expire in 4 days. The service will refuse to create a
+  /// snapshot that would expire in less than 1 hour after creation.
+  core.String expireTime;
+
+  /// The name of the snapshot.
+  core.String name;
+
+  /// The name of the topic from which this snapshot is retaining messages.
+  core.String topic;
+
+  Snapshot();
+
+  Snapshot.fromJson(core.Map _json) {
+    if (_json.containsKey("expireTime")) {
+      expireTime = _json["expireTime"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("topic")) {
+      topic = _json["topic"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (expireTime != null) {
+      _json["expireTime"] = expireTime;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (topic != null) {
+      _json["topic"] = topic;
+    }
+    return _json;
+  }
+}
+
 /// A subscription resource.
 class Subscription {
   /// This value is the maximum time after a subscriber receives a message
@@ -2028,6 +2687,17 @@
   /// system will eventually redeliver the message.
   core.int ackDeadlineSeconds;
 
+  /// How long to retain unacknowledged messages in the subscription's backlog,
+  /// from the moment a message is published.
+  /// If `retain_acked_messages` is true, then this also configures the
+  /// retention
+  /// of acknowledged messages, and thus configures how far back in time a
+  /// `Seek`
+  /// can be done. Defaults to 7 days. Cannot be more than 7 days or less than
+  /// 10
+  /// minutes.
+  core.String messageRetentionDuration;
+
   /// The name of the subscription. It must have the format
   /// `"projects/{project}/subscriptions/{subscription}"`. `{subscription}` must
   /// start with a letter, and contain only letters (`[A-Za-z]`), numbers
@@ -2041,6 +2711,13 @@
   /// will pull and ack messages using API methods.
   PushConfig pushConfig;
 
+  /// Indicates whether to retain acknowledged messages. If true, then
+  /// messages are not expunged from the subscription's backlog, even if they
+  /// are
+  /// acknowledged, until they fall out of the `message_retention_duration`
+  /// window.
+  core.bool retainAckedMessages;
+
   /// The name of the topic from which this subscription is receiving messages.
   /// Format is `projects/{project}/topics/{topic}`.
   /// The value of this field will be `_deleted-topic_` if the topic has been
@@ -2053,12 +2730,18 @@
     if (_json.containsKey("ackDeadlineSeconds")) {
       ackDeadlineSeconds = _json["ackDeadlineSeconds"];
     }
+    if (_json.containsKey("messageRetentionDuration")) {
+      messageRetentionDuration = _json["messageRetentionDuration"];
+    }
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
     if (_json.containsKey("pushConfig")) {
       pushConfig = new PushConfig.fromJson(_json["pushConfig"]);
     }
+    if (_json.containsKey("retainAckedMessages")) {
+      retainAckedMessages = _json["retainAckedMessages"];
+    }
     if (_json.containsKey("topic")) {
       topic = _json["topic"];
     }
@@ -2070,12 +2753,18 @@
     if (ackDeadlineSeconds != null) {
       _json["ackDeadlineSeconds"] = ackDeadlineSeconds;
     }
+    if (messageRetentionDuration != null) {
+      _json["messageRetentionDuration"] = messageRetentionDuration;
+    }
     if (name != null) {
       _json["name"] = name;
     }
     if (pushConfig != null) {
       _json["pushConfig"] = (pushConfig).toJson();
     }
+    if (retainAckedMessages != null) {
+      _json["retainAckedMessages"] = retainAckedMessages;
+    }
     if (topic != null) {
       _json["topic"] = topic;
     }
@@ -2160,3 +2849,69 @@
     return _json;
   }
 }
+
+/// Request for the UpdateSnapshot method.
+class UpdateSnapshotRequest {
+  /// The updated snpashot object.
+  Snapshot snapshot;
+
+  /// Indicates which fields in the provided snapshot to update.
+  /// Must be specified and non-empty.
+  core.String updateMask;
+
+  UpdateSnapshotRequest();
+
+  UpdateSnapshotRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("snapshot")) {
+      snapshot = new Snapshot.fromJson(_json["snapshot"]);
+    }
+    if (_json.containsKey("updateMask")) {
+      updateMask = _json["updateMask"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (snapshot != null) {
+      _json["snapshot"] = (snapshot).toJson();
+    }
+    if (updateMask != null) {
+      _json["updateMask"] = updateMask;
+    }
+    return _json;
+  }
+}
+
+/// Request for the UpdateSubscription method.
+class UpdateSubscriptionRequest {
+  /// The updated subscription object.
+  Subscription subscription;
+
+  /// Indicates which fields in the provided subscription to update.
+  /// Must be specified and non-empty.
+  core.String updateMask;
+
+  UpdateSubscriptionRequest();
+
+  UpdateSubscriptionRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("subscription")) {
+      subscription = new Subscription.fromJson(_json["subscription"]);
+    }
+    if (_json.containsKey("updateMask")) {
+      updateMask = _json["updateMask"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (subscription != null) {
+      _json["subscription"] = (subscription).toJson();
+    }
+    if (updateMask != null) {
+      _json["updateMask"] = updateMask;
+    }
+    return _json;
+  }
+}
diff --git a/googleapis/lib/runtimeconfig/v1.dart b/googleapis/lib/runtimeconfig/v1.dart
index 635905c..ab24087 100644
--- a/googleapis/lib/runtimeconfig/v1.dart
+++ b/googleapis/lib/runtimeconfig/v1.dart
@@ -164,12 +164,12 @@
   /// [name] - The name of the operation's parent resource.
   /// Value must have pattern "^operations$".
   ///
-  /// [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.
   ///
@@ -181,9 +181,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();
@@ -195,15 +195,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];
     }
diff --git a/googleapis/lib/safebrowsing/v4.dart b/googleapis/lib/safebrowsing/v4.dart
index 0c540d7..daca101 100644
--- a/googleapis/lib/safebrowsing/v4.dart
+++ b/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;
 
@@ -422,6 +472,14 @@
 
 /// The constraints for this update.
 class Constraints {
+  /// A client's physical location, expressed as a ISO 31166-1 alpha-2
+  /// region code.
+  core.String deviceLocation;
+
+  /// Requests the lists for a specific language. Expects ISO 639 alpha-2
+  /// format.
+  core.String language;
+
   /// Sets the maximum number of entries that the client is willing to have
   /// in the local database. This should be a power of 2 between 2**10 and
   /// 2**20. If zero, no database size limit is set.
@@ -443,6 +501,12 @@
   Constraints();
 
   Constraints.fromJson(core.Map _json) {
+    if (_json.containsKey("deviceLocation")) {
+      deviceLocation = _json["deviceLocation"];
+    }
+    if (_json.containsKey("language")) {
+      language = _json["language"];
+    }
     if (_json.containsKey("maxDatabaseEntries")) {
       maxDatabaseEntries = _json["maxDatabaseEntries"];
     }
@@ -460,6 +524,12 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (deviceLocation != null) {
+      _json["deviceLocation"] = deviceLocation;
+    }
+    if (language != null) {
+      _json["language"] = language;
+    }
     if (maxDatabaseEntries != null) {
       _json["maxDatabaseEntries"] = maxDatabaseEntries;
     }
@@ -476,6 +546,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.
@@ -1125,7 +1216,8 @@
   }
 
   /// The offset of the first entry in the encoded data, or, if only a single
-  /// integer was encoded, that single integer's value.
+  /// integer was encoded, that single integer's value. If the field is empty or
+  /// missing, assume zero.
   core.String firstValue;
 
   /// The number of entries that are delta encoded in the encoded data. If only
@@ -1330,6 +1422,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 +1770,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/googleapis/lib/script/v1.dart b/googleapis/lib/script/v1.dart
index 344ee9c..86f0eff 100644
--- a/googleapis/lib/script/v1.dart
+++ b/googleapis/lib/script/v1.dart
@@ -57,6 +57,8 @@
 
   final commons.ApiRequester _requester;
 
+  ProcessesResourceApi get processes => new ProcessesResourceApi(_requester);
+  ProjectsResourceApi get projects => new ProjectsResourceApi(_requester);
   ScriptsResourceApi get scripts => new ScriptsResourceApi(_requester);
 
   ScriptApi(http.Client client,
@@ -66,13 +68,994 @@
             new commons.ApiRequester(client, rootUrl, servicePath, USER_AGENT);
 }
 
+class ProcessesResourceApi {
+  final commons.ApiRequester _requester;
+
+  ProcessesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// List information about processes made by or on behalf of a user,
+  /// such as process type and current status.
+  ///
+  /// Request parameters:
+  ///
+  /// [pageSize] - The maximum number of returned processes per page of results.
+  /// Defaults to
+  /// 50.
+  ///
+  /// [userProcessFilter_startTime] - Optional field used to limit returned
+  /// processes to those that were
+  /// started on or after the given timestamp.
+  ///
+  /// [userProcessFilter_projectName] - Optional field used to limit returned
+  /// processes to those originating from
+  /// projects with a specific project name.
+  ///
+  /// [userProcessFilter_userAccessLevels] - Optional field used to limit
+  /// returned processes to those having one of
+  /// the specified user access levels.
+  ///
+  /// [userProcessFilter_functionName] - Optional field used to limit returned
+  /// processes to those originating from
+  /// a script function with the given function name.
+  ///
+  /// [userProcessFilter_scriptId] - Optional field used to limit returned
+  /// processes to those originating from
+  /// projects with a specific script ID.
+  ///
+  /// [userProcessFilter_statuses] - Optional field used to limit returned
+  /// processes to those having one of
+  /// the specified process statuses.
+  ///
+  /// [userProcessFilter_types] - Optional field used to limit returned
+  /// processes to those having one of
+  /// the specified process types.
+  ///
+  /// [userProcessFilter_deploymentId] - Optional field used to limit returned
+  /// processes to those originating from
+  /// projects with a specific deployment ID.
+  ///
+  /// [userProcessFilter_endTime] - Optional field used to limit returned
+  /// processes to those that completed
+  /// on or before the given timestamp.
+  ///
+  /// [pageToken] - The token for continuing a previous list request on the next
+  /// page. This
+  /// should be set to the value of `nextPageToken` from a previous response.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListUserProcessesResponse].
+  ///
+  /// 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<ListUserProcessesResponse> list(
+      {core.int pageSize,
+      core.String userProcessFilter_startTime,
+      core.String userProcessFilter_projectName,
+      core.List<core.String> userProcessFilter_userAccessLevels,
+      core.String userProcessFilter_functionName,
+      core.String userProcessFilter_scriptId,
+      core.List<core.String> userProcessFilter_statuses,
+      core.List<core.String> userProcessFilter_types,
+      core.String userProcessFilter_deploymentId,
+      core.String userProcessFilter_endTime,
+      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 (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (userProcessFilter_startTime != null) {
+      _queryParams["userProcessFilter.startTime"] = [
+        userProcessFilter_startTime
+      ];
+    }
+    if (userProcessFilter_projectName != null) {
+      _queryParams["userProcessFilter.projectName"] = [
+        userProcessFilter_projectName
+      ];
+    }
+    if (userProcessFilter_userAccessLevels != null) {
+      _queryParams["userProcessFilter.userAccessLevels"] =
+          userProcessFilter_userAccessLevels;
+    }
+    if (userProcessFilter_functionName != null) {
+      _queryParams["userProcessFilter.functionName"] = [
+        userProcessFilter_functionName
+      ];
+    }
+    if (userProcessFilter_scriptId != null) {
+      _queryParams["userProcessFilter.scriptId"] = [userProcessFilter_scriptId];
+    }
+    if (userProcessFilter_statuses != null) {
+      _queryParams["userProcessFilter.statuses"] = userProcessFilter_statuses;
+    }
+    if (userProcessFilter_types != null) {
+      _queryParams["userProcessFilter.types"] = userProcessFilter_types;
+    }
+    if (userProcessFilter_deploymentId != null) {
+      _queryParams["userProcessFilter.deploymentId"] = [
+        userProcessFilter_deploymentId
+      ];
+    }
+    if (userProcessFilter_endTime != null) {
+      _queryParams["userProcessFilter.endTime"] = [userProcessFilter_endTime];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/processes';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new ListUserProcessesResponse.fromJson(data));
+  }
+
+  /// List information about a script's executed processes, such as process type
+  /// and current status.
+  ///
+  /// Request parameters:
+  ///
+  /// [pageSize] - The maximum number of returned processes per page of results.
+  /// Defaults to
+  /// 50.
+  ///
+  /// [scriptProcessFilter_endTime] - Optional field used to limit returned
+  /// processes to those that completed
+  /// on or before the given timestamp.
+  ///
+  /// [scriptProcessFilter_userAccessLevels] - Optional field used to limit
+  /// returned processes to those having one of
+  /// the specified user access levels.
+  ///
+  /// [scriptProcessFilter_statuses] - Optional field used to limit returned
+  /// processes to those having one of
+  /// the specified process statuses.
+  ///
+  /// [scriptProcessFilter_startTime] - Optional field used to limit returned
+  /// processes to those that were
+  /// started on or after the given timestamp.
+  ///
+  /// [scriptProcessFilter_functionName] - Optional field used to limit returned
+  /// processes to those originating from
+  /// a script function with the given function name.
+  ///
+  /// [scriptProcessFilter_types] - Optional field used to limit returned
+  /// processes to those having one of
+  /// the specified process types.
+  ///
+  /// [scriptId] - The script ID of the project whose processes are listed.
+  ///
+  /// [scriptProcessFilter_deploymentId] - Optional field used to limit returned
+  /// processes to those originating from
+  /// projects with a specific deployment ID.
+  ///
+  /// [pageToken] - The token for continuing a previous list request on the next
+  /// page. This
+  /// should be set to the value of `nextPageToken` from a previous response.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListScriptProcessesResponse].
+  ///
+  /// 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<ListScriptProcessesResponse> listScriptProcesses(
+      {core.int pageSize,
+      core.String scriptProcessFilter_endTime,
+      core.List<core.String> scriptProcessFilter_userAccessLevels,
+      core.List<core.String> scriptProcessFilter_statuses,
+      core.String scriptProcessFilter_startTime,
+      core.String scriptProcessFilter_functionName,
+      core.List<core.String> scriptProcessFilter_types,
+      core.String scriptId,
+      core.String scriptProcessFilter_deploymentId,
+      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 (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (scriptProcessFilter_endTime != null) {
+      _queryParams["scriptProcessFilter.endTime"] = [
+        scriptProcessFilter_endTime
+      ];
+    }
+    if (scriptProcessFilter_userAccessLevels != null) {
+      _queryParams["scriptProcessFilter.userAccessLevels"] =
+          scriptProcessFilter_userAccessLevels;
+    }
+    if (scriptProcessFilter_statuses != null) {
+      _queryParams["scriptProcessFilter.statuses"] =
+          scriptProcessFilter_statuses;
+    }
+    if (scriptProcessFilter_startTime != null) {
+      _queryParams["scriptProcessFilter.startTime"] = [
+        scriptProcessFilter_startTime
+      ];
+    }
+    if (scriptProcessFilter_functionName != null) {
+      _queryParams["scriptProcessFilter.functionName"] = [
+        scriptProcessFilter_functionName
+      ];
+    }
+    if (scriptProcessFilter_types != null) {
+      _queryParams["scriptProcessFilter.types"] = scriptProcessFilter_types;
+    }
+    if (scriptId != null) {
+      _queryParams["scriptId"] = [scriptId];
+    }
+    if (scriptProcessFilter_deploymentId != null) {
+      _queryParams["scriptProcessFilter.deploymentId"] = [
+        scriptProcessFilter_deploymentId
+      ];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/processes:listScriptProcesses';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new ListScriptProcessesResponse.fromJson(data));
+  }
+}
+
+class ProjectsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ProjectsDeploymentsResourceApi get deployments =>
+      new ProjectsDeploymentsResourceApi(_requester);
+  ProjectsVersionsResourceApi get versions =>
+      new ProjectsVersionsResourceApi(_requester);
+
+  ProjectsResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Creates a new, empty script project with no script files and a base
+  /// manifest file.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Project].
+  ///
+  /// 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<Project> create(CreateProjectRequest 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 = 'v1/projects';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Project.fromJson(data));
+  }
+
+  /// Gets a script project's metadata.
+  ///
+  /// Request parameters:
+  ///
+  /// [scriptId] - The script project's Drive ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Project].
+  ///
+  /// 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<Project> get(core.String scriptId, {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 (scriptId == null) {
+      throw new core.ArgumentError("Parameter scriptId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' + commons.Escaper.ecapeVariable('$scriptId');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Project.fromJson(data));
+  }
+
+  /// Gets the content of the script project, including the code source and
+  /// metadata for each script file.
+  ///
+  /// Request parameters:
+  ///
+  /// [scriptId] - The script project's Drive ID.
+  ///
+  /// [versionNumber] - The version number of the project to retrieve. If not
+  /// provided, the
+  /// project's HEAD version is returned.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Content].
+  ///
+  /// 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<Content> getContent(core.String scriptId,
+      {core.int versionNumber, 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 (scriptId == null) {
+      throw new core.ArgumentError("Parameter scriptId is required.");
+    }
+    if (versionNumber != null) {
+      _queryParams["versionNumber"] = ["${versionNumber}"];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' +
+        commons.Escaper.ecapeVariable('$scriptId') +
+        '/content';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Content.fromJson(data));
+  }
+
+  /// Get metrics data for scripts, such as number of executions and
+  /// active users.
+  ///
+  /// Request parameters:
+  ///
+  /// [scriptId] - Required field indicating the script to get metrics for.
+  ///
+  /// [metricsGranularity] - Required field indicating what granularity of
+  /// metrics are returned.
+  /// Possible string values are:
+  /// - "UNSPECIFIED_GRANULARITY" : A UNSPECIFIED_GRANULARITY.
+  /// - "WEEKLY" : A WEEKLY.
+  /// - "DAILY" : A DAILY.
+  ///
+  /// [metricsFilter_deploymentId] - Optional field indicating a specific
+  /// deployment to retrieve metrics from.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Metrics].
+  ///
+  /// 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<Metrics> getMetrics(core.String scriptId,
+      {core.String metricsGranularity,
+      core.String metricsFilter_deploymentId,
+      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 (scriptId == null) {
+      throw new core.ArgumentError("Parameter scriptId is required.");
+    }
+    if (metricsGranularity != null) {
+      _queryParams["metricsGranularity"] = [metricsGranularity];
+    }
+    if (metricsFilter_deploymentId != null) {
+      _queryParams["metricsFilter.deploymentId"] = [metricsFilter_deploymentId];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' +
+        commons.Escaper.ecapeVariable('$scriptId') +
+        '/metrics';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Metrics.fromJson(data));
+  }
+
+  /// Updates the content of the specified script project.
+  /// This content is stored as the HEAD version, and is used when the script is
+  /// executed as a trigger, in the script editor, in add-on preview mode, or as
+  /// a web app or Apps Script API in development mode. This clears all the
+  /// existing files in the project.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [scriptId] - The script project's Drive ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Content].
+  ///
+  /// 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<Content> updateContent(Content request, core.String scriptId,
+      {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 (scriptId == null) {
+      throw new core.ArgumentError("Parameter scriptId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' +
+        commons.Escaper.ecapeVariable('$scriptId') +
+        '/content';
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Content.fromJson(data));
+  }
+}
+
+class ProjectsDeploymentsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ProjectsDeploymentsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Creates a deployment of an Apps Script project.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [scriptId] - The script project's Drive ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Deployment].
+  ///
+  /// 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<Deployment> create(
+      DeploymentConfig request, core.String scriptId,
+      {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 (scriptId == null) {
+      throw new core.ArgumentError("Parameter scriptId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' +
+        commons.Escaper.ecapeVariable('$scriptId') +
+        '/deployments';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Deployment.fromJson(data));
+  }
+
+  /// Deletes a deployment of an Apps Script project.
+  ///
+  /// Request parameters:
+  ///
+  /// [scriptId] - The script project's Drive ID.
+  ///
+  /// [deploymentId] - The deployment ID to be undeployed.
+  ///
+  /// [$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 scriptId, core.String deploymentId,
+      {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 (scriptId == null) {
+      throw new core.ArgumentError("Parameter scriptId is required.");
+    }
+    if (deploymentId == null) {
+      throw new core.ArgumentError("Parameter deploymentId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' +
+        commons.Escaper.ecapeVariable('$scriptId') +
+        '/deployments/' +
+        commons.Escaper.ecapeVariable('$deploymentId');
+
+    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 a deployment of an Apps Script project.
+  ///
+  /// Request parameters:
+  ///
+  /// [scriptId] - The script project's Drive ID.
+  ///
+  /// [deploymentId] - The deployment ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Deployment].
+  ///
+  /// 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<Deployment> get(core.String scriptId, core.String deploymentId,
+      {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 (scriptId == null) {
+      throw new core.ArgumentError("Parameter scriptId is required.");
+    }
+    if (deploymentId == null) {
+      throw new core.ArgumentError("Parameter deploymentId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' +
+        commons.Escaper.ecapeVariable('$scriptId') +
+        '/deployments/' +
+        commons.Escaper.ecapeVariable('$deploymentId');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Deployment.fromJson(data));
+  }
+
+  /// Lists the deployments of an Apps Script project.
+  ///
+  /// Request parameters:
+  ///
+  /// [scriptId] - The script project's Drive ID.
+  ///
+  /// [pageSize] - The maximum number of deployments on each returned page.
+  /// Defaults to 50.
+  ///
+  /// [pageToken] - The token for continuing a previous list request on the next
+  /// page. This
+  /// should be set to the value of `nextPageToken` from a previous response.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListDeploymentsResponse].
+  ///
+  /// 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<ListDeploymentsResponse> list(core.String scriptId,
+      {core.int pageSize, 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 (scriptId == null) {
+      throw new core.ArgumentError("Parameter scriptId is required.");
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' +
+        commons.Escaper.ecapeVariable('$scriptId') +
+        '/deployments';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListDeploymentsResponse.fromJson(data));
+  }
+
+  /// Updates a deployment of an Apps Script project.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [scriptId] - The script project's Drive ID.
+  ///
+  /// [deploymentId] - The deployment ID for this deployment.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Deployment].
+  ///
+  /// 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<Deployment> update(UpdateDeploymentRequest request,
+      core.String scriptId, core.String deploymentId,
+      {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 (scriptId == null) {
+      throw new core.ArgumentError("Parameter scriptId is required.");
+    }
+    if (deploymentId == null) {
+      throw new core.ArgumentError("Parameter deploymentId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' +
+        commons.Escaper.ecapeVariable('$scriptId') +
+        '/deployments/' +
+        commons.Escaper.ecapeVariable('$deploymentId');
+
+    var _response = _requester.request(_url, "PUT",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Deployment.fromJson(data));
+  }
+}
+
+class ProjectsVersionsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ProjectsVersionsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Creates a new immutable version using the current code, with a unique
+  /// version number.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [scriptId] - The script project's Drive ID.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Version].
+  ///
+  /// 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<Version> create(Version request, core.String scriptId,
+      {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 (scriptId == null) {
+      throw new core.ArgumentError("Parameter scriptId is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' +
+        commons.Escaper.ecapeVariable('$scriptId') +
+        '/versions';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Version.fromJson(data));
+  }
+
+  /// Gets a version of a script project.
+  ///
+  /// Request parameters:
+  ///
+  /// [scriptId] - The script project's Drive ID.
+  ///
+  /// [versionNumber] - The version number.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [Version].
+  ///
+  /// 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<Version> get(core.String scriptId, core.int versionNumber,
+      {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 (scriptId == null) {
+      throw new core.ArgumentError("Parameter scriptId is required.");
+    }
+    if (versionNumber == null) {
+      throw new core.ArgumentError("Parameter versionNumber is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' +
+        commons.Escaper.ecapeVariable('$scriptId') +
+        '/versions/' +
+        commons.Escaper.ecapeVariable('$versionNumber');
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Version.fromJson(data));
+  }
+
+  /// List the versions of a script project.
+  ///
+  /// Request parameters:
+  ///
+  /// [scriptId] - The script project's Drive ID.
+  ///
+  /// [pageToken] - The token for continuing a previous list request on the next
+  /// page. This
+  /// should be set to the value of `nextPageToken` from a previous response.
+  ///
+  /// [pageSize] - The maximum number of versions on each returned page.
+  /// Defaults to 50.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ListVersionsResponse].
+  ///
+  /// 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<ListVersionsResponse> list(core.String scriptId,
+      {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 (scriptId == null) {
+      throw new core.ArgumentError("Parameter scriptId is required.");
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/projects/' +
+        commons.Escaper.ecapeVariable('$scriptId') +
+        '/versions';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListVersionsResponse.fromJson(data));
+  }
+}
+
 class ScriptsResourceApi {
   final commons.ApiRequester _requester;
 
   ScriptsResourceApi(commons.ApiRequester client) : _requester = client;
 
   /// Runs a function in an Apps Script project. The project must be deployed
-  /// for use with the Apps Script Execution API.
+  /// for use with the Apps Script API.
   ///
   /// This method requires authorization with an OAuth 2.0 token that includes
   /// at
@@ -131,12 +1114,284 @@
   }
 }
 
-/// An object that provides information about the nature of an error in the Apps
-/// Script Execution API. If an
-/// `run` call succeeds but the
-/// script function (or Apps Script itself) throws an exception, the response
-/// body's `error` field contains a
-/// `Status` object. The `Status` object's `details` field
+/// The Content resource.
+class Content {
+  /// The list of script project files.
+  /// One of the files is a script manifest; it must be named "appsscript",
+  /// must have type of JSON, and include the manifest configurations for the
+  /// project.
+  core.List<File> files;
+
+  /// The script project's Drive ID.
+  core.String scriptId;
+
+  Content();
+
+  Content.fromJson(core.Map _json) {
+    if (_json.containsKey("files")) {
+      files = _json["files"].map((value) => new File.fromJson(value)).toList();
+    }
+    if (_json.containsKey("scriptId")) {
+      scriptId = _json["scriptId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (files != null) {
+      _json["files"] = files.map((value) => (value).toJson()).toList();
+    }
+    if (scriptId != null) {
+      _json["scriptId"] = scriptId;
+    }
+    return _json;
+  }
+}
+
+/// Request to create a script project.
+class CreateProjectRequest {
+  /// The Drive ID of a parent file that the created script project is bound to.
+  /// This is usually the ID of a Google Doc, Google Sheet, Google Form, or
+  /// Google Slides file. If not set, a standalone script project is created.
+  core.String parentId;
+
+  /// The title for the project.
+  core.String title;
+
+  CreateProjectRequest();
+
+  CreateProjectRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("parentId")) {
+      parentId = _json["parentId"];
+    }
+    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 (parentId != null) {
+      _json["parentId"] = parentId;
+    }
+    if (title != null) {
+      _json["title"] = title;
+    }
+    return _json;
+  }
+}
+
+/// Representation of a single script deployment.
+class Deployment {
+  /// The deployment configuration.
+  DeploymentConfig deploymentConfig;
+
+  /// The deployment ID for this deployment.
+  core.String deploymentId;
+
+  /// The deployment's entry points.
+  core.List<EntryPoint> entryPoints;
+
+  /// Script's defined set of functions.
+  GoogleAppsScriptTypeFunctionSet functionSet;
+
+  /// Set of scopes required by the deployment.
+  GoogleAppsScriptTypeScopeSet scopeSet;
+
+  /// Last modified date time stamp.
+  core.String updateTime;
+
+  Deployment();
+
+  Deployment.fromJson(core.Map _json) {
+    if (_json.containsKey("deploymentConfig")) {
+      deploymentConfig =
+          new DeploymentConfig.fromJson(_json["deploymentConfig"]);
+    }
+    if (_json.containsKey("deploymentId")) {
+      deploymentId = _json["deploymentId"];
+    }
+    if (_json.containsKey("entryPoints")) {
+      entryPoints = _json["entryPoints"]
+          .map((value) => new EntryPoint.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("functionSet")) {
+      functionSet =
+          new GoogleAppsScriptTypeFunctionSet.fromJson(_json["functionSet"]);
+    }
+    if (_json.containsKey("scopeSet")) {
+      scopeSet = new GoogleAppsScriptTypeScopeSet.fromJson(_json["scopeSet"]);
+    }
+    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 (deploymentConfig != null) {
+      _json["deploymentConfig"] = (deploymentConfig).toJson();
+    }
+    if (deploymentId != null) {
+      _json["deploymentId"] = deploymentId;
+    }
+    if (entryPoints != null) {
+      _json["entryPoints"] =
+          entryPoints.map((value) => (value).toJson()).toList();
+    }
+    if (functionSet != null) {
+      _json["functionSet"] = (functionSet).toJson();
+    }
+    if (scopeSet != null) {
+      _json["scopeSet"] = (scopeSet).toJson();
+    }
+    if (updateTime != null) {
+      _json["updateTime"] = updateTime;
+    }
+    return _json;
+  }
+}
+
+/// Metadata the defines how a deployment is configured.
+class DeploymentConfig {
+  /// The description for this deployment.
+  core.String description;
+
+  /// The manifest file name for this deployment.
+  core.String manifestFileName;
+
+  /// The script project's Drive ID.
+  core.String scriptId;
+
+  /// The version number on which this deployment is based.
+  core.int versionNumber;
+
+  DeploymentConfig();
+
+  DeploymentConfig.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("manifestFileName")) {
+      manifestFileName = _json["manifestFileName"];
+    }
+    if (_json.containsKey("scriptId")) {
+      scriptId = _json["scriptId"];
+    }
+    if (_json.containsKey("versionNumber")) {
+      versionNumber = _json["versionNumber"];
+    }
+  }
+
+  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 (manifestFileName != null) {
+      _json["manifestFileName"] = manifestFileName;
+    }
+    if (scriptId != null) {
+      _json["scriptId"] = scriptId;
+    }
+    if (versionNumber != null) {
+      _json["versionNumber"] = versionNumber;
+    }
+    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 configuration that defines how a deployment is accessed externally.
+class EntryPoint {
+  /// Add-on properties.
+  GoogleAppsScriptTypeAddOnEntryPoint addOn;
+
+  /// The type of the entry point.
+  /// Possible string values are:
+  /// - "ENTRY_POINT_TYPE_UNSPECIFIED" : An unspecified entry point.
+  /// - "WEB_APP" : A web application entry point.
+  /// - "EXECUTION_API" : An API executable entry point.
+  /// - "ADD_ON" : An Add-On entry point.
+  core.String entryPointType;
+
+  /// An entry point specification for Apps Script API execution calls.
+  GoogleAppsScriptTypeExecutionApiEntryPoint executionApi;
+
+  /// An entry point specification for web apps.
+  GoogleAppsScriptTypeWebAppEntryPoint webApp;
+
+  EntryPoint();
+
+  EntryPoint.fromJson(core.Map _json) {
+    if (_json.containsKey("addOn")) {
+      addOn = new GoogleAppsScriptTypeAddOnEntryPoint.fromJson(_json["addOn"]);
+    }
+    if (_json.containsKey("entryPointType")) {
+      entryPointType = _json["entryPointType"];
+    }
+    if (_json.containsKey("executionApi")) {
+      executionApi = new GoogleAppsScriptTypeExecutionApiEntryPoint.fromJson(
+          _json["executionApi"]);
+    }
+    if (_json.containsKey("webApp")) {
+      webApp =
+          new GoogleAppsScriptTypeWebAppEntryPoint.fromJson(_json["webApp"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (addOn != null) {
+      _json["addOn"] = (addOn).toJson();
+    }
+    if (entryPointType != null) {
+      _json["entryPointType"] = entryPointType;
+    }
+    if (executionApi != null) {
+      _json["executionApi"] = (executionApi).toJson();
+    }
+    if (webApp != null) {
+      _json["webApp"] = (webApp).toJson();
+    }
+    return _json;
+  }
+}
+
+/// An object that provides information about the nature of an error resulting
+/// from an attempted execution of a script function using the Apps Script API.
+/// If a run call
+/// succeeds but the script function (or Apps Script itself) throws an
+/// exception,
+/// the response body's error field
+/// contains a
+/// Status object. The `Status` object's `details` field
 /// contains an array with a single one of these `ExecutionError` objects.
 class ExecutionError {
   /// The error message thrown by Apps Script, usually localized into the user's
@@ -190,7 +1445,7 @@
 class ExecutionRequest {
   /// If `true` and the user is an owner of the script, the script runs at the
   /// most recently saved version rather than the version deployed for use with
-  /// the Execution API. Optional; default is `false`.
+  /// the Apps Script API. Optional; default is `false`.
   core.bool devMode;
 
   /// The name of the function to execute in the given script. The name does not
@@ -211,13 +1466,13 @@
   /// For Android add-ons only. An ID that represents the user's current session
   /// in the Android app for Google Docs or Sheets, included as extra data in
   /// the
-  /// [`Intent`](https://developer.android.com/guide/components/intents-filters.html)
+  /// [Intent](https://developer.android.com/guide/components/intents-filters.html)
   /// that launches the add-on. When an Android add-on is run with a session
   /// state, it gains the privileges of a
-  /// [bound](https://developers.google.com/apps-script/guides/bound) script
-  /// &mdash;
-  /// that is, it can access information like the user's current cursor position
-  /// (in Docs) or selected cell (in Sheets). To retrieve the state, call
+  /// [bound](https://developers.google.com/apps-script/guides/bound)
+  /// script&mdash;that is, it can access information like the user's current
+  /// cursor position (in Docs) or selected cell (in Sheets). To retrieve the
+  /// state, call
   /// `Intent.getStringExtra("com.google.android.apps.docs.addons.SessionState")`.
   /// Optional.
   core.String sessionState;
@@ -258,15 +1513,13 @@
   }
 }
 
-/// An object that provides the return value of a function executed through the
-/// Apps Script Execution API. If a
-/// `run` call succeeds and the
-/// script function returns successfully, the response body's
-/// `response` field contains this
+/// An object that provides the return value of a function executed using the
+/// Apps Script API. If the script function returns successfully, the response
+/// body's response field contains this
 /// `ExecutionResponse` object.
 class ExecutionResponse {
   /// The return value of the script function. The type matches the object type
-  /// returned in Apps Script. Functions called through the Execution API cannot
+  /// returned in Apps Script. Functions called using the Apps Script API cannot
   /// return Apps Script-specific objects (such as a `Document` or a
   /// `Calendar`);
   /// they can only return primitive types such as a `string`, `number`,
@@ -295,44 +1548,860 @@
   }
 }
 
-/// The response will not arrive until the function finishes executing. The
-/// maximum runtime is listed in the guide to [limitations in Apps
-/// Script](https://developers.google.com/apps-script/guides/services/quotas#current_limitations).
-/// <p>If the script function returns successfully, the `response` field will
-/// contain an `ExecutionResponse` object with the function's return value in
-/// the object's `result` field.</p>
-/// <p>If the script function (or Apps Script itself) throws an exception, the
-/// `error` field will contain a `Status` object. The `Status` object's
-/// `details` field will contain an array with a single `ExecutionError` object
-/// that provides information about the nature of the error.</p>
-/// <p>If the `run` call itself fails (for example, because of a malformed
-/// request or an authorization error), the method will return an HTTP response
-/// code in the 4XX range with a different format for the response body. Client
-/// libraries will automatically convert a 4XX response into an exception
-/// class.</p>
+/// An individual file within a script project.
+/// A file is a third-party source code created by one or more
+/// developers. It can be a server-side JS code, HTML, or a
+/// configuration file. Each script project can contain multiple files.
+class File {
+  /// Creation date timestamp.
+  /// This read-only field is only visible to users who have WRITER
+  /// permission for the script project.
+  core.String createTime;
+
+  /// The defined set of functions in the script file, if any.
+  GoogleAppsScriptTypeFunctionSet functionSet;
+
+  /// The user who modified the file most recently.
+  /// This read-only field is only visible to users who have WRITER
+  /// permission for the script project.
+  GoogleAppsScriptTypeUser lastModifyUser;
+
+  /// The name of the file. The file extension is not part of the file
+  /// name, which can be identified from the type field.
+  core.String name;
+
+  /// The file content.
+  core.String source;
+
+  /// The type of the file.
+  /// Possible string values are:
+  /// - "ENUM_TYPE_UNSPECIFIED" : Undetermined file type; never actually used.
+  /// - "SERVER_JS" : An Apps Script server-side code file.
+  /// - "HTML" : A file containing client-side HTML.
+  /// - "JSON" : A file in JSON format. This type is only used for the script
+  /// project's manifest. The manifest file content must match the
+  /// structure of a valid
+  /// [ScriptManifest](/apps-script/concepts/manifests)
+  core.String type;
+
+  /// Last modified date timestamp.
+  /// This read-only field is only visible to users who have WRITER
+  /// permission for the script project.
+  core.String updateTime;
+
+  File();
+
+  File.fromJson(core.Map _json) {
+    if (_json.containsKey("createTime")) {
+      createTime = _json["createTime"];
+    }
+    if (_json.containsKey("functionSet")) {
+      functionSet =
+          new GoogleAppsScriptTypeFunctionSet.fromJson(_json["functionSet"]);
+    }
+    if (_json.containsKey("lastModifyUser")) {
+      lastModifyUser =
+          new GoogleAppsScriptTypeUser.fromJson(_json["lastModifyUser"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("source")) {
+      source = _json["source"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    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 (createTime != null) {
+      _json["createTime"] = createTime;
+    }
+    if (functionSet != null) {
+      _json["functionSet"] = (functionSet).toJson();
+    }
+    if (lastModifyUser != null) {
+      _json["lastModifyUser"] = (lastModifyUser).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (source != null) {
+      _json["source"] = source;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (updateTime != null) {
+      _json["updateTime"] = updateTime;
+    }
+    return _json;
+  }
+}
+
+/// An add-on entry point.
+class GoogleAppsScriptTypeAddOnEntryPoint {
+  /// The add-on's required list of supported container types.
+  /// Possible string values are:
+  /// - "UNKNOWN_ADDON_TYPE" : Default value, unknown add-on type.
+  /// - "GMAIL" : Add-on type for Gmail.
+  /// - "DATA_STUDIO" : Add-on type for Data Studio.
+  core.String addOnType;
+
+  /// The add-on's optional description.
+  core.String description;
+
+  /// The add-on's optional help URL.
+  core.String helpUrl;
+
+  /// The add-on's required post install tip URL.
+  core.String postInstallTipUrl;
+
+  /// The add-on's optional report issue URL.
+  core.String reportIssueUrl;
+
+  /// The add-on's required title.
+  core.String title;
+
+  GoogleAppsScriptTypeAddOnEntryPoint();
+
+  GoogleAppsScriptTypeAddOnEntryPoint.fromJson(core.Map _json) {
+    if (_json.containsKey("addOnType")) {
+      addOnType = _json["addOnType"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("helpUrl")) {
+      helpUrl = _json["helpUrl"];
+    }
+    if (_json.containsKey("postInstallTipUrl")) {
+      postInstallTipUrl = _json["postInstallTipUrl"];
+    }
+    if (_json.containsKey("reportIssueUrl")) {
+      reportIssueUrl = _json["reportIssueUrl"];
+    }
+    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 (addOnType != null) {
+      _json["addOnType"] = addOnType;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (helpUrl != null) {
+      _json["helpUrl"] = helpUrl;
+    }
+    if (postInstallTipUrl != null) {
+      _json["postInstallTipUrl"] = postInstallTipUrl;
+    }
+    if (reportIssueUrl != null) {
+      _json["reportIssueUrl"] = reportIssueUrl;
+    }
+    if (title != null) {
+      _json["title"] = title;
+    }
+    return _json;
+  }
+}
+
+/// API executable entry point configuration.
+class GoogleAppsScriptTypeExecutionApiConfig {
+  /// Who has permission to run the API executable.
+  /// Possible string values are:
+  /// - "UNKNOWN_ACCESS" : Default value, should not be used.
+  /// - "MYSELF" : Only the user who deployed the web app or executable can
+  /// access it.
+  /// Note that this is not necessarily the owner of the script project.
+  /// - "DOMAIN" : Only users in the same domain as the user who deployed the
+  /// web app or
+  /// executable can access it.
+  /// - "ANYONE" : Any logged in user can access the web app or executable.
+  /// - "ANYONE_ANONYMOUS" : Any user, logged in or not, can access the web app
+  /// or executable.
+  core.String access;
+
+  GoogleAppsScriptTypeExecutionApiConfig();
+
+  GoogleAppsScriptTypeExecutionApiConfig.fromJson(core.Map _json) {
+    if (_json.containsKey("access")) {
+      access = _json["access"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (access != null) {
+      _json["access"] = access;
+    }
+    return _json;
+  }
+}
+
+/// An API executable entry point.
+class GoogleAppsScriptTypeExecutionApiEntryPoint {
+  /// The entry point's configuration.
+  GoogleAppsScriptTypeExecutionApiConfig entryPointConfig;
+
+  GoogleAppsScriptTypeExecutionApiEntryPoint();
+
+  GoogleAppsScriptTypeExecutionApiEntryPoint.fromJson(core.Map _json) {
+    if (_json.containsKey("entryPointConfig")) {
+      entryPointConfig = new GoogleAppsScriptTypeExecutionApiConfig.fromJson(
+          _json["entryPointConfig"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (entryPointConfig != null) {
+      _json["entryPointConfig"] = (entryPointConfig).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Represents a function in a script project.
+class GoogleAppsScriptTypeFunction {
+  /// The function name in the script project.
+  core.String name;
+
+  GoogleAppsScriptTypeFunction();
+
+  GoogleAppsScriptTypeFunction.fromJson(core.Map _json) {
+    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 (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// A set of functions. No duplicates are permitted.
+class GoogleAppsScriptTypeFunctionSet {
+  /// A list of functions composing the set.
+  core.List<GoogleAppsScriptTypeFunction> values;
+
+  GoogleAppsScriptTypeFunctionSet();
+
+  GoogleAppsScriptTypeFunctionSet.fromJson(core.Map _json) {
+    if (_json.containsKey("values")) {
+      values = _json["values"]
+          .map((value) => new GoogleAppsScriptTypeFunction.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 (values != null) {
+      _json["values"] = values.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Representation of a single script process execution that was started from
+/// the script editor, a trigger, an application, or using the Apps Script API.
+/// This is distinct from the `Operation`
+/// resource, which only represents exeuctions started via the Apps Script API.
+class GoogleAppsScriptTypeProcess {
+  /// Duration the execution spent executing.
+  core.String duration;
+
+  /// User-facing name for the user executing the script.
+  core.String executingUser;
+
+  /// Name of the function the started the execution.
+  core.String functionName;
+
+  /// The executions status.
+  /// Possible string values are:
+  /// - "PROCESS_STATUS_UNSPECIFIED" : Unspecified status.
+  /// - "RUNNING" : The process is currently running.
+  /// - "PAUSED" : The process has paused.
+  /// - "COMPLETED" : The process has completed.
+  /// - "CANCELED" : The process was cancelled.
+  /// - "FAILED" : The process failed.
+  /// - "TIMED_OUT" : The process timed out.
+  /// - "UNKNOWN" : Process status unknown.
+  core.String processStatus;
+
+  /// The executions type.
+  /// Possible string values are:
+  /// - "PROCESS_TYPE_UNSPECIFIED" : Unspecified type.
+  /// - "ADD_ON" : The process was started from an add-on entry point.
+  /// - "EXECUTION_API" : The process was started using the Apps Script API.
+  /// - "TIME_DRIVEN" : The process was started from a time-based trigger.
+  /// - "TRIGGER" : The process was started from an event-based trigger.
+  /// - "WEBAPP" : The process was started from a web app entry point.
+  /// - "EDITOR" : The process was started using the Apps Script IDE.
+  core.String processType;
+
+  /// Name of the script being executed.
+  core.String projectName;
+
+  /// Time the execution started.
+  core.String startTime;
+
+  /// The executing users access level to the script.
+  /// Possible string values are:
+  /// - "USER_ACCESS_LEVEL_UNSPECIFIED" : User access level unspecified
+  /// - "NONE" : The user has no access.
+  /// - "READ" : The user has read-only access.
+  /// - "WRITE" : The user has write access.
+  /// - "OWNER" : The user is an owner.
+  core.String userAccessLevel;
+
+  GoogleAppsScriptTypeProcess();
+
+  GoogleAppsScriptTypeProcess.fromJson(core.Map _json) {
+    if (_json.containsKey("duration")) {
+      duration = _json["duration"];
+    }
+    if (_json.containsKey("executingUser")) {
+      executingUser = _json["executingUser"];
+    }
+    if (_json.containsKey("functionName")) {
+      functionName = _json["functionName"];
+    }
+    if (_json.containsKey("processStatus")) {
+      processStatus = _json["processStatus"];
+    }
+    if (_json.containsKey("processType")) {
+      processType = _json["processType"];
+    }
+    if (_json.containsKey("projectName")) {
+      projectName = _json["projectName"];
+    }
+    if (_json.containsKey("startTime")) {
+      startTime = _json["startTime"];
+    }
+    if (_json.containsKey("userAccessLevel")) {
+      userAccessLevel = _json["userAccessLevel"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (duration != null) {
+      _json["duration"] = duration;
+    }
+    if (executingUser != null) {
+      _json["executingUser"] = executingUser;
+    }
+    if (functionName != null) {
+      _json["functionName"] = functionName;
+    }
+    if (processStatus != null) {
+      _json["processStatus"] = processStatus;
+    }
+    if (processType != null) {
+      _json["processType"] = processType;
+    }
+    if (projectName != null) {
+      _json["projectName"] = projectName;
+    }
+    if (startTime != null) {
+      _json["startTime"] = startTime;
+    }
+    if (userAccessLevel != null) {
+      _json["userAccessLevel"] = userAccessLevel;
+    }
+    return _json;
+  }
+}
+
+/// Represents an authorization scope.
+class GoogleAppsScriptTypeScope {
+  /// Who authorized the scope.
+  /// Possible string values are:
+  /// - "SCOPE_AUTHORIZER_UNSPECIFIED" : Authorizer unspecified.
+  /// - "AUTHORIZED_BY_DEVELOPER" : Developer authorized scope.
+  /// - "AUTHORIZED_BY_END_USER" : End user authorized scope.
+  core.String authorizer;
+
+  /// The scope's identifying string.
+  core.String name;
+
+  GoogleAppsScriptTypeScope();
+
+  GoogleAppsScriptTypeScope.fromJson(core.Map _json) {
+    if (_json.containsKey("authorizer")) {
+      authorizer = _json["authorizer"];
+    }
+    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 (authorizer != null) {
+      _json["authorizer"] = authorizer;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// A set of scopes. No duplicates are permitted.
+class GoogleAppsScriptTypeScopeSet {
+  /// List of scope values in the set.
+  core.List<GoogleAppsScriptTypeScope> values;
+
+  GoogleAppsScriptTypeScopeSet();
+
+  GoogleAppsScriptTypeScopeSet.fromJson(core.Map _json) {
+    if (_json.containsKey("values")) {
+      values = _json["values"]
+          .map((value) => new GoogleAppsScriptTypeScope.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 (values != null) {
+      _json["values"] = values.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// A simple user profile resource.
+class GoogleAppsScriptTypeUser {
+  /// The user's domain.
+  core.String domain;
+
+  /// The user's identifying email address.
+  core.String email;
+
+  /// The user's display name.
+  core.String name;
+
+  /// The user's photo.
+  core.String photoUrl;
+
+  GoogleAppsScriptTypeUser();
+
+  GoogleAppsScriptTypeUser.fromJson(core.Map _json) {
+    if (_json.containsKey("domain")) {
+      domain = _json["domain"];
+    }
+    if (_json.containsKey("email")) {
+      email = _json["email"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("photoUrl")) {
+      photoUrl = _json["photoUrl"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (domain != null) {
+      _json["domain"] = domain;
+    }
+    if (email != null) {
+      _json["email"] = email;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (photoUrl != null) {
+      _json["photoUrl"] = photoUrl;
+    }
+    return _json;
+  }
+}
+
+/// Web app entry point configuration.
+class GoogleAppsScriptTypeWebAppConfig {
+  /// Who has permission to run the web app.
+  /// Possible string values are:
+  /// - "UNKNOWN_ACCESS" : Default value, should not be used.
+  /// - "MYSELF" : Only the user who deployed the web app or executable can
+  /// access it.
+  /// Note that this is not necessarily the owner of the script project.
+  /// - "DOMAIN" : Only users in the same domain as the user who deployed the
+  /// web app or
+  /// executable can access it.
+  /// - "ANYONE" : Any logged in user can access the web app or executable.
+  /// - "ANYONE_ANONYMOUS" : Any user, logged in or not, can access the web app
+  /// or executable.
+  core.String access;
+
+  /// Who to execute the web app as.
+  /// Possible string values are:
+  /// - "UNKNOWN_EXECUTE_AS" : Default value, should not be used.
+  /// - "USER_ACCESSING" : The script runs as the user accessing the web app.
+  /// - "USER_DEPLOYING" : The script runs as the user who deployed the web app.
+  /// Note that this is
+  /// not necessarily the owner of the script project.
+  core.String executeAs;
+
+  GoogleAppsScriptTypeWebAppConfig();
+
+  GoogleAppsScriptTypeWebAppConfig.fromJson(core.Map _json) {
+    if (_json.containsKey("access")) {
+      access = _json["access"];
+    }
+    if (_json.containsKey("executeAs")) {
+      executeAs = _json["executeAs"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (access != null) {
+      _json["access"] = access;
+    }
+    if (executeAs != null) {
+      _json["executeAs"] = executeAs;
+    }
+    return _json;
+  }
+}
+
+/// A web application entry point.
+class GoogleAppsScriptTypeWebAppEntryPoint {
+  /// The entry point's configuration.
+  GoogleAppsScriptTypeWebAppConfig entryPointConfig;
+
+  /// The URL for the web application.
+  core.String url;
+
+  GoogleAppsScriptTypeWebAppEntryPoint();
+
+  GoogleAppsScriptTypeWebAppEntryPoint.fromJson(core.Map _json) {
+    if (_json.containsKey("entryPointConfig")) {
+      entryPointConfig = new GoogleAppsScriptTypeWebAppConfig.fromJson(
+          _json["entryPointConfig"]);
+    }
+    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 (entryPointConfig != null) {
+      _json["entryPointConfig"] = (entryPointConfig).toJson();
+    }
+    if (url != null) {
+      _json["url"] = url;
+    }
+    return _json;
+  }
+}
+
+/// Response with the list of deployments for the specified Apps Script project.
+class ListDeploymentsResponse {
+  /// The list of deployments.
+  core.List<Deployment> deployments;
+
+  /// The token that can be used in the next call to get the next page of
+  /// results.
+  core.String nextPageToken;
+
+  ListDeploymentsResponse();
+
+  ListDeploymentsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("deployments")) {
+      deployments = _json["deployments"]
+          .map((value) => new Deployment.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 (deployments != null) {
+      _json["deployments"] =
+          deployments.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+/// Response with the list of
+/// Process resources.
+class ListScriptProcessesResponse {
+  /// Token for the next page of results. If empty, there are no more pages
+  /// remaining.
+  core.String nextPageToken;
+
+  /// List of processes matching request parameters.
+  core.List<GoogleAppsScriptTypeProcess> processes;
+
+  ListScriptProcessesResponse();
+
+  ListScriptProcessesResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("processes")) {
+      processes = _json["processes"]
+          .map((value) => new GoogleAppsScriptTypeProcess.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 (processes != null) {
+      _json["processes"] = processes.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Response with the list of
+/// Process resources.
+class ListUserProcessesResponse {
+  /// Token for the next page of results. If empty, there are no more pages
+  /// remaining.
+  core.String nextPageToken;
+
+  /// List of processes matching request parameters.
+  core.List<GoogleAppsScriptTypeProcess> processes;
+
+  ListUserProcessesResponse();
+
+  ListUserProcessesResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("processes")) {
+      processes = _json["processes"]
+          .map((value) => new GoogleAppsScriptTypeProcess.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 (processes != null) {
+      _json["processes"] = processes.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Response with the list of the versions for the specified script project.
+class ListVersionsResponse {
+  /// The token use to fetch the next page of records. if not exist in the
+  /// response, that means no more versions to list.
+  core.String nextPageToken;
+
+  /// The list of versions.
+  core.List<Version> versions;
+
+  ListVersionsResponse();
+
+  ListVersionsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("versions")) {
+      versions = _json["versions"]
+          .map((value) => new Version.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 (versions != null) {
+      _json["versions"] = versions.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Resource containing usage stats for a given script, based on the supplied
+/// filter and mask present in the request.
+class Metrics {
+  /// Number of active users.
+  core.List<MetricsValue> activeUsers;
+
+  /// Number of failed executions.
+  core.List<MetricsValue> failedExecutions;
+
+  /// Number of total executions.
+  core.List<MetricsValue> totalExecutions;
+
+  Metrics();
+
+  Metrics.fromJson(core.Map _json) {
+    if (_json.containsKey("activeUsers")) {
+      activeUsers = _json["activeUsers"]
+          .map((value) => new MetricsValue.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("failedExecutions")) {
+      failedExecutions = _json["failedExecutions"]
+          .map((value) => new MetricsValue.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("totalExecutions")) {
+      totalExecutions = _json["totalExecutions"]
+          .map((value) => new MetricsValue.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 (activeUsers != null) {
+      _json["activeUsers"] =
+          activeUsers.map((value) => (value).toJson()).toList();
+    }
+    if (failedExecutions != null) {
+      _json["failedExecutions"] =
+          failedExecutions.map((value) => (value).toJson()).toList();
+    }
+    if (totalExecutions != null) {
+      _json["totalExecutions"] =
+          totalExecutions.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Metrics value that holds number of executions counted.
+class MetricsValue {
+  /// Required field indicating the end time of the interval.
+  core.String endTime;
+
+  /// Required field indicating the start time of the interval.
+  core.String startTime;
+
+  /// Indicates the number of executions counted.
+  core.String value;
+
+  MetricsValue();
+
+  MetricsValue.fromJson(core.Map _json) {
+    if (_json.containsKey("endTime")) {
+      endTime = _json["endTime"];
+    }
+    if (_json.containsKey("startTime")) {
+      startTime = _json["startTime"];
+    }
+    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 (endTime != null) {
+      _json["endTime"] = endTime;
+    }
+    if (startTime != null) {
+      _json["startTime"] = startTime;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+/// A representation of a execution of an Apps Script function that is started
+/// using run. The execution response does not arrive until the function
+/// finishes executing. The maximum execution runtime is listed in the [Apps
+/// Script quotas
+/// guide](/apps-script/guides/services/quotas#current_limitations). <p>After
+/// the execution is started, it can have one of four outcomes:</p> <ul> <li> If
+/// the script function returns successfully, the
+///   response field contains an
+///   ExecutionResponse object
+///   with the function's return value in the object's `result` field.</li>
+/// <li> If the script function (or Apps Script itself) throws an exception, the
+///   error field contains a
+///   Status object. The `Status` object's `details`
+///   field contains an array with a single
+///   ExecutionError object that
+///   provides information about the nature of the error.</li>
+/// <li> If the execution has not yet completed,
+///   the done field is `false` and
+///   the neither the `response` nor `error` fields are present.</li>
+/// <li> If the `run` call itself fails (for example, because of a
+///   malformed request or an authorization error), the method returns an HTTP
+///   response code in the 4XX range with a different format for the response
+///   body. Client libraries automatically convert a 4XX response into an
+///   exception class.</li>
+/// </ul>
 class Operation {
-  /// This field is only used with asynchronous executions and indicates whether
-  /// or not the script execution has completed. A completed execution has a
-  /// populated response field containing the `ExecutionResponse` from function
-  /// that was executed.
+  /// This field indicates whether the script execution has completed. A
+  /// completed execution has a populated `response` field containing the
+  /// ExecutionResponse from function that was executed.
   core.bool done;
 
   /// If a `run` call succeeds but the script function (or Apps Script itself)
-  /// throws an exception, this field will contain a `Status` object. The
-  /// `Status` object's `details` field will contain an array with a single
-  /// `ExecutionError` object that provides information about the nature of the
-  /// error.
+  /// throws an exception, this field contains a Status object. The `Status`
+  /// object's `details` field contains an array with a single ExecutionError
+  /// object that provides information about the nature of the error.
   Status error;
 
-  /// This field is not used.
-  ///
-  /// 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;
-
-  /// If the script function returns successfully, this field will contain an
-  /// `ExecutionResponse` object with the function's return value as the
-  /// object's `result` field.
+  /// If the script function returns successfully, this field contains an
+  /// ExecutionResponse object with the function's return value.
   ///
   /// The values for Object must be JSON objects. It can consist of `num`,
   /// `String`, `bool` and `null` as well as `Map` and `List` values.
@@ -347,9 +2416,6 @@
     if (_json.containsKey("error")) {
       error = new Status.fromJson(_json["error"]);
     }
-    if (_json.containsKey("metadata")) {
-      metadata = _json["metadata"];
-    }
     if (_json.containsKey("response")) {
       response = _json["response"];
     }
@@ -364,9 +2430,6 @@
     if (error != null) {
       _json["error"] = (error).toJson();
     }
-    if (metadata != null) {
-      _json["metadata"] = metadata;
-    }
     if (response != null) {
       _json["response"] = response;
     }
@@ -374,6 +2437,86 @@
   }
 }
 
+/// The script project resource.
+class Project {
+  /// When the script was created.
+  core.String createTime;
+
+  /// User who originally created the script.
+  GoogleAppsScriptTypeUser creator;
+
+  /// User who last modified the script.
+  GoogleAppsScriptTypeUser lastModifyUser;
+
+  /// The parent's Drive ID that the script will be attached to. This is usually
+  /// the ID of a Google Document or Google Sheet. This filed is optional, and
+  /// if not set, a stand-alone script will be created.
+  core.String parentId;
+
+  /// The script project's Drive ID.
+  core.String scriptId;
+
+  /// The title for the project.
+  core.String title;
+
+  /// When the script was last updated.
+  core.String updateTime;
+
+  Project();
+
+  Project.fromJson(core.Map _json) {
+    if (_json.containsKey("createTime")) {
+      createTime = _json["createTime"];
+    }
+    if (_json.containsKey("creator")) {
+      creator = new GoogleAppsScriptTypeUser.fromJson(_json["creator"]);
+    }
+    if (_json.containsKey("lastModifyUser")) {
+      lastModifyUser =
+          new GoogleAppsScriptTypeUser.fromJson(_json["lastModifyUser"]);
+    }
+    if (_json.containsKey("parentId")) {
+      parentId = _json["parentId"];
+    }
+    if (_json.containsKey("scriptId")) {
+      scriptId = _json["scriptId"];
+    }
+    if (_json.containsKey("title")) {
+      title = _json["title"];
+    }
+    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 (createTime != null) {
+      _json["createTime"] = createTime;
+    }
+    if (creator != null) {
+      _json["creator"] = (creator).toJson();
+    }
+    if (lastModifyUser != null) {
+      _json["lastModifyUser"] = (lastModifyUser).toJson();
+    }
+    if (parentId != null) {
+      _json["parentId"] = parentId;
+    }
+    if (scriptId != null) {
+      _json["scriptId"] = scriptId;
+    }
+    if (title != null) {
+      _json["title"] = title;
+    }
+    if (updateTime != null) {
+      _json["updateTime"] = updateTime;
+    }
+    return _json;
+  }
+}
+
 /// A stack trace through the script that shows where the execution failed.
 class ScriptStackTraceElement {
   /// The name of the function that failed.
@@ -407,14 +2550,15 @@
 }
 
 /// If a `run` call succeeds but the script function (or Apps Script itself)
-/// throws an exception, the response body's `error` field will contain this
-/// `Status` object.
+/// throws an exception, the response body's error field contains this `Status`
+/// object.
 class Status {
-  /// The status code. For this API, this value will always be 3, corresponding
-  /// to an <code>INVALID_ARGUMENT</code> error.
+  /// The status code. For this API, this value either: <ul> <li> 3, indicating
+  /// an `INVALID_ARGUMENT` error, or</li> <li> 1, indicating a `CANCELLED`
+  /// execution.</li> </ul>
   core.int code;
 
-  /// An array that contains a single `ExecutionError` object that provides
+  /// An array that contains a single ExecutionError object that provides
   /// information about the nature of the error.
   ///
   /// The values for Object must be JSON objects. It can consist of `num`,
@@ -423,8 +2567,8 @@
 
   /// A developer-facing error message, which is in English. Any user-facing
   /// error message is localized and sent in the
-  /// [`google.rpc.Status.details`](google.rpc.Status.details) field, or
-  /// localized by the client.
+  /// [google.rpc.Status.details](google.rpc.Status.details) field, or localized
+  /// by the client.
   core.String message;
 
   Status();
@@ -456,3 +2600,80 @@
     return _json;
   }
 }
+
+/// Request with deployment information to update an existing deployment.
+class UpdateDeploymentRequest {
+  /// The deployment configuration.
+  DeploymentConfig deploymentConfig;
+
+  UpdateDeploymentRequest();
+
+  UpdateDeploymentRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("deploymentConfig")) {
+      deploymentConfig =
+          new DeploymentConfig.fromJson(_json["deploymentConfig"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (deploymentConfig != null) {
+      _json["deploymentConfig"] = (deploymentConfig).toJson();
+    }
+    return _json;
+  }
+}
+
+/// A resource representing a script project version. A version is a "snapshot"
+/// of a script project and is similar to a read-only branched release. When
+/// creating deployments, the version to use must be specified.
+class Version {
+  /// When the version was created.
+  core.String createTime;
+
+  /// The description for this version.
+  core.String description;
+
+  /// The script project's Drive ID.
+  core.String scriptId;
+
+  /// The incremental ID that is created by Apps Script when a version is
+  /// created. This is system assigned number and is immutable once created.
+  core.int versionNumber;
+
+  Version();
+
+  Version.fromJson(core.Map _json) {
+    if (_json.containsKey("createTime")) {
+      createTime = _json["createTime"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("scriptId")) {
+      scriptId = _json["scriptId"];
+    }
+    if (_json.containsKey("versionNumber")) {
+      versionNumber = _json["versionNumber"];
+    }
+  }
+
+  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;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (scriptId != null) {
+      _json["scriptId"] = scriptId;
+    }
+    if (versionNumber != null) {
+      _json["versionNumber"] = versionNumber;
+    }
+    return _json;
+  }
+}
diff --git a/googleapis/lib/serviceconsumermanagement/v1.dart b/googleapis/lib/serviceconsumermanagement/v1.dart
new file mode 100644
index 0000000..f15fb80
--- /dev/null
+++ b/googleapis/lib/serviceconsumermanagement/v1.dart
@@ -0,0 +1,5573 @@
+// This is a generated file (see the discoveryapis_generator project).
+
+library googleapis.serviceconsumermanagement.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_1;
+
+export 'package:_discoveryapis_commons/_discoveryapis_commons.dart'
+    show ApiRequestError, DetailedApiRequestError;
+
+const core.String USER_AGENT = 'dart-api-client serviceconsumermanagement/v1';
+
+/// Provides management methods for configuring service producer resources on
+/// Google Cloud.
+class ServiceconsumermanagementApi {
+  /// View and manage your data across Google Cloud Platform services
+  static const CloudPlatformScope =
+      "https://www.googleapis.com/auth/cloud-platform";
+
+  /// Manage your Google API service configuration
+  static const ServiceManagementScope =
+      "https://www.googleapis.com/auth/service.management";
+
+  final commons.ApiRequester _requester;
+
+  OperationsResourceApi get operations => new OperationsResourceApi(_requester);
+  ServicesResourceApi get services => new ServicesResourceApi(_requester);
+
+  ServiceconsumermanagementApi(http_1.Client client,
+      {core.String rootUrl: "https://serviceconsumermanagement.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_1.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_1.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_1.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$".
+  ///
+  /// [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.
+  ///
+  /// Completes with a [ListOperationsResponse].
+  ///
+  /// Completes with a [commons.ApiRequestError] if the API endpoint returned an
+  /// error.
+  ///
+  /// 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.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 (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 ($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));
+  }
+}
+
+class ServicesResourceApi {
+  final commons.ApiRequester _requester;
+
+  ServicesTenancyUnitsResourceApi get tenancyUnits =>
+      new ServicesTenancyUnitsResourceApi(_requester);
+
+  ServicesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Search tenancy units for a service.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Service for which search is performed.
+  /// services/{service}
+  /// {service} the name of a service, for example 'service.googleapis.com'.
+  /// Value must have pattern "^services/[^/]+$".
+  ///
+  /// [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.
+  ///
+  /// Optional.
+  ///
+  /// [pageSize] - The maximum number of results returned by this request.
+  /// Currently, the
+  /// default maximum is set to 1000. If page_size is not provided or provided a
+  /// number larger than 1000, it will be automatically set to 1000.
+  ///
+  /// Optional.
+  ///
+  /// [query] - Set a query `{expression}` for querying tenancy units. Your
+  /// `{expression}`
+  /// must be in the format: `field_name=literal_string`. The `field_name` is
+  /// the
+  /// name of the field you want to compare. Supported fields are
+  /// `tenant_resources.tag` and`tenant_resources.resource`.
+  ///
+  /// For example, to search tenancy units that contain at least one tenant
+  /// resource with given tag 'xyz', use query `tenant_resources.tag=xyz`.
+  /// To search tenancy units that contain at least one tenant resource with
+  /// given resource name 'projects/123456', use query
+  /// `tenant_resources.resource=projects/123456`.
+  ///
+  /// Multiple expressions can be joined with `AND`s. Tenancy units must match
+  /// all expressions to be included in the result set. For example,
+  /// `tenant_resources.tag=xyz AND tenant_resources.resource=projects/123456`
+  ///
+  /// Optional.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [SearchTenancyUnitsResponse].
+  ///
+  /// Completes with a [commons.ApiRequestError] if the API endpoint returned an
+  /// error.
+  ///
+  /// 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<SearchTenancyUnitsResponse> search(core.String parent,
+      {core.String pageToken,
+      core.int pageSize,
+      core.String query,
+      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 (query != null) {
+      _queryParams["query"] = [query];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' + commons.Escaper.ecapeVariableReserved('$parent') + ':search';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new SearchTenancyUnitsResponse.fromJson(data));
+  }
+}
+
+class ServicesTenancyUnitsResourceApi {
+  final commons.ApiRequester _requester;
+
+  ServicesTenancyUnitsResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Add a new tenant project to the tenancy unit.
+  /// There can be at most 512 tenant projects in a tenancy units.
+  /// If there are previously failed AddTenantProject calls, you might need to
+  /// call RemoveTenantProject first to clean them before you can make another
+  /// AddTenantProject with the same tag.
+  /// Operation<response: Empty>.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Name of the tenancy unit.
+  /// Value must have pattern "^services/[^/]+/[^/]+/[^/]+/tenancyUnits/[^/]+$".
+  ///
+  /// [$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_1.Client] completes with an error when making a REST
+  /// call, this method will complete with the same error.
+  async.Future<Operation> addProject(
+      AddTenantProjectRequest 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') +
+        ':addProject';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /// Creates a tenancy unit with no tenant resources.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - services/{service}/{collection id}/{resource id}
+  /// {collection id} is the cloud resource collection type representing the
+  /// service consumer, for example 'projects', or 'organizations'.
+  /// {resource id} is the consumer numeric id, such as project number:
+  /// '123456'.
+  /// {service} the name of a service, for example 'service.googleapis.com'.
+  /// Enabled service binding using the new tenancy unit.
+  /// Value must have pattern "^services/[^/]+/[^/]+/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [TenancyUnit].
+  ///
+  /// Completes with a [commons.ApiRequestError] if the API endpoint returned an
+  /// error.
+  ///
+  /// 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<TenancyUnit> create(
+      CreateTenancyUnitRequest 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') +
+        '/tenancyUnits';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new TenancyUnit.fromJson(data));
+  }
+
+  /// Delete tenancy unit.  Before the tenancy unit is deleted, there should be
+  /// no tenant resource in it.
+  /// Operation<response: Empty>.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Name of the tenancy unit to be deleted.
+  /// Value must have pattern "^services/[^/]+/[^/]+/[^/]+/tenancyUnits/[^/]+$".
+  ///
+  /// [$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_1.Client] completes with an error when making a REST
+  /// call, this method will complete with the same error.
+  async.Future<Operation> 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 Operation.fromJson(data));
+  }
+
+  /// Find tenancy unit for a service and consumer.
+  /// This method should not be used in producers' runtime path, e.g. finding
+  /// the tenant project number when creating VMs. Producers should persist
+  /// the tenant project information after the project is created.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Service and consumer. Required.
+  /// services/{service}/{collection id}/{resource id}
+  /// {collection id} is the cloud resource collection type representing the
+  /// service consumer, for example 'projects', or 'organizations'.
+  /// {resource id} is the consumer numeric id, such as project number:
+  /// '123456'.
+  /// {service} the name of a service, for example 'service.googleapis.com'.
+  /// Value must have pattern "^services/[^/]+/[^/]+/[^/]+$".
+  ///
+  /// [pageSize] - The maximum number of results returned by this request.
+  ///
+  /// [filter] - Filter expression over tenancy resources field. Optional.
+  ///
+  /// [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.
+  ///
+  /// Completes with a [ListTenancyUnitsResponse].
+  ///
+  /// Completes with a [commons.ApiRequestError] if the API endpoint returned an
+  /// error.
+  ///
+  /// 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<ListTenancyUnitsResponse> list(core.String parent,
+      {core.int pageSize,
+      core.String filter,
+      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 (parent == null) {
+      throw new core.ArgumentError("Parameter parent is required.");
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' +
+        commons.Escaper.ecapeVariableReserved('$parent') +
+        '/tenancyUnits';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new ListTenancyUnitsResponse.fromJson(data));
+  }
+
+  /// Removes specified project resource identified by tenant resource tag.
+  /// It will remove project lien with 'TenantManager' origin if that was added.
+  /// It will then attempt to delete the project.
+  /// If that operation fails, this method fails.
+  /// Operation<response: Empty>.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Name of the tenancy unit.
+  /// Such as
+  /// 'services/service.googleapis.com/projects/12345/tenancyUnits/abcd'.
+  /// Value must have pattern "^services/[^/]+/[^/]+/[^/]+/tenancyUnits/[^/]+$".
+  ///
+  /// [$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_1.Client] completes with an error when making a REST
+  /// call, this method will complete with the same error.
+  async.Future<Operation> removeProject(
+      RemoveTenantProjectRequest 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') +
+        ':removeProject';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+}
+
+/// Request to add a newly created and configured tenant project to tenancy
+/// unit.
+class AddTenantProjectRequest {
+  /// Configuration of the new tenant project that will be added to tenancy unit
+  /// resources.
+  TenantProjectConfig projectConfig;
+
+  /// Tag of the added project. Must be less than 128 characters. Required.
+  core.String tag;
+
+  AddTenantProjectRequest();
+
+  AddTenantProjectRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("projectConfig")) {
+      projectConfig = new TenantProjectConfig.fromJson(_json["projectConfig"]);
+    }
+    if (_json.containsKey("tag")) {
+      tag = _json["tag"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (projectConfig != null) {
+      _json["projectConfig"] = (projectConfig).toJson();
+    }
+    if (tag != null) {
+      _json["tag"] = tag;
+    }
+    return _json;
+  }
+}
+
+/// Api is a light-weight descriptor for an API Interface.
+///
+/// Interfaces are also described as "protocol buffer services" in some
+/// contexts,
+/// such as by the "service" keyword in a .proto file, but they are different
+/// from API Services, which represent a concrete implementation of an interface
+/// as opposed to simply a description of methods and bindings. They are also
+/// sometimes simply referred to as "APIs" in other contexts, such as the name
+/// of
+/// this message itself. See https://cloud.google.com/apis/design/glossary for
+/// detailed terminology.
+class Api {
+  /// The methods of this interface, in unspecified order.
+  core.List<Method> methods;
+
+  /// Included interfaces. See Mixin.
+  core.List<Mixin> mixins;
+
+  /// The fully qualified name of this interface, including package name
+  /// followed by the interface's simple name.
+  core.String name;
+
+  /// Any metadata attached to the interface.
+  core.List<Option> options;
+
+  /// Source context for the protocol buffer service represented by this
+  /// message.
+  SourceContext sourceContext;
+
+  /// The source syntax of the service.
+  /// Possible string values are:
+  /// - "SYNTAX_PROTO2" : Syntax `proto2`.
+  /// - "SYNTAX_PROTO3" : Syntax `proto3`.
+  core.String syntax;
+
+  /// A version string for this interface. If specified, must have the form
+  /// `major-version.minor-version`, as in `1.10`. If the minor version is
+  /// omitted, it defaults to zero. If the entire version field is empty, the
+  /// major version is derived from the package name, as outlined below. If the
+  /// field is not empty, the version in the package name will be verified to be
+  /// consistent with what is provided here.
+  ///
+  /// The versioning schema uses [semantic
+  /// versioning](http://semver.org) where the major version number
+  /// indicates a breaking change and the minor version an additive,
+  /// non-breaking change. Both version numbers are signals to users
+  /// what to expect from different versions, and should be carefully
+  /// chosen based on the product plan.
+  ///
+  /// The major version is also reflected in the package name of the
+  /// interface, which must end in `v<major-version>`, as in
+  /// `google.feature.v1`. For major versions 0 and 1, the suffix can
+  /// be omitted. Zero major versions must only be used for
+  /// experimental, non-GA interfaces.
+  core.String version;
+
+  Api();
+
+  Api.fromJson(core.Map _json) {
+    if (_json.containsKey("methods")) {
+      methods =
+          _json["methods"].map((value) => new Method.fromJson(value)).toList();
+    }
+    if (_json.containsKey("mixins")) {
+      mixins =
+          _json["mixins"].map((value) => new Mixin.fromJson(value)).toList();
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("options")) {
+      options =
+          _json["options"].map((value) => new Option.fromJson(value)).toList();
+    }
+    if (_json.containsKey("sourceContext")) {
+      sourceContext = new SourceContext.fromJson(_json["sourceContext"]);
+    }
+    if (_json.containsKey("syntax")) {
+      syntax = _json["syntax"];
+    }
+    if (_json.containsKey("version")) {
+      version = _json["version"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (methods != null) {
+      _json["methods"] = methods.map((value) => (value).toJson()).toList();
+    }
+    if (mixins != null) {
+      _json["mixins"] = mixins.map((value) => (value).toJson()).toList();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (options != null) {
+      _json["options"] = options.map((value) => (value).toJson()).toList();
+    }
+    if (sourceContext != null) {
+      _json["sourceContext"] = (sourceContext).toJson();
+    }
+    if (syntax != null) {
+      _json["syntax"] = syntax;
+    }
+    if (version != null) {
+      _json["version"] = version;
+    }
+    return _json;
+  }
+}
+
+/// Configuration for an anthentication provider, including support for
+/// [JSON Web Token
+/// (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32).
+class AuthProvider {
+  /// The list of JWT
+  /// [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3).
+  /// that are allowed to access. A JWT containing any of these audiences will
+  /// be accepted. When this setting is absent, only JWTs with audience
+  /// "https://Service_name/API_name"
+  /// will be accepted. For example, if no audiences are in the setting,
+  /// LibraryService API will only accept JWTs with the following audience
+  /// "https://library-example.googleapis.com/google.example.library.v1.LibraryService".
+  ///
+  /// Example:
+  ///
+  ///     audiences: bookstore_android.apps.googleusercontent.com,
+  ///                bookstore_web.apps.googleusercontent.com
+  core.String audiences;
+
+  /// Redirect URL if JWT token is required but no present or is expired.
+  /// Implement authorizationUrl of securityDefinitions in OpenAPI spec.
+  core.String authorizationUrl;
+
+  /// The unique identifier of the auth provider. It will be referred to by
+  /// `AuthRequirement.provider_id`.
+  ///
+  /// Example: "bookstore_auth".
+  core.String id;
+
+  /// Identifies the principal that issued the JWT. See
+  /// https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.1
+  /// Usually a URL or an email address.
+  ///
+  /// Example: https://securetoken.google.com
+  /// Example: 1234567-compute@developer.gserviceaccount.com
+  core.String issuer;
+
+  /// URL of the provider's public key set to validate signature of the JWT. See
+  /// [OpenID
+  /// Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata).
+  /// Optional if the key set document:
+  ///  - can be retrieved from
+  /// [OpenID
+  /// Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html
+  ///    of the issuer.
+  /// - can be inferred from the email domain of the issuer (e.g. a Google
+  /// service account).
+  ///
+  /// Example: https://www.googleapis.com/oauth2/v1/certs
+  core.String jwksUri;
+
+  AuthProvider();
+
+  AuthProvider.fromJson(core.Map _json) {
+    if (_json.containsKey("audiences")) {
+      audiences = _json["audiences"];
+    }
+    if (_json.containsKey("authorizationUrl")) {
+      authorizationUrl = _json["authorizationUrl"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("issuer")) {
+      issuer = _json["issuer"];
+    }
+    if (_json.containsKey("jwksUri")) {
+      jwksUri = _json["jwksUri"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (audiences != null) {
+      _json["audiences"] = audiences;
+    }
+    if (authorizationUrl != null) {
+      _json["authorizationUrl"] = authorizationUrl;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (issuer != null) {
+      _json["issuer"] = issuer;
+    }
+    if (jwksUri != null) {
+      _json["jwksUri"] = jwksUri;
+    }
+    return _json;
+  }
+}
+
+/// User-defined authentication requirements, including support for
+/// [JSON Web Token
+/// (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32).
+class AuthRequirement {
+  /// NOTE: This will be deprecated soon, once AuthProvider.audiences is
+  /// implemented and accepted in all the runtime components.
+  ///
+  /// The list of JWT
+  /// [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3).
+  /// that are allowed to access. A JWT containing any of these audiences will
+  /// be accepted. When this setting is absent, only JWTs with audience
+  /// "https://Service_name/API_name"
+  /// will be accepted. For example, if no audiences are in the setting,
+  /// LibraryService API will only accept JWTs with the following audience
+  /// "https://library-example.googleapis.com/google.example.library.v1.LibraryService".
+  ///
+  /// Example:
+  ///
+  ///     audiences: bookstore_android.apps.googleusercontent.com,
+  ///                bookstore_web.apps.googleusercontent.com
+  core.String audiences;
+
+  /// id from authentication provider.
+  ///
+  /// Example:
+  ///
+  ///     provider_id: bookstore_auth
+  core.String providerId;
+
+  AuthRequirement();
+
+  AuthRequirement.fromJson(core.Map _json) {
+    if (_json.containsKey("audiences")) {
+      audiences = _json["audiences"];
+    }
+    if (_json.containsKey("providerId")) {
+      providerId = _json["providerId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (audiences != null) {
+      _json["audiences"] = audiences;
+    }
+    if (providerId != null) {
+      _json["providerId"] = providerId;
+    }
+    return _json;
+  }
+}
+
+/// `Authentication` defines the authentication configuration for an API.
+///
+/// Example for an API targeted for external use:
+///
+///     name: calendar.googleapis.com
+///     authentication:
+///       providers:
+///       - id: google_calendar_auth
+///         jwks_uri: https://www.googleapis.com/oauth2/v1/certs
+///         issuer: https://securetoken.google.com
+///       rules:
+///       - selector: "*"
+///         requirements:
+///           provider_id: google_calendar_auth
+class Authentication {
+  /// Defines a set of authentication providers that a service supports.
+  core.List<AuthProvider> providers;
+
+  /// A list of authentication rules that apply to individual API methods.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<AuthenticationRule> rules;
+
+  Authentication();
+
+  Authentication.fromJson(core.Map _json) {
+    if (_json.containsKey("providers")) {
+      providers = _json["providers"]
+          .map((value) => new AuthProvider.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new AuthenticationRule.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 (providers != null) {
+      _json["providers"] = providers.map((value) => (value).toJson()).toList();
+    }
+    if (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Authentication rules for the service.
+///
+/// By default, if a method has any authentication requirements, every request
+/// must include a valid credential matching one of the requirements.
+/// It's an error to include more than one kind of credential in a single
+/// request.
+///
+/// If a method doesn't have any auth requirements, request credentials will be
+/// ignored.
+class AuthenticationRule {
+  /// Whether to allow requests without a credential. The credential can be
+  /// an OAuth token, Google cookies (first-party auth) or EndUserCreds.
+  ///
+  /// For requests without credentials, if the service control environment is
+  /// specified, each incoming request **must** be associated with a service
+  /// consumer. This can be done by passing an API key that belongs to a
+  /// consumer
+  /// project.
+  core.bool allowWithoutCredential;
+
+  /// Configuration for custom authentication.
+  CustomAuthRequirements customAuth;
+
+  /// The requirements for OAuth credentials.
+  OAuthRequirements oauth;
+
+  /// Requirements for additional authentication providers.
+  core.List<AuthRequirement> requirements;
+
+  /// Selects the methods to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  AuthenticationRule();
+
+  AuthenticationRule.fromJson(core.Map _json) {
+    if (_json.containsKey("allowWithoutCredential")) {
+      allowWithoutCredential = _json["allowWithoutCredential"];
+    }
+    if (_json.containsKey("customAuth")) {
+      customAuth = new CustomAuthRequirements.fromJson(_json["customAuth"]);
+    }
+    if (_json.containsKey("oauth")) {
+      oauth = new OAuthRequirements.fromJson(_json["oauth"]);
+    }
+    if (_json.containsKey("requirements")) {
+      requirements = _json["requirements"]
+          .map((value) => new AuthRequirement.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (allowWithoutCredential != null) {
+      _json["allowWithoutCredential"] = allowWithoutCredential;
+    }
+    if (customAuth != null) {
+      _json["customAuth"] = (customAuth).toJson();
+    }
+    if (oauth != null) {
+      _json["oauth"] = (oauth).toJson();
+    }
+    if (requirements != null) {
+      _json["requirements"] =
+          requirements.map((value) => (value).toJson()).toList();
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// Configuration of authorization.
+///
+/// This section determines the authorization provider, if unspecified, then no
+/// authorization check will be done.
+///
+/// Example:
+///
+///     experimental:
+///       authorization:
+///         provider: firebaserules.googleapis.com
+class AuthorizationConfig {
+  /// The name of the authorization provider, such as
+  /// firebaserules.googleapis.com.
+  core.String provider;
+
+  AuthorizationConfig();
+
+  AuthorizationConfig.fromJson(core.Map _json) {
+    if (_json.containsKey("provider")) {
+      provider = _json["provider"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (provider != null) {
+      _json["provider"] = provider;
+    }
+    return _json;
+  }
+}
+
+/// Authorization rule for API services.
+///
+/// It specifies the permission(s) required for an API element for the overall
+/// API request to succeed. It is typically used to mark request message fields
+/// that contain the name of the resource and indicates the permissions that
+/// will be checked on that resource.
+///
+/// For example:
+///
+///     package google.storage.v1;
+///
+///     message CopyObjectRequest {
+///       string source = 1 [
+///         (google.api.authz).permissions = "storage.objects.get"];
+///
+///       string destination = 2 [
+///         (google.api.authz).permissions =
+///             "storage.objects.create,storage.objects.update"];
+///     }
+class AuthorizationRule {
+  /// The required permissions. The acceptable values vary depend on the
+  /// authorization system used. For Google APIs, it should be a comma-separated
+  /// Google IAM permission values. When multiple permissions are listed, the
+  /// semantics is not defined by the system. Additional documentation must
+  /// be provided manually.
+  core.String permissions;
+
+  /// Selects the API elements to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  AuthorizationRule();
+
+  AuthorizationRule.fromJson(core.Map _json) {
+    if (_json.containsKey("permissions")) {
+      permissions = _json["permissions"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (permissions != null) {
+      _json["permissions"] = permissions;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// `Backend` defines the backend configuration for a service.
+class Backend {
+  /// A list of API backend rules that apply to individual API methods.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<BackendRule> rules;
+
+  Backend();
+
+  Backend.fromJson(core.Map _json) {
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new BackendRule.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 (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// A backend rule provides configuration for an individual API element.
+class BackendRule {
+  /// The address of the API backend.
+  core.String address;
+
+  /// The number of seconds to wait for a response from a request.  The default
+  /// deadline for gRPC is infinite (no deadline) and HTTP requests is 5
+  /// seconds.
+  core.double deadline;
+
+  /// Minimum deadline in seconds needed for this method. Calls having deadline
+  /// value lower than this will be rejected.
+  core.double minDeadline;
+
+  /// Selects the methods to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  BackendRule();
+
+  BackendRule.fromJson(core.Map _json) {
+    if (_json.containsKey("address")) {
+      address = _json["address"];
+    }
+    if (_json.containsKey("deadline")) {
+      deadline = _json["deadline"];
+    }
+    if (_json.containsKey("minDeadline")) {
+      minDeadline = _json["minDeadline"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (address != null) {
+      _json["address"] = address;
+    }
+    if (deadline != null) {
+      _json["deadline"] = deadline;
+    }
+    if (minDeadline != null) {
+      _json["minDeadline"] = minDeadline;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// Billing related configuration of the service.
+///
+/// The following example shows how to configure monitored resources and metrics
+/// for billing:
+///
+///     monitored_resources:
+///     - type: library.googleapis.com/branch
+///       labels:
+///       - key: /city
+///         description: The city where the library branch is located in.
+///       - key: /name
+///         description: The name of the branch.
+///     metrics:
+///     - name: library.googleapis.com/book/borrowed_count
+///       metric_kind: DELTA
+///       value_type: INT64
+///     billing:
+///       consumer_destinations:
+///       - monitored_resource: library.googleapis.com/branch
+///         metrics:
+///         - library.googleapis.com/book/borrowed_count
+class Billing {
+  /// Billing configurations for sending metrics to the consumer project.
+  /// There can be multiple consumer destinations per service, each one must
+  /// have
+  /// a different monitored resource type. A metric can be used in at most
+  /// one consumer destination.
+  core.List<BillingDestination> consumerDestinations;
+
+  Billing();
+
+  Billing.fromJson(core.Map _json) {
+    if (_json.containsKey("consumerDestinations")) {
+      consumerDestinations = _json["consumerDestinations"]
+          .map((value) => new BillingDestination.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 (consumerDestinations != null) {
+      _json["consumerDestinations"] =
+          consumerDestinations.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Describes billing configuration for new a Tenant Project
+class BillingConfig {
+  /// Name of the billing account.
+  /// For example `billingAccounts/012345-567890-ABCDEF`.
+  core.String billingAccount;
+
+  BillingConfig();
+
+  BillingConfig.fromJson(core.Map _json) {
+    if (_json.containsKey("billingAccount")) {
+      billingAccount = _json["billingAccount"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (billingAccount != null) {
+      _json["billingAccount"] = billingAccount;
+    }
+    return _json;
+  }
+}
+
+/// Configuration of a specific billing destination (Currently only support
+/// bill against consumer project).
+class BillingDestination {
+  /// Names of the metrics to report to this billing destination.
+  /// Each name must be defined in Service.metrics section.
+  core.List<core.String> metrics;
+
+  /// The monitored resource type. The type must be defined in
+  /// Service.monitored_resources section.
+  core.String monitoredResource;
+
+  BillingDestination();
+
+  BillingDestination.fromJson(core.Map _json) {
+    if (_json.containsKey("metrics")) {
+      metrics = _json["metrics"];
+    }
+    if (_json.containsKey("monitoredResource")) {
+      monitoredResource = _json["monitoredResource"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (metrics != null) {
+      _json["metrics"] = metrics;
+    }
+    if (monitoredResource != null) {
+      _json["monitoredResource"] = monitoredResource;
+    }
+    return _json;
+  }
+}
+
+/// 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;
+  }
+}
+
+/// `Context` defines which contexts an API requests.
+///
+/// Example:
+///
+///     context:
+///       rules:
+///       - selector: "*"
+///         requested:
+///         - google.rpc.context.ProjectContext
+///         - google.rpc.context.OriginContext
+///
+/// The above specifies that all methods in the API request
+/// `google.rpc.context.ProjectContext` and
+/// `google.rpc.context.OriginContext`.
+///
+/// Available context types are defined in package
+/// `google.rpc.context`.
+///
+/// This also provides mechanism to whitelist any protobuf message extension
+/// that
+/// can be sent in grpc metadata using “x-goog-ext-<extension_id>-bin” and
+/// “x-goog-ext-<extension_id>-jspb” format. For example, list any service
+/// specific protobuf types that can appear in grpc metadata as follows in your
+/// yaml file:
+///
+/// Example:
+///
+///     context:
+///       rules:
+///        - selector: "google.example.library.v1.LibraryService.CreateBook"
+///          allowed_request_extensions:
+///          - google.foo.v1.NewExtension
+///          allowed_response_extensions:
+///          - google.foo.v1.NewExtension
+///
+/// You can also specify extension ID instead of fully qualified extension name
+/// here.
+class Context {
+  /// A list of RPC context rules that apply to individual API methods.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<ContextRule> rules;
+
+  Context();
+
+  Context.fromJson(core.Map _json) {
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new ContextRule.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 (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// A context rule provides information about the context for an individual API
+/// element.
+class ContextRule {
+  /// A list of full type names or extension IDs of extensions allowed in grpc
+  /// side channel from client to backend.
+  core.List<core.String> allowedRequestExtensions;
+
+  /// A list of full type names or extension IDs of extensions allowed in grpc
+  /// side channel from backend to client.
+  core.List<core.String> allowedResponseExtensions;
+
+  /// A list of full type names of provided contexts.
+  core.List<core.String> provided;
+
+  /// A list of full type names of requested contexts.
+  core.List<core.String> requested;
+
+  /// Selects the methods to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  ContextRule();
+
+  ContextRule.fromJson(core.Map _json) {
+    if (_json.containsKey("allowedRequestExtensions")) {
+      allowedRequestExtensions = _json["allowedRequestExtensions"];
+    }
+    if (_json.containsKey("allowedResponseExtensions")) {
+      allowedResponseExtensions = _json["allowedResponseExtensions"];
+    }
+    if (_json.containsKey("provided")) {
+      provided = _json["provided"];
+    }
+    if (_json.containsKey("requested")) {
+      requested = _json["requested"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (allowedRequestExtensions != null) {
+      _json["allowedRequestExtensions"] = allowedRequestExtensions;
+    }
+    if (allowedResponseExtensions != null) {
+      _json["allowedResponseExtensions"] = allowedResponseExtensions;
+    }
+    if (provided != null) {
+      _json["provided"] = provided;
+    }
+    if (requested != null) {
+      _json["requested"] = requested;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// Selects and configures the service controller used by the service.  The
+/// service controller handles features like abuse, quota, billing, logging,
+/// monitoring, etc.
+class Control {
+  /// The service control environment to use. If empty, no control plane
+  /// feature (like quota and billing) will be enabled.
+  core.String environment;
+
+  Control();
+
+  Control.fromJson(core.Map _json) {
+    if (_json.containsKey("environment")) {
+      environment = _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;
+    }
+    return _json;
+  }
+}
+
+/// Request to create a tenancy unit for a consumer of a service.
+class CreateTenancyUnitRequest {
+  /// Optional producer provided identifier of the tenancy unit
+  /// Must be no longer than 40 characters and preferably URI friendly
+  /// If it is not provided, UID for the tenancy unit will be auto generated
+  /// It must be unique across a service.
+  /// If the tenancy unit already exists for the service and consumer pair,
+  /// CreateTenancyUnit will return existing tenancy unit if provided identifier
+  /// is identical or empty, otherwise the call will fail.
+  core.String tenancyUnitId;
+
+  CreateTenancyUnitRequest();
+
+  CreateTenancyUnitRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("tenancyUnitId")) {
+      tenancyUnitId = _json["tenancyUnitId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (tenancyUnitId != null) {
+      _json["tenancyUnitId"] = tenancyUnitId;
+    }
+    return _json;
+  }
+}
+
+/// Configuration for a custom authentication provider.
+class CustomAuthRequirements {
+  /// A configuration string containing connection information for the
+  /// authentication provider, typically formatted as a SmartService string
+  /// (go/smartservice).
+  core.String provider;
+
+  CustomAuthRequirements();
+
+  CustomAuthRequirements.fromJson(core.Map _json) {
+    if (_json.containsKey("provider")) {
+      provider = _json["provider"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (provider != null) {
+      _json["provider"] = provider;
+    }
+    return _json;
+  }
+}
+
+/// Customize service error responses.  For example, list any service
+/// specific protobuf types that can appear in error detail lists of
+/// error responses.
+///
+/// Example:
+///
+///     custom_error:
+///       types:
+///       - google.foo.v1.CustomError
+///       - google.foo.v1.AnotherError
+class CustomError {
+  /// The list of custom error rules that apply to individual API messages.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<CustomErrorRule> rules;
+
+  /// The list of custom error detail types, e.g. 'google.foo.v1.CustomError'.
+  core.List<core.String> types;
+
+  CustomError();
+
+  CustomError.fromJson(core.Map _json) {
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new CustomErrorRule.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("types")) {
+      types = _json["types"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    if (types != null) {
+      _json["types"] = types;
+    }
+    return _json;
+  }
+}
+
+/// A custom error rule.
+class CustomErrorRule {
+  /// Mark this message as possible payload in error response.  Otherwise,
+  /// objects of this type will be filtered when they appear in error payload.
+  core.bool isErrorType;
+
+  /// Selects messages to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  CustomErrorRule();
+
+  CustomErrorRule.fromJson(core.Map _json) {
+    if (_json.containsKey("isErrorType")) {
+      isErrorType = _json["isErrorType"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (isErrorType != null) {
+      _json["isErrorType"] = isErrorType;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// A custom pattern is used for defining custom HTTP verb.
+class CustomHttpPattern {
+  /// The name of this custom HTTP verb.
+  core.String kind;
+
+  /// The path matched by this custom verb.
+  core.String path;
+
+  CustomHttpPattern();
+
+  CustomHttpPattern.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("path")) {
+      path = _json["path"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (path != null) {
+      _json["path"] = path;
+    }
+    return _json;
+  }
+}
+
+/// `Documentation` provides the information for describing a service.
+///
+/// Example:
+/// <pre><code>documentation:
+///   summary: >
+///     The Google Calendar API gives access
+///     to most calendar features.
+///   pages:
+///   - name: Overview
+///     content: &#40;== include google/foo/overview.md ==&#41;
+///   - name: Tutorial
+///     content: &#40;== include google/foo/tutorial.md ==&#41;
+///     subpages;
+///     - name: Java
+///       content: &#40;== include google/foo/tutorial_java.md ==&#41;
+///   rules:
+///   - selector: google.calendar.Calendar.Get
+///     description: >
+///       ...
+///   - selector: google.calendar.Calendar.Put
+///     description: >
+///       ...
+/// </code></pre>
+/// Documentation is provided in markdown syntax. In addition to
+/// standard markdown features, definition lists, tables and fenced
+/// code blocks are supported. Section headers can be provided and are
+/// interpreted relative to the section nesting of the context where
+/// a documentation fragment is embedded.
+///
+/// Documentation from the IDL is merged with documentation defined
+/// via the config at normalization time, where documentation provided
+/// by config rules overrides IDL provided.
+///
+/// A number of constructs specific to the API platform are supported
+/// in documentation text.
+///
+/// In order to reference a proto element, the following
+/// notation can be used:
+/// <pre><code>&#91;fully.qualified.proto.name]&#91;]</code></pre>
+/// To override the display text used for the link, this can be used:
+/// <pre><code>&#91;display text]&#91;fully.qualified.proto.name]</code></pre>
+/// Text can be excluded from doc using the following notation:
+/// <pre><code>&#40;-- internal comment --&#41;</code></pre>
+/// Comments can be made conditional using a visibility label. The below
+/// text will be only rendered if the `BETA` label is available:
+/// <pre><code>&#40;--BETA: comment for BETA users --&#41;</code></pre>
+/// A few directives are available in documentation. Note that
+/// directives must appear on a single line to be properly
+/// identified. The `include` directive includes a markdown file from
+/// an external source:
+/// <pre><code>&#40;== include path/to/file ==&#41;</code></pre>
+/// The `resource_for` directive marks a message to be the resource of
+/// a collection in REST view. If it is not specified, tools attempt
+/// to infer the resource from the operations in a collection:
+/// <pre><code>&#40;== resource_for v1.shelves.books ==&#41;</code></pre>
+/// The directive `suppress_warning` does not directly affect documentation
+/// and is documented together with service config validation.
+class Documentation {
+  /// The URL to the root of documentation.
+  core.String documentationRootUrl;
+
+  /// Declares a single overview page. For example:
+  /// <pre><code>documentation:
+  ///   summary: ...
+  ///   overview: &#40;== include overview.md ==&#41;
+  /// </code></pre>
+  /// This is a shortcut for the following declaration (using pages style):
+  /// <pre><code>documentation:
+  ///   summary: ...
+  ///   pages:
+  ///   - name: Overview
+  ///     content: &#40;== include overview.md ==&#41;
+  /// </code></pre>
+  /// Note: you cannot specify both `overview` field and `pages` field.
+  core.String overview;
+
+  /// The top level pages for the documentation set.
+  core.List<Page> pages;
+
+  /// A list of documentation rules that apply to individual API elements.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<DocumentationRule> rules;
+
+  /// A short summary of what the service does. Can only be provided by
+  /// plain text.
+  core.String summary;
+
+  Documentation();
+
+  Documentation.fromJson(core.Map _json) {
+    if (_json.containsKey("documentationRootUrl")) {
+      documentationRootUrl = _json["documentationRootUrl"];
+    }
+    if (_json.containsKey("overview")) {
+      overview = _json["overview"];
+    }
+    if (_json.containsKey("pages")) {
+      pages = _json["pages"].map((value) => new Page.fromJson(value)).toList();
+    }
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new DocumentationRule.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("summary")) {
+      summary = _json["summary"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (documentationRootUrl != null) {
+      _json["documentationRootUrl"] = documentationRootUrl;
+    }
+    if (overview != null) {
+      _json["overview"] = overview;
+    }
+    if (pages != null) {
+      _json["pages"] = pages.map((value) => (value).toJson()).toList();
+    }
+    if (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    if (summary != null) {
+      _json["summary"] = summary;
+    }
+    return _json;
+  }
+}
+
+/// A documentation rule provides information about individual API elements.
+class DocumentationRule {
+  /// Deprecation description of the selected element(s). It can be provided if
+  /// an
+  /// element is marked as `deprecated`.
+  core.String deprecationDescription;
+
+  /// Description of the selected API(s).
+  core.String description;
+
+  /// The selector is a comma-separated list of patterns. Each pattern is a
+  /// qualified name of the element which may end in "*", indicating a wildcard.
+  /// Wildcards are only allowed at the end and for a whole component of the
+  /// qualified name, i.e. "foo.*" is ok, but not "foo.b*" or "foo.*.bar". To
+  /// specify a default for all applicable elements, the whole pattern "*"
+  /// is used.
+  core.String selector;
+
+  DocumentationRule();
+
+  DocumentationRule.fromJson(core.Map _json) {
+    if (_json.containsKey("deprecationDescription")) {
+      deprecationDescription = _json["deprecationDescription"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (deprecationDescription != null) {
+      _json["deprecationDescription"] = deprecationDescription;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    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;
+  }
+}
+
+/// `Endpoint` describes a network endpoint that serves a set of APIs.
+/// A service may expose any number of endpoints, and all endpoints share the
+/// same service configuration, such as quota configuration and monitoring
+/// configuration.
+///
+/// Example service configuration:
+///
+///     name: library-example.googleapis.com
+///     endpoints:
+///       # Below entry makes 'google.example.library.v1.Library'
+///       # API be served from endpoint address library-example.googleapis.com.
+///       # It also allows HTTP OPTIONS calls to be passed to the backend, for
+///       # it to decide whether the subsequent cross-origin request is
+///       # allowed to proceed.
+///     - name: library-example.googleapis.com
+///       allow_cors: true
+class Endpoint {
+  /// DEPRECATED: This field is no longer supported. Instead of using aliases,
+  /// please specify multiple google.api.Endpoint for each of the intended
+  /// aliases.
+  ///
+  /// Additional names that this endpoint will be hosted on.
+  core.List<core.String> aliases;
+
+  /// Allowing
+  /// [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing), aka
+  /// cross-domain traffic, would allow the backends served from this endpoint
+  /// to
+  /// receive and respond to HTTP OPTIONS requests. The response will be used by
+  /// the browser to determine whether the subsequent cross-origin request is
+  /// allowed to proceed.
+  core.bool allowCors;
+
+  /// The list of features enabled on this endpoint.
+  core.List<core.String> features;
+
+  /// The canonical name of this endpoint.
+  core.String name;
+
+  /// The specification of an Internet routable address of API frontend that
+  /// will
+  /// handle requests to this [API
+  /// Endpoint](https://cloud.google.com/apis/design/glossary).
+  /// It should be either a valid IPv4 address or a fully-qualified domain name.
+  /// For example, "8.8.8.8" or "myservice.appspot.com".
+  core.String target;
+
+  Endpoint();
+
+  Endpoint.fromJson(core.Map _json) {
+    if (_json.containsKey("aliases")) {
+      aliases = _json["aliases"];
+    }
+    if (_json.containsKey("allowCors")) {
+      allowCors = _json["allowCors"];
+    }
+    if (_json.containsKey("features")) {
+      features = _json["features"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("target")) {
+      target = _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 (aliases != null) {
+      _json["aliases"] = aliases;
+    }
+    if (allowCors != null) {
+      _json["allowCors"] = allowCors;
+    }
+    if (features != null) {
+      _json["features"] = features;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (target != null) {
+      _json["target"] = target;
+    }
+    return _json;
+  }
+}
+
+/// Enum type definition.
+class Enum {
+  /// Enum value definitions.
+  core.List<EnumValue> enumvalue;
+
+  /// Enum type name.
+  core.String name;
+
+  /// Protocol buffer options.
+  core.List<Option> options;
+
+  /// The source context.
+  SourceContext sourceContext;
+
+  /// The source syntax.
+  /// Possible string values are:
+  /// - "SYNTAX_PROTO2" : Syntax `proto2`.
+  /// - "SYNTAX_PROTO3" : Syntax `proto3`.
+  core.String syntax;
+
+  Enum();
+
+  Enum.fromJson(core.Map _json) {
+    if (_json.containsKey("enumvalue")) {
+      enumvalue = _json["enumvalue"]
+          .map((value) => new EnumValue.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("options")) {
+      options =
+          _json["options"].map((value) => new Option.fromJson(value)).toList();
+    }
+    if (_json.containsKey("sourceContext")) {
+      sourceContext = new SourceContext.fromJson(_json["sourceContext"]);
+    }
+    if (_json.containsKey("syntax")) {
+      syntax = _json["syntax"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (enumvalue != null) {
+      _json["enumvalue"] = enumvalue.map((value) => (value).toJson()).toList();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (options != null) {
+      _json["options"] = options.map((value) => (value).toJson()).toList();
+    }
+    if (sourceContext != null) {
+      _json["sourceContext"] = (sourceContext).toJson();
+    }
+    if (syntax != null) {
+      _json["syntax"] = syntax;
+    }
+    return _json;
+  }
+}
+
+/// Enum value definition.
+class EnumValue {
+  /// Enum value name.
+  core.String name;
+
+  /// Enum value number.
+  core.int number;
+
+  /// Protocol buffer options.
+  core.List<Option> options;
+
+  EnumValue();
+
+  EnumValue.fromJson(core.Map _json) {
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("number")) {
+      number = _json["number"];
+    }
+    if (_json.containsKey("options")) {
+      options =
+          _json["options"].map((value) => new Option.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 (name != null) {
+      _json["name"] = name;
+    }
+    if (number != null) {
+      _json["number"] = number;
+    }
+    if (options != null) {
+      _json["options"] = options.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Experimental service configuration. These configuration options can
+/// only be used by whitelisted users.
+class Experimental {
+  /// Authorization configuration.
+  AuthorizationConfig authorization;
+
+  Experimental();
+
+  Experimental.fromJson(core.Map _json) {
+    if (_json.containsKey("authorization")) {
+      authorization = new AuthorizationConfig.fromJson(_json["authorization"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (authorization != null) {
+      _json["authorization"] = (authorization).toJson();
+    }
+    return _json;
+  }
+}
+
+/// A single field of a message type.
+class Field {
+  /// The field cardinality.
+  /// Possible string values are:
+  /// - "CARDINALITY_UNKNOWN" : For fields with unknown cardinality.
+  /// - "CARDINALITY_OPTIONAL" : For optional fields.
+  /// - "CARDINALITY_REQUIRED" : For required fields. Proto2 syntax only.
+  /// - "CARDINALITY_REPEATED" : For repeated fields.
+  core.String cardinality;
+
+  /// The string value of the default value of this field. Proto2 syntax only.
+  core.String defaultValue;
+
+  /// The field JSON name.
+  core.String jsonName;
+
+  /// The field type.
+  /// Possible string values are:
+  /// - "TYPE_UNKNOWN" : Field type unknown.
+  /// - "TYPE_DOUBLE" : Field type double.
+  /// - "TYPE_FLOAT" : Field type float.
+  /// - "TYPE_INT64" : Field type int64.
+  /// - "TYPE_UINT64" : Field type uint64.
+  /// - "TYPE_INT32" : Field type int32.
+  /// - "TYPE_FIXED64" : Field type fixed64.
+  /// - "TYPE_FIXED32" : Field type fixed32.
+  /// - "TYPE_BOOL" : Field type bool.
+  /// - "TYPE_STRING" : Field type string.
+  /// - "TYPE_GROUP" : Field type group. Proto2 syntax only, and deprecated.
+  /// - "TYPE_MESSAGE" : Field type message.
+  /// - "TYPE_BYTES" : Field type bytes.
+  /// - "TYPE_UINT32" : Field type uint32.
+  /// - "TYPE_ENUM" : Field type enum.
+  /// - "TYPE_SFIXED32" : Field type sfixed32.
+  /// - "TYPE_SFIXED64" : Field type sfixed64.
+  /// - "TYPE_SINT32" : Field type sint32.
+  /// - "TYPE_SINT64" : Field type sint64.
+  core.String kind;
+
+  /// The field name.
+  core.String name;
+
+  /// The field number.
+  core.int number;
+
+  /// The index of the field type in `Type.oneofs`, for message or enumeration
+  /// types. The first type has index 1; zero means the type is not in the list.
+  core.int oneofIndex;
+
+  /// The protocol buffer options.
+  core.List<Option> options;
+
+  /// Whether to use alternative packed wire representation.
+  core.bool packed;
+
+  /// The field type URL, without the scheme, for message or enumeration
+  /// types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
+  core.String typeUrl;
+
+  Field();
+
+  Field.fromJson(core.Map _json) {
+    if (_json.containsKey("cardinality")) {
+      cardinality = _json["cardinality"];
+    }
+    if (_json.containsKey("defaultValue")) {
+      defaultValue = _json["defaultValue"];
+    }
+    if (_json.containsKey("jsonName")) {
+      jsonName = _json["jsonName"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("number")) {
+      number = _json["number"];
+    }
+    if (_json.containsKey("oneofIndex")) {
+      oneofIndex = _json["oneofIndex"];
+    }
+    if (_json.containsKey("options")) {
+      options =
+          _json["options"].map((value) => new Option.fromJson(value)).toList();
+    }
+    if (_json.containsKey("packed")) {
+      packed = _json["packed"];
+    }
+    if (_json.containsKey("typeUrl")) {
+      typeUrl = _json["typeUrl"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (cardinality != null) {
+      _json["cardinality"] = cardinality;
+    }
+    if (defaultValue != null) {
+      _json["defaultValue"] = defaultValue;
+    }
+    if (jsonName != null) {
+      _json["jsonName"] = jsonName;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (number != null) {
+      _json["number"] = number;
+    }
+    if (oneofIndex != null) {
+      _json["oneofIndex"] = oneofIndex;
+    }
+    if (options != null) {
+      _json["options"] = options.map((value) => (value).toJson()).toList();
+    }
+    if (packed != null) {
+      _json["packed"] = packed;
+    }
+    if (typeUrl != null) {
+      _json["typeUrl"] = typeUrl;
+    }
+    return _json;
+  }
+}
+
+/// Defines the HTTP configuration for an API service. It contains a list of
+/// HttpRule, each specifying the mapping of an RPC method
+/// to one or more HTTP REST API methods.
+class Http {
+  /// When set to true, URL path parmeters will be fully URI-decoded except in
+  /// cases of single segment matches in reserved expansion, where "%2F" will be
+  /// left encoded.
+  ///
+  /// The default behavior is to not decode RFC 6570 reserved characters in
+  /// multi
+  /// segment matches.
+  core.bool fullyDecodeReservedExpansion;
+
+  /// A list of HTTP configuration rules that apply to individual API methods.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<HttpRule> rules;
+
+  Http();
+
+  Http.fromJson(core.Map _json) {
+    if (_json.containsKey("fullyDecodeReservedExpansion")) {
+      fullyDecodeReservedExpansion = _json["fullyDecodeReservedExpansion"];
+    }
+    if (_json.containsKey("rules")) {
+      rules =
+          _json["rules"].map((value) => new HttpRule.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 (fullyDecodeReservedExpansion != null) {
+      _json["fullyDecodeReservedExpansion"] = fullyDecodeReservedExpansion;
+    }
+    if (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// `HttpRule` defines the mapping of an RPC method to one or more HTTP
+/// REST API methods. The mapping specifies how different portions of the RPC
+/// request message are mapped to URL path, URL query parameters, and
+/// HTTP request body. The mapping is typically specified as an
+/// `google.api.http` annotation on the RPC method,
+/// see "google/api/annotations.proto" for details.
+///
+/// The mapping consists of a field specifying the path template and
+/// method kind.  The path template can refer to fields in the request
+/// message, as in the example below which describes a REST GET
+/// operation on a resource collection of messages:
+///
+///
+///     service Messaging {
+///       rpc GetMessage(GetMessageRequest) returns (Message) {
+/// option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}";
+///       }
+///     }
+///     message GetMessageRequest {
+///       message SubMessage {
+///         string subfield = 1;
+///       }
+///       string message_id = 1; // mapped to the URL
+///       SubMessage sub = 2;    // `sub.subfield` is url-mapped
+///     }
+///     message Message {
+///       string text = 1; // content of the resource
+///     }
+///
+/// The same http annotation can alternatively be expressed inside the
+/// `GRPC API Configuration` YAML file.
+///
+///     http:
+///       rules:
+///         - selector: <proto_package_name>.Messaging.GetMessage
+///           get: /v1/messages/{message_id}/{sub.subfield}
+///
+/// This definition enables an automatic, bidrectional mapping of HTTP
+/// JSON to RPC. Example:
+///
+/// HTTP | RPC
+/// -----|-----
+/// `GET /v1/messages/123456/foo`  | `GetMessage(message_id: "123456" sub:
+/// SubMessage(subfield: "foo"))`
+///
+/// In general, not only fields but also field paths can be referenced
+/// from a path pattern. Fields mapped to the path pattern cannot be
+/// repeated and must have a primitive (non-message) type.
+///
+/// Any fields in the request message which are not bound by the path
+/// pattern automatically become (optional) HTTP query
+/// parameters. Assume the following definition of the request message:
+///
+///
+///     service Messaging {
+///       rpc GetMessage(GetMessageRequest) returns (Message) {
+///         option (google.api.http).get = "/v1/messages/{message_id}";
+///       }
+///     }
+///     message GetMessageRequest {
+///       message SubMessage {
+///         string subfield = 1;
+///       }
+///       string message_id = 1; // mapped to the URL
+///       int64 revision = 2;    // becomes a parameter
+///       SubMessage sub = 3;    // `sub.subfield` becomes a parameter
+///     }
+///
+///
+/// This enables a HTTP JSON to RPC mapping as below:
+///
+/// HTTP | RPC
+/// -----|-----
+/// `GET /v1/messages/123456?revision=2&sub.subfield=foo` |
+/// `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield:
+/// "foo"))`
+///
+/// Note that fields which are mapped to HTTP parameters must have a
+/// primitive type or a repeated primitive type. Message types are not
+/// allowed. In the case of a repeated type, the parameter can be
+/// repeated in the URL, as in `...?param=A&param=B`.
+///
+/// For HTTP method kinds which allow a request body, the `body` field
+/// specifies the mapping. Consider a REST update method on the
+/// message resource collection:
+///
+///
+///     service Messaging {
+///       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {
+///         option (google.api.http) = {
+///           put: "/v1/messages/{message_id}"
+///           body: "message"
+///         };
+///       }
+///     }
+///     message UpdateMessageRequest {
+///       string message_id = 1; // mapped to the URL
+///       Message message = 2;   // mapped to the body
+///     }
+///
+///
+/// The following HTTP JSON to RPC mapping is enabled, where the
+/// representation of the JSON in the request body is determined by
+/// protos JSON encoding:
+///
+/// HTTP | RPC
+/// -----|-----
+/// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id:
+/// "123456" message { text: "Hi!" })`
+///
+/// The special name `*` can be used in the body mapping to define that
+/// every field not bound by the path template should be mapped to the
+/// request body.  This enables the following alternative definition of
+/// the update method:
+///
+///     service Messaging {
+///       rpc UpdateMessage(Message) returns (Message) {
+///         option (google.api.http) = {
+///           put: "/v1/messages/{message_id}"
+///           body: "*"
+///         };
+///       }
+///     }
+///     message Message {
+///       string message_id = 1;
+///       string text = 2;
+///     }
+///
+///
+/// The following HTTP JSON to RPC mapping is enabled:
+///
+/// HTTP | RPC
+/// -----|-----
+/// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id:
+/// "123456" text: "Hi!")`
+///
+/// Note that when using `*` in the body mapping, it is not possible to
+/// have HTTP parameters, as all fields not bound by the path end in
+/// the body. This makes this option more rarely used in practice of
+/// defining REST APIs. The common usage of `*` is in custom methods
+/// which don't use the URL at all for transferring data.
+///
+/// It is possible to define multiple HTTP methods for one RPC by using
+/// the `additional_bindings` option. Example:
+///
+///     service Messaging {
+///       rpc GetMessage(GetMessageRequest) returns (Message) {
+///         option (google.api.http) = {
+///           get: "/v1/messages/{message_id}"
+///           additional_bindings {
+///             get: "/v1/users/{user_id}/messages/{message_id}"
+///           }
+///         };
+///       }
+///     }
+///     message GetMessageRequest {
+///       string message_id = 1;
+///       string user_id = 2;
+///     }
+///
+///
+/// This enables the following two alternative HTTP JSON to RPC
+/// mappings:
+///
+/// HTTP | RPC
+/// -----|-----
+/// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")`
+/// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id:
+/// "123456")`
+///
+/// # Rules for HTTP mapping
+///
+/// The rules for mapping HTTP path, query parameters, and body fields
+/// to the request message are as follows:
+///
+/// 1. The `body` field specifies either `*` or a field path, or is
+///    omitted. If omitted, it indicates there is no HTTP request body.
+/// 2. Leaf fields (recursive expansion of nested messages in the
+///    request) can be classified into three types:
+///     (a) Matched in the URL template.
+///     (b) Covered by body (if body is `*`, everything except (a) fields;
+///         else everything under the body field)
+///     (c) All other fields.
+/// 3. URL query parameters found in the HTTP request are mapped to (c) fields.
+/// 4. Any body sent with an HTTP request can contain only (b) fields.
+///
+/// The syntax of the path template is as follows:
+///
+///     Template = "/" Segments [ Verb ] ;
+///     Segments = Segment { "/" Segment } ;
+///     Segment  = "*" | "**" | LITERAL | Variable ;
+///     Variable = "{" FieldPath [ "=" Segments ] "}" ;
+///     FieldPath = IDENT { "." IDENT } ;
+///     Verb     = ":" LITERAL ;
+///
+/// The syntax `*` matches a single path segment. The syntax `**` matches zero
+/// or more path segments, which must be the last part of the path except the
+/// `Verb`. The syntax `LITERAL` matches literal text in the path.
+///
+/// The syntax `Variable` matches part of the URL path as specified by its
+/// template. A variable template must not contain other variables. If a
+/// variable
+/// matches a single path segment, its template may be omitted, e.g. `{var}`
+/// is equivalent to `{var=*}`.
+///
+/// If a variable contains exactly one path segment, such as `"{var}"` or
+/// `"{var=*}"`, when such a variable is expanded into a URL path, all
+/// characters
+/// except `[-_.~0-9a-zA-Z]` are percent-encoded. Such variables show up in the
+/// Discovery Document as `{var}`.
+///
+/// If a variable contains one or more path segments, such as `"{var=foo / * }"`
+/// or `"{var=**}"`, when such a variable is expanded into a URL path, all
+/// characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. Such variables
+/// show up in the Discovery Document as `{+var}`.
+///
+/// NOTE: While the single segment variable matches the semantics of
+/// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2
+/// Simple String Expansion, the multi segment variable **does not** match
+/// RFC 6570 Reserved Expansion. The reason is that the Reserved Expansion
+/// does not expand special characters like `?` and `#`, which would lead
+/// to invalid URLs.
+///
+/// NOTE: the field paths in variables and in the `body` must not refer to
+/// repeated fields or map fields.
+class HttpRule {
+  /// Additional HTTP bindings for the selector. Nested bindings must
+  /// not contain an `additional_bindings` field themselves (that is,
+  /// the nesting may only be one level deep).
+  core.List<HttpRule> additionalBindings;
+
+  /// Specifies the permission(s) required for an API element for the overall
+  /// API request to succeed. It is typically used to mark request message
+  /// fields
+  /// that contain the name of the resource and indicates the permissions that
+  /// will be checked on that resource.
+  core.List<AuthorizationRule> authorizations;
+
+  /// The name of the request field whose value is mapped to the HTTP body, or
+  /// `*` for mapping all fields not captured by the path pattern to the HTTP
+  /// body. NOTE: the referred field must not be a repeated field and must be
+  /// present at the top-level of request message type.
+  core.String body;
+
+  /// The custom pattern is used for specifying an HTTP method that is not
+  /// included in the `pattern` field, such as HEAD, or "*" to leave the
+  /// HTTP method unspecified for this rule. The wild-card rule is useful
+  /// for services that provide content to Web (HTML) clients.
+  CustomHttpPattern custom;
+
+  /// Used for deleting a resource.
+  core.String delete;
+
+  /// Used for listing and getting information about resources.
+  core.String get;
+
+  /// Use this only for Scotty Requests. Do not use this for bytestream methods.
+  /// For media support, add instead [][google.bytestream.RestByteStream] as an
+  /// API to your configuration.
+  MediaDownload mediaDownload;
+
+  /// Use this only for Scotty Requests. Do not use this for media support using
+  /// Bytestream, add instead
+  /// [][google.bytestream.RestByteStream] as an API to your
+  /// configuration for Bytestream methods.
+  MediaUpload mediaUpload;
+
+  /// Used for updating a resource.
+  core.String patch;
+
+  /// Used for creating a resource.
+  core.String post;
+
+  /// Used for updating a resource.
+  core.String put;
+
+  /// DO NOT USE. This is an experimental field.
+  ///
+  /// Optional. The REST collection name is by default derived from the URL
+  /// pattern. If specified, this field overrides the default collection name.
+  /// Example:
+  ///
+  ///     rpc AddressesAggregatedList(AddressesAggregatedListRequest)
+  ///         returns (AddressesAggregatedListResponse) {
+  ///       option (google.api.http) = {
+  ///         get: "/v1/projects/{project_id}/aggregated/addresses"
+  ///         rest_collection: "projects.addresses"
+  ///       };
+  ///     }
+  ///
+  /// This method has the automatically derived collection name
+  /// "projects.aggregated". Because, semantically, this rpc is actually an
+  /// operation on the "projects.addresses" collection, the `rest_collection`
+  /// field is configured to override the derived collection name.
+  core.String restCollection;
+
+  /// DO NOT USE. This is an experimental field.
+  ///
+  /// Optional. The rest method name is by default derived from the URL
+  /// pattern. If specified, this field overrides the default method name.
+  /// Example:
+  ///
+  ///     rpc CreateResource(CreateResourceRequest)
+  ///         returns (CreateResourceResponse) {
+  ///       option (google.api.http) = {
+  ///         post: "/v1/resources",
+  ///         body: "resource",
+  ///         rest_method_name: "insert"
+  ///       };
+  ///     }
+  ///
+  /// This method has the automatically derived rest method name
+  /// "create", but for backwards compatibility with apiary, it is specified as
+  /// insert.
+  core.String restMethodName;
+
+  /// Selects methods to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  HttpRule();
+
+  HttpRule.fromJson(core.Map _json) {
+    if (_json.containsKey("additionalBindings")) {
+      additionalBindings = _json["additionalBindings"]
+          .map((value) => new HttpRule.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("authorizations")) {
+      authorizations = _json["authorizations"]
+          .map((value) => new AuthorizationRule.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("body")) {
+      body = _json["body"];
+    }
+    if (_json.containsKey("custom")) {
+      custom = new CustomHttpPattern.fromJson(_json["custom"]);
+    }
+    if (_json.containsKey("delete")) {
+      delete = _json["delete"];
+    }
+    if (_json.containsKey("get")) {
+      get = _json["get"];
+    }
+    if (_json.containsKey("mediaDownload")) {
+      mediaDownload = new MediaDownload.fromJson(_json["mediaDownload"]);
+    }
+    if (_json.containsKey("mediaUpload")) {
+      mediaUpload = new MediaUpload.fromJson(_json["mediaUpload"]);
+    }
+    if (_json.containsKey("patch")) {
+      patch = _json["patch"];
+    }
+    if (_json.containsKey("post")) {
+      post = _json["post"];
+    }
+    if (_json.containsKey("put")) {
+      put = _json["put"];
+    }
+    if (_json.containsKey("restCollection")) {
+      restCollection = _json["restCollection"];
+    }
+    if (_json.containsKey("restMethodName")) {
+      restMethodName = _json["restMethodName"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (additionalBindings != null) {
+      _json["additionalBindings"] =
+          additionalBindings.map((value) => (value).toJson()).toList();
+    }
+    if (authorizations != null) {
+      _json["authorizations"] =
+          authorizations.map((value) => (value).toJson()).toList();
+    }
+    if (body != null) {
+      _json["body"] = body;
+    }
+    if (custom != null) {
+      _json["custom"] = (custom).toJson();
+    }
+    if (delete != null) {
+      _json["delete"] = delete;
+    }
+    if (get != null) {
+      _json["get"] = get;
+    }
+    if (mediaDownload != null) {
+      _json["mediaDownload"] = (mediaDownload).toJson();
+    }
+    if (mediaUpload != null) {
+      _json["mediaUpload"] = (mediaUpload).toJson();
+    }
+    if (patch != null) {
+      _json["patch"] = patch;
+    }
+    if (post != null) {
+      _json["post"] = post;
+    }
+    if (put != null) {
+      _json["put"] = put;
+    }
+    if (restCollection != null) {
+      _json["restCollection"] = restCollection;
+    }
+    if (restMethodName != null) {
+      _json["restMethodName"] = restMethodName;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// A description of a label.
+class LabelDescriptor {
+  /// A human-readable description for the label.
+  core.String description;
+
+  /// The label key.
+  core.String key;
+
+  /// The type of data that can be assigned to the label.
+  /// Possible string values are:
+  /// - "STRING" : A variable-length string. This is the default.
+  /// - "BOOL" : Boolean; true or false.
+  /// - "INT64" : A 64-bit signed integer.
+  core.String valueType;
+
+  LabelDescriptor();
+
+  LabelDescriptor.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("key")) {
+      key = _json["key"];
+    }
+    if (_json.containsKey("valueType")) {
+      valueType = _json["valueType"];
+    }
+  }
+
+  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 (key != null) {
+      _json["key"] = key;
+    }
+    if (valueType != null) {
+      _json["valueType"] = valueType;
+    }
+    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;
+  }
+}
+
+/// Response for the list request.
+class ListTenancyUnitsResponse {
+  /// Pagination token for large results.
+  core.String nextPageToken;
+
+  /// Tenancy Units matching the request.
+  core.List<TenancyUnit> tenancyUnits;
+
+  ListTenancyUnitsResponse();
+
+  ListTenancyUnitsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("tenancyUnits")) {
+      tenancyUnits = _json["tenancyUnits"]
+          .map((value) => new TenancyUnit.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 (tenancyUnits != null) {
+      _json["tenancyUnits"] =
+          tenancyUnits.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// A description of a log type. Example in YAML format:
+///
+///     - name: library.googleapis.com/activity_history
+///       description: The history of borrowing and returning library items.
+///       display_name: Activity
+///       labels:
+///       - key: /customer_id
+///         description: Identifier of a library customer
+class LogDescriptor {
+  /// A human-readable description of this log. This information appears in
+  /// the documentation and can contain details.
+  core.String description;
+
+  /// The human-readable name for this log. This information appears on
+  /// the user interface and should be concise.
+  core.String displayName;
+
+  /// The set of labels that are available to describe a specific log entry.
+  /// Runtime requests that contain labels not specified here are
+  /// considered invalid.
+  core.List<LabelDescriptor> labels;
+
+  /// The name of the log. It must be less than 512 characters long and can
+  /// include the following characters: upper- and lower-case alphanumeric
+  /// characters [A-Za-z0-9], and punctuation characters including
+  /// slash, underscore, hyphen, period [/_-.].
+  core.String name;
+
+  LogDescriptor();
+
+  LogDescriptor.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("displayName")) {
+      displayName = _json["displayName"];
+    }
+    if (_json.containsKey("labels")) {
+      labels = _json["labels"]
+          .map((value) => new LabelDescriptor.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 (description != null) {
+      _json["description"] = description;
+    }
+    if (displayName != null) {
+      _json["displayName"] = displayName;
+    }
+    if (labels != null) {
+      _json["labels"] = labels.map((value) => (value).toJson()).toList();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Logging configuration of the service.
+///
+/// The following example shows how to configure logs to be sent to the
+/// producer and consumer projects. In the example, the `activity_history`
+/// log is sent to both the producer and consumer projects, whereas the
+/// `purchase_history` log is only sent to the producer project.
+///
+///     monitored_resources:
+///     - type: library.googleapis.com/branch
+///       labels:
+///       - key: /city
+///         description: The city where the library branch is located in.
+///       - key: /name
+///         description: The name of the branch.
+///     logs:
+///     - name: activity_history
+///       labels:
+///       - key: /customer_id
+///     - name: purchase_history
+///     logging:
+///       producer_destinations:
+///       - monitored_resource: library.googleapis.com/branch
+///         logs:
+///         - activity_history
+///         - purchase_history
+///       consumer_destinations:
+///       - monitored_resource: library.googleapis.com/branch
+///         logs:
+///         - activity_history
+class Logging {
+  /// Logging configurations for sending logs to the consumer project.
+  /// There can be multiple consumer destinations, each one must have a
+  /// different monitored resource type. A log can be used in at most
+  /// one consumer destination.
+  core.List<LoggingDestination> consumerDestinations;
+
+  /// Logging configurations for sending logs to the producer project.
+  /// There can be multiple producer destinations, each one must have a
+  /// different monitored resource type. A log can be used in at most
+  /// one producer destination.
+  core.List<LoggingDestination> producerDestinations;
+
+  Logging();
+
+  Logging.fromJson(core.Map _json) {
+    if (_json.containsKey("consumerDestinations")) {
+      consumerDestinations = _json["consumerDestinations"]
+          .map((value) => new LoggingDestination.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("producerDestinations")) {
+      producerDestinations = _json["producerDestinations"]
+          .map((value) => new LoggingDestination.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 (consumerDestinations != null) {
+      _json["consumerDestinations"] =
+          consumerDestinations.map((value) => (value).toJson()).toList();
+    }
+    if (producerDestinations != null) {
+      _json["producerDestinations"] =
+          producerDestinations.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Configuration of a specific logging destination (the producer project
+/// or the consumer project).
+class LoggingDestination {
+  /// Names of the logs to be sent to this destination. Each name must
+  /// be defined in the Service.logs section. If the log name is
+  /// not a domain scoped name, it will be automatically prefixed with
+  /// the service name followed by "/".
+  core.List<core.String> logs;
+
+  /// The monitored resource type. The type must be defined in the
+  /// Service.monitored_resources section.
+  core.String monitoredResource;
+
+  LoggingDestination();
+
+  LoggingDestination.fromJson(core.Map _json) {
+    if (_json.containsKey("logs")) {
+      logs = _json["logs"];
+    }
+    if (_json.containsKey("monitoredResource")) {
+      monitoredResource = _json["monitoredResource"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (logs != null) {
+      _json["logs"] = logs;
+    }
+    if (monitoredResource != null) {
+      _json["monitoredResource"] = monitoredResource;
+    }
+    return _json;
+  }
+}
+
+/// Defines the Media configuration for a service in case of a download.
+/// Use this only for Scotty Requests. Do not use this for media support using
+/// Bytestream, add instead [][google.bytestream.RestByteStream] as an API to
+/// your configuration for Bytestream methods.
+class MediaDownload {
+  /// A boolean that determines whether a notification for the completion of a
+  /// download should be sent to the backend.
+  core.bool completeNotification;
+
+  /// DO NOT USE FIELDS BELOW THIS LINE UNTIL THIS WARNING IS REMOVED.
+  ///
+  /// Specify name of the download service if one is used for download.
+  core.String downloadService;
+
+  /// Name of the Scotty dropzone to use for the current API.
+  core.String dropzone;
+
+  /// Whether download is enabled.
+  core.bool enabled;
+
+  /// Optional maximum acceptable size for direct download.
+  /// The size is specified in bytes.
+  core.String maxDirectDownloadSize;
+
+  /// A boolean that determines if direct download from ESF should be used for
+  /// download of this media.
+  core.bool useDirectDownload;
+
+  MediaDownload();
+
+  MediaDownload.fromJson(core.Map _json) {
+    if (_json.containsKey("completeNotification")) {
+      completeNotification = _json["completeNotification"];
+    }
+    if (_json.containsKey("downloadService")) {
+      downloadService = _json["downloadService"];
+    }
+    if (_json.containsKey("dropzone")) {
+      dropzone = _json["dropzone"];
+    }
+    if (_json.containsKey("enabled")) {
+      enabled = _json["enabled"];
+    }
+    if (_json.containsKey("maxDirectDownloadSize")) {
+      maxDirectDownloadSize = _json["maxDirectDownloadSize"];
+    }
+    if (_json.containsKey("useDirectDownload")) {
+      useDirectDownload = _json["useDirectDownload"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (completeNotification != null) {
+      _json["completeNotification"] = completeNotification;
+    }
+    if (downloadService != null) {
+      _json["downloadService"] = downloadService;
+    }
+    if (dropzone != null) {
+      _json["dropzone"] = dropzone;
+    }
+    if (enabled != null) {
+      _json["enabled"] = enabled;
+    }
+    if (maxDirectDownloadSize != null) {
+      _json["maxDirectDownloadSize"] = maxDirectDownloadSize;
+    }
+    if (useDirectDownload != null) {
+      _json["useDirectDownload"] = useDirectDownload;
+    }
+    return _json;
+  }
+}
+
+/// Defines the Media configuration for a service in case of an upload.
+/// Use this only for Scotty Requests. Do not use this for media support using
+/// Bytestream, add instead [][google.bytestream.RestByteStream] as an API to
+/// your configuration for Bytestream methods.
+class MediaUpload {
+  /// A boolean that determines whether a notification for the completion of an
+  /// upload should be sent to the backend. These notifications will not be seen
+  /// by the client and will not consume quota.
+  core.bool completeNotification;
+
+  /// Name of the Scotty dropzone to use for the current API.
+  core.String dropzone;
+
+  /// Whether upload is enabled.
+  core.bool enabled;
+
+  /// Optional maximum acceptable size for an upload.
+  /// The size is specified in bytes.
+  core.String maxSize;
+
+  /// An array of mimetype patterns. Esf will only accept uploads that match one
+  /// of the given patterns.
+  core.List<core.String> mimeTypes;
+
+  /// Whether to receive a notification for progress changes of media upload.
+  core.bool progressNotification;
+
+  /// Whether to receive a notification on the start of media upload.
+  core.bool startNotification;
+
+  /// DO NOT USE FIELDS BELOW THIS LINE UNTIL THIS WARNING IS REMOVED.
+  ///
+  /// Specify name of the upload service if one is used for upload.
+  core.String uploadService;
+
+  MediaUpload();
+
+  MediaUpload.fromJson(core.Map _json) {
+    if (_json.containsKey("completeNotification")) {
+      completeNotification = _json["completeNotification"];
+    }
+    if (_json.containsKey("dropzone")) {
+      dropzone = _json["dropzone"];
+    }
+    if (_json.containsKey("enabled")) {
+      enabled = _json["enabled"];
+    }
+    if (_json.containsKey("maxSize")) {
+      maxSize = _json["maxSize"];
+    }
+    if (_json.containsKey("mimeTypes")) {
+      mimeTypes = _json["mimeTypes"];
+    }
+    if (_json.containsKey("progressNotification")) {
+      progressNotification = _json["progressNotification"];
+    }
+    if (_json.containsKey("startNotification")) {
+      startNotification = _json["startNotification"];
+    }
+    if (_json.containsKey("uploadService")) {
+      uploadService = _json["uploadService"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (completeNotification != null) {
+      _json["completeNotification"] = completeNotification;
+    }
+    if (dropzone != null) {
+      _json["dropzone"] = dropzone;
+    }
+    if (enabled != null) {
+      _json["enabled"] = enabled;
+    }
+    if (maxSize != null) {
+      _json["maxSize"] = maxSize;
+    }
+    if (mimeTypes != null) {
+      _json["mimeTypes"] = mimeTypes;
+    }
+    if (progressNotification != null) {
+      _json["progressNotification"] = progressNotification;
+    }
+    if (startNotification != null) {
+      _json["startNotification"] = startNotification;
+    }
+    if (uploadService != null) {
+      _json["uploadService"] = uploadService;
+    }
+    return _json;
+  }
+}
+
+/// Method represents a method of an API interface.
+class Method {
+  /// The simple name of this method.
+  core.String name;
+
+  /// Any metadata attached to the method.
+  core.List<Option> options;
+
+  /// If true, the request is streamed.
+  core.bool requestStreaming;
+
+  /// A URL of the input message type.
+  core.String requestTypeUrl;
+
+  /// If true, the response is streamed.
+  core.bool responseStreaming;
+
+  /// The URL of the output message type.
+  core.String responseTypeUrl;
+
+  /// The source syntax of this method.
+  /// Possible string values are:
+  /// - "SYNTAX_PROTO2" : Syntax `proto2`.
+  /// - "SYNTAX_PROTO3" : Syntax `proto3`.
+  core.String syntax;
+
+  Method();
+
+  Method.fromJson(core.Map _json) {
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("options")) {
+      options =
+          _json["options"].map((value) => new Option.fromJson(value)).toList();
+    }
+    if (_json.containsKey("requestStreaming")) {
+      requestStreaming = _json["requestStreaming"];
+    }
+    if (_json.containsKey("requestTypeUrl")) {
+      requestTypeUrl = _json["requestTypeUrl"];
+    }
+    if (_json.containsKey("responseStreaming")) {
+      responseStreaming = _json["responseStreaming"];
+    }
+    if (_json.containsKey("responseTypeUrl")) {
+      responseTypeUrl = _json["responseTypeUrl"];
+    }
+    if (_json.containsKey("syntax")) {
+      syntax = _json["syntax"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (options != null) {
+      _json["options"] = options.map((value) => (value).toJson()).toList();
+    }
+    if (requestStreaming != null) {
+      _json["requestStreaming"] = requestStreaming;
+    }
+    if (requestTypeUrl != null) {
+      _json["requestTypeUrl"] = requestTypeUrl;
+    }
+    if (responseStreaming != null) {
+      _json["responseStreaming"] = responseStreaming;
+    }
+    if (responseTypeUrl != null) {
+      _json["responseTypeUrl"] = responseTypeUrl;
+    }
+    if (syntax != null) {
+      _json["syntax"] = syntax;
+    }
+    return _json;
+  }
+}
+
+/// Defines a metric type and its schema. Once a metric descriptor is created,
+/// deleting or altering it stops data collection and makes the metric type's
+/// existing data unusable.
+class MetricDescriptor {
+  /// A detailed description of the metric, which can be used in documentation.
+  core.String description;
+
+  /// A concise name for the metric, which can be displayed in user interfaces.
+  /// Use sentence case without an ending period, for example "Request count".
+  /// This field is optional but it is recommended to be set for any metrics
+  /// associated with user-visible concepts, such as Quota.
+  core.String displayName;
+
+  /// The set of labels that can be used to describe a specific
+  /// instance of this metric type. For example, the
+  /// `appengine.googleapis.com/http/server/response_latencies` metric
+  /// type has a label for the HTTP response code, `response_code`, so
+  /// you can look at latencies for successful responses or just
+  /// for responses that failed.
+  core.List<LabelDescriptor> labels;
+
+  /// Whether the metric records instantaneous values, changes to a value, etc.
+  /// Some combinations of `metric_kind` and `value_type` might not be
+  /// supported.
+  /// Possible string values are:
+  /// - "METRIC_KIND_UNSPECIFIED" : Do not use this default value.
+  /// - "GAUGE" : An instantaneous measurement of a value.
+  /// - "DELTA" : The change in a value during a time interval.
+  /// - "CUMULATIVE" : A value accumulated over a time interval.  Cumulative
+  /// measurements in a time series should have the same start time
+  /// and increasing end times, until an event resets the cumulative
+  /// value to zero and sets a new start time for the following
+  /// points.
+  core.String metricKind;
+
+  /// The resource name of the metric descriptor.
+  core.String name;
+
+  /// The metric type, including its DNS name prefix. The type is not
+  /// URL-encoded.  All user-defined custom metric types have the DNS name
+  /// `custom.googleapis.com`.  Metric types should use a natural hierarchical
+  /// grouping. For example:
+  ///
+  ///     "custom.googleapis.com/invoice/paid/amount"
+  ///     "appengine.googleapis.com/http/server/response_latencies"
+  core.String type;
+
+  /// The unit in which the metric value is reported. It is only applicable
+  /// if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The
+  /// supported units are a subset of [The Unified Code for Units of
+  /// Measure](http://unitsofmeasure.org/ucum.html) standard:
+  ///
+  /// **Basic units (UNIT)**
+  ///
+  /// * `bit`   bit
+  /// * `By`    byte
+  /// * `s`     second
+  /// * `min`   minute
+  /// * `h`     hour
+  /// * `d`     day
+  ///
+  /// **Prefixes (PREFIX)**
+  ///
+  /// * `k`     kilo    (10**3)
+  /// * `M`     mega    (10**6)
+  /// * `G`     giga    (10**9)
+  /// * `T`     tera    (10**12)
+  /// * `P`     peta    (10**15)
+  /// * `E`     exa     (10**18)
+  /// * `Z`     zetta   (10**21)
+  /// * `Y`     yotta   (10**24)
+  /// * `m`     milli   (10**-3)
+  /// * `u`     micro   (10**-6)
+  /// * `n`     nano    (10**-9)
+  /// * `p`     pico    (10**-12)
+  /// * `f`     femto   (10**-15)
+  /// * `a`     atto    (10**-18)
+  /// * `z`     zepto   (10**-21)
+  /// * `y`     yocto   (10**-24)
+  /// * `Ki`    kibi    (2**10)
+  /// * `Mi`    mebi    (2**20)
+  /// * `Gi`    gibi    (2**30)
+  /// * `Ti`    tebi    (2**40)
+  ///
+  /// **Grammar**
+  ///
+  /// The grammar also includes these connectors:
+  ///
+  /// * `/`    division (as an infix operator, e.g. `1/s`).
+  /// * `.`    multiplication (as an infix operator, e.g. `GBy.d`)
+  ///
+  /// The grammar for a unit is as follows:
+  ///
+  ///     Expression = Component { "." Component } { "/" Component } ;
+  ///
+  ///     Component = ( [ PREFIX ] UNIT | "%" ) [ Annotation ]
+  ///               | Annotation
+  ///               | "1"
+  ///               ;
+  ///
+  ///     Annotation = "{" NAME "}" ;
+  ///
+  /// Notes:
+  ///
+  /// * `Annotation` is just a comment if it follows a `UNIT` and is
+  ///    equivalent to `1` if it is used alone. For examples,
+  ///    `{requests}/s == 1/s`, `By{transmitted}/s == By/s`.
+  /// * `NAME` is a sequence of non-blank printable ASCII characters not
+  ///    containing '{' or '}'.
+  /// * `1` represents dimensionless value 1, such as in `1/s`.
+  /// * `%` represents dimensionless value 1/100, and annotates values giving
+  ///    a percentage.
+  core.String unit;
+
+  /// Whether the measurement is an integer, a floating-point number, etc.
+  /// Some combinations of `metric_kind` and `value_type` might not be
+  /// supported.
+  /// Possible string values are:
+  /// - "VALUE_TYPE_UNSPECIFIED" : Do not use this default value.
+  /// - "BOOL" : The value is a boolean.
+  /// This value type can be used only if the metric kind is `GAUGE`.
+  /// - "INT64" : The value is a signed 64-bit integer.
+  /// - "DOUBLE" : The value is a double precision floating point number.
+  /// - "STRING" : The value is a text string.
+  /// This value type can be used only if the metric kind is `GAUGE`.
+  /// - "DISTRIBUTION" : The value is a `Distribution`.
+  /// - "MONEY" : The value is money.
+  core.String valueType;
+
+  MetricDescriptor();
+
+  MetricDescriptor.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("displayName")) {
+      displayName = _json["displayName"];
+    }
+    if (_json.containsKey("labels")) {
+      labels = _json["labels"]
+          .map((value) => new LabelDescriptor.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("metricKind")) {
+      metricKind = _json["metricKind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    if (_json.containsKey("unit")) {
+      unit = _json["unit"];
+    }
+    if (_json.containsKey("valueType")) {
+      valueType = _json["valueType"];
+    }
+  }
+
+  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 (displayName != null) {
+      _json["displayName"] = displayName;
+    }
+    if (labels != null) {
+      _json["labels"] = labels.map((value) => (value).toJson()).toList();
+    }
+    if (metricKind != null) {
+      _json["metricKind"] = metricKind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (unit != null) {
+      _json["unit"] = unit;
+    }
+    if (valueType != null) {
+      _json["valueType"] = valueType;
+    }
+    return _json;
+  }
+}
+
+/// Bind API methods to metrics. Binding a method to a metric causes that
+/// metric's configured quota behaviors to apply to the method call.
+class MetricRule {
+  /// Metrics to update when the selected methods are called, and the associated
+  /// cost applied to each metric.
+  ///
+  /// The key of the map is the metric name, and the values are the amount
+  /// increased for the metric against which the quota limits are defined.
+  /// The value must not be negative.
+  core.Map<core.String, core.String> metricCosts;
+
+  /// Selects the methods to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  MetricRule();
+
+  MetricRule.fromJson(core.Map _json) {
+    if (_json.containsKey("metricCosts")) {
+      metricCosts = _json["metricCosts"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (metricCosts != null) {
+      _json["metricCosts"] = metricCosts;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// Declares an API Interface to be included in this interface. The including
+/// interface must redeclare all the methods from the included interface, but
+/// documentation and options are inherited as follows:
+///
+/// - If after comment and whitespace stripping, the documentation
+///   string of the redeclared method is empty, it will be inherited
+///   from the original method.
+///
+/// - Each annotation belonging to the service config (http,
+///   visibility) which is not set in the redeclared method will be
+///   inherited.
+///
+/// - If an http annotation is inherited, the path pattern will be
+///   modified as follows. Any version prefix will be replaced by the
+///   version of the including interface plus the root path if
+///   specified.
+///
+/// Example of a simple mixin:
+///
+///     package google.acl.v1;
+///     service AccessControl {
+///       // Get the underlying ACL object.
+///       rpc GetAcl(GetAclRequest) returns (Acl) {
+///         option (google.api.http).get = "/v1/{resource=**}:getAcl";
+///       }
+///     }
+///
+///     package google.storage.v2;
+///     service Storage {
+///       //       rpc GetAcl(GetAclRequest) returns (Acl);
+///
+///       // Get a data record.
+///       rpc GetData(GetDataRequest) returns (Data) {
+///         option (google.api.http).get = "/v2/{resource=**}";
+///       }
+///     }
+///
+/// Example of a mixin configuration:
+///
+///     apis:
+///     - name: google.storage.v2.Storage
+///       mixins:
+///       - name: google.acl.v1.AccessControl
+///
+/// The mixin construct implies that all methods in `AccessControl` are
+/// also declared with same name and request/response types in
+/// `Storage`. A documentation generator or annotation processor will
+/// see the effective `Storage.GetAcl` method after inherting
+/// documentation and annotations as follows:
+///
+///     service Storage {
+///       // Get the underlying ACL object.
+///       rpc GetAcl(GetAclRequest) returns (Acl) {
+///         option (google.api.http).get = "/v2/{resource=**}:getAcl";
+///       }
+///       ...
+///     }
+///
+/// Note how the version in the path pattern changed from `v1` to `v2`.
+///
+/// If the `root` field in the mixin is specified, it should be a
+/// relative path under which inherited HTTP paths are placed. Example:
+///
+///     apis:
+///     - name: google.storage.v2.Storage
+///       mixins:
+///       - name: google.acl.v1.AccessControl
+///         root: acls
+///
+/// This implies the following inherited HTTP annotation:
+///
+///     service Storage {
+///       // Get the underlying ACL object.
+///       rpc GetAcl(GetAclRequest) returns (Acl) {
+///         option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
+///       }
+///       ...
+///     }
+class Mixin {
+  /// The fully qualified name of the interface which is included.
+  core.String name;
+
+  /// If non-empty specifies a path under which inherited HTTP paths
+  /// are rooted.
+  core.String root;
+
+  Mixin();
+
+  Mixin.fromJson(core.Map _json) {
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("root")) {
+      root = _json["root"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (root != null) {
+      _json["root"] = root;
+    }
+    return _json;
+  }
+}
+
+/// An object that describes the schema of a MonitoredResource object using a
+/// type name and a set of labels.  For example, the monitored resource
+/// descriptor for Google Compute Engine VM instances has a type of
+/// `"gce_instance"` and specifies the use of the labels `"instance_id"` and
+/// `"zone"` to identify particular VM instances.
+///
+/// Different APIs can support different monitored resource types. APIs
+/// generally
+/// provide a `list` method that returns the monitored resource descriptors used
+/// by the API.
+class MonitoredResourceDescriptor {
+  /// Optional. A detailed description of the monitored resource type that might
+  /// be used in documentation.
+  core.String description;
+
+  /// Optional. A concise name for the monitored resource type that might be
+  /// displayed in user interfaces. It should be a Title Cased Noun Phrase,
+  /// without any article or other determiners. For example,
+  /// `"Google Cloud SQL Database"`.
+  core.String displayName;
+
+  /// Required. A set of labels used to describe instances of this monitored
+  /// resource type. For example, an individual Google Cloud SQL database is
+  /// identified by values for the labels `"database_id"` and `"zone"`.
+  core.List<LabelDescriptor> labels;
+
+  /// Optional. The resource name of the monitored resource descriptor:
+  /// `"projects/{project_id}/monitoredResourceDescriptors/{type}"` where
+  /// {type} is the value of the `type` field in this object and
+  /// {project_id} is a project ID that provides API-specific context for
+  /// accessing the type.  APIs that do not use project information can use the
+  /// resource name format `"monitoredResourceDescriptors/{type}"`.
+  core.String name;
+
+  /// Required. The monitored resource type. For example, the type
+  /// `"cloudsql_database"` represents databases in Google Cloud SQL.
+  /// The maximum length of this value is 256 characters.
+  core.String type;
+
+  MonitoredResourceDescriptor();
+
+  MonitoredResourceDescriptor.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("displayName")) {
+      displayName = _json["displayName"];
+    }
+    if (_json.containsKey("labels")) {
+      labels = _json["labels"]
+          .map((value) => new LabelDescriptor.fromJson(value))
+          .toList();
+    }
+    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 (description != null) {
+      _json["description"] = description;
+    }
+    if (displayName != null) {
+      _json["displayName"] = displayName;
+    }
+    if (labels != null) {
+      _json["labels"] = labels.map((value) => (value).toJson()).toList();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+/// Monitoring configuration of the service.
+///
+/// The example below shows how to configure monitored resources and metrics
+/// for monitoring. In the example, a monitored resource and two metrics are
+/// defined. The `library.googleapis.com/book/returned_count` metric is sent
+/// to both producer and consumer projects, whereas the
+/// `library.googleapis.com/book/overdue_count` metric is only sent to the
+/// consumer project.
+///
+///     monitored_resources:
+///     - type: library.googleapis.com/branch
+///       labels:
+///       - key: /city
+///         description: The city where the library branch is located in.
+///       - key: /name
+///         description: The name of the branch.
+///     metrics:
+///     - name: library.googleapis.com/book/returned_count
+///       metric_kind: DELTA
+///       value_type: INT64
+///       labels:
+///       - key: /customer_id
+///     - name: library.googleapis.com/book/overdue_count
+///       metric_kind: GAUGE
+///       value_type: INT64
+///       labels:
+///       - key: /customer_id
+///     monitoring:
+///       producer_destinations:
+///       - monitored_resource: library.googleapis.com/branch
+///         metrics:
+///         - library.googleapis.com/book/returned_count
+///       consumer_destinations:
+///       - monitored_resource: library.googleapis.com/branch
+///         metrics:
+///         - library.googleapis.com/book/returned_count
+///         - library.googleapis.com/book/overdue_count
+class Monitoring {
+  /// Monitoring configurations for sending metrics to the consumer project.
+  /// There can be multiple consumer destinations, each one must have a
+  /// different monitored resource type. A metric can be used in at most
+  /// one consumer destination.
+  core.List<MonitoringDestination> consumerDestinations;
+
+  /// Monitoring configurations for sending metrics to the producer project.
+  /// There can be multiple producer destinations, each one must have a
+  /// different monitored resource type. A metric can be used in at most
+  /// one producer destination.
+  core.List<MonitoringDestination> producerDestinations;
+
+  Monitoring();
+
+  Monitoring.fromJson(core.Map _json) {
+    if (_json.containsKey("consumerDestinations")) {
+      consumerDestinations = _json["consumerDestinations"]
+          .map((value) => new MonitoringDestination.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("producerDestinations")) {
+      producerDestinations = _json["producerDestinations"]
+          .map((value) => new MonitoringDestination.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 (consumerDestinations != null) {
+      _json["consumerDestinations"] =
+          consumerDestinations.map((value) => (value).toJson()).toList();
+    }
+    if (producerDestinations != null) {
+      _json["producerDestinations"] =
+          producerDestinations.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Configuration of a specific monitoring destination (the producer project
+/// or the consumer project).
+class MonitoringDestination {
+  /// Names of the metrics to report to this monitoring destination.
+  /// Each name must be defined in Service.metrics section.
+  core.List<core.String> metrics;
+
+  /// The monitored resource type. The type must be defined in
+  /// Service.monitored_resources section.
+  core.String monitoredResource;
+
+  MonitoringDestination();
+
+  MonitoringDestination.fromJson(core.Map _json) {
+    if (_json.containsKey("metrics")) {
+      metrics = _json["metrics"];
+    }
+    if (_json.containsKey("monitoredResource")) {
+      monitoredResource = _json["monitoredResource"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (metrics != null) {
+      _json["metrics"] = metrics;
+    }
+    if (monitoredResource != null) {
+      _json["monitoredResource"] = monitoredResource;
+    }
+    return _json;
+  }
+}
+
+/// OAuth scopes are a way to define data and permissions on data. For example,
+/// there are scopes defined for "Read-only access to Google Calendar" and
+/// "Access to Cloud Platform". Users can consent to a scope for an application,
+/// giving it permission to access that data on their behalf.
+///
+/// OAuth scope specifications should be fairly coarse grained; a user will need
+/// to see and understand the text description of what your scope means.
+///
+/// In most cases: use one or at most two OAuth scopes for an entire family of
+/// products. If your product has multiple APIs, you should probably be sharing
+/// the OAuth scope across all of those APIs.
+///
+/// When you need finer grained OAuth consent screens: talk with your product
+/// management about how developers will use them in practice.
+///
+/// Please note that even though each of the canonical scopes is enough for a
+/// request to be accepted and passed to the backend, a request can still fail
+/// due to the backend requiring additional scopes or permissions.
+class OAuthRequirements {
+  /// The list of publicly documented OAuth scopes that are allowed access. An
+  /// OAuth token containing any of these scopes will be accepted.
+  ///
+  /// Example:
+  ///
+  ///      canonical_scopes: https://www.googleapis.com/auth/calendar,
+  ///                        https://www.googleapis.com/auth/calendar.read
+  core.String canonicalScopes;
+
+  OAuthRequirements();
+
+  OAuthRequirements.fromJson(core.Map _json) {
+    if (_json.containsKey("canonicalScopes")) {
+      canonicalScopes = _json["canonicalScopes"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (canonicalScopes != null) {
+      _json["canonicalScopes"] = canonicalScopes;
+    }
+    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 protocol buffer option, which can be attached to a message, field,
+/// enumeration, etc.
+class Option {
+  /// The option's name. For protobuf built-in options (options defined in
+  /// descriptor.proto), this is the short name. For example, `"map_entry"`.
+  /// For custom options, it should be the fully-qualified name. For example,
+  /// `"google.api.http"`.
+  core.String name;
+
+  /// The option's value packed in an Any message. If the value is a primitive,
+  /// the corresponding wrapper type defined in google/protobuf/wrappers.proto
+  /// should be used. If the value is an enum, it should be stored as an int32
+  /// value using the google.protobuf.Int32Value type.
+  ///
+  /// 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> value;
+
+  Option();
+
+  Option.fromJson(core.Map _json) {
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    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 (name != null) {
+      _json["name"] = name;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+/// Represents a documentation page. A page can contain subpages to represent
+/// nested documentation set structure.
+class Page {
+  /// The Markdown content of the page. You can use <code>&#40;== include {path}
+  /// ==&#41;</code>
+  /// to include content from a Markdown file.
+  core.String content;
+
+  /// The name of the page. It will be used as an identity of the page to
+  /// generate URI of the page, text of the link to this page in navigation,
+  /// etc. The full page name (start from the root page name to this page
+  /// concatenated with `.`) can be used as reference to the page in your
+  /// documentation. For example:
+  /// <pre><code>pages:
+  /// - name: Tutorial
+  ///   content: &#40;== include tutorial.md ==&#41;
+  ///   subpages:
+  ///   - name: Java
+  ///     content: &#40;== include tutorial_java.md ==&#41;
+  /// </code></pre>
+  /// You can reference `Java` page using Markdown reference link syntax:
+  /// `Java`.
+  core.String name;
+
+  /// Subpages of this page. The order of subpages specified here will be
+  /// honored in the generated docset.
+  core.List<Page> subpages;
+
+  Page();
+
+  Page.fromJson(core.Map _json) {
+    if (_json.containsKey("content")) {
+      content = _json["content"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("subpages")) {
+      subpages =
+          _json["subpages"].map((value) => new Page.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 (content != null) {
+      _json["content"] = content;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (subpages != null) {
+      _json["subpages"] = subpages.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Translates to IAM Policy bindings (without auditing at this level)
+class PolicyBinding {
+  /// Uses the same format as in IAM policy.
+  /// `member` must include both prefix and id. E.g., `user:{emailId}`,
+  /// `serviceAccount:{emailId}`, `group:{emailId}`.
+  core.List<core.String> members;
+
+  /// Role. (https://cloud.google.com/iam/docs/understanding-roles)
+  /// For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
+  core.String role;
+
+  PolicyBinding();
+
+  PolicyBinding.fromJson(core.Map _json) {
+    if (_json.containsKey("members")) {
+      members = _json["members"];
+    }
+    if (_json.containsKey("role")) {
+      role = _json["role"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (members != null) {
+      _json["members"] = members;
+    }
+    if (role != null) {
+      _json["role"] = role;
+    }
+    return _json;
+  }
+}
+
+/// Quota configuration helps to achieve fairness and budgeting in service
+/// usage.
+///
+/// The quota configuration works this way:
+/// - The service configuration defines a set of metrics.
+/// - For API calls, the quota.metric_rules maps methods to metrics with
+///   corresponding costs.
+/// - The quota.limits defines limits on the metrics, which will be used for
+///   quota checks at runtime.
+///
+/// An example quota configuration in yaml format:
+///
+///    quota:
+///
+///      - name: apiWriteQpsPerProject
+///        metric: library.googleapis.com/write_calls
+///        unit: "1/min/{project}"  # rate limit for consumer projects
+///        values:
+///          STANDARD: 10000
+///
+///
+///      # The metric rules bind all methods to the read_calls metric,
+///      # except for the UpdateBook and DeleteBook methods. These two methods
+///      # are mapped to the write_calls metric, with the UpdateBook method
+///      # consuming at twice rate as the DeleteBook method.
+///      metric_rules:
+///      - selector: "*"
+///        metric_costs:
+///          library.googleapis.com/read_calls: 1
+///      - selector: google.example.library.v1.LibraryService.UpdateBook
+///        metric_costs:
+///          library.googleapis.com/write_calls: 2
+///      - selector: google.example.library.v1.LibraryService.DeleteBook
+///        metric_costs:
+///          library.googleapis.com/write_calls: 1
+///
+///  Corresponding Metric definition:
+///
+///      metrics:
+///      - name: library.googleapis.com/read_calls
+///        display_name: Read requests
+///        metric_kind: DELTA
+///        value_type: INT64
+///
+///      - name: library.googleapis.com/write_calls
+///        display_name: Write requests
+///        metric_kind: DELTA
+///        value_type: INT64
+class Quota {
+  /// List of `QuotaLimit` definitions for the service.
+  core.List<QuotaLimit> limits;
+
+  /// List of `MetricRule` definitions, each one mapping a selected method to
+  /// one
+  /// or more metrics.
+  core.List<MetricRule> metricRules;
+
+  Quota();
+
+  Quota.fromJson(core.Map _json) {
+    if (_json.containsKey("limits")) {
+      limits = _json["limits"]
+          .map((value) => new QuotaLimit.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("metricRules")) {
+      metricRules = _json["metricRules"]
+          .map((value) => new MetricRule.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 (limits != null) {
+      _json["limits"] = limits.map((value) => (value).toJson()).toList();
+    }
+    if (metricRules != null) {
+      _json["metricRules"] =
+          metricRules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// `QuotaLimit` defines a specific limit that applies over a specified duration
+/// for a limit type. There can be at most one limit for a duration and limit
+/// type combination defined within a `QuotaGroup`.
+class QuotaLimit {
+  /// Default number of tokens that can be consumed during the specified
+  /// duration. This is the number of tokens assigned when a client
+  /// application developer activates the service for his/her project.
+  ///
+  /// Specifying a value of 0 will block all requests. This can be used if you
+  /// are provisioning quota to selected consumers and blocking others.
+  /// Similarly, a value of -1 will indicate an unlimited quota. No other
+  /// negative values are allowed.
+  ///
+  /// Used by group-based quotas only.
+  core.String defaultLimit;
+
+  /// Optional. User-visible, extended description for this quota limit.
+  /// Should be used only when more context is needed to understand this limit
+  /// than provided by the limit's display name (see: `display_name`).
+  core.String description;
+
+  /// User-visible display name for this limit.
+  /// Optional. If not set, the UI will provide a default display name based on
+  /// the quota configuration. This field can be used to override the default
+  /// display name generated from the configuration.
+  core.String displayName;
+
+  /// Duration of this limit in textual notation. Example: "100s", "24h", "1d".
+  /// For duration longer than a day, only multiple of days is supported. We
+  /// support only "100s" and "1d" for now. Additional support will be added in
+  /// the future. "0" indicates indefinite duration.
+  ///
+  /// Used by group-based quotas only.
+  core.String duration;
+
+  /// Free tier value displayed in the Developers Console for this limit.
+  /// The free tier is the number of tokens that will be subtracted from the
+  /// billed amount when billing is enabled.
+  /// This field can only be set on a limit with duration "1d", in a billable
+  /// group; it is invalid on any other limit. If this field is not set, it
+  /// defaults to 0, indicating that there is no free tier for this service.
+  ///
+  /// Used by group-based quotas only.
+  core.String freeTier;
+
+  /// Maximum number of tokens that can be consumed during the specified
+  /// duration. Client application developers can override the default limit up
+  /// to this maximum. If specified, this value cannot be set to a value less
+  /// than the default limit. If not specified, it is set to the default limit.
+  ///
+  /// To allow clients to apply overrides with no upper bound, set this to -1,
+  /// indicating unlimited maximum quota.
+  ///
+  /// Used by group-based quotas only.
+  core.String maxLimit;
+
+  /// The name of the metric this quota limit applies to. The quota limits with
+  /// the same metric will be checked together during runtime. The metric must
+  /// be
+  /// defined within the service config.
+  core.String metric;
+
+  /// Name of the quota limit.
+  ///
+  /// The name must be provided, and it must be unique within the service. The
+  /// name can only include alphanumeric characters as well as '-'.
+  ///
+  /// The maximum length of the limit name is 64 characters.
+  core.String name;
+
+  /// Specify the unit of the quota limit. It uses the same syntax as
+  /// Metric.unit. The supported unit kinds are determined by the quota
+  /// backend system.
+  ///
+  /// Here are some examples:
+  /// * "1/min/{project}" for quota per minute per project.
+  ///
+  /// Note: the order of unit components is insignificant.
+  /// The "1" at the beginning is required to follow the metric unit syntax.
+  core.String unit;
+
+  /// Tiered limit values. You must specify this as a key:value pair, with an
+  /// integer value that is the maximum number of requests allowed for the
+  /// specified unit. Currently only STANDARD is supported.
+  core.Map<core.String, core.String> values;
+
+  QuotaLimit();
+
+  QuotaLimit.fromJson(core.Map _json) {
+    if (_json.containsKey("defaultLimit")) {
+      defaultLimit = _json["defaultLimit"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("displayName")) {
+      displayName = _json["displayName"];
+    }
+    if (_json.containsKey("duration")) {
+      duration = _json["duration"];
+    }
+    if (_json.containsKey("freeTier")) {
+      freeTier = _json["freeTier"];
+    }
+    if (_json.containsKey("maxLimit")) {
+      maxLimit = _json["maxLimit"];
+    }
+    if (_json.containsKey("metric")) {
+      metric = _json["metric"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("unit")) {
+      unit = _json["unit"];
+    }
+    if (_json.containsKey("values")) {
+      values = _json["values"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (defaultLimit != null) {
+      _json["defaultLimit"] = defaultLimit;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (displayName != null) {
+      _json["displayName"] = displayName;
+    }
+    if (duration != null) {
+      _json["duration"] = duration;
+    }
+    if (freeTier != null) {
+      _json["freeTier"] = freeTier;
+    }
+    if (maxLimit != null) {
+      _json["maxLimit"] = maxLimit;
+    }
+    if (metric != null) {
+      _json["metric"] = metric;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (unit != null) {
+      _json["unit"] = unit;
+    }
+    if (values != null) {
+      _json["values"] = values;
+    }
+    return _json;
+  }
+}
+
+/// Request message to remove tenant project resource from the tenancy unit.
+class RemoveTenantProjectRequest {
+  /// Tag of the resource within the tenancy unit.
+  core.String tag;
+
+  RemoveTenantProjectRequest();
+
+  RemoveTenantProjectRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("tag")) {
+      tag = _json["tag"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (tag != null) {
+      _json["tag"] = tag;
+    }
+    return _json;
+  }
+}
+
+/// Response for the search query.
+class SearchTenancyUnitsResponse {
+  /// Pagination token for large results.
+  core.String nextPageToken;
+
+  /// Tenancy Units matching the request.
+  core.List<TenancyUnit> tenancyUnits;
+
+  SearchTenancyUnitsResponse();
+
+  SearchTenancyUnitsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("tenancyUnits")) {
+      tenancyUnits = _json["tenancyUnits"]
+          .map((value) => new TenancyUnit.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 (tenancyUnits != null) {
+      _json["tenancyUnits"] =
+          tenancyUnits.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// `Service` is the root object of Google service configuration schema. It
+/// describes basic information about a service, such as the name and the
+/// title, and delegates other aspects to sub-sections. Each sub-section is
+/// either a proto message or a repeated proto message that configures a
+/// specific aspect, such as auth. See each proto message definition for
+/// details.
+///
+/// Example:
+///
+///     type: google.api.Service
+///     config_version: 3
+///     name: calendar.googleapis.com
+///     title: Google Calendar API
+///     apis:
+///     - name: google.calendar.v3.Calendar
+///     authentication:
+///       providers:
+///       - id: google_calendar_auth
+///         jwks_uri: https://www.googleapis.com/oauth2/v1/certs
+///         issuer: https://securetoken.google.com
+///       rules:
+///       - selector: "*"
+///         requirements:
+///           provider_id: google_calendar_auth
+class Service {
+  /// A list of API interfaces exported by this service. Only the `name` field
+  /// of the google.protobuf.Api needs to be provided by the configuration
+  /// author, as the remaining fields will be derived from the IDL during the
+  /// normalization process. It is an error to specify an API interface here
+  /// which cannot be resolved against the associated IDL files.
+  core.List<Api> apis;
+
+  /// Auth configuration.
+  Authentication authentication;
+
+  /// API backend configuration.
+  Backend backend;
+
+  /// Billing configuration.
+  Billing billing;
+
+  /// The semantic version of the service configuration. The config version
+  /// affects the interpretation of the service configuration. For example,
+  /// certain features are enabled by default for certain config versions.
+  /// The latest config version is `3`.
+  core.int configVersion;
+
+  /// Context configuration.
+  Context context;
+
+  /// Configuration for the service control plane.
+  Control control;
+
+  /// Custom error configuration.
+  CustomError customError;
+
+  /// Additional API documentation.
+  Documentation documentation;
+
+  /// Configuration for network endpoints.  If this is empty, then an endpoint
+  /// with the same name as the service is automatically generated to service
+  /// all
+  /// defined APIs.
+  core.List<Endpoint> endpoints;
+
+  /// A list of all enum types included in this API service.  Enums
+  /// referenced directly or indirectly by the `apis` are automatically
+  /// included.  Enums which are not referenced but shall be included
+  /// should be listed here by name. Example:
+  ///
+  ///     enums:
+  ///     - name: google.someapi.v1.SomeEnum
+  core.List<Enum> enums;
+
+  /// Experimental configuration.
+  Experimental experimental;
+
+  /// HTTP configuration.
+  Http http;
+
+  /// A unique ID for a specific instance of this message, typically assigned
+  /// by the client for tracking purpose. If empty, the server may choose to
+  /// generate one instead.
+  core.String id;
+
+  /// Logging configuration.
+  Logging logging;
+
+  /// Defines the logs used by this service.
+  core.List<LogDescriptor> logs;
+
+  /// Defines the metrics used by this service.
+  core.List<MetricDescriptor> metrics;
+
+  /// Defines the monitored resources used by this service. This is required
+  /// by the Service.monitoring and Service.logging configurations.
+  core.List<MonitoredResourceDescriptor> monitoredResources;
+
+  /// Monitoring configuration.
+  Monitoring monitoring;
+
+  /// The DNS address at which this service is available,
+  /// e.g. `calendar.googleapis.com`.
+  core.String name;
+
+  /// The Google project that owns this service.
+  core.String producerProjectId;
+
+  /// Quota configuration.
+  Quota quota;
+
+  /// Output only. The source information for this configuration if available.
+  SourceInfo sourceInfo;
+
+  /// System parameter configuration.
+  SystemParameters systemParameters;
+
+  /// A list of all proto message types included in this API service.
+  /// It serves similar purpose as [google.api.Service.types], except that
+  /// these types are not needed by user-defined APIs. Therefore, they will not
+  /// show up in the generated discovery doc. This field should only be used
+  /// to define system APIs in ESF.
+  core.List<Type> systemTypes;
+
+  /// The product title for this service.
+  core.String title;
+
+  /// A list of all proto message types included in this API service.
+  /// Types referenced directly or indirectly by the `apis` are
+  /// automatically included.  Messages which are not referenced but
+  /// shall be included, such as types used by the `google.protobuf.Any` type,
+  /// should be listed here by name. Example:
+  ///
+  ///     types:
+  ///     - name: google.protobuf.Int32
+  core.List<Type> types;
+
+  /// Configuration controlling usage of this service.
+  Usage usage;
+
+  /// API visibility configuration.
+  Visibility visibility;
+
+  Service();
+
+  Service.fromJson(core.Map _json) {
+    if (_json.containsKey("apis")) {
+      apis = _json["apis"].map((value) => new Api.fromJson(value)).toList();
+    }
+    if (_json.containsKey("authentication")) {
+      authentication = new Authentication.fromJson(_json["authentication"]);
+    }
+    if (_json.containsKey("backend")) {
+      backend = new Backend.fromJson(_json["backend"]);
+    }
+    if (_json.containsKey("billing")) {
+      billing = new Billing.fromJson(_json["billing"]);
+    }
+    if (_json.containsKey("configVersion")) {
+      configVersion = _json["configVersion"];
+    }
+    if (_json.containsKey("context")) {
+      context = new Context.fromJson(_json["context"]);
+    }
+    if (_json.containsKey("control")) {
+      control = new Control.fromJson(_json["control"]);
+    }
+    if (_json.containsKey("customError")) {
+      customError = new CustomError.fromJson(_json["customError"]);
+    }
+    if (_json.containsKey("documentation")) {
+      documentation = new Documentation.fromJson(_json["documentation"]);
+    }
+    if (_json.containsKey("endpoints")) {
+      endpoints = _json["endpoints"]
+          .map((value) => new Endpoint.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("enums")) {
+      enums = _json["enums"].map((value) => new Enum.fromJson(value)).toList();
+    }
+    if (_json.containsKey("experimental")) {
+      experimental = new Experimental.fromJson(_json["experimental"]);
+    }
+    if (_json.containsKey("http")) {
+      http = new Http.fromJson(_json["http"]);
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("logging")) {
+      logging = new Logging.fromJson(_json["logging"]);
+    }
+    if (_json.containsKey("logs")) {
+      logs = _json["logs"]
+          .map((value) => new LogDescriptor.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("metrics")) {
+      metrics = _json["metrics"]
+          .map((value) => new MetricDescriptor.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("monitoredResources")) {
+      monitoredResources = _json["monitoredResources"]
+          .map((value) => new MonitoredResourceDescriptor.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("monitoring")) {
+      monitoring = new Monitoring.fromJson(_json["monitoring"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("producerProjectId")) {
+      producerProjectId = _json["producerProjectId"];
+    }
+    if (_json.containsKey("quota")) {
+      quota = new Quota.fromJson(_json["quota"]);
+    }
+    if (_json.containsKey("sourceInfo")) {
+      sourceInfo = new SourceInfo.fromJson(_json["sourceInfo"]);
+    }
+    if (_json.containsKey("systemParameters")) {
+      systemParameters =
+          new SystemParameters.fromJson(_json["systemParameters"]);
+    }
+    if (_json.containsKey("systemTypes")) {
+      systemTypes = _json["systemTypes"]
+          .map((value) => new Type.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("title")) {
+      title = _json["title"];
+    }
+    if (_json.containsKey("types")) {
+      types = _json["types"].map((value) => new Type.fromJson(value)).toList();
+    }
+    if (_json.containsKey("usage")) {
+      usage = new Usage.fromJson(_json["usage"]);
+    }
+    if (_json.containsKey("visibility")) {
+      visibility = new Visibility.fromJson(_json["visibility"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (apis != null) {
+      _json["apis"] = apis.map((value) => (value).toJson()).toList();
+    }
+    if (authentication != null) {
+      _json["authentication"] = (authentication).toJson();
+    }
+    if (backend != null) {
+      _json["backend"] = (backend).toJson();
+    }
+    if (billing != null) {
+      _json["billing"] = (billing).toJson();
+    }
+    if (configVersion != null) {
+      _json["configVersion"] = configVersion;
+    }
+    if (context != null) {
+      _json["context"] = (context).toJson();
+    }
+    if (control != null) {
+      _json["control"] = (control).toJson();
+    }
+    if (customError != null) {
+      _json["customError"] = (customError).toJson();
+    }
+    if (documentation != null) {
+      _json["documentation"] = (documentation).toJson();
+    }
+    if (endpoints != null) {
+      _json["endpoints"] = endpoints.map((value) => (value).toJson()).toList();
+    }
+    if (enums != null) {
+      _json["enums"] = enums.map((value) => (value).toJson()).toList();
+    }
+    if (experimental != null) {
+      _json["experimental"] = (experimental).toJson();
+    }
+    if (http != null) {
+      _json["http"] = (http).toJson();
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (logging != null) {
+      _json["logging"] = (logging).toJson();
+    }
+    if (logs != null) {
+      _json["logs"] = logs.map((value) => (value).toJson()).toList();
+    }
+    if (metrics != null) {
+      _json["metrics"] = metrics.map((value) => (value).toJson()).toList();
+    }
+    if (monitoredResources != null) {
+      _json["monitoredResources"] =
+          monitoredResources.map((value) => (value).toJson()).toList();
+    }
+    if (monitoring != null) {
+      _json["monitoring"] = (monitoring).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (producerProjectId != null) {
+      _json["producerProjectId"] = producerProjectId;
+    }
+    if (quota != null) {
+      _json["quota"] = (quota).toJson();
+    }
+    if (sourceInfo != null) {
+      _json["sourceInfo"] = (sourceInfo).toJson();
+    }
+    if (systemParameters != null) {
+      _json["systemParameters"] = (systemParameters).toJson();
+    }
+    if (systemTypes != null) {
+      _json["systemTypes"] =
+          systemTypes.map((value) => (value).toJson()).toList();
+    }
+    if (title != null) {
+      _json["title"] = title;
+    }
+    if (types != null) {
+      _json["types"] = types.map((value) => (value).toJson()).toList();
+    }
+    if (usage != null) {
+      _json["usage"] = (usage).toJson();
+    }
+    if (visibility != null) {
+      _json["visibility"] = (visibility).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Describes service account configuration for the tenant project.
+class ServiceAccountConfig {
+  /// ID of the IAM service account to be created in tenant project.
+  /// The email format of the service account will be
+  /// "<account-id>@<tenant-project-id>.iam.gserviceaccount.com".
+  /// This account id has to be unique within tenant project and producers
+  /// have to guarantee it.
+  core.String accountId;
+
+  /// Roles for the service account above on tenant project.
+  core.List<core.String> tenantProjectRoles;
+
+  ServiceAccountConfig();
+
+  ServiceAccountConfig.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("tenantProjectRoles")) {
+      tenantProjectRoles = _json["tenantProjectRoles"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (tenantProjectRoles != null) {
+      _json["tenantProjectRoles"] = tenantProjectRoles;
+    }
+    return _json;
+  }
+}
+
+/// `SourceContext` represents information about the source of a
+/// protobuf element, like the file in which it is defined.
+class SourceContext {
+  /// The path-qualified name of the .proto file that contained the associated
+  /// protobuf element.  For example: `"google/protobuf/source_context.proto"`.
+  core.String fileName;
+
+  SourceContext();
+
+  SourceContext.fromJson(core.Map _json) {
+    if (_json.containsKey("fileName")) {
+      fileName = _json["fileName"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (fileName != null) {
+      _json["fileName"] = fileName;
+    }
+    return _json;
+  }
+}
+
+/// Source information used to create a Service Config
+class SourceInfo {
+  /// All files used during config generation.
+  ///
+  /// 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>> sourceFiles;
+
+  SourceInfo();
+
+  SourceInfo.fromJson(core.Map _json) {
+    if (_json.containsKey("sourceFiles")) {
+      sourceFiles = _json["sourceFiles"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (sourceFiles != null) {
+      _json["sourceFiles"] = sourceFiles;
+    }
+    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;
+  }
+}
+
+/// Define a parameter's name and location. The parameter may be passed as
+/// either
+/// an HTTP header or a URL query parameter, and if both are passed the behavior
+/// is implementation-dependent.
+class SystemParameter {
+  /// Define the HTTP header name to use for the parameter. It is case
+  /// insensitive.
+  core.String httpHeader;
+
+  /// Define the name of the parameter, such as "api_key" . It is case
+  /// sensitive.
+  core.String name;
+
+  /// Define the URL query parameter name to use for the parameter. It is case
+  /// sensitive.
+  core.String urlQueryParameter;
+
+  SystemParameter();
+
+  SystemParameter.fromJson(core.Map _json) {
+    if (_json.containsKey("httpHeader")) {
+      httpHeader = _json["httpHeader"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("urlQueryParameter")) {
+      urlQueryParameter = _json["urlQueryParameter"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (httpHeader != null) {
+      _json["httpHeader"] = httpHeader;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (urlQueryParameter != null) {
+      _json["urlQueryParameter"] = urlQueryParameter;
+    }
+    return _json;
+  }
+}
+
+/// Define a system parameter rule mapping system parameter definitions to
+/// methods.
+class SystemParameterRule {
+  /// Define parameters. Multiple names may be defined for a parameter.
+  /// For a given method call, only one of them should be used. If multiple
+  /// names are used the behavior is implementation-dependent.
+  /// If none of the specified names are present the behavior is
+  /// parameter-dependent.
+  core.List<SystemParameter> parameters;
+
+  /// Selects the methods to which this rule applies. Use '*' to indicate all
+  /// methods in all APIs.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  SystemParameterRule();
+
+  SystemParameterRule.fromJson(core.Map _json) {
+    if (_json.containsKey("parameters")) {
+      parameters = _json["parameters"]
+          .map((value) => new SystemParameter.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (parameters != null) {
+      _json["parameters"] =
+          parameters.map((value) => (value).toJson()).toList();
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// ### System parameter configuration
+///
+/// A system parameter is a special kind of parameter defined by the API
+/// system, not by an individual API. It is typically mapped to an HTTP header
+/// and/or a URL query parameter. This configuration specifies which methods
+/// change the names of the system parameters.
+class SystemParameters {
+  /// Define system parameters.
+  ///
+  /// The parameters defined here will override the default parameters
+  /// implemented by the system. If this field is missing from the service
+  /// config, default system parameters will be used. Default system parameters
+  /// and names is implementation-dependent.
+  ///
+  /// Example: define api key for all methods
+  ///
+  ///     system_parameters
+  ///       rules:
+  ///         - selector: "*"
+  ///           parameters:
+  ///             - name: api_key
+  ///               url_query_parameter: api_key
+  ///
+  ///
+  /// Example: define 2 api key names for a specific method.
+  ///
+  ///     system_parameters
+  ///       rules:
+  ///         - selector: "/ListShelves"
+  ///           parameters:
+  ///             - name: api_key
+  ///               http_header: Api-Key1
+  ///             - name: api_key
+  ///               http_header: Api-Key2
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<SystemParameterRule> rules;
+
+  SystemParameters();
+
+  SystemParameters.fromJson(core.Map _json) {
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new SystemParameterRule.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 (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Representation of a tenancy unit.
+class TenancyUnit {
+  /// @OutputOnly Cloud resource One Platform Name of the consumer of this
+  /// service. For example 'projects/123456'.
+  core.String consumer;
+
+  /// @OutputOnly The time this tenancy unit was created.
+  core.String createTime;
+
+  /// Globally unique identifier of this tenancy unit
+  /// "services/{service}/{collection id}/{resource id}/tenancyUnits/{unit}"
+  core.String name;
+
+  /// @OutputOnly Google Cloud API name of the service owning this tenancy unit.
+  /// For example 'serviceconsumermanagement.googleapis.com'.
+  core.String service;
+
+  /// Resources constituting the tenancy unit.
+  /// There can be at most 512 tenant resources in a tenancy units.
+  core.List<TenantResource> tenantResources;
+
+  TenancyUnit();
+
+  TenancyUnit.fromJson(core.Map _json) {
+    if (_json.containsKey("consumer")) {
+      consumer = _json["consumer"];
+    }
+    if (_json.containsKey("createTime")) {
+      createTime = _json["createTime"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("service")) {
+      service = _json["service"];
+    }
+    if (_json.containsKey("tenantResources")) {
+      tenantResources = _json["tenantResources"]
+          .map((value) => new TenantResource.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 (consumer != null) {
+      _json["consumer"] = consumer;
+    }
+    if (createTime != null) {
+      _json["createTime"] = createTime;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (service != null) {
+      _json["service"] = service;
+    }
+    if (tenantResources != null) {
+      _json["tenantResources"] =
+          tenantResources.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// This structure defines a tenant project to be added to the specified tenancy
+/// unit and its initial configuration and properties. A project lien will be
+/// created for the tenant project to prevent the tenant project from being
+/// deleted accidentally. The lien will be deleted as part of tenant project
+/// removal.
+class TenantProjectConfig {
+  /// Billing account properties.
+  /// It may be specified explicitly, or created from the specified group
+  /// during provisioning
+  BillingConfig billingConfig;
+
+  /// Folder where project in this tenancy unit must be located
+  /// This folder must have been previously created with proper
+  /// permissions for the caller to create and configure a project in it.
+  /// Valid folder resource names have the format `folders/{folder_number}`
+  /// (for example, `folders/123456`).
+  core.String folder;
+
+  /// Labels that will be applied to this project.
+  core.Map<core.String, core.String> labels;
+
+  /// Configuration for IAM service account on tenant project.
+  ServiceAccountConfig serviceAccountConfig;
+
+  /// Google Cloud API names of services that will be activated on this project
+  /// during provisioning.  If any of these services can not be activated,
+  /// addTenantProject method will fail.
+  /// For example: 'compute.googleapis.com','cloudfunctions.googleapis.com'
+  core.List<core.String> services;
+
+  /// Describes ownership and policies for the new tenant project. Required.
+  TenantProjectPolicy tenantProjectPolicy;
+
+  TenantProjectConfig();
+
+  TenantProjectConfig.fromJson(core.Map _json) {
+    if (_json.containsKey("billingConfig")) {
+      billingConfig = new BillingConfig.fromJson(_json["billingConfig"]);
+    }
+    if (_json.containsKey("folder")) {
+      folder = _json["folder"];
+    }
+    if (_json.containsKey("labels")) {
+      labels = _json["labels"];
+    }
+    if (_json.containsKey("serviceAccountConfig")) {
+      serviceAccountConfig =
+          new ServiceAccountConfig.fromJson(_json["serviceAccountConfig"]);
+    }
+    if (_json.containsKey("services")) {
+      services = _json["services"];
+    }
+    if (_json.containsKey("tenantProjectPolicy")) {
+      tenantProjectPolicy =
+          new TenantProjectPolicy.fromJson(_json["tenantProjectPolicy"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (billingConfig != null) {
+      _json["billingConfig"] = (billingConfig).toJson();
+    }
+    if (folder != null) {
+      _json["folder"] = folder;
+    }
+    if (labels != null) {
+      _json["labels"] = labels;
+    }
+    if (serviceAccountConfig != null) {
+      _json["serviceAccountConfig"] = (serviceAccountConfig).toJson();
+    }
+    if (services != null) {
+      _json["services"] = services;
+    }
+    if (tenantProjectPolicy != null) {
+      _json["tenantProjectPolicy"] = (tenantProjectPolicy).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Describes policy settings that need to be applied to a newly
+/// created Tenant Project.
+class TenantProjectPolicy {
+  /// Policy bindings to be applied to the tenant project, in addition to the
+  /// 'roles/owner' role granted to the Service Consumer Management service
+  /// account.
+  /// At least one binding must have the role `roles/owner`. Among the list of
+  /// members for `roles/owner`, at least one of them must be either `user` or
+  /// `group` type.
+  core.List<PolicyBinding> policyBindings;
+
+  TenantProjectPolicy();
+
+  TenantProjectPolicy.fromJson(core.Map _json) {
+    if (_json.containsKey("policyBindings")) {
+      policyBindings = _json["policyBindings"]
+          .map((value) => new PolicyBinding.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 (policyBindings != null) {
+      _json["policyBindings"] =
+          policyBindings.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Resource constituting the TenancyUnit.
+class TenantResource {
+  /// @OutputOnly Identifier of the tenant resource.
+  /// For cloud projects it is in the form 'projects/{number}'.
+  /// For example 'projects/123456'.
+  core.String resource;
+
+  /// Status of tenant resource.
+  /// Possible string values are:
+  /// - "STATUS_UNSPECIFIED" : Unspecified status is the default unset value.
+  /// - "PENDING_CREATE" : Creation of the tenant resource is ongoing.
+  /// - "ACTIVE" : Active resource.
+  /// - "PENDING_DELETE" : Deletion of the resource is ongoing.
+  /// - "FAILED" : Tenant resource creation or deletion has failed.
+  core.String status;
+
+  /// Unique per single tenancy unit.
+  core.String tag;
+
+  TenantResource();
+
+  TenantResource.fromJson(core.Map _json) {
+    if (_json.containsKey("resource")) {
+      resource = _json["resource"];
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"];
+    }
+    if (_json.containsKey("tag")) {
+      tag = _json["tag"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (resource != null) {
+      _json["resource"] = resource;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    if (tag != null) {
+      _json["tag"] = tag;
+    }
+    return _json;
+  }
+}
+
+/// A protocol buffer message type.
+class Type {
+  /// The list of fields.
+  core.List<Field> fields;
+
+  /// The fully qualified message name.
+  core.String name;
+
+  /// The list of types appearing in `oneof` definitions in this type.
+  core.List<core.String> oneofs;
+
+  /// The protocol buffer options.
+  core.List<Option> options;
+
+  /// The source context.
+  SourceContext sourceContext;
+
+  /// The source syntax.
+  /// Possible string values are:
+  /// - "SYNTAX_PROTO2" : Syntax `proto2`.
+  /// - "SYNTAX_PROTO3" : Syntax `proto3`.
+  core.String syntax;
+
+  Type();
+
+  Type.fromJson(core.Map _json) {
+    if (_json.containsKey("fields")) {
+      fields =
+          _json["fields"].map((value) => new Field.fromJson(value)).toList();
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("oneofs")) {
+      oneofs = _json["oneofs"];
+    }
+    if (_json.containsKey("options")) {
+      options =
+          _json["options"].map((value) => new Option.fromJson(value)).toList();
+    }
+    if (_json.containsKey("sourceContext")) {
+      sourceContext = new SourceContext.fromJson(_json["sourceContext"]);
+    }
+    if (_json.containsKey("syntax")) {
+      syntax = _json["syntax"];
+    }
+  }
+
+  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 (name != null) {
+      _json["name"] = name;
+    }
+    if (oneofs != null) {
+      _json["oneofs"] = oneofs;
+    }
+    if (options != null) {
+      _json["options"] = options.map((value) => (value).toJson()).toList();
+    }
+    if (sourceContext != null) {
+      _json["sourceContext"] = (sourceContext).toJson();
+    }
+    if (syntax != null) {
+      _json["syntax"] = syntax;
+    }
+    return _json;
+  }
+}
+
+/// Configuration controlling usage of a service.
+class Usage {
+  /// The full resource name of a channel used for sending notifications to the
+  /// service producer.
+  ///
+  /// Google Service Management currently only supports
+  /// [Google Cloud Pub/Sub](https://cloud.google.com/pubsub) as a notification
+  /// channel. To use Google Cloud Pub/Sub as the channel, this must be the name
+  /// of a Cloud Pub/Sub topic that uses the Cloud Pub/Sub topic name format
+  /// documented in https://cloud.google.com/pubsub/docs/overview.
+  core.String producerNotificationChannel;
+
+  /// Requirements that must be satisfied before a consumer project can use the
+  /// service. Each requirement is of the form <service.name>/<requirement-id>;
+  /// for example 'serviceusage.googleapis.com/billing-enabled'.
+  core.List<core.String> requirements;
+
+  /// A list of usage rules that apply to individual API methods.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<UsageRule> rules;
+
+  Usage();
+
+  Usage.fromJson(core.Map _json) {
+    if (_json.containsKey("producerNotificationChannel")) {
+      producerNotificationChannel = _json["producerNotificationChannel"];
+    }
+    if (_json.containsKey("requirements")) {
+      requirements = _json["requirements"];
+    }
+    if (_json.containsKey("rules")) {
+      rules =
+          _json["rules"].map((value) => new UsageRule.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 (producerNotificationChannel != null) {
+      _json["producerNotificationChannel"] = producerNotificationChannel;
+    }
+    if (requirements != null) {
+      _json["requirements"] = requirements;
+    }
+    if (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Usage configuration rules for the service.
+///
+/// NOTE: Under development.
+///
+///
+/// Use this rule to configure unregistered calls for the service. Unregistered
+/// calls are calls that do not contain consumer project identity.
+/// (Example: calls that do not contain an API key).
+/// By default, API methods do not allow unregistered calls, and each method
+/// call
+/// must be identified by a consumer project identity. Use this rule to
+/// allow/disallow unregistered calls.
+///
+/// Example of an API that wants to allow unregistered calls for entire service.
+///
+///     usage:
+///       rules:
+///       - selector: "*"
+///         allow_unregistered_calls: true
+///
+/// Example of a method that wants to allow unregistered calls.
+///
+///     usage:
+///       rules:
+///       - selector: "google.example.library.v1.LibraryService.CreateBook"
+///         allow_unregistered_calls: true
+class UsageRule {
+  /// 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
+  /// methods in all APIs.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  /// 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();
+
+  UsageRule.fromJson(core.Map _json) {
+    if (_json.containsKey("allowUnregisteredCalls")) {
+      allowUnregisteredCalls = _json["allowUnregisteredCalls"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+    if (_json.containsKey("skipServiceControl")) {
+      skipServiceControl = _json["skipServiceControl"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (allowUnregisteredCalls != null) {
+      _json["allowUnregisteredCalls"] = allowUnregisteredCalls;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    if (skipServiceControl != null) {
+      _json["skipServiceControl"] = skipServiceControl;
+    }
+    return _json;
+  }
+}
+
+/// `Visibility` defines restrictions for the visibility of service
+/// elements.  Restrictions are specified using visibility labels
+/// (e.g., TRUSTED_TESTER) that are elsewhere linked to users and projects.
+///
+/// Users and projects can have access to more than one visibility label. The
+/// effective visibility for multiple labels is the union of each label's
+/// elements, plus any unrestricted elements.
+///
+/// If an element and its parents have no restrictions, visibility is
+/// unconditionally granted.
+///
+/// Example:
+///
+///     visibility:
+///       rules:
+///       - selector: google.calendar.Calendar.EnhancedSearch
+///         restriction: TRUSTED_TESTER
+///       - selector: google.calendar.Calendar.Delegate
+///         restriction: GOOGLE_INTERNAL
+///
+/// Here, all methods are publicly visible except for the restricted methods
+/// EnhancedSearch and Delegate.
+class Visibility {
+  /// A list of visibility rules that apply to individual API elements.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<VisibilityRule> rules;
+
+  Visibility();
+
+  Visibility.fromJson(core.Map _json) {
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new VisibilityRule.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 (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// A visibility rule provides visibility configuration for an individual API
+/// element.
+class VisibilityRule {
+  /// A comma-separated list of visibility labels that apply to the `selector`.
+  /// Any of the listed labels can be used to grant the visibility.
+  ///
+  /// If a rule has multiple labels, removing one of the labels but not all of
+  /// them can break clients.
+  ///
+  /// Example:
+  ///
+  ///     visibility:
+  ///       rules:
+  ///       - selector: google.calendar.Calendar.EnhancedSearch
+  ///         restriction: GOOGLE_INTERNAL, TRUSTED_TESTER
+  ///
+  /// Removing GOOGLE_INTERNAL from this restriction will break clients that
+  /// rely on this method and only had access to it through GOOGLE_INTERNAL.
+  core.String restriction;
+
+  /// Selects methods, messages, fields, enums, etc. to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  VisibilityRule();
+
+  VisibilityRule.fromJson(core.Map _json) {
+    if (_json.containsKey("restriction")) {
+      restriction = _json["restriction"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (restriction != null) {
+      _json["restriction"] = restriction;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
diff --git a/googleapis/lib/servicecontrol/v1.dart b/googleapis/lib/servicecontrol/v1.dart
index 90aeb31..d76c9c9 100644
--- a/googleapis/lib/servicecontrol/v1.dart
+++ b/googleapis/lib/servicecontrol/v1.dart
@@ -855,8 +855,9 @@
   /// The error code.
   /// Possible string values are:
   /// - "ERROR_CODE_UNSPECIFIED" : This is never used in `CheckResponse`.
-  /// - "NOT_FOUND" : The consumer's project id was not found.
-  /// Same as google.rpc.Code.NOT_FOUND.
+  /// - "NOT_FOUND" : The consumer's project id, network container, or resource
+  /// container was
+  /// not found. Same as google.rpc.Code.NOT_FOUND.
   /// - "PERMISSION_DENIED" : The consumer doesn't have access to the specified
   /// resource.
   /// Same as google.rpc.Code.PERMISSION_DENIED.
@@ -920,6 +921,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 +937,9 @@
     if (_json.containsKey("detail")) {
       detail = _json["detail"];
     }
+    if (_json.containsKey("subject")) {
+      subject = _json["subject"];
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -940,6 +951,9 @@
     if (detail != null) {
       _json["detail"] = detail;
     }
+    if (subject != null) {
+      _json["subject"] = subject;
+    }
     return _json;
   }
 }
diff --git a/googleapis/lib/servicemanagement/v1.dart b/googleapis/lib/servicemanagement/v1.dart
index bdd6da3..365b9fc 100644
--- a/googleapis/lib/servicemanagement/v1.dart
+++ b/googleapis/lib/servicemanagement/v1.dart
@@ -122,10 +122,10 @@
   /// * `serviceName={some-service}.googleapis.com AND (status=done OR
   /// startTime>="2017-02-01")`
   ///
-  /// [pageToken] - The standard list page token.
-  ///
   /// [name] - Not used.
   ///
+  /// [pageToken] - The standard list page token.
+  ///
   /// [pageSize] - The maximum number of operations to return. If unspecified,
   /// defaults to
   /// 50. The maximum value is 100.
@@ -142,8 +142,8 @@
   /// call, this method will complete with the same error.
   async.Future<ListOperationsResponse> list(
       {core.String filter,
-      core.String pageToken,
       core.String name,
+      core.String pageToken,
       core.int pageSize,
       core.String $fields}) {
     var _url = null;
@@ -156,12 +156,12 @@
     if (filter != null) {
       _queryParams["filter"] = [filter];
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (name != null) {
       _queryParams["name"] = [name];
     }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
@@ -1001,10 +1001,10 @@
   /// [overview](/service-management/overview)
   /// for naming requirements.  For example: `example.googleapis.com`.
   ///
-  /// [pageSize] - The max number of items to include in the response list.
-  ///
   /// [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.
   ///
@@ -1016,7 +1016,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<ListServiceConfigsResponse> list(core.String serviceName,
-      {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;
@@ -1027,12 +1027,12 @@
     if (serviceName == null) {
       throw new core.ArgumentError("Parameter serviceName 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];
     }
@@ -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];
     }
@@ -1634,7 +1634,7 @@
 /// If there are AuditConfigs for both `allServices` and a specific service,
 /// the union of the two AuditConfigs is used for that service: the log_types
 /// specified in each AuditConfig are enabled, and the exempted_members in each
-/// AuditConfig are exempted.
+/// AuditLogConfig are exempted.
 ///
 /// Example Policy with multiple AuditConfigs:
 ///
@@ -1681,7 +1681,6 @@
   /// The configuration for logging of each type of permission.
   /// Next ID: 4
   core.List<AuditLogConfig> auditLogConfigs;
-  core.List<core.String> exemptedMembers;
 
   /// Specifies a service that will be enabled for audit logging.
   /// For example, `storage.googleapis.com`, `cloudsql.googleapis.com`.
@@ -1696,9 +1695,6 @@
           .map((value) => new AuditLogConfig.fromJson(value))
           .toList();
     }
-    if (_json.containsKey("exemptedMembers")) {
-      exemptedMembers = _json["exemptedMembers"];
-    }
     if (_json.containsKey("service")) {
       service = _json["service"];
     }
@@ -1711,9 +1707,6 @@
       _json["auditLogConfigs"] =
           auditLogConfigs.map((value) => (value).toJson()).toList();
     }
-    if (exemptedMembers != null) {
-      _json["exemptedMembers"] = exemptedMembers;
-    }
     if (service != null) {
       _json["service"] = service;
     }
@@ -2260,7 +2253,7 @@
   /// NOTE: an unsatisfied condition will not allow user access via current
   /// binding. Different bindings, including their conditions, are examined
   /// independently.
-  /// This field is GOOGLE_INTERNAL.
+  /// This field is only visible as GOOGLE_INTERNAL or CONDITION_TRUSTED_TESTER.
   Expr condition;
 
   /// Specifies the identities requesting access for a Cloud Platform resource.
@@ -3156,12 +3149,6 @@
   /// allowed to proceed.
   core.bool allowCors;
 
-  /// The list of APIs served by this endpoint.
-  ///
-  /// If no APIs are specified this translates to "all APIs" exported by the
-  /// service, as defined in the top-level service configuration.
-  core.List<core.String> apis;
-
   /// The list of features enabled on this endpoint.
   core.List<core.String> features;
 
@@ -3185,9 +3172,6 @@
     if (_json.containsKey("allowCors")) {
       allowCors = _json["allowCors"];
     }
-    if (_json.containsKey("apis")) {
-      apis = _json["apis"];
-    }
     if (_json.containsKey("features")) {
       features = _json["features"];
     }
@@ -3208,9 +3192,6 @@
     if (allowCors != null) {
       _json["allowCors"] = allowCors;
     }
-    if (apis != null) {
-      _json["apis"] = apis;
-    }
     if (features != null) {
       _json["features"] = features;
     }
@@ -3549,108 +3530,6 @@
   }
 }
 
-/// The metadata associated with a long running operation resource.
-class FlowOperationMetadata {
-  /// The state of the operation with respect to cancellation.
-  /// Possible string values are:
-  /// - "RUNNING" : Default state, cancellable but not cancelled.
-  /// - "UNCANCELLABLE" : The operation has proceeded past the point of no
-  /// return and cannot
-  /// be cancelled.
-  /// - "CANCELLED" : The operation has been cancelled, work should cease
-  /// and any needed rollback steps executed.
-  core.String cancelState;
-
-  /// Deadline for the flow to complete, to prevent orphaned Operations.
-  ///
-  /// If the flow has not completed by this time, it may be terminated by
-  /// the engine, or force-failed by Operation lookup.
-  ///
-  /// Note that this is not a hard deadline after which the Flow will
-  /// definitely be failed, rather it is a deadline after which it is reasonable
-  /// to suspect a problem and other parts of the system may kill operation
-  /// to ensure we don't have orphans.
-  /// see also: go/prevent-orphaned-operations
-  core.String deadline;
-
-  /// The name of the top-level flow corresponding to this operation.
-  /// Must be equal to the "name" field for a FlowName enum.
-  core.String flowName;
-
-  /// Operation type which is a flow type and subtype info as that is missing in
-  /// our datastore otherwise. This maps to the ordinal value of the enum:
-  /// jcg/api/tenant/operations/OperationNamespace.java
-  core.int operationType;
-
-  /// The full name of the resources that this flow is directly associated with.
-  core.List<core.String> resourceNames;
-
-  /// The start time of the operation.
-  core.String startTime;
-
-  ///
-  /// Possible string values are:
-  /// - "UNSPECIFIED_OP_SERVICE"
-  /// - "SERVICE_MANAGEMENT"
-  /// - "SERVICE_USAGE"
-  /// - "SERVICE_CONSUMER_MANAGEMENT" : TenancyUnit, ServiceNetworking fall
-  /// under this
-  core.String surface;
-
-  FlowOperationMetadata();
-
-  FlowOperationMetadata.fromJson(core.Map _json) {
-    if (_json.containsKey("cancelState")) {
-      cancelState = _json["cancelState"];
-    }
-    if (_json.containsKey("deadline")) {
-      deadline = _json["deadline"];
-    }
-    if (_json.containsKey("flowName")) {
-      flowName = _json["flowName"];
-    }
-    if (_json.containsKey("operationType")) {
-      operationType = _json["operationType"];
-    }
-    if (_json.containsKey("resourceNames")) {
-      resourceNames = _json["resourceNames"];
-    }
-    if (_json.containsKey("startTime")) {
-      startTime = _json["startTime"];
-    }
-    if (_json.containsKey("surface")) {
-      surface = _json["surface"];
-    }
-  }
-
-  core.Map<core.String, core.Object> toJson() {
-    final core.Map<core.String, core.Object> _json =
-        new core.Map<core.String, core.Object>();
-    if (cancelState != null) {
-      _json["cancelState"] = cancelState;
-    }
-    if (deadline != null) {
-      _json["deadline"] = deadline;
-    }
-    if (flowName != null) {
-      _json["flowName"] = flowName;
-    }
-    if (operationType != null) {
-      _json["operationType"] = operationType;
-    }
-    if (resourceNames != null) {
-      _json["resourceNames"] = resourceNames;
-    }
-    if (startTime != null) {
-      _json["startTime"] = startTime;
-    }
-    if (surface != null) {
-      _json["surface"] = surface;
-    }
-    return _json;
-  }
-}
-
 /// Request message for GenerateConfigReport method.
 class GenerateConfigReportRequest {
   /// Service configuration for which we want to generate the report.
@@ -4081,13 +3960,6 @@
   /// Used for updating a resource.
   core.String put;
 
-  /// The name of the response field whose value is mapped to the HTTP body of
-  /// response. Other response fields are ignored. This field is optional. When
-  /// not set, the response message will be used as HTTP body of response.
-  /// NOTE: the referred field must be not a repeated field and must be present
-  /// at the top-level of response message type.
-  core.String responseBody;
-
   /// Selects methods to which this rule applies.
   ///
   /// Refer to selector for syntax details.
@@ -4128,9 +4000,6 @@
     if (_json.containsKey("put")) {
       put = _json["put"];
     }
-    if (_json.containsKey("responseBody")) {
-      responseBody = _json["responseBody"];
-    }
     if (_json.containsKey("selector")) {
       selector = _json["selector"];
     }
@@ -4170,9 +4039,6 @@
     if (put != null) {
       _json["put"] = put;
     }
-    if (responseBody != null) {
-      _json["responseBody"] = responseBody;
-    }
     if (selector != null) {
       _json["selector"] = selector;
     }
@@ -4910,8 +4776,6 @@
   ///
   /// **Grammar**
   ///
-  /// The grammar includes the dimensionless unit `1`, such as `1/s`.
-  ///
   /// The grammar also includes these connectors:
   ///
   /// * `/`    division (as an infix operator, e.g. `1/s`).
@@ -4921,7 +4785,7 @@
   ///
   ///     Expression = Component { "." Component } { "/" Component } ;
   ///
-  ///     Component = [ PREFIX ] UNIT [ Annotation ]
+  ///     Component = ( [ PREFIX ] UNIT | "%" ) [ Annotation ]
   ///               | Annotation
   ///               | "1"
   ///               ;
@@ -4935,6 +4799,9 @@
   ///    `{requests}/s == 1/s`, `By{transmitted}/s == By/s`.
   /// * `NAME` is a sequence of non-blank printable ASCII characters not
   ///    containing '{' or '}'.
+  /// * `1` represents dimensionless value 1, such as in `1/s`.
+  /// * `%` represents dimensionless value 1/100, and annotates values giving
+  ///    a percentage.
   core.String unit;
 
   /// Whether the measurement is an integer, a floating-point number, etc.
@@ -5673,7 +5540,7 @@
 ///     }
 ///
 /// For a description of IAM and its features, see the
-/// [IAM developer's guide](https://cloud.google.com/iam).
+/// [IAM developer's guide](https://cloud.google.com/iam/docs).
 class Policy {
   /// Specifies cloud audit logging configuration for this policy.
   core.List<AuditConfig> auditConfigs;
@@ -5703,9 +5570,7 @@
         convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
   }
 
-  core.bool iamOwned;
-
-  /// Version of the `Policy`. The default version is 0.
+  /// Deprecated.
   core.int version;
 
   Policy();
@@ -5724,9 +5589,6 @@
     if (_json.containsKey("etag")) {
       etag = _json["etag"];
     }
-    if (_json.containsKey("iamOwned")) {
-      iamOwned = _json["iamOwned"];
-    }
     if (_json.containsKey("version")) {
       version = _json["version"];
     }
@@ -5745,9 +5607,6 @@
     if (etag != null) {
       _json["etag"] = etag;
     }
-    if (iamOwned != null) {
-      _json["iamOwned"] = iamOwned;
-    }
     if (version != null) {
       _json["version"] = version;
     }
@@ -7168,7 +7027,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
@@ -7177,10 +7037,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/googleapis/lib/serviceusage/v1.dart b/googleapis/lib/serviceusage/v1.dart
new file mode 100644
index 0000000..0c0ffc2
--- /dev/null
+++ b/googleapis/lib/serviceusage/v1.dart
@@ -0,0 +1,5286 @@
+// This is a generated file (see the discoveryapis_generator project).
+
+library googleapis.serviceusage.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_1;
+
+export 'package:_discoveryapis_commons/_discoveryapis_commons.dart'
+    show ApiRequestError, DetailedApiRequestError;
+
+const core.String USER_AGENT = 'dart-api-client serviceusage/v1';
+
+/// Enables services that service consumers want to use on Google Cloud
+/// Platform, lists the available or enabled services, or disables services that
+/// service consumers no longer use.
+class ServiceusageApi {
+  /// View and manage your data across Google Cloud Platform services
+  static const CloudPlatformScope =
+      "https://www.googleapis.com/auth/cloud-platform";
+
+  /// View your data across Google Cloud Platform services
+  static const CloudPlatformReadOnlyScope =
+      "https://www.googleapis.com/auth/cloud-platform.read-only";
+
+  /// Manage your Google API service configuration
+  static const ServiceManagementScope =
+      "https://www.googleapis.com/auth/service.management";
+
+  final commons.ApiRequester _requester;
+
+  OperationsResourceApi get operations => new OperationsResourceApi(_requester);
+  ServicesResourceApi get services => new ServicesResourceApi(_requester);
+
+  ServiceusageApi(http_1.Client client,
+      {core.String rootUrl: "https://serviceusage.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_1.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_1.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_1.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:
+  ///
+  /// [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.
+  ///
+  /// [$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_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 filter,
+      core.String name,
+      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 (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
+    if (name != null) {
+      _queryParams["name"] = [name];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/operations';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListOperationsResponse.fromJson(data));
+  }
+}
+
+class ServicesResourceApi {
+  final commons.ApiRequester _requester;
+
+  ServicesResourceApi(commons.ApiRequester client) : _requester = client;
+
+  /// Disable a service so it can no longer be used with a
+  /// project. This prevents unintended usage that may cause unexpected billing
+  /// charges or security leaks.
+  ///
+  /// It is not valid to call the disable method on a service that is not
+  /// currently enabled. Callers will receive a FAILED_PRECONDITION status if
+  /// the target service is not currently enabled.
+  ///
+  /// Operation<response: google.protobuf.Empty>
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Name of the consumer and service to disable the service on.
+  ///
+  /// The enable and disable methods currently only support projects.
+  ///
+  /// An example name would be:
+  /// projects/123/services/serviceusage.googleapis.com
+  /// Value must have pattern "^[^/]+/[^/]+/services/[^/]+$".
+  ///
+  /// [$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_1.Client] completes with an error when making a REST
+  /// call, this method will complete with the same error.
+  async.Future<Operation> disable(
+      DisableServiceRequest 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') + ':disable';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /// Enable a service so it can be used with a project.
+  /// See [Cloud Auth Guide](https://cloud.google.com/docs/authentication) for
+  /// more information.
+  ///
+  /// Operation<response: google.protobuf.Empty>
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Name of the consumer and service to enable the service on.
+  ///
+  /// The enable and disable methods currently only support projects.
+  ///
+  /// Enabling a service requires that the service is public or is shared with
+  /// the user enabling the service.
+  ///
+  /// An example name would be:
+  /// projects/123/services/serviceusage.googleapis.com
+  /// Value must have pattern "^[^/]+/[^/]+/services/[^/]+$".
+  ///
+  /// [$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_1.Client] completes with an error when making a REST
+  /// call, this method will complete with the same error.
+  async.Future<Operation> enable(EnableServiceRequest 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') + ':enable';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /// Returns the service definition and EnabledState for a given service.
+  ///
+  /// Request parameters:
+  ///
+  /// [name] - Name of the consumer and service to get the ConsumerState for.
+  ///
+  /// An example name would be:
+  /// projects/123/services/serviceusage.googleapis.com
+  /// Value must have pattern "^[^/]+/[^/]+/services/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [ServiceState].
+  ///
+  /// Completes with a [commons.ApiRequestError] if the API endpoint returned an
+  /// error.
+  ///
+  /// 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<ServiceState> 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 ServiceState.fromJson(data));
+  }
+
+  /// List enabled services.
+  ///
+  /// Request parameters:
+  ///
+  /// [parent] - Parent to search for services on.
+  ///
+  /// An example name would be:
+  /// projects/123
+  /// Value must have pattern "^[^/]+/[^/]+$".
+  ///
+  /// [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.
+  ///
+  /// Completes with a [ListEnabledServicesResponse].
+  ///
+  /// Completes with a [commons.ApiRequestError] if the API endpoint returned an
+  /// error.
+  ///
+  /// 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<ListEnabledServicesResponse> listEnabled(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') +
+        '/services:enabled';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response
+        .then((data) => new ListEnabledServicesResponse.fromJson(data));
+  }
+
+  /// Search available services.
+  ///
+  /// When no filter is specified, returns all accessible services. This
+  /// includes
+  /// public services and services for which the calling user has the
+  /// "servicemanagement.services.bind" permission.
+  ///
+  /// Request parameters:
+  ///
+  /// [pageToken] - Token identifying which result to start with; returned by a
+  /// previous search
+  /// call.
+  ///
+  /// [pageSize] - Requested size of the next page of data.
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [SearchServicesResponse].
+  ///
+  /// Completes with a [commons.ApiRequestError] if the API endpoint returned an
+  /// error.
+  ///
+  /// 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.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/services:search';
+
+    var _response = _requester.request(_url, "GET",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new SearchServicesResponse.fromJson(data));
+  }
+}
+
+/// Api is a light-weight descriptor for an API Interface.
+///
+/// Interfaces are also described as "protocol buffer services" in some
+/// contexts,
+/// such as by the "service" keyword in a .proto file, but they are different
+/// from API Services, which represent a concrete implementation of an interface
+/// as opposed to simply a description of methods and bindings. They are also
+/// sometimes simply referred to as "APIs" in other contexts, such as the name
+/// of
+/// this message itself. See https://cloud.google.com/apis/design/glossary for
+/// detailed terminology.
+class Api {
+  /// The methods of this interface, in unspecified order.
+  core.List<Method> methods;
+
+  /// Included interfaces. See Mixin.
+  core.List<Mixin> mixins;
+
+  /// The fully qualified name of this interface, including package name
+  /// followed by the interface's simple name.
+  core.String name;
+
+  /// Any metadata attached to the interface.
+  core.List<Option> options;
+
+  /// Source context for the protocol buffer service represented by this
+  /// message.
+  SourceContext sourceContext;
+
+  /// The source syntax of the service.
+  /// Possible string values are:
+  /// - "SYNTAX_PROTO2" : Syntax `proto2`.
+  /// - "SYNTAX_PROTO3" : Syntax `proto3`.
+  core.String syntax;
+
+  /// A version string for this interface. If specified, must have the form
+  /// `major-version.minor-version`, as in `1.10`. If the minor version is
+  /// omitted, it defaults to zero. If the entire version field is empty, the
+  /// major version is derived from the package name, as outlined below. If the
+  /// field is not empty, the version in the package name will be verified to be
+  /// consistent with what is provided here.
+  ///
+  /// The versioning schema uses [semantic
+  /// versioning](http://semver.org) where the major version number
+  /// indicates a breaking change and the minor version an additive,
+  /// non-breaking change. Both version numbers are signals to users
+  /// what to expect from different versions, and should be carefully
+  /// chosen based on the product plan.
+  ///
+  /// The major version is also reflected in the package name of the
+  /// interface, which must end in `v<major-version>`, as in
+  /// `google.feature.v1`. For major versions 0 and 1, the suffix can
+  /// be omitted. Zero major versions must only be used for
+  /// experimental, non-GA interfaces.
+  core.String version;
+
+  Api();
+
+  Api.fromJson(core.Map _json) {
+    if (_json.containsKey("methods")) {
+      methods =
+          _json["methods"].map((value) => new Method.fromJson(value)).toList();
+    }
+    if (_json.containsKey("mixins")) {
+      mixins =
+          _json["mixins"].map((value) => new Mixin.fromJson(value)).toList();
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("options")) {
+      options =
+          _json["options"].map((value) => new Option.fromJson(value)).toList();
+    }
+    if (_json.containsKey("sourceContext")) {
+      sourceContext = new SourceContext.fromJson(_json["sourceContext"]);
+    }
+    if (_json.containsKey("syntax")) {
+      syntax = _json["syntax"];
+    }
+    if (_json.containsKey("version")) {
+      version = _json["version"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (methods != null) {
+      _json["methods"] = methods.map((value) => (value).toJson()).toList();
+    }
+    if (mixins != null) {
+      _json["mixins"] = mixins.map((value) => (value).toJson()).toList();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (options != null) {
+      _json["options"] = options.map((value) => (value).toJson()).toList();
+    }
+    if (sourceContext != null) {
+      _json["sourceContext"] = (sourceContext).toJson();
+    }
+    if (syntax != null) {
+      _json["syntax"] = syntax;
+    }
+    if (version != null) {
+      _json["version"] = version;
+    }
+    return _json;
+  }
+}
+
+/// Configuration for an anthentication provider, including support for
+/// [JSON Web Token
+/// (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32).
+class AuthProvider {
+  /// The list of JWT
+  /// [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3).
+  /// that are allowed to access. A JWT containing any of these audiences will
+  /// be accepted. When this setting is absent, only JWTs with audience
+  /// "https://Service_name/API_name"
+  /// will be accepted. For example, if no audiences are in the setting,
+  /// LibraryService API will only accept JWTs with the following audience
+  /// "https://library-example.googleapis.com/google.example.library.v1.LibraryService".
+  ///
+  /// Example:
+  ///
+  ///     audiences: bookstore_android.apps.googleusercontent.com,
+  ///                bookstore_web.apps.googleusercontent.com
+  core.String audiences;
+
+  /// Redirect URL if JWT token is required but no present or is expired.
+  /// Implement authorizationUrl of securityDefinitions in OpenAPI spec.
+  core.String authorizationUrl;
+
+  /// The unique identifier of the auth provider. It will be referred to by
+  /// `AuthRequirement.provider_id`.
+  ///
+  /// Example: "bookstore_auth".
+  core.String id;
+
+  /// Identifies the principal that issued the JWT. See
+  /// https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.1
+  /// Usually a URL or an email address.
+  ///
+  /// Example: https://securetoken.google.com
+  /// Example: 1234567-compute@developer.gserviceaccount.com
+  core.String issuer;
+
+  /// URL of the provider's public key set to validate signature of the JWT. See
+  /// [OpenID
+  /// Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata).
+  /// Optional if the key set document:
+  ///  - can be retrieved from
+  /// [OpenID
+  /// Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html
+  ///    of the issuer.
+  /// - can be inferred from the email domain of the issuer (e.g. a Google
+  /// service account).
+  ///
+  /// Example: https://www.googleapis.com/oauth2/v1/certs
+  core.String jwksUri;
+
+  AuthProvider();
+
+  AuthProvider.fromJson(core.Map _json) {
+    if (_json.containsKey("audiences")) {
+      audiences = _json["audiences"];
+    }
+    if (_json.containsKey("authorizationUrl")) {
+      authorizationUrl = _json["authorizationUrl"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("issuer")) {
+      issuer = _json["issuer"];
+    }
+    if (_json.containsKey("jwksUri")) {
+      jwksUri = _json["jwksUri"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (audiences != null) {
+      _json["audiences"] = audiences;
+    }
+    if (authorizationUrl != null) {
+      _json["authorizationUrl"] = authorizationUrl;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (issuer != null) {
+      _json["issuer"] = issuer;
+    }
+    if (jwksUri != null) {
+      _json["jwksUri"] = jwksUri;
+    }
+    return _json;
+  }
+}
+
+/// User-defined authentication requirements, including support for
+/// [JSON Web Token
+/// (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32).
+class AuthRequirement {
+  /// NOTE: This will be deprecated soon, once AuthProvider.audiences is
+  /// implemented and accepted in all the runtime components.
+  ///
+  /// The list of JWT
+  /// [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3).
+  /// that are allowed to access. A JWT containing any of these audiences will
+  /// be accepted. When this setting is absent, only JWTs with audience
+  /// "https://Service_name/API_name"
+  /// will be accepted. For example, if no audiences are in the setting,
+  /// LibraryService API will only accept JWTs with the following audience
+  /// "https://library-example.googleapis.com/google.example.library.v1.LibraryService".
+  ///
+  /// Example:
+  ///
+  ///     audiences: bookstore_android.apps.googleusercontent.com,
+  ///                bookstore_web.apps.googleusercontent.com
+  core.String audiences;
+
+  /// id from authentication provider.
+  ///
+  /// Example:
+  ///
+  ///     provider_id: bookstore_auth
+  core.String providerId;
+
+  AuthRequirement();
+
+  AuthRequirement.fromJson(core.Map _json) {
+    if (_json.containsKey("audiences")) {
+      audiences = _json["audiences"];
+    }
+    if (_json.containsKey("providerId")) {
+      providerId = _json["providerId"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (audiences != null) {
+      _json["audiences"] = audiences;
+    }
+    if (providerId != null) {
+      _json["providerId"] = providerId;
+    }
+    return _json;
+  }
+}
+
+/// `Authentication` defines the authentication configuration for an API.
+///
+/// Example for an API targeted for external use:
+///
+///     name: calendar.googleapis.com
+///     authentication:
+///       providers:
+///       - id: google_calendar_auth
+///         jwks_uri: https://www.googleapis.com/oauth2/v1/certs
+///         issuer: https://securetoken.google.com
+///       rules:
+///       - selector: "*"
+///         requirements:
+///           provider_id: google_calendar_auth
+class Authentication {
+  /// Defines a set of authentication providers that a service supports.
+  core.List<AuthProvider> providers;
+
+  /// A list of authentication rules that apply to individual API methods.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<AuthenticationRule> rules;
+
+  Authentication();
+
+  Authentication.fromJson(core.Map _json) {
+    if (_json.containsKey("providers")) {
+      providers = _json["providers"]
+          .map((value) => new AuthProvider.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new AuthenticationRule.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 (providers != null) {
+      _json["providers"] = providers.map((value) => (value).toJson()).toList();
+    }
+    if (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Authentication rules for the service.
+///
+/// By default, if a method has any authentication requirements, every request
+/// must include a valid credential matching one of the requirements.
+/// It's an error to include more than one kind of credential in a single
+/// request.
+///
+/// If a method doesn't have any auth requirements, request credentials will be
+/// ignored.
+class AuthenticationRule {
+  /// Whether to allow requests without a credential. The credential can be
+  /// an OAuth token, Google cookies (first-party auth) or EndUserCreds.
+  ///
+  /// For requests without credentials, if the service control environment is
+  /// specified, each incoming request **must** be associated with a service
+  /// consumer. This can be done by passing an API key that belongs to a
+  /// consumer
+  /// project.
+  core.bool allowWithoutCredential;
+
+  /// Configuration for custom authentication.
+  CustomAuthRequirements customAuth;
+
+  /// The requirements for OAuth credentials.
+  OAuthRequirements oauth;
+
+  /// Requirements for additional authentication providers.
+  core.List<AuthRequirement> requirements;
+
+  /// Selects the methods to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  AuthenticationRule();
+
+  AuthenticationRule.fromJson(core.Map _json) {
+    if (_json.containsKey("allowWithoutCredential")) {
+      allowWithoutCredential = _json["allowWithoutCredential"];
+    }
+    if (_json.containsKey("customAuth")) {
+      customAuth = new CustomAuthRequirements.fromJson(_json["customAuth"]);
+    }
+    if (_json.containsKey("oauth")) {
+      oauth = new OAuthRequirements.fromJson(_json["oauth"]);
+    }
+    if (_json.containsKey("requirements")) {
+      requirements = _json["requirements"]
+          .map((value) => new AuthRequirement.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (allowWithoutCredential != null) {
+      _json["allowWithoutCredential"] = allowWithoutCredential;
+    }
+    if (customAuth != null) {
+      _json["customAuth"] = (customAuth).toJson();
+    }
+    if (oauth != null) {
+      _json["oauth"] = (oauth).toJson();
+    }
+    if (requirements != null) {
+      _json["requirements"] =
+          requirements.map((value) => (value).toJson()).toList();
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// Configuration of authorization.
+///
+/// This section determines the authorization provider, if unspecified, then no
+/// authorization check will be done.
+///
+/// Example:
+///
+///     experimental:
+///       authorization:
+///         provider: firebaserules.googleapis.com
+class AuthorizationConfig {
+  /// The name of the authorization provider, such as
+  /// firebaserules.googleapis.com.
+  core.String provider;
+
+  AuthorizationConfig();
+
+  AuthorizationConfig.fromJson(core.Map _json) {
+    if (_json.containsKey("provider")) {
+      provider = _json["provider"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (provider != null) {
+      _json["provider"] = provider;
+    }
+    return _json;
+  }
+}
+
+/// Authorization rule for API services.
+///
+/// It specifies the permission(s) required for an API element for the overall
+/// API request to succeed. It is typically used to mark request message fields
+/// that contain the name of the resource and indicates the permissions that
+/// will be checked on that resource.
+///
+/// For example:
+///
+///     package google.storage.v1;
+///
+///     message CopyObjectRequest {
+///       string source = 1 [
+///         (google.api.authz).permissions = "storage.objects.get"];
+///
+///       string destination = 2 [
+///         (google.api.authz).permissions =
+///             "storage.objects.create,storage.objects.update"];
+///     }
+class AuthorizationRule {
+  /// The required permissions. The acceptable values vary depend on the
+  /// authorization system used. For Google APIs, it should be a comma-separated
+  /// Google IAM permission values. When multiple permissions are listed, the
+  /// semantics is not defined by the system. Additional documentation must
+  /// be provided manually.
+  core.String permissions;
+
+  /// Selects the API elements to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  AuthorizationRule();
+
+  AuthorizationRule.fromJson(core.Map _json) {
+    if (_json.containsKey("permissions")) {
+      permissions = _json["permissions"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (permissions != null) {
+      _json["permissions"] = permissions;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// `Backend` defines the backend configuration for a service.
+class Backend {
+  /// A list of API backend rules that apply to individual API methods.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<BackendRule> rules;
+
+  Backend();
+
+  Backend.fromJson(core.Map _json) {
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new BackendRule.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 (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// A backend rule provides configuration for an individual API element.
+class BackendRule {
+  /// The address of the API backend.
+  core.String address;
+
+  /// The number of seconds to wait for a response from a request.  The default
+  /// deadline for gRPC is infinite (no deadline) and HTTP requests is 5
+  /// seconds.
+  core.double deadline;
+
+  /// Minimum deadline in seconds needed for this method. Calls having deadline
+  /// value lower than this will be rejected.
+  core.double minDeadline;
+
+  /// Selects the methods to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  BackendRule();
+
+  BackendRule.fromJson(core.Map _json) {
+    if (_json.containsKey("address")) {
+      address = _json["address"];
+    }
+    if (_json.containsKey("deadline")) {
+      deadline = _json["deadline"];
+    }
+    if (_json.containsKey("minDeadline")) {
+      minDeadline = _json["minDeadline"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (address != null) {
+      _json["address"] = address;
+    }
+    if (deadline != null) {
+      _json["deadline"] = deadline;
+    }
+    if (minDeadline != null) {
+      _json["minDeadline"] = minDeadline;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// Billing related configuration of the service.
+///
+/// The following example shows how to configure monitored resources and metrics
+/// for billing:
+///
+///     monitored_resources:
+///     - type: library.googleapis.com/branch
+///       labels:
+///       - key: /city
+///         description: The city where the library branch is located in.
+///       - key: /name
+///         description: The name of the branch.
+///     metrics:
+///     - name: library.googleapis.com/book/borrowed_count
+///       metric_kind: DELTA
+///       value_type: INT64
+///     billing:
+///       consumer_destinations:
+///       - monitored_resource: library.googleapis.com/branch
+///         metrics:
+///         - library.googleapis.com/book/borrowed_count
+class Billing {
+  /// Billing configurations for sending metrics to the consumer project.
+  /// There can be multiple consumer destinations per service, each one must
+  /// have
+  /// a different monitored resource type. A metric can be used in at most
+  /// one consumer destination.
+  core.List<BillingDestination> consumerDestinations;
+
+  Billing();
+
+  Billing.fromJson(core.Map _json) {
+    if (_json.containsKey("consumerDestinations")) {
+      consumerDestinations = _json["consumerDestinations"]
+          .map((value) => new BillingDestination.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 (consumerDestinations != null) {
+      _json["consumerDestinations"] =
+          consumerDestinations.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Configuration of a specific billing destination (Currently only support
+/// bill against consumer project).
+class BillingDestination {
+  /// Names of the metrics to report to this billing destination.
+  /// Each name must be defined in Service.metrics section.
+  core.List<core.String> metrics;
+
+  /// The monitored resource type. The type must be defined in
+  /// Service.monitored_resources section.
+  core.String monitoredResource;
+
+  BillingDestination();
+
+  BillingDestination.fromJson(core.Map _json) {
+    if (_json.containsKey("metrics")) {
+      metrics = _json["metrics"];
+    }
+    if (_json.containsKey("monitoredResource")) {
+      monitoredResource = _json["monitoredResource"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (metrics != null) {
+      _json["metrics"] = metrics;
+    }
+    if (monitoredResource != null) {
+      _json["monitoredResource"] = monitoredResource;
+    }
+    return _json;
+  }
+}
+
+/// 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;
+  }
+}
+
+/// `Context` defines which contexts an API requests.
+///
+/// Example:
+///
+///     context:
+///       rules:
+///       - selector: "*"
+///         requested:
+///         - google.rpc.context.ProjectContext
+///         - google.rpc.context.OriginContext
+///
+/// The above specifies that all methods in the API request
+/// `google.rpc.context.ProjectContext` and
+/// `google.rpc.context.OriginContext`.
+///
+/// Available context types are defined in package
+/// `google.rpc.context`.
+///
+/// This also provides mechanism to whitelist any protobuf message extension
+/// that
+/// can be sent in grpc metadata using “x-goog-ext-<extension_id>-bin” and
+/// “x-goog-ext-<extension_id>-jspb” format. For example, list any service
+/// specific protobuf types that can appear in grpc metadata as follows in your
+/// yaml file:
+///
+/// Example:
+///
+///     context:
+///       rules:
+///        - selector: "google.example.library.v1.LibraryService.CreateBook"
+///          allowed_request_extensions:
+///          - google.foo.v1.NewExtension
+///          allowed_response_extensions:
+///          - google.foo.v1.NewExtension
+///
+/// You can also specify extension ID instead of fully qualified extension name
+/// here.
+class Context {
+  /// A list of RPC context rules that apply to individual API methods.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<ContextRule> rules;
+
+  Context();
+
+  Context.fromJson(core.Map _json) {
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new ContextRule.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 (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// A context rule provides information about the context for an individual API
+/// element.
+class ContextRule {
+  /// A list of full type names or extension IDs of extensions allowed in grpc
+  /// side channel from client to backend.
+  core.List<core.String> allowedRequestExtensions;
+
+  /// A list of full type names or extension IDs of extensions allowed in grpc
+  /// side channel from backend to client.
+  core.List<core.String> allowedResponseExtensions;
+
+  /// A list of full type names of provided contexts.
+  core.List<core.String> provided;
+
+  /// A list of full type names of requested contexts.
+  core.List<core.String> requested;
+
+  /// Selects the methods to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  ContextRule();
+
+  ContextRule.fromJson(core.Map _json) {
+    if (_json.containsKey("allowedRequestExtensions")) {
+      allowedRequestExtensions = _json["allowedRequestExtensions"];
+    }
+    if (_json.containsKey("allowedResponseExtensions")) {
+      allowedResponseExtensions = _json["allowedResponseExtensions"];
+    }
+    if (_json.containsKey("provided")) {
+      provided = _json["provided"];
+    }
+    if (_json.containsKey("requested")) {
+      requested = _json["requested"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (allowedRequestExtensions != null) {
+      _json["allowedRequestExtensions"] = allowedRequestExtensions;
+    }
+    if (allowedResponseExtensions != null) {
+      _json["allowedResponseExtensions"] = allowedResponseExtensions;
+    }
+    if (provided != null) {
+      _json["provided"] = provided;
+    }
+    if (requested != null) {
+      _json["requested"] = requested;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// Selects and configures the service controller used by the service.  The
+/// service controller handles features like abuse, quota, billing, logging,
+/// monitoring, etc.
+class Control {
+  /// The service control environment to use. If empty, no control plane
+  /// feature (like quota and billing) will be enabled.
+  core.String environment;
+
+  Control();
+
+  Control.fromJson(core.Map _json) {
+    if (_json.containsKey("environment")) {
+      environment = _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;
+    }
+    return _json;
+  }
+}
+
+/// Configuration for a custom authentication provider.
+class CustomAuthRequirements {
+  /// A configuration string containing connection information for the
+  /// authentication provider, typically formatted as a SmartService string
+  /// (go/smartservice).
+  core.String provider;
+
+  CustomAuthRequirements();
+
+  CustomAuthRequirements.fromJson(core.Map _json) {
+    if (_json.containsKey("provider")) {
+      provider = _json["provider"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (provider != null) {
+      _json["provider"] = provider;
+    }
+    return _json;
+  }
+}
+
+/// Customize service error responses.  For example, list any service
+/// specific protobuf types that can appear in error detail lists of
+/// error responses.
+///
+/// Example:
+///
+///     custom_error:
+///       types:
+///       - google.foo.v1.CustomError
+///       - google.foo.v1.AnotherError
+class CustomError {
+  /// The list of custom error rules that apply to individual API messages.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<CustomErrorRule> rules;
+
+  /// The list of custom error detail types, e.g. 'google.foo.v1.CustomError'.
+  core.List<core.String> types;
+
+  CustomError();
+
+  CustomError.fromJson(core.Map _json) {
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new CustomErrorRule.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("types")) {
+      types = _json["types"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    if (types != null) {
+      _json["types"] = types;
+    }
+    return _json;
+  }
+}
+
+/// A custom error rule.
+class CustomErrorRule {
+  /// Mark this message as possible payload in error response.  Otherwise,
+  /// objects of this type will be filtered when they appear in error payload.
+  core.bool isErrorType;
+
+  /// Selects messages to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  CustomErrorRule();
+
+  CustomErrorRule.fromJson(core.Map _json) {
+    if (_json.containsKey("isErrorType")) {
+      isErrorType = _json["isErrorType"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (isErrorType != null) {
+      _json["isErrorType"] = isErrorType;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// A custom pattern is used for defining custom HTTP verb.
+class CustomHttpPattern {
+  /// The name of this custom HTTP verb.
+  core.String kind;
+
+  /// The path matched by this custom verb.
+  core.String path;
+
+  CustomHttpPattern();
+
+  CustomHttpPattern.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("path")) {
+      path = _json["path"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (path != null) {
+      _json["path"] = path;
+    }
+    return _json;
+  }
+}
+
+/// Request message for DisableService.
+class DisableServiceRequest {
+  DisableServiceRequest();
+
+  DisableServiceRequest.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;
+  }
+}
+
+/// `Documentation` provides the information for describing a service.
+///
+/// Example:
+/// <pre><code>documentation:
+///   summary: >
+///     The Google Calendar API gives access
+///     to most calendar features.
+///   pages:
+///   - name: Overview
+///     content: &#40;== include google/foo/overview.md ==&#41;
+///   - name: Tutorial
+///     content: &#40;== include google/foo/tutorial.md ==&#41;
+///     subpages;
+///     - name: Java
+///       content: &#40;== include google/foo/tutorial_java.md ==&#41;
+///   rules:
+///   - selector: google.calendar.Calendar.Get
+///     description: >
+///       ...
+///   - selector: google.calendar.Calendar.Put
+///     description: >
+///       ...
+/// </code></pre>
+/// Documentation is provided in markdown syntax. In addition to
+/// standard markdown features, definition lists, tables and fenced
+/// code blocks are supported. Section headers can be provided and are
+/// interpreted relative to the section nesting of the context where
+/// a documentation fragment is embedded.
+///
+/// Documentation from the IDL is merged with documentation defined
+/// via the config at normalization time, where documentation provided
+/// by config rules overrides IDL provided.
+///
+/// A number of constructs specific to the API platform are supported
+/// in documentation text.
+///
+/// In order to reference a proto element, the following
+/// notation can be used:
+/// <pre><code>&#91;fully.qualified.proto.name]&#91;]</code></pre>
+/// To override the display text used for the link, this can be used:
+/// <pre><code>&#91;display text]&#91;fully.qualified.proto.name]</code></pre>
+/// Text can be excluded from doc using the following notation:
+/// <pre><code>&#40;-- internal comment --&#41;</code></pre>
+/// Comments can be made conditional using a visibility label. The below
+/// text will be only rendered if the `BETA` label is available:
+/// <pre><code>&#40;--BETA: comment for BETA users --&#41;</code></pre>
+/// A few directives are available in documentation. Note that
+/// directives must appear on a single line to be properly
+/// identified. The `include` directive includes a markdown file from
+/// an external source:
+/// <pre><code>&#40;== include path/to/file ==&#41;</code></pre>
+/// The `resource_for` directive marks a message to be the resource of
+/// a collection in REST view. If it is not specified, tools attempt
+/// to infer the resource from the operations in a collection:
+/// <pre><code>&#40;== resource_for v1.shelves.books ==&#41;</code></pre>
+/// The directive `suppress_warning` does not directly affect documentation
+/// and is documented together with service config validation.
+class Documentation {
+  /// The URL to the root of documentation.
+  core.String documentationRootUrl;
+
+  /// Declares a single overview page. For example:
+  /// <pre><code>documentation:
+  ///   summary: ...
+  ///   overview: &#40;== include overview.md ==&#41;
+  /// </code></pre>
+  /// This is a shortcut for the following declaration (using pages style):
+  /// <pre><code>documentation:
+  ///   summary: ...
+  ///   pages:
+  ///   - name: Overview
+  ///     content: &#40;== include overview.md ==&#41;
+  /// </code></pre>
+  /// Note: you cannot specify both `overview` field and `pages` field.
+  core.String overview;
+
+  /// The top level pages for the documentation set.
+  core.List<Page> pages;
+
+  /// A list of documentation rules that apply to individual API elements.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<DocumentationRule> rules;
+
+  /// A short summary of what the service does. Can only be provided by
+  /// plain text.
+  core.String summary;
+
+  Documentation();
+
+  Documentation.fromJson(core.Map _json) {
+    if (_json.containsKey("documentationRootUrl")) {
+      documentationRootUrl = _json["documentationRootUrl"];
+    }
+    if (_json.containsKey("overview")) {
+      overview = _json["overview"];
+    }
+    if (_json.containsKey("pages")) {
+      pages = _json["pages"].map((value) => new Page.fromJson(value)).toList();
+    }
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new DocumentationRule.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("summary")) {
+      summary = _json["summary"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (documentationRootUrl != null) {
+      _json["documentationRootUrl"] = documentationRootUrl;
+    }
+    if (overview != null) {
+      _json["overview"] = overview;
+    }
+    if (pages != null) {
+      _json["pages"] = pages.map((value) => (value).toJson()).toList();
+    }
+    if (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    if (summary != null) {
+      _json["summary"] = summary;
+    }
+    return _json;
+  }
+}
+
+/// A documentation rule provides information about individual API elements.
+class DocumentationRule {
+  /// Deprecation description of the selected element(s). It can be provided if
+  /// an
+  /// element is marked as `deprecated`.
+  core.String deprecationDescription;
+
+  /// Description of the selected API(s).
+  core.String description;
+
+  /// The selector is a comma-separated list of patterns. Each pattern is a
+  /// qualified name of the element which may end in "*", indicating a wildcard.
+  /// Wildcards are only allowed at the end and for a whole component of the
+  /// qualified name, i.e. "foo.*" is ok, but not "foo.b*" or "foo.*.bar". To
+  /// specify a default for all applicable elements, the whole pattern "*"
+  /// is used.
+  core.String selector;
+
+  DocumentationRule();
+
+  DocumentationRule.fromJson(core.Map _json) {
+    if (_json.containsKey("deprecationDescription")) {
+      deprecationDescription = _json["deprecationDescription"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (deprecationDescription != null) {
+      _json["deprecationDescription"] = deprecationDescription;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    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;
+  }
+}
+
+/// Request message for EnableService.
+class EnableServiceRequest {
+  EnableServiceRequest();
+
+  EnableServiceRequest.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;
+  }
+}
+
+/// The EnabledState reflects whether the service has been explicitly enabled or
+/// not.
+class EnabledState {
+  /// Whether or not the service has been explicitly enabled.
+  /// Possible string values are:
+  /// - "ENABLED_UNSPECIFIED" : The default value, which indicates that the
+  /// enabled state of the service
+  /// is unknown or unspecified.
+  /// - "DISABLED" : The service has not been made available for use for the
+  /// consumer.
+  /// - "ENABLED" : The service was explicitly enabled for use by a consumer.
+  core.String state;
+
+  EnabledState();
+
+  EnabledState.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;
+  }
+}
+
+/// `Endpoint` describes a network endpoint that serves a set of APIs.
+/// A service may expose any number of endpoints, and all endpoints share the
+/// same service configuration, such as quota configuration and monitoring
+/// configuration.
+///
+/// Example service configuration:
+///
+///     name: library-example.googleapis.com
+///     endpoints:
+///       # Below entry makes 'google.example.library.v1.Library'
+///       # API be served from endpoint address library-example.googleapis.com.
+///       # It also allows HTTP OPTIONS calls to be passed to the backend, for
+///       # it to decide whether the subsequent cross-origin request is
+///       # allowed to proceed.
+///     - name: library-example.googleapis.com
+///       allow_cors: true
+class Endpoint {
+  /// DEPRECATED: This field is no longer supported. Instead of using aliases,
+  /// please specify multiple google.api.Endpoint for each of the intended
+  /// aliases.
+  ///
+  /// Additional names that this endpoint will be hosted on.
+  core.List<core.String> aliases;
+
+  /// Allowing
+  /// [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing), aka
+  /// cross-domain traffic, would allow the backends served from this endpoint
+  /// to
+  /// receive and respond to HTTP OPTIONS requests. The response will be used by
+  /// the browser to determine whether the subsequent cross-origin request is
+  /// allowed to proceed.
+  core.bool allowCors;
+
+  /// The list of features enabled on this endpoint.
+  core.List<core.String> features;
+
+  /// The canonical name of this endpoint.
+  core.String name;
+
+  /// The specification of an Internet routable address of API frontend that
+  /// will
+  /// handle requests to this [API
+  /// Endpoint](https://cloud.google.com/apis/design/glossary).
+  /// It should be either a valid IPv4 address or a fully-qualified domain name.
+  /// For example, "8.8.8.8" or "myservice.appspot.com".
+  core.String target;
+
+  Endpoint();
+
+  Endpoint.fromJson(core.Map _json) {
+    if (_json.containsKey("aliases")) {
+      aliases = _json["aliases"];
+    }
+    if (_json.containsKey("allowCors")) {
+      allowCors = _json["allowCors"];
+    }
+    if (_json.containsKey("features")) {
+      features = _json["features"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("target")) {
+      target = _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 (aliases != null) {
+      _json["aliases"] = aliases;
+    }
+    if (allowCors != null) {
+      _json["allowCors"] = allowCors;
+    }
+    if (features != null) {
+      _json["features"] = features;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (target != null) {
+      _json["target"] = target;
+    }
+    return _json;
+  }
+}
+
+/// Enum type definition.
+class Enum {
+  /// Enum value definitions.
+  core.List<EnumValue> enumvalue;
+
+  /// Enum type name.
+  core.String name;
+
+  /// Protocol buffer options.
+  core.List<Option> options;
+
+  /// The source context.
+  SourceContext sourceContext;
+
+  /// The source syntax.
+  /// Possible string values are:
+  /// - "SYNTAX_PROTO2" : Syntax `proto2`.
+  /// - "SYNTAX_PROTO3" : Syntax `proto3`.
+  core.String syntax;
+
+  Enum();
+
+  Enum.fromJson(core.Map _json) {
+    if (_json.containsKey("enumvalue")) {
+      enumvalue = _json["enumvalue"]
+          .map((value) => new EnumValue.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("options")) {
+      options =
+          _json["options"].map((value) => new Option.fromJson(value)).toList();
+    }
+    if (_json.containsKey("sourceContext")) {
+      sourceContext = new SourceContext.fromJson(_json["sourceContext"]);
+    }
+    if (_json.containsKey("syntax")) {
+      syntax = _json["syntax"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (enumvalue != null) {
+      _json["enumvalue"] = enumvalue.map((value) => (value).toJson()).toList();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (options != null) {
+      _json["options"] = options.map((value) => (value).toJson()).toList();
+    }
+    if (sourceContext != null) {
+      _json["sourceContext"] = (sourceContext).toJson();
+    }
+    if (syntax != null) {
+      _json["syntax"] = syntax;
+    }
+    return _json;
+  }
+}
+
+/// Enum value definition.
+class EnumValue {
+  /// Enum value name.
+  core.String name;
+
+  /// Enum value number.
+  core.int number;
+
+  /// Protocol buffer options.
+  core.List<Option> options;
+
+  EnumValue();
+
+  EnumValue.fromJson(core.Map _json) {
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("number")) {
+      number = _json["number"];
+    }
+    if (_json.containsKey("options")) {
+      options =
+          _json["options"].map((value) => new Option.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 (name != null) {
+      _json["name"] = name;
+    }
+    if (number != null) {
+      _json["number"] = number;
+    }
+    if (options != null) {
+      _json["options"] = options.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Experimental service configuration. These configuration options can
+/// only be used by whitelisted users.
+class Experimental {
+  /// Authorization configuration.
+  AuthorizationConfig authorization;
+
+  Experimental();
+
+  Experimental.fromJson(core.Map _json) {
+    if (_json.containsKey("authorization")) {
+      authorization = new AuthorizationConfig.fromJson(_json["authorization"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (authorization != null) {
+      _json["authorization"] = (authorization).toJson();
+    }
+    return _json;
+  }
+}
+
+/// A single field of a message type.
+class Field {
+  /// The field cardinality.
+  /// Possible string values are:
+  /// - "CARDINALITY_UNKNOWN" : For fields with unknown cardinality.
+  /// - "CARDINALITY_OPTIONAL" : For optional fields.
+  /// - "CARDINALITY_REQUIRED" : For required fields. Proto2 syntax only.
+  /// - "CARDINALITY_REPEATED" : For repeated fields.
+  core.String cardinality;
+
+  /// The string value of the default value of this field. Proto2 syntax only.
+  core.String defaultValue;
+
+  /// The field JSON name.
+  core.String jsonName;
+
+  /// The field type.
+  /// Possible string values are:
+  /// - "TYPE_UNKNOWN" : Field type unknown.
+  /// - "TYPE_DOUBLE" : Field type double.
+  /// - "TYPE_FLOAT" : Field type float.
+  /// - "TYPE_INT64" : Field type int64.
+  /// - "TYPE_UINT64" : Field type uint64.
+  /// - "TYPE_INT32" : Field type int32.
+  /// - "TYPE_FIXED64" : Field type fixed64.
+  /// - "TYPE_FIXED32" : Field type fixed32.
+  /// - "TYPE_BOOL" : Field type bool.
+  /// - "TYPE_STRING" : Field type string.
+  /// - "TYPE_GROUP" : Field type group. Proto2 syntax only, and deprecated.
+  /// - "TYPE_MESSAGE" : Field type message.
+  /// - "TYPE_BYTES" : Field type bytes.
+  /// - "TYPE_UINT32" : Field type uint32.
+  /// - "TYPE_ENUM" : Field type enum.
+  /// - "TYPE_SFIXED32" : Field type sfixed32.
+  /// - "TYPE_SFIXED64" : Field type sfixed64.
+  /// - "TYPE_SINT32" : Field type sint32.
+  /// - "TYPE_SINT64" : Field type sint64.
+  core.String kind;
+
+  /// The field name.
+  core.String name;
+
+  /// The field number.
+  core.int number;
+
+  /// The index of the field type in `Type.oneofs`, for message or enumeration
+  /// types. The first type has index 1; zero means the type is not in the list.
+  core.int oneofIndex;
+
+  /// The protocol buffer options.
+  core.List<Option> options;
+
+  /// Whether to use alternative packed wire representation.
+  core.bool packed;
+
+  /// The field type URL, without the scheme, for message or enumeration
+  /// types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
+  core.String typeUrl;
+
+  Field();
+
+  Field.fromJson(core.Map _json) {
+    if (_json.containsKey("cardinality")) {
+      cardinality = _json["cardinality"];
+    }
+    if (_json.containsKey("defaultValue")) {
+      defaultValue = _json["defaultValue"];
+    }
+    if (_json.containsKey("jsonName")) {
+      jsonName = _json["jsonName"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("number")) {
+      number = _json["number"];
+    }
+    if (_json.containsKey("oneofIndex")) {
+      oneofIndex = _json["oneofIndex"];
+    }
+    if (_json.containsKey("options")) {
+      options =
+          _json["options"].map((value) => new Option.fromJson(value)).toList();
+    }
+    if (_json.containsKey("packed")) {
+      packed = _json["packed"];
+    }
+    if (_json.containsKey("typeUrl")) {
+      typeUrl = _json["typeUrl"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (cardinality != null) {
+      _json["cardinality"] = cardinality;
+    }
+    if (defaultValue != null) {
+      _json["defaultValue"] = defaultValue;
+    }
+    if (jsonName != null) {
+      _json["jsonName"] = jsonName;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (number != null) {
+      _json["number"] = number;
+    }
+    if (oneofIndex != null) {
+      _json["oneofIndex"] = oneofIndex;
+    }
+    if (options != null) {
+      _json["options"] = options.map((value) => (value).toJson()).toList();
+    }
+    if (packed != null) {
+      _json["packed"] = packed;
+    }
+    if (typeUrl != null) {
+      _json["typeUrl"] = typeUrl;
+    }
+    return _json;
+  }
+}
+
+/// `Service` is the root object of Google service configuration schema. It
+/// describes basic information about a service, such as the name and the
+/// title, and delegates other aspects to sub-sections. Each sub-section is
+/// either a proto message or a repeated proto message that configures a
+/// specific aspect, such as auth. See each proto message definition for
+/// details.
+///
+/// Example:
+///
+///     type: google.api.Service
+///     config_version: 3
+///     name: calendar.googleapis.com
+///     title: Google Calendar API
+///     apis:
+///     - name: google.calendar.v3.Calendar
+///     authentication:
+///       providers:
+///       - id: google_calendar_auth
+///         jwks_uri: https://www.googleapis.com/oauth2/v1/certs
+///         issuer: https://securetoken.google.com
+///       rules:
+///       - selector: "*"
+///         requirements:
+///           provider_id: google_calendar_auth
+class GoogleApiService {
+  /// A list of API interfaces exported by this service. Only the `name` field
+  /// of the google.protobuf.Api needs to be provided by the configuration
+  /// author, as the remaining fields will be derived from the IDL during the
+  /// normalization process. It is an error to specify an API interface here
+  /// which cannot be resolved against the associated IDL files.
+  core.List<Api> apis;
+
+  /// Auth configuration.
+  Authentication authentication;
+
+  /// API backend configuration.
+  Backend backend;
+
+  /// Billing configuration.
+  Billing billing;
+
+  /// The semantic version of the service configuration. The config version
+  /// affects the interpretation of the service configuration. For example,
+  /// certain features are enabled by default for certain config versions.
+  /// The latest config version is `3`.
+  core.int configVersion;
+
+  /// Context configuration.
+  Context context;
+
+  /// Configuration for the service control plane.
+  Control control;
+
+  /// Custom error configuration.
+  CustomError customError;
+
+  /// Additional API documentation.
+  Documentation documentation;
+
+  /// Configuration for network endpoints.  If this is empty, then an endpoint
+  /// with the same name as the service is automatically generated to service
+  /// all
+  /// defined APIs.
+  core.List<Endpoint> endpoints;
+
+  /// A list of all enum types included in this API service.  Enums
+  /// referenced directly or indirectly by the `apis` are automatically
+  /// included.  Enums which are not referenced but shall be included
+  /// should be listed here by name. Example:
+  ///
+  ///     enums:
+  ///     - name: google.someapi.v1.SomeEnum
+  core.List<Enum> enums;
+
+  /// Experimental configuration.
+  Experimental experimental;
+
+  /// HTTP configuration.
+  Http http;
+
+  /// A unique ID for a specific instance of this message, typically assigned
+  /// by the client for tracking purpose. If empty, the server may choose to
+  /// generate one instead.
+  core.String id;
+
+  /// Logging configuration.
+  Logging logging;
+
+  /// Defines the logs used by this service.
+  core.List<LogDescriptor> logs;
+
+  /// Defines the metrics used by this service.
+  core.List<MetricDescriptor> metrics;
+
+  /// Defines the monitored resources used by this service. This is required
+  /// by the Service.monitoring and Service.logging configurations.
+  core.List<MonitoredResourceDescriptor> monitoredResources;
+
+  /// Monitoring configuration.
+  Monitoring monitoring;
+
+  /// The DNS address at which this service is available,
+  /// e.g. `calendar.googleapis.com`.
+  core.String name;
+
+  /// The Google project that owns this service.
+  core.String producerProjectId;
+
+  /// Quota configuration.
+  Quota quota;
+
+  /// Output only. The source information for this configuration if available.
+  SourceInfo sourceInfo;
+
+  /// System parameter configuration.
+  SystemParameters systemParameters;
+
+  /// A list of all proto message types included in this API service.
+  /// It serves similar purpose as [google.api.Service.types], except that
+  /// these types are not needed by user-defined APIs. Therefore, they will not
+  /// show up in the generated discovery doc. This field should only be used
+  /// to define system APIs in ESF.
+  core.List<Type> systemTypes;
+
+  /// The product title for this service.
+  core.String title;
+
+  /// A list of all proto message types included in this API service.
+  /// Types referenced directly or indirectly by the `apis` are
+  /// automatically included.  Messages which are not referenced but
+  /// shall be included, such as types used by the `google.protobuf.Any` type,
+  /// should be listed here by name. Example:
+  ///
+  ///     types:
+  ///     - name: google.protobuf.Int32
+  core.List<Type> types;
+
+  /// Configuration controlling usage of this service.
+  Usage usage;
+
+  /// API visibility configuration.
+  Visibility visibility;
+
+  GoogleApiService();
+
+  GoogleApiService.fromJson(core.Map _json) {
+    if (_json.containsKey("apis")) {
+      apis = _json["apis"].map((value) => new Api.fromJson(value)).toList();
+    }
+    if (_json.containsKey("authentication")) {
+      authentication = new Authentication.fromJson(_json["authentication"]);
+    }
+    if (_json.containsKey("backend")) {
+      backend = new Backend.fromJson(_json["backend"]);
+    }
+    if (_json.containsKey("billing")) {
+      billing = new Billing.fromJson(_json["billing"]);
+    }
+    if (_json.containsKey("configVersion")) {
+      configVersion = _json["configVersion"];
+    }
+    if (_json.containsKey("context")) {
+      context = new Context.fromJson(_json["context"]);
+    }
+    if (_json.containsKey("control")) {
+      control = new Control.fromJson(_json["control"]);
+    }
+    if (_json.containsKey("customError")) {
+      customError = new CustomError.fromJson(_json["customError"]);
+    }
+    if (_json.containsKey("documentation")) {
+      documentation = new Documentation.fromJson(_json["documentation"]);
+    }
+    if (_json.containsKey("endpoints")) {
+      endpoints = _json["endpoints"]
+          .map((value) => new Endpoint.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("enums")) {
+      enums = _json["enums"].map((value) => new Enum.fromJson(value)).toList();
+    }
+    if (_json.containsKey("experimental")) {
+      experimental = new Experimental.fromJson(_json["experimental"]);
+    }
+    if (_json.containsKey("http")) {
+      http = new Http.fromJson(_json["http"]);
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("logging")) {
+      logging = new Logging.fromJson(_json["logging"]);
+    }
+    if (_json.containsKey("logs")) {
+      logs = _json["logs"]
+          .map((value) => new LogDescriptor.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("metrics")) {
+      metrics = _json["metrics"]
+          .map((value) => new MetricDescriptor.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("monitoredResources")) {
+      monitoredResources = _json["monitoredResources"]
+          .map((value) => new MonitoredResourceDescriptor.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("monitoring")) {
+      monitoring = new Monitoring.fromJson(_json["monitoring"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("producerProjectId")) {
+      producerProjectId = _json["producerProjectId"];
+    }
+    if (_json.containsKey("quota")) {
+      quota = new Quota.fromJson(_json["quota"]);
+    }
+    if (_json.containsKey("sourceInfo")) {
+      sourceInfo = new SourceInfo.fromJson(_json["sourceInfo"]);
+    }
+    if (_json.containsKey("systemParameters")) {
+      systemParameters =
+          new SystemParameters.fromJson(_json["systemParameters"]);
+    }
+    if (_json.containsKey("systemTypes")) {
+      systemTypes = _json["systemTypes"]
+          .map((value) => new Type.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("title")) {
+      title = _json["title"];
+    }
+    if (_json.containsKey("types")) {
+      types = _json["types"].map((value) => new Type.fromJson(value)).toList();
+    }
+    if (_json.containsKey("usage")) {
+      usage = new Usage.fromJson(_json["usage"]);
+    }
+    if (_json.containsKey("visibility")) {
+      visibility = new Visibility.fromJson(_json["visibility"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (apis != null) {
+      _json["apis"] = apis.map((value) => (value).toJson()).toList();
+    }
+    if (authentication != null) {
+      _json["authentication"] = (authentication).toJson();
+    }
+    if (backend != null) {
+      _json["backend"] = (backend).toJson();
+    }
+    if (billing != null) {
+      _json["billing"] = (billing).toJson();
+    }
+    if (configVersion != null) {
+      _json["configVersion"] = configVersion;
+    }
+    if (context != null) {
+      _json["context"] = (context).toJson();
+    }
+    if (control != null) {
+      _json["control"] = (control).toJson();
+    }
+    if (customError != null) {
+      _json["customError"] = (customError).toJson();
+    }
+    if (documentation != null) {
+      _json["documentation"] = (documentation).toJson();
+    }
+    if (endpoints != null) {
+      _json["endpoints"] = endpoints.map((value) => (value).toJson()).toList();
+    }
+    if (enums != null) {
+      _json["enums"] = enums.map((value) => (value).toJson()).toList();
+    }
+    if (experimental != null) {
+      _json["experimental"] = (experimental).toJson();
+    }
+    if (http != null) {
+      _json["http"] = (http).toJson();
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (logging != null) {
+      _json["logging"] = (logging).toJson();
+    }
+    if (logs != null) {
+      _json["logs"] = logs.map((value) => (value).toJson()).toList();
+    }
+    if (metrics != null) {
+      _json["metrics"] = metrics.map((value) => (value).toJson()).toList();
+    }
+    if (monitoredResources != null) {
+      _json["monitoredResources"] =
+          monitoredResources.map((value) => (value).toJson()).toList();
+    }
+    if (monitoring != null) {
+      _json["monitoring"] = (monitoring).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (producerProjectId != null) {
+      _json["producerProjectId"] = producerProjectId;
+    }
+    if (quota != null) {
+      _json["quota"] = (quota).toJson();
+    }
+    if (sourceInfo != null) {
+      _json["sourceInfo"] = (sourceInfo).toJson();
+    }
+    if (systemParameters != null) {
+      _json["systemParameters"] = (systemParameters).toJson();
+    }
+    if (systemTypes != null) {
+      _json["systemTypes"] =
+          systemTypes.map((value) => (value).toJson()).toList();
+    }
+    if (title != null) {
+      _json["title"] = title;
+    }
+    if (types != null) {
+      _json["types"] = types.map((value) => (value).toJson()).toList();
+    }
+    if (usage != null) {
+      _json["usage"] = (usage).toJson();
+    }
+    if (visibility != null) {
+      _json["visibility"] = (visibility).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Defines the HTTP configuration for an API service. It contains a list of
+/// HttpRule, each specifying the mapping of an RPC method
+/// to one or more HTTP REST API methods.
+class Http {
+  /// When set to true, URL path parmeters will be fully URI-decoded except in
+  /// cases of single segment matches in reserved expansion, where "%2F" will be
+  /// left encoded.
+  ///
+  /// The default behavior is to not decode RFC 6570 reserved characters in
+  /// multi
+  /// segment matches.
+  core.bool fullyDecodeReservedExpansion;
+
+  /// A list of HTTP configuration rules that apply to individual API methods.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<HttpRule> rules;
+
+  Http();
+
+  Http.fromJson(core.Map _json) {
+    if (_json.containsKey("fullyDecodeReservedExpansion")) {
+      fullyDecodeReservedExpansion = _json["fullyDecodeReservedExpansion"];
+    }
+    if (_json.containsKey("rules")) {
+      rules =
+          _json["rules"].map((value) => new HttpRule.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 (fullyDecodeReservedExpansion != null) {
+      _json["fullyDecodeReservedExpansion"] = fullyDecodeReservedExpansion;
+    }
+    if (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// `HttpRule` defines the mapping of an RPC method to one or more HTTP
+/// REST API methods. The mapping specifies how different portions of the RPC
+/// request message are mapped to URL path, URL query parameters, and
+/// HTTP request body. The mapping is typically specified as an
+/// `google.api.http` annotation on the RPC method,
+/// see "google/api/annotations.proto" for details.
+///
+/// The mapping consists of a field specifying the path template and
+/// method kind.  The path template can refer to fields in the request
+/// message, as in the example below which describes a REST GET
+/// operation on a resource collection of messages:
+///
+///
+///     service Messaging {
+///       rpc GetMessage(GetMessageRequest) returns (Message) {
+/// option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}";
+///       }
+///     }
+///     message GetMessageRequest {
+///       message SubMessage {
+///         string subfield = 1;
+///       }
+///       string message_id = 1; // mapped to the URL
+///       SubMessage sub = 2;    // `sub.subfield` is url-mapped
+///     }
+///     message Message {
+///       string text = 1; // content of the resource
+///     }
+///
+/// The same http annotation can alternatively be expressed inside the
+/// `GRPC API Configuration` YAML file.
+///
+///     http:
+///       rules:
+///         - selector: <proto_package_name>.Messaging.GetMessage
+///           get: /v1/messages/{message_id}/{sub.subfield}
+///
+/// This definition enables an automatic, bidrectional mapping of HTTP
+/// JSON to RPC. Example:
+///
+/// HTTP | RPC
+/// -----|-----
+/// `GET /v1/messages/123456/foo`  | `GetMessage(message_id: "123456" sub:
+/// SubMessage(subfield: "foo"))`
+///
+/// In general, not only fields but also field paths can be referenced
+/// from a path pattern. Fields mapped to the path pattern cannot be
+/// repeated and must have a primitive (non-message) type.
+///
+/// Any fields in the request message which are not bound by the path
+/// pattern automatically become (optional) HTTP query
+/// parameters. Assume the following definition of the request message:
+///
+///
+///     service Messaging {
+///       rpc GetMessage(GetMessageRequest) returns (Message) {
+///         option (google.api.http).get = "/v1/messages/{message_id}";
+///       }
+///     }
+///     message GetMessageRequest {
+///       message SubMessage {
+///         string subfield = 1;
+///       }
+///       string message_id = 1; // mapped to the URL
+///       int64 revision = 2;    // becomes a parameter
+///       SubMessage sub = 3;    // `sub.subfield` becomes a parameter
+///     }
+///
+///
+/// This enables a HTTP JSON to RPC mapping as below:
+///
+/// HTTP | RPC
+/// -----|-----
+/// `GET /v1/messages/123456?revision=2&sub.subfield=foo` |
+/// `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield:
+/// "foo"))`
+///
+/// Note that fields which are mapped to HTTP parameters must have a
+/// primitive type or a repeated primitive type. Message types are not
+/// allowed. In the case of a repeated type, the parameter can be
+/// repeated in the URL, as in `...?param=A&param=B`.
+///
+/// For HTTP method kinds which allow a request body, the `body` field
+/// specifies the mapping. Consider a REST update method on the
+/// message resource collection:
+///
+///
+///     service Messaging {
+///       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {
+///         option (google.api.http) = {
+///           put: "/v1/messages/{message_id}"
+///           body: "message"
+///         };
+///       }
+///     }
+///     message UpdateMessageRequest {
+///       string message_id = 1; // mapped to the URL
+///       Message message = 2;   // mapped to the body
+///     }
+///
+///
+/// The following HTTP JSON to RPC mapping is enabled, where the
+/// representation of the JSON in the request body is determined by
+/// protos JSON encoding:
+///
+/// HTTP | RPC
+/// -----|-----
+/// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id:
+/// "123456" message { text: "Hi!" })`
+///
+/// The special name `*` can be used in the body mapping to define that
+/// every field not bound by the path template should be mapped to the
+/// request body.  This enables the following alternative definition of
+/// the update method:
+///
+///     service Messaging {
+///       rpc UpdateMessage(Message) returns (Message) {
+///         option (google.api.http) = {
+///           put: "/v1/messages/{message_id}"
+///           body: "*"
+///         };
+///       }
+///     }
+///     message Message {
+///       string message_id = 1;
+///       string text = 2;
+///     }
+///
+///
+/// The following HTTP JSON to RPC mapping is enabled:
+///
+/// HTTP | RPC
+/// -----|-----
+/// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id:
+/// "123456" text: "Hi!")`
+///
+/// Note that when using `*` in the body mapping, it is not possible to
+/// have HTTP parameters, as all fields not bound by the path end in
+/// the body. This makes this option more rarely used in practice of
+/// defining REST APIs. The common usage of `*` is in custom methods
+/// which don't use the URL at all for transferring data.
+///
+/// It is possible to define multiple HTTP methods for one RPC by using
+/// the `additional_bindings` option. Example:
+///
+///     service Messaging {
+///       rpc GetMessage(GetMessageRequest) returns (Message) {
+///         option (google.api.http) = {
+///           get: "/v1/messages/{message_id}"
+///           additional_bindings {
+///             get: "/v1/users/{user_id}/messages/{message_id}"
+///           }
+///         };
+///       }
+///     }
+///     message GetMessageRequest {
+///       string message_id = 1;
+///       string user_id = 2;
+///     }
+///
+///
+/// This enables the following two alternative HTTP JSON to RPC
+/// mappings:
+///
+/// HTTP | RPC
+/// -----|-----
+/// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")`
+/// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id:
+/// "123456")`
+///
+/// # Rules for HTTP mapping
+///
+/// The rules for mapping HTTP path, query parameters, and body fields
+/// to the request message are as follows:
+///
+/// 1. The `body` field specifies either `*` or a field path, or is
+///    omitted. If omitted, it indicates there is no HTTP request body.
+/// 2. Leaf fields (recursive expansion of nested messages in the
+///    request) can be classified into three types:
+///     (a) Matched in the URL template.
+///     (b) Covered by body (if body is `*`, everything except (a) fields;
+///         else everything under the body field)
+///     (c) All other fields.
+/// 3. URL query parameters found in the HTTP request are mapped to (c) fields.
+/// 4. Any body sent with an HTTP request can contain only (b) fields.
+///
+/// The syntax of the path template is as follows:
+///
+///     Template = "/" Segments [ Verb ] ;
+///     Segments = Segment { "/" Segment } ;
+///     Segment  = "*" | "**" | LITERAL | Variable ;
+///     Variable = "{" FieldPath [ "=" Segments ] "}" ;
+///     FieldPath = IDENT { "." IDENT } ;
+///     Verb     = ":" LITERAL ;
+///
+/// The syntax `*` matches a single path segment. The syntax `**` matches zero
+/// or more path segments, which must be the last part of the path except the
+/// `Verb`. The syntax `LITERAL` matches literal text in the path.
+///
+/// The syntax `Variable` matches part of the URL path as specified by its
+/// template. A variable template must not contain other variables. If a
+/// variable
+/// matches a single path segment, its template may be omitted, e.g. `{var}`
+/// is equivalent to `{var=*}`.
+///
+/// If a variable contains exactly one path segment, such as `"{var}"` or
+/// `"{var=*}"`, when such a variable is expanded into a URL path, all
+/// characters
+/// except `[-_.~0-9a-zA-Z]` are percent-encoded. Such variables show up in the
+/// Discovery Document as `{var}`.
+///
+/// If a variable contains one or more path segments, such as `"{var=foo / * }"`
+/// or `"{var=**}"`, when such a variable is expanded into a URL path, all
+/// characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. Such variables
+/// show up in the Discovery Document as `{+var}`.
+///
+/// NOTE: While the single segment variable matches the semantics of
+/// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2
+/// Simple String Expansion, the multi segment variable **does not** match
+/// RFC 6570 Reserved Expansion. The reason is that the Reserved Expansion
+/// does not expand special characters like `?` and `#`, which would lead
+/// to invalid URLs.
+///
+/// NOTE: the field paths in variables and in the `body` must not refer to
+/// repeated fields or map fields.
+class HttpRule {
+  /// Additional HTTP bindings for the selector. Nested bindings must
+  /// not contain an `additional_bindings` field themselves (that is,
+  /// the nesting may only be one level deep).
+  core.List<HttpRule> additionalBindings;
+
+  /// Specifies the permission(s) required for an API element for the overall
+  /// API request to succeed. It is typically used to mark request message
+  /// fields
+  /// that contain the name of the resource and indicates the permissions that
+  /// will be checked on that resource.
+  core.List<AuthorizationRule> authorizations;
+
+  /// The name of the request field whose value is mapped to the HTTP body, or
+  /// `*` for mapping all fields not captured by the path pattern to the HTTP
+  /// body. NOTE: the referred field must not be a repeated field and must be
+  /// present at the top-level of request message type.
+  core.String body;
+
+  /// The custom pattern is used for specifying an HTTP method that is not
+  /// included in the `pattern` field, such as HEAD, or "*" to leave the
+  /// HTTP method unspecified for this rule. The wild-card rule is useful
+  /// for services that provide content to Web (HTML) clients.
+  CustomHttpPattern custom;
+
+  /// Used for deleting a resource.
+  core.String delete;
+
+  /// Used for listing and getting information about resources.
+  core.String get;
+
+  /// Use this only for Scotty Requests. Do not use this for bytestream methods.
+  /// For media support, add instead [][google.bytestream.RestByteStream] as an
+  /// API to your configuration.
+  MediaDownload mediaDownload;
+
+  /// Use this only for Scotty Requests. Do not use this for media support using
+  /// Bytestream, add instead
+  /// [][google.bytestream.RestByteStream] as an API to your
+  /// configuration for Bytestream methods.
+  MediaUpload mediaUpload;
+
+  /// Used for updating a resource.
+  core.String patch;
+
+  /// Used for creating a resource.
+  core.String post;
+
+  /// Used for updating a resource.
+  core.String put;
+
+  /// DO NOT USE. This is an experimental field.
+  ///
+  /// Optional. The REST collection name is by default derived from the URL
+  /// pattern. If specified, this field overrides the default collection name.
+  /// Example:
+  ///
+  ///     rpc AddressesAggregatedList(AddressesAggregatedListRequest)
+  ///         returns (AddressesAggregatedListResponse) {
+  ///       option (google.api.http) = {
+  ///         get: "/v1/projects/{project_id}/aggregated/addresses"
+  ///         rest_collection: "projects.addresses"
+  ///       };
+  ///     }
+  ///
+  /// This method has the automatically derived collection name
+  /// "projects.aggregated". Because, semantically, this rpc is actually an
+  /// operation on the "projects.addresses" collection, the `rest_collection`
+  /// field is configured to override the derived collection name.
+  core.String restCollection;
+
+  /// DO NOT USE. This is an experimental field.
+  ///
+  /// Optional. The rest method name is by default derived from the URL
+  /// pattern. If specified, this field overrides the default method name.
+  /// Example:
+  ///
+  ///     rpc CreateResource(CreateResourceRequest)
+  ///         returns (CreateResourceResponse) {
+  ///       option (google.api.http) = {
+  ///         post: "/v1/resources",
+  ///         body: "resource",
+  ///         rest_method_name: "insert"
+  ///       };
+  ///     }
+  ///
+  /// This method has the automatically derived rest method name
+  /// "create", but for backwards compatibility with apiary, it is specified as
+  /// insert.
+  core.String restMethodName;
+
+  /// Selects methods to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  HttpRule();
+
+  HttpRule.fromJson(core.Map _json) {
+    if (_json.containsKey("additionalBindings")) {
+      additionalBindings = _json["additionalBindings"]
+          .map((value) => new HttpRule.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("authorizations")) {
+      authorizations = _json["authorizations"]
+          .map((value) => new AuthorizationRule.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("body")) {
+      body = _json["body"];
+    }
+    if (_json.containsKey("custom")) {
+      custom = new CustomHttpPattern.fromJson(_json["custom"]);
+    }
+    if (_json.containsKey("delete")) {
+      delete = _json["delete"];
+    }
+    if (_json.containsKey("get")) {
+      get = _json["get"];
+    }
+    if (_json.containsKey("mediaDownload")) {
+      mediaDownload = new MediaDownload.fromJson(_json["mediaDownload"]);
+    }
+    if (_json.containsKey("mediaUpload")) {
+      mediaUpload = new MediaUpload.fromJson(_json["mediaUpload"]);
+    }
+    if (_json.containsKey("patch")) {
+      patch = _json["patch"];
+    }
+    if (_json.containsKey("post")) {
+      post = _json["post"];
+    }
+    if (_json.containsKey("put")) {
+      put = _json["put"];
+    }
+    if (_json.containsKey("restCollection")) {
+      restCollection = _json["restCollection"];
+    }
+    if (_json.containsKey("restMethodName")) {
+      restMethodName = _json["restMethodName"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (additionalBindings != null) {
+      _json["additionalBindings"] =
+          additionalBindings.map((value) => (value).toJson()).toList();
+    }
+    if (authorizations != null) {
+      _json["authorizations"] =
+          authorizations.map((value) => (value).toJson()).toList();
+    }
+    if (body != null) {
+      _json["body"] = body;
+    }
+    if (custom != null) {
+      _json["custom"] = (custom).toJson();
+    }
+    if (delete != null) {
+      _json["delete"] = delete;
+    }
+    if (get != null) {
+      _json["get"] = get;
+    }
+    if (mediaDownload != null) {
+      _json["mediaDownload"] = (mediaDownload).toJson();
+    }
+    if (mediaUpload != null) {
+      _json["mediaUpload"] = (mediaUpload).toJson();
+    }
+    if (patch != null) {
+      _json["patch"] = patch;
+    }
+    if (post != null) {
+      _json["post"] = post;
+    }
+    if (put != null) {
+      _json["put"] = put;
+    }
+    if (restCollection != null) {
+      _json["restCollection"] = restCollection;
+    }
+    if (restMethodName != null) {
+      _json["restMethodName"] = restMethodName;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// A description of a label.
+class LabelDescriptor {
+  /// A human-readable description for the label.
+  core.String description;
+
+  /// The label key.
+  core.String key;
+
+  /// The type of data that can be assigned to the label.
+  /// Possible string values are:
+  /// - "STRING" : A variable-length string. This is the default.
+  /// - "BOOL" : Boolean; true or false.
+  /// - "INT64" : A 64-bit signed integer.
+  core.String valueType;
+
+  LabelDescriptor();
+
+  LabelDescriptor.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("key")) {
+      key = _json["key"];
+    }
+    if (_json.containsKey("valueType")) {
+      valueType = _json["valueType"];
+    }
+  }
+
+  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 (key != null) {
+      _json["key"] = key;
+    }
+    if (valueType != null) {
+      _json["valueType"] = valueType;
+    }
+    return _json;
+  }
+}
+
+/// Response message for ListEnabledServices.
+class ListEnabledServicesResponse {
+  /// Token that can be passed to `ListEnabledServices` to resume a paginated
+  /// query.
+  core.String nextPageToken;
+
+  /// The state of the enabled services for the requested parent.
+  core.List<ServiceState> services;
+
+  ListEnabledServicesResponse();
+
+  ListEnabledServicesResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("services")) {
+      services = _json["services"]
+          .map((value) => new ServiceState.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 (services != null) {
+      _json["services"] = services.map((value) => (value).toJson()).toList();
+    }
+    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;
+  }
+}
+
+/// A description of a log type. Example in YAML format:
+///
+///     - name: library.googleapis.com/activity_history
+///       description: The history of borrowing and returning library items.
+///       display_name: Activity
+///       labels:
+///       - key: /customer_id
+///         description: Identifier of a library customer
+class LogDescriptor {
+  /// A human-readable description of this log. This information appears in
+  /// the documentation and can contain details.
+  core.String description;
+
+  /// The human-readable name for this log. This information appears on
+  /// the user interface and should be concise.
+  core.String displayName;
+
+  /// The set of labels that are available to describe a specific log entry.
+  /// Runtime requests that contain labels not specified here are
+  /// considered invalid.
+  core.List<LabelDescriptor> labels;
+
+  /// The name of the log. It must be less than 512 characters long and can
+  /// include the following characters: upper- and lower-case alphanumeric
+  /// characters [A-Za-z0-9], and punctuation characters including
+  /// slash, underscore, hyphen, period [/_-.].
+  core.String name;
+
+  LogDescriptor();
+
+  LogDescriptor.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("displayName")) {
+      displayName = _json["displayName"];
+    }
+    if (_json.containsKey("labels")) {
+      labels = _json["labels"]
+          .map((value) => new LabelDescriptor.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 (description != null) {
+      _json["description"] = description;
+    }
+    if (displayName != null) {
+      _json["displayName"] = displayName;
+    }
+    if (labels != null) {
+      _json["labels"] = labels.map((value) => (value).toJson()).toList();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+/// Logging configuration of the service.
+///
+/// The following example shows how to configure logs to be sent to the
+/// producer and consumer projects. In the example, the `activity_history`
+/// log is sent to both the producer and consumer projects, whereas the
+/// `purchase_history` log is only sent to the producer project.
+///
+///     monitored_resources:
+///     - type: library.googleapis.com/branch
+///       labels:
+///       - key: /city
+///         description: The city where the library branch is located in.
+///       - key: /name
+///         description: The name of the branch.
+///     logs:
+///     - name: activity_history
+///       labels:
+///       - key: /customer_id
+///     - name: purchase_history
+///     logging:
+///       producer_destinations:
+///       - monitored_resource: library.googleapis.com/branch
+///         logs:
+///         - activity_history
+///         - purchase_history
+///       consumer_destinations:
+///       - monitored_resource: library.googleapis.com/branch
+///         logs:
+///         - activity_history
+class Logging {
+  /// Logging configurations for sending logs to the consumer project.
+  /// There can be multiple consumer destinations, each one must have a
+  /// different monitored resource type. A log can be used in at most
+  /// one consumer destination.
+  core.List<LoggingDestination> consumerDestinations;
+
+  /// Logging configurations for sending logs to the producer project.
+  /// There can be multiple producer destinations, each one must have a
+  /// different monitored resource type. A log can be used in at most
+  /// one producer destination.
+  core.List<LoggingDestination> producerDestinations;
+
+  Logging();
+
+  Logging.fromJson(core.Map _json) {
+    if (_json.containsKey("consumerDestinations")) {
+      consumerDestinations = _json["consumerDestinations"]
+          .map((value) => new LoggingDestination.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("producerDestinations")) {
+      producerDestinations = _json["producerDestinations"]
+          .map((value) => new LoggingDestination.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 (consumerDestinations != null) {
+      _json["consumerDestinations"] =
+          consumerDestinations.map((value) => (value).toJson()).toList();
+    }
+    if (producerDestinations != null) {
+      _json["producerDestinations"] =
+          producerDestinations.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Configuration of a specific logging destination (the producer project
+/// or the consumer project).
+class LoggingDestination {
+  /// Names of the logs to be sent to this destination. Each name must
+  /// be defined in the Service.logs section. If the log name is
+  /// not a domain scoped name, it will be automatically prefixed with
+  /// the service name followed by "/".
+  core.List<core.String> logs;
+
+  /// The monitored resource type. The type must be defined in the
+  /// Service.monitored_resources section.
+  core.String monitoredResource;
+
+  LoggingDestination();
+
+  LoggingDestination.fromJson(core.Map _json) {
+    if (_json.containsKey("logs")) {
+      logs = _json["logs"];
+    }
+    if (_json.containsKey("monitoredResource")) {
+      monitoredResource = _json["monitoredResource"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (logs != null) {
+      _json["logs"] = logs;
+    }
+    if (monitoredResource != null) {
+      _json["monitoredResource"] = monitoredResource;
+    }
+    return _json;
+  }
+}
+
+/// Defines the Media configuration for a service in case of a download.
+/// Use this only for Scotty Requests. Do not use this for media support using
+/// Bytestream, add instead [][google.bytestream.RestByteStream] as an API to
+/// your configuration for Bytestream methods.
+class MediaDownload {
+  /// A boolean that determines whether a notification for the completion of a
+  /// download should be sent to the backend.
+  core.bool completeNotification;
+
+  /// DO NOT USE FIELDS BELOW THIS LINE UNTIL THIS WARNING IS REMOVED.
+  ///
+  /// Specify name of the download service if one is used for download.
+  core.String downloadService;
+
+  /// Name of the Scotty dropzone to use for the current API.
+  core.String dropzone;
+
+  /// Whether download is enabled.
+  core.bool enabled;
+
+  /// Optional maximum acceptable size for direct download.
+  /// The size is specified in bytes.
+  core.String maxDirectDownloadSize;
+
+  /// A boolean that determines if direct download from ESF should be used for
+  /// download of this media.
+  core.bool useDirectDownload;
+
+  MediaDownload();
+
+  MediaDownload.fromJson(core.Map _json) {
+    if (_json.containsKey("completeNotification")) {
+      completeNotification = _json["completeNotification"];
+    }
+    if (_json.containsKey("downloadService")) {
+      downloadService = _json["downloadService"];
+    }
+    if (_json.containsKey("dropzone")) {
+      dropzone = _json["dropzone"];
+    }
+    if (_json.containsKey("enabled")) {
+      enabled = _json["enabled"];
+    }
+    if (_json.containsKey("maxDirectDownloadSize")) {
+      maxDirectDownloadSize = _json["maxDirectDownloadSize"];
+    }
+    if (_json.containsKey("useDirectDownload")) {
+      useDirectDownload = _json["useDirectDownload"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (completeNotification != null) {
+      _json["completeNotification"] = completeNotification;
+    }
+    if (downloadService != null) {
+      _json["downloadService"] = downloadService;
+    }
+    if (dropzone != null) {
+      _json["dropzone"] = dropzone;
+    }
+    if (enabled != null) {
+      _json["enabled"] = enabled;
+    }
+    if (maxDirectDownloadSize != null) {
+      _json["maxDirectDownloadSize"] = maxDirectDownloadSize;
+    }
+    if (useDirectDownload != null) {
+      _json["useDirectDownload"] = useDirectDownload;
+    }
+    return _json;
+  }
+}
+
+/// Defines the Media configuration for a service in case of an upload.
+/// Use this only for Scotty Requests. Do not use this for media support using
+/// Bytestream, add instead [][google.bytestream.RestByteStream] as an API to
+/// your configuration for Bytestream methods.
+class MediaUpload {
+  /// A boolean that determines whether a notification for the completion of an
+  /// upload should be sent to the backend. These notifications will not be seen
+  /// by the client and will not consume quota.
+  core.bool completeNotification;
+
+  /// Name of the Scotty dropzone to use for the current API.
+  core.String dropzone;
+
+  /// Whether upload is enabled.
+  core.bool enabled;
+
+  /// Optional maximum acceptable size for an upload.
+  /// The size is specified in bytes.
+  core.String maxSize;
+
+  /// An array of mimetype patterns. Esf will only accept uploads that match one
+  /// of the given patterns.
+  core.List<core.String> mimeTypes;
+
+  /// Whether to receive a notification for progress changes of media upload.
+  core.bool progressNotification;
+
+  /// Whether to receive a notification on the start of media upload.
+  core.bool startNotification;
+
+  /// DO NOT USE FIELDS BELOW THIS LINE UNTIL THIS WARNING IS REMOVED.
+  ///
+  /// Specify name of the upload service if one is used for upload.
+  core.String uploadService;
+
+  MediaUpload();
+
+  MediaUpload.fromJson(core.Map _json) {
+    if (_json.containsKey("completeNotification")) {
+      completeNotification = _json["completeNotification"];
+    }
+    if (_json.containsKey("dropzone")) {
+      dropzone = _json["dropzone"];
+    }
+    if (_json.containsKey("enabled")) {
+      enabled = _json["enabled"];
+    }
+    if (_json.containsKey("maxSize")) {
+      maxSize = _json["maxSize"];
+    }
+    if (_json.containsKey("mimeTypes")) {
+      mimeTypes = _json["mimeTypes"];
+    }
+    if (_json.containsKey("progressNotification")) {
+      progressNotification = _json["progressNotification"];
+    }
+    if (_json.containsKey("startNotification")) {
+      startNotification = _json["startNotification"];
+    }
+    if (_json.containsKey("uploadService")) {
+      uploadService = _json["uploadService"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (completeNotification != null) {
+      _json["completeNotification"] = completeNotification;
+    }
+    if (dropzone != null) {
+      _json["dropzone"] = dropzone;
+    }
+    if (enabled != null) {
+      _json["enabled"] = enabled;
+    }
+    if (maxSize != null) {
+      _json["maxSize"] = maxSize;
+    }
+    if (mimeTypes != null) {
+      _json["mimeTypes"] = mimeTypes;
+    }
+    if (progressNotification != null) {
+      _json["progressNotification"] = progressNotification;
+    }
+    if (startNotification != null) {
+      _json["startNotification"] = startNotification;
+    }
+    if (uploadService != null) {
+      _json["uploadService"] = uploadService;
+    }
+    return _json;
+  }
+}
+
+/// Method represents a method of an API interface.
+class Method {
+  /// The simple name of this method.
+  core.String name;
+
+  /// Any metadata attached to the method.
+  core.List<Option> options;
+
+  /// If true, the request is streamed.
+  core.bool requestStreaming;
+
+  /// A URL of the input message type.
+  core.String requestTypeUrl;
+
+  /// If true, the response is streamed.
+  core.bool responseStreaming;
+
+  /// The URL of the output message type.
+  core.String responseTypeUrl;
+
+  /// The source syntax of this method.
+  /// Possible string values are:
+  /// - "SYNTAX_PROTO2" : Syntax `proto2`.
+  /// - "SYNTAX_PROTO3" : Syntax `proto3`.
+  core.String syntax;
+
+  Method();
+
+  Method.fromJson(core.Map _json) {
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("options")) {
+      options =
+          _json["options"].map((value) => new Option.fromJson(value)).toList();
+    }
+    if (_json.containsKey("requestStreaming")) {
+      requestStreaming = _json["requestStreaming"];
+    }
+    if (_json.containsKey("requestTypeUrl")) {
+      requestTypeUrl = _json["requestTypeUrl"];
+    }
+    if (_json.containsKey("responseStreaming")) {
+      responseStreaming = _json["responseStreaming"];
+    }
+    if (_json.containsKey("responseTypeUrl")) {
+      responseTypeUrl = _json["responseTypeUrl"];
+    }
+    if (_json.containsKey("syntax")) {
+      syntax = _json["syntax"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (options != null) {
+      _json["options"] = options.map((value) => (value).toJson()).toList();
+    }
+    if (requestStreaming != null) {
+      _json["requestStreaming"] = requestStreaming;
+    }
+    if (requestTypeUrl != null) {
+      _json["requestTypeUrl"] = requestTypeUrl;
+    }
+    if (responseStreaming != null) {
+      _json["responseStreaming"] = responseStreaming;
+    }
+    if (responseTypeUrl != null) {
+      _json["responseTypeUrl"] = responseTypeUrl;
+    }
+    if (syntax != null) {
+      _json["syntax"] = syntax;
+    }
+    return _json;
+  }
+}
+
+/// Defines a metric type and its schema. Once a metric descriptor is created,
+/// deleting or altering it stops data collection and makes the metric type's
+/// existing data unusable.
+class MetricDescriptor {
+  /// A detailed description of the metric, which can be used in documentation.
+  core.String description;
+
+  /// A concise name for the metric, which can be displayed in user interfaces.
+  /// Use sentence case without an ending period, for example "Request count".
+  /// This field is optional but it is recommended to be set for any metrics
+  /// associated with user-visible concepts, such as Quota.
+  core.String displayName;
+
+  /// The set of labels that can be used to describe a specific
+  /// instance of this metric type. For example, the
+  /// `appengine.googleapis.com/http/server/response_latencies` metric
+  /// type has a label for the HTTP response code, `response_code`, so
+  /// you can look at latencies for successful responses or just
+  /// for responses that failed.
+  core.List<LabelDescriptor> labels;
+
+  /// Whether the metric records instantaneous values, changes to a value, etc.
+  /// Some combinations of `metric_kind` and `value_type` might not be
+  /// supported.
+  /// Possible string values are:
+  /// - "METRIC_KIND_UNSPECIFIED" : Do not use this default value.
+  /// - "GAUGE" : An instantaneous measurement of a value.
+  /// - "DELTA" : The change in a value during a time interval.
+  /// - "CUMULATIVE" : A value accumulated over a time interval.  Cumulative
+  /// measurements in a time series should have the same start time
+  /// and increasing end times, until an event resets the cumulative
+  /// value to zero and sets a new start time for the following
+  /// points.
+  core.String metricKind;
+
+  /// The resource name of the metric descriptor.
+  core.String name;
+
+  /// The metric type, including its DNS name prefix. The type is not
+  /// URL-encoded.  All user-defined custom metric types have the DNS name
+  /// `custom.googleapis.com`.  Metric types should use a natural hierarchical
+  /// grouping. For example:
+  ///
+  ///     "custom.googleapis.com/invoice/paid/amount"
+  ///     "appengine.googleapis.com/http/server/response_latencies"
+  core.String type;
+
+  /// The unit in which the metric value is reported. It is only applicable
+  /// if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The
+  /// supported units are a subset of [The Unified Code for Units of
+  /// Measure](http://unitsofmeasure.org/ucum.html) standard:
+  ///
+  /// **Basic units (UNIT)**
+  ///
+  /// * `bit`   bit
+  /// * `By`    byte
+  /// * `s`     second
+  /// * `min`   minute
+  /// * `h`     hour
+  /// * `d`     day
+  ///
+  /// **Prefixes (PREFIX)**
+  ///
+  /// * `k`     kilo    (10**3)
+  /// * `M`     mega    (10**6)
+  /// * `G`     giga    (10**9)
+  /// * `T`     tera    (10**12)
+  /// * `P`     peta    (10**15)
+  /// * `E`     exa     (10**18)
+  /// * `Z`     zetta   (10**21)
+  /// * `Y`     yotta   (10**24)
+  /// * `m`     milli   (10**-3)
+  /// * `u`     micro   (10**-6)
+  /// * `n`     nano    (10**-9)
+  /// * `p`     pico    (10**-12)
+  /// * `f`     femto   (10**-15)
+  /// * `a`     atto    (10**-18)
+  /// * `z`     zepto   (10**-21)
+  /// * `y`     yocto   (10**-24)
+  /// * `Ki`    kibi    (2**10)
+  /// * `Mi`    mebi    (2**20)
+  /// * `Gi`    gibi    (2**30)
+  /// * `Ti`    tebi    (2**40)
+  ///
+  /// **Grammar**
+  ///
+  /// The grammar also includes these connectors:
+  ///
+  /// * `/`    division (as an infix operator, e.g. `1/s`).
+  /// * `.`    multiplication (as an infix operator, e.g. `GBy.d`)
+  ///
+  /// The grammar for a unit is as follows:
+  ///
+  ///     Expression = Component { "." Component } { "/" Component } ;
+  ///
+  ///     Component = ( [ PREFIX ] UNIT | "%" ) [ Annotation ]
+  ///               | Annotation
+  ///               | "1"
+  ///               ;
+  ///
+  ///     Annotation = "{" NAME "}" ;
+  ///
+  /// Notes:
+  ///
+  /// * `Annotation` is just a comment if it follows a `UNIT` and is
+  ///    equivalent to `1` if it is used alone. For examples,
+  ///    `{requests}/s == 1/s`, `By{transmitted}/s == By/s`.
+  /// * `NAME` is a sequence of non-blank printable ASCII characters not
+  ///    containing '{' or '}'.
+  /// * `1` represents dimensionless value 1, such as in `1/s`.
+  /// * `%` represents dimensionless value 1/100, and annotates values giving
+  ///    a percentage.
+  core.String unit;
+
+  /// Whether the measurement is an integer, a floating-point number, etc.
+  /// Some combinations of `metric_kind` and `value_type` might not be
+  /// supported.
+  /// Possible string values are:
+  /// - "VALUE_TYPE_UNSPECIFIED" : Do not use this default value.
+  /// - "BOOL" : The value is a boolean.
+  /// This value type can be used only if the metric kind is `GAUGE`.
+  /// - "INT64" : The value is a signed 64-bit integer.
+  /// - "DOUBLE" : The value is a double precision floating point number.
+  /// - "STRING" : The value is a text string.
+  /// This value type can be used only if the metric kind is `GAUGE`.
+  /// - "DISTRIBUTION" : The value is a `Distribution`.
+  /// - "MONEY" : The value is money.
+  core.String valueType;
+
+  MetricDescriptor();
+
+  MetricDescriptor.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("displayName")) {
+      displayName = _json["displayName"];
+    }
+    if (_json.containsKey("labels")) {
+      labels = _json["labels"]
+          .map((value) => new LabelDescriptor.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("metricKind")) {
+      metricKind = _json["metricKind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    if (_json.containsKey("unit")) {
+      unit = _json["unit"];
+    }
+    if (_json.containsKey("valueType")) {
+      valueType = _json["valueType"];
+    }
+  }
+
+  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 (displayName != null) {
+      _json["displayName"] = displayName;
+    }
+    if (labels != null) {
+      _json["labels"] = labels.map((value) => (value).toJson()).toList();
+    }
+    if (metricKind != null) {
+      _json["metricKind"] = metricKind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (unit != null) {
+      _json["unit"] = unit;
+    }
+    if (valueType != null) {
+      _json["valueType"] = valueType;
+    }
+    return _json;
+  }
+}
+
+/// Bind API methods to metrics. Binding a method to a metric causes that
+/// metric's configured quota behaviors to apply to the method call.
+class MetricRule {
+  /// Metrics to update when the selected methods are called, and the associated
+  /// cost applied to each metric.
+  ///
+  /// The key of the map is the metric name, and the values are the amount
+  /// increased for the metric against which the quota limits are defined.
+  /// The value must not be negative.
+  core.Map<core.String, core.String> metricCosts;
+
+  /// Selects the methods to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  MetricRule();
+
+  MetricRule.fromJson(core.Map _json) {
+    if (_json.containsKey("metricCosts")) {
+      metricCosts = _json["metricCosts"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (metricCosts != null) {
+      _json["metricCosts"] = metricCosts;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// Declares an API Interface to be included in this interface. The including
+/// interface must redeclare all the methods from the included interface, but
+/// documentation and options are inherited as follows:
+///
+/// - If after comment and whitespace stripping, the documentation
+///   string of the redeclared method is empty, it will be inherited
+///   from the original method.
+///
+/// - Each annotation belonging to the service config (http,
+///   visibility) which is not set in the redeclared method will be
+///   inherited.
+///
+/// - If an http annotation is inherited, the path pattern will be
+///   modified as follows. Any version prefix will be replaced by the
+///   version of the including interface plus the root path if
+///   specified.
+///
+/// Example of a simple mixin:
+///
+///     package google.acl.v1;
+///     service AccessControl {
+///       // Get the underlying ACL object.
+///       rpc GetAcl(GetAclRequest) returns (Acl) {
+///         option (google.api.http).get = "/v1/{resource=**}:getAcl";
+///       }
+///     }
+///
+///     package google.storage.v2;
+///     service Storage {
+///       //       rpc GetAcl(GetAclRequest) returns (Acl);
+///
+///       // Get a data record.
+///       rpc GetData(GetDataRequest) returns (Data) {
+///         option (google.api.http).get = "/v2/{resource=**}";
+///       }
+///     }
+///
+/// Example of a mixin configuration:
+///
+///     apis:
+///     - name: google.storage.v2.Storage
+///       mixins:
+///       - name: google.acl.v1.AccessControl
+///
+/// The mixin construct implies that all methods in `AccessControl` are
+/// also declared with same name and request/response types in
+/// `Storage`. A documentation generator or annotation processor will
+/// see the effective `Storage.GetAcl` method after inherting
+/// documentation and annotations as follows:
+///
+///     service Storage {
+///       // Get the underlying ACL object.
+///       rpc GetAcl(GetAclRequest) returns (Acl) {
+///         option (google.api.http).get = "/v2/{resource=**}:getAcl";
+///       }
+///       ...
+///     }
+///
+/// Note how the version in the path pattern changed from `v1` to `v2`.
+///
+/// If the `root` field in the mixin is specified, it should be a
+/// relative path under which inherited HTTP paths are placed. Example:
+///
+///     apis:
+///     - name: google.storage.v2.Storage
+///       mixins:
+///       - name: google.acl.v1.AccessControl
+///         root: acls
+///
+/// This implies the following inherited HTTP annotation:
+///
+///     service Storage {
+///       // Get the underlying ACL object.
+///       rpc GetAcl(GetAclRequest) returns (Acl) {
+///         option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
+///       }
+///       ...
+///     }
+class Mixin {
+  /// The fully qualified name of the interface which is included.
+  core.String name;
+
+  /// If non-empty specifies a path under which inherited HTTP paths
+  /// are rooted.
+  core.String root;
+
+  Mixin();
+
+  Mixin.fromJson(core.Map _json) {
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("root")) {
+      root = _json["root"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (root != null) {
+      _json["root"] = root;
+    }
+    return _json;
+  }
+}
+
+/// An object that describes the schema of a MonitoredResource object using a
+/// type name and a set of labels.  For example, the monitored resource
+/// descriptor for Google Compute Engine VM instances has a type of
+/// `"gce_instance"` and specifies the use of the labels `"instance_id"` and
+/// `"zone"` to identify particular VM instances.
+///
+/// Different APIs can support different monitored resource types. APIs
+/// generally
+/// provide a `list` method that returns the monitored resource descriptors used
+/// by the API.
+class MonitoredResourceDescriptor {
+  /// Optional. A detailed description of the monitored resource type that might
+  /// be used in documentation.
+  core.String description;
+
+  /// Optional. A concise name for the monitored resource type that might be
+  /// displayed in user interfaces. It should be a Title Cased Noun Phrase,
+  /// without any article or other determiners. For example,
+  /// `"Google Cloud SQL Database"`.
+  core.String displayName;
+
+  /// Required. A set of labels used to describe instances of this monitored
+  /// resource type. For example, an individual Google Cloud SQL database is
+  /// identified by values for the labels `"database_id"` and `"zone"`.
+  core.List<LabelDescriptor> labels;
+
+  /// Optional. The resource name of the monitored resource descriptor:
+  /// `"projects/{project_id}/monitoredResourceDescriptors/{type}"` where
+  /// {type} is the value of the `type` field in this object and
+  /// {project_id} is a project ID that provides API-specific context for
+  /// accessing the type.  APIs that do not use project information can use the
+  /// resource name format `"monitoredResourceDescriptors/{type}"`.
+  core.String name;
+
+  /// Required. The monitored resource type. For example, the type
+  /// `"cloudsql_database"` represents databases in Google Cloud SQL.
+  /// The maximum length of this value is 256 characters.
+  core.String type;
+
+  MonitoredResourceDescriptor();
+
+  MonitoredResourceDescriptor.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("displayName")) {
+      displayName = _json["displayName"];
+    }
+    if (_json.containsKey("labels")) {
+      labels = _json["labels"]
+          .map((value) => new LabelDescriptor.fromJson(value))
+          .toList();
+    }
+    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 (description != null) {
+      _json["description"] = description;
+    }
+    if (displayName != null) {
+      _json["displayName"] = displayName;
+    }
+    if (labels != null) {
+      _json["labels"] = labels.map((value) => (value).toJson()).toList();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+/// Monitoring configuration of the service.
+///
+/// The example below shows how to configure monitored resources and metrics
+/// for monitoring. In the example, a monitored resource and two metrics are
+/// defined. The `library.googleapis.com/book/returned_count` metric is sent
+/// to both producer and consumer projects, whereas the
+/// `library.googleapis.com/book/overdue_count` metric is only sent to the
+/// consumer project.
+///
+///     monitored_resources:
+///     - type: library.googleapis.com/branch
+///       labels:
+///       - key: /city
+///         description: The city where the library branch is located in.
+///       - key: /name
+///         description: The name of the branch.
+///     metrics:
+///     - name: library.googleapis.com/book/returned_count
+///       metric_kind: DELTA
+///       value_type: INT64
+///       labels:
+///       - key: /customer_id
+///     - name: library.googleapis.com/book/overdue_count
+///       metric_kind: GAUGE
+///       value_type: INT64
+///       labels:
+///       - key: /customer_id
+///     monitoring:
+///       producer_destinations:
+///       - monitored_resource: library.googleapis.com/branch
+///         metrics:
+///         - library.googleapis.com/book/returned_count
+///       consumer_destinations:
+///       - monitored_resource: library.googleapis.com/branch
+///         metrics:
+///         - library.googleapis.com/book/returned_count
+///         - library.googleapis.com/book/overdue_count
+class Monitoring {
+  /// Monitoring configurations for sending metrics to the consumer project.
+  /// There can be multiple consumer destinations, each one must have a
+  /// different monitored resource type. A metric can be used in at most
+  /// one consumer destination.
+  core.List<MonitoringDestination> consumerDestinations;
+
+  /// Monitoring configurations for sending metrics to the producer project.
+  /// There can be multiple producer destinations, each one must have a
+  /// different monitored resource type. A metric can be used in at most
+  /// one producer destination.
+  core.List<MonitoringDestination> producerDestinations;
+
+  Monitoring();
+
+  Monitoring.fromJson(core.Map _json) {
+    if (_json.containsKey("consumerDestinations")) {
+      consumerDestinations = _json["consumerDestinations"]
+          .map((value) => new MonitoringDestination.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("producerDestinations")) {
+      producerDestinations = _json["producerDestinations"]
+          .map((value) => new MonitoringDestination.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 (consumerDestinations != null) {
+      _json["consumerDestinations"] =
+          consumerDestinations.map((value) => (value).toJson()).toList();
+    }
+    if (producerDestinations != null) {
+      _json["producerDestinations"] =
+          producerDestinations.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Configuration of a specific monitoring destination (the producer project
+/// or the consumer project).
+class MonitoringDestination {
+  /// Names of the metrics to report to this monitoring destination.
+  /// Each name must be defined in Service.metrics section.
+  core.List<core.String> metrics;
+
+  /// The monitored resource type. The type must be defined in
+  /// Service.monitored_resources section.
+  core.String monitoredResource;
+
+  MonitoringDestination();
+
+  MonitoringDestination.fromJson(core.Map _json) {
+    if (_json.containsKey("metrics")) {
+      metrics = _json["metrics"];
+    }
+    if (_json.containsKey("monitoredResource")) {
+      monitoredResource = _json["monitoredResource"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (metrics != null) {
+      _json["metrics"] = metrics;
+    }
+    if (monitoredResource != null) {
+      _json["monitoredResource"] = monitoredResource;
+    }
+    return _json;
+  }
+}
+
+/// OAuth scopes are a way to define data and permissions on data. For example,
+/// there are scopes defined for "Read-only access to Google Calendar" and
+/// "Access to Cloud Platform". Users can consent to a scope for an application,
+/// giving it permission to access that data on their behalf.
+///
+/// OAuth scope specifications should be fairly coarse grained; a user will need
+/// to see and understand the text description of what your scope means.
+///
+/// In most cases: use one or at most two OAuth scopes for an entire family of
+/// products. If your product has multiple APIs, you should probably be sharing
+/// the OAuth scope across all of those APIs.
+///
+/// When you need finer grained OAuth consent screens: talk with your product
+/// management about how developers will use them in practice.
+///
+/// Please note that even though each of the canonical scopes is enough for a
+/// request to be accepted and passed to the backend, a request can still fail
+/// due to the backend requiring additional scopes or permissions.
+class OAuthRequirements {
+  /// The list of publicly documented OAuth scopes that are allowed access. An
+  /// OAuth token containing any of these scopes will be accepted.
+  ///
+  /// Example:
+  ///
+  ///      canonical_scopes: https://www.googleapis.com/auth/calendar,
+  ///                        https://www.googleapis.com/auth/calendar.read
+  core.String canonicalScopes;
+
+  OAuthRequirements();
+
+  OAuthRequirements.fromJson(core.Map _json) {
+    if (_json.containsKey("canonicalScopes")) {
+      canonicalScopes = _json["canonicalScopes"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (canonicalScopes != null) {
+      _json["canonicalScopes"] = canonicalScopes;
+    }
+    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;
+  }
+}
+
+/// The metadata associated with a long running operation resource.
+class OperationMetadata {
+  /// Percentage of completion of this operation, ranging from 0 to 100.
+  core.int progressPercentage;
+
+  /// The full name of the resources that this operation is directly
+  /// associated with.
+  core.List<core.String> resourceNames;
+
+  /// The start time of the operation.
+  core.String startTime;
+
+  /// Detailed status information for each step. The order is undetermined.
+  core.List<Step> steps;
+
+  OperationMetadata();
+
+  OperationMetadata.fromJson(core.Map _json) {
+    if (_json.containsKey("progressPercentage")) {
+      progressPercentage = _json["progressPercentage"];
+    }
+    if (_json.containsKey("resourceNames")) {
+      resourceNames = _json["resourceNames"];
+    }
+    if (_json.containsKey("startTime")) {
+      startTime = _json["startTime"];
+    }
+    if (_json.containsKey("steps")) {
+      steps = _json["steps"].map((value) => new Step.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 (progressPercentage != null) {
+      _json["progressPercentage"] = progressPercentage;
+    }
+    if (resourceNames != null) {
+      _json["resourceNames"] = resourceNames;
+    }
+    if (startTime != null) {
+      _json["startTime"] = startTime;
+    }
+    if (steps != null) {
+      _json["steps"] = steps.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// A protocol buffer option, which can be attached to a message, field,
+/// enumeration, etc.
+class Option {
+  /// The option's name. For protobuf built-in options (options defined in
+  /// descriptor.proto), this is the short name. For example, `"map_entry"`.
+  /// For custom options, it should be the fully-qualified name. For example,
+  /// `"google.api.http"`.
+  core.String name;
+
+  /// The option's value packed in an Any message. If the value is a primitive,
+  /// the corresponding wrapper type defined in google/protobuf/wrappers.proto
+  /// should be used. If the value is an enum, it should be stored as an int32
+  /// value using the google.protobuf.Int32Value type.
+  ///
+  /// 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> value;
+
+  Option();
+
+  Option.fromJson(core.Map _json) {
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    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 (name != null) {
+      _json["name"] = name;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+/// Represents a documentation page. A page can contain subpages to represent
+/// nested documentation set structure.
+class Page {
+  /// The Markdown content of the page. You can use <code>&#40;== include {path}
+  /// ==&#41;</code>
+  /// to include content from a Markdown file.
+  core.String content;
+
+  /// The name of the page. It will be used as an identity of the page to
+  /// generate URI of the page, text of the link to this page in navigation,
+  /// etc. The full page name (start from the root page name to this page
+  /// concatenated with `.`) can be used as reference to the page in your
+  /// documentation. For example:
+  /// <pre><code>pages:
+  /// - name: Tutorial
+  ///   content: &#40;== include tutorial.md ==&#41;
+  ///   subpages:
+  ///   - name: Java
+  ///     content: &#40;== include tutorial_java.md ==&#41;
+  /// </code></pre>
+  /// You can reference `Java` page using Markdown reference link syntax:
+  /// `Java`.
+  core.String name;
+
+  /// Subpages of this page. The order of subpages specified here will be
+  /// honored in the generated docset.
+  core.List<Page> subpages;
+
+  Page();
+
+  Page.fromJson(core.Map _json) {
+    if (_json.containsKey("content")) {
+      content = _json["content"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("subpages")) {
+      subpages =
+          _json["subpages"].map((value) => new Page.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 (content != null) {
+      _json["content"] = content;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (subpages != null) {
+      _json["subpages"] = subpages.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// The published version of a Service that is managed by
+/// Google Service Management.
+class PublishedService {
+  /// The resource name of the service.
+  ///
+  /// A valid name would be:
+  /// - services/serviceusage.googleapis.com
+  core.String name;
+
+  /// The service's published configuration.
+  GoogleApiService service;
+
+  PublishedService();
+
+  PublishedService.fromJson(core.Map _json) {
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("service")) {
+      service = new GoogleApiService.fromJson(_json["service"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (service != null) {
+      _json["service"] = (service).toJson();
+    }
+    return _json;
+  }
+}
+
+/// Quota configuration helps to achieve fairness and budgeting in service
+/// usage.
+///
+/// The quota configuration works this way:
+/// - The service configuration defines a set of metrics.
+/// - For API calls, the quota.metric_rules maps methods to metrics with
+///   corresponding costs.
+/// - The quota.limits defines limits on the metrics, which will be used for
+///   quota checks at runtime.
+///
+/// An example quota configuration in yaml format:
+///
+///    quota:
+///
+///      - name: apiWriteQpsPerProject
+///        metric: library.googleapis.com/write_calls
+///        unit: "1/min/{project}"  # rate limit for consumer projects
+///        values:
+///          STANDARD: 10000
+///
+///
+///      # The metric rules bind all methods to the read_calls metric,
+///      # except for the UpdateBook and DeleteBook methods. These two methods
+///      # are mapped to the write_calls metric, with the UpdateBook method
+///      # consuming at twice rate as the DeleteBook method.
+///      metric_rules:
+///      - selector: "*"
+///        metric_costs:
+///          library.googleapis.com/read_calls: 1
+///      - selector: google.example.library.v1.LibraryService.UpdateBook
+///        metric_costs:
+///          library.googleapis.com/write_calls: 2
+///      - selector: google.example.library.v1.LibraryService.DeleteBook
+///        metric_costs:
+///          library.googleapis.com/write_calls: 1
+///
+///  Corresponding Metric definition:
+///
+///      metrics:
+///      - name: library.googleapis.com/read_calls
+///        display_name: Read requests
+///        metric_kind: DELTA
+///        value_type: INT64
+///
+///      - name: library.googleapis.com/write_calls
+///        display_name: Write requests
+///        metric_kind: DELTA
+///        value_type: INT64
+class Quota {
+  /// List of `QuotaLimit` definitions for the service.
+  core.List<QuotaLimit> limits;
+
+  /// List of `MetricRule` definitions, each one mapping a selected method to
+  /// one
+  /// or more metrics.
+  core.List<MetricRule> metricRules;
+
+  Quota();
+
+  Quota.fromJson(core.Map _json) {
+    if (_json.containsKey("limits")) {
+      limits = _json["limits"]
+          .map((value) => new QuotaLimit.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("metricRules")) {
+      metricRules = _json["metricRules"]
+          .map((value) => new MetricRule.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 (limits != null) {
+      _json["limits"] = limits.map((value) => (value).toJson()).toList();
+    }
+    if (metricRules != null) {
+      _json["metricRules"] =
+          metricRules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// `QuotaLimit` defines a specific limit that applies over a specified duration
+/// for a limit type. There can be at most one limit for a duration and limit
+/// type combination defined within a `QuotaGroup`.
+class QuotaLimit {
+  /// Default number of tokens that can be consumed during the specified
+  /// duration. This is the number of tokens assigned when a client
+  /// application developer activates the service for his/her project.
+  ///
+  /// Specifying a value of 0 will block all requests. This can be used if you
+  /// are provisioning quota to selected consumers and blocking others.
+  /// Similarly, a value of -1 will indicate an unlimited quota. No other
+  /// negative values are allowed.
+  ///
+  /// Used by group-based quotas only.
+  core.String defaultLimit;
+
+  /// Optional. User-visible, extended description for this quota limit.
+  /// Should be used only when more context is needed to understand this limit
+  /// than provided by the limit's display name (see: `display_name`).
+  core.String description;
+
+  /// User-visible display name for this limit.
+  /// Optional. If not set, the UI will provide a default display name based on
+  /// the quota configuration. This field can be used to override the default
+  /// display name generated from the configuration.
+  core.String displayName;
+
+  /// Duration of this limit in textual notation. Example: "100s", "24h", "1d".
+  /// For duration longer than a day, only multiple of days is supported. We
+  /// support only "100s" and "1d" for now. Additional support will be added in
+  /// the future. "0" indicates indefinite duration.
+  ///
+  /// Used by group-based quotas only.
+  core.String duration;
+
+  /// Free tier value displayed in the Developers Console for this limit.
+  /// The free tier is the number of tokens that will be subtracted from the
+  /// billed amount when billing is enabled.
+  /// This field can only be set on a limit with duration "1d", in a billable
+  /// group; it is invalid on any other limit. If this field is not set, it
+  /// defaults to 0, indicating that there is no free tier for this service.
+  ///
+  /// Used by group-based quotas only.
+  core.String freeTier;
+
+  /// Maximum number of tokens that can be consumed during the specified
+  /// duration. Client application developers can override the default limit up
+  /// to this maximum. If specified, this value cannot be set to a value less
+  /// than the default limit. If not specified, it is set to the default limit.
+  ///
+  /// To allow clients to apply overrides with no upper bound, set this to -1,
+  /// indicating unlimited maximum quota.
+  ///
+  /// Used by group-based quotas only.
+  core.String maxLimit;
+
+  /// The name of the metric this quota limit applies to. The quota limits with
+  /// the same metric will be checked together during runtime. The metric must
+  /// be
+  /// defined within the service config.
+  core.String metric;
+
+  /// Name of the quota limit.
+  ///
+  /// The name must be provided, and it must be unique within the service. The
+  /// name can only include alphanumeric characters as well as '-'.
+  ///
+  /// The maximum length of the limit name is 64 characters.
+  core.String name;
+
+  /// Specify the unit of the quota limit. It uses the same syntax as
+  /// Metric.unit. The supported unit kinds are determined by the quota
+  /// backend system.
+  ///
+  /// Here are some examples:
+  /// * "1/min/{project}" for quota per minute per project.
+  ///
+  /// Note: the order of unit components is insignificant.
+  /// The "1" at the beginning is required to follow the metric unit syntax.
+  core.String unit;
+
+  /// Tiered limit values. You must specify this as a key:value pair, with an
+  /// integer value that is the maximum number of requests allowed for the
+  /// specified unit. Currently only STANDARD is supported.
+  core.Map<core.String, core.String> values;
+
+  QuotaLimit();
+
+  QuotaLimit.fromJson(core.Map _json) {
+    if (_json.containsKey("defaultLimit")) {
+      defaultLimit = _json["defaultLimit"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("displayName")) {
+      displayName = _json["displayName"];
+    }
+    if (_json.containsKey("duration")) {
+      duration = _json["duration"];
+    }
+    if (_json.containsKey("freeTier")) {
+      freeTier = _json["freeTier"];
+    }
+    if (_json.containsKey("maxLimit")) {
+      maxLimit = _json["maxLimit"];
+    }
+    if (_json.containsKey("metric")) {
+      metric = _json["metric"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("unit")) {
+      unit = _json["unit"];
+    }
+    if (_json.containsKey("values")) {
+      values = _json["values"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (defaultLimit != null) {
+      _json["defaultLimit"] = defaultLimit;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (displayName != null) {
+      _json["displayName"] = displayName;
+    }
+    if (duration != null) {
+      _json["duration"] = duration;
+    }
+    if (freeTier != null) {
+      _json["freeTier"] = freeTier;
+    }
+    if (maxLimit != null) {
+      _json["maxLimit"] = maxLimit;
+    }
+    if (metric != null) {
+      _json["metric"] = metric;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (unit != null) {
+      _json["unit"] = unit;
+    }
+    if (values != null) {
+      _json["values"] = values;
+    }
+    return _json;
+  }
+}
+
+/// Response message for SearchServices.
+class SearchServicesResponse {
+  /// Token that can be passed to `SearchServices` to resume a paginated query.
+  core.String nextPageToken;
+
+  /// The state of services available publicly or available to the authenticated
+  /// caller.
+  core.List<PublishedService> services;
+
+  SearchServicesResponse();
+
+  SearchServicesResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("services")) {
+      services = _json["services"]
+          .map((value) => new PublishedService.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 (services != null) {
+      _json["services"] = services.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// The properties of a consumer with respect to a Service.
+class ServiceState {
+  /// Reflects whether or not the service has been explicitly enabled.
+  EnabledState enabled;
+
+  /// The resource name of the consumer and service.
+  ///
+  /// A valid name would be:
+  /// - projects/123/services/serviceusage.googleapis.com
+  core.String name;
+
+  /// The published version of the consumed service.
+  PublishedService service;
+
+  ServiceState();
+
+  ServiceState.fromJson(core.Map _json) {
+    if (_json.containsKey("enabled")) {
+      enabled = new EnabledState.fromJson(_json["enabled"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("service")) {
+      service = new PublishedService.fromJson(_json["service"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (enabled != null) {
+      _json["enabled"] = (enabled).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (service != null) {
+      _json["service"] = (service).toJson();
+    }
+    return _json;
+  }
+}
+
+/// `SourceContext` represents information about the source of a
+/// protobuf element, like the file in which it is defined.
+class SourceContext {
+  /// The path-qualified name of the .proto file that contained the associated
+  /// protobuf element.  For example: `"google/protobuf/source_context.proto"`.
+  core.String fileName;
+
+  SourceContext();
+
+  SourceContext.fromJson(core.Map _json) {
+    if (_json.containsKey("fileName")) {
+      fileName = _json["fileName"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (fileName != null) {
+      _json["fileName"] = fileName;
+    }
+    return _json;
+  }
+}
+
+/// Source information used to create a Service Config
+class SourceInfo {
+  /// All files used during config generation.
+  ///
+  /// 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>> sourceFiles;
+
+  SourceInfo();
+
+  SourceInfo.fromJson(core.Map _json) {
+    if (_json.containsKey("sourceFiles")) {
+      sourceFiles = _json["sourceFiles"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (sourceFiles != null) {
+      _json["sourceFiles"] = sourceFiles;
+    }
+    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;
+  }
+}
+
+/// Represents the status of one operation step.
+class Step {
+  /// The short description of the step.
+  core.String description;
+
+  /// The status code.
+  /// Possible string values are:
+  /// - "STATUS_UNSPECIFIED" : Unspecifed code.
+  /// - "DONE" : The operation or step has completed without errors.
+  /// - "NOT_STARTED" : The operation or step has not started yet.
+  /// - "IN_PROGRESS" : The operation or step is in progress.
+  /// - "FAILED" : The operation or step has completed with errors. If the
+  /// operation is
+  /// rollbackable, the rollback completed with errors too.
+  /// - "CANCELLED" : The operation or step has completed with cancellation.
+  core.String status;
+
+  Step();
+
+  Step.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("status")) {
+      status = _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 (description != null) {
+      _json["description"] = description;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    return _json;
+  }
+}
+
+/// Define a parameter's name and location. The parameter may be passed as
+/// either
+/// an HTTP header or a URL query parameter, and if both are passed the behavior
+/// is implementation-dependent.
+class SystemParameter {
+  /// Define the HTTP header name to use for the parameter. It is case
+  /// insensitive.
+  core.String httpHeader;
+
+  /// Define the name of the parameter, such as "api_key" . It is case
+  /// sensitive.
+  core.String name;
+
+  /// Define the URL query parameter name to use for the parameter. It is case
+  /// sensitive.
+  core.String urlQueryParameter;
+
+  SystemParameter();
+
+  SystemParameter.fromJson(core.Map _json) {
+    if (_json.containsKey("httpHeader")) {
+      httpHeader = _json["httpHeader"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("urlQueryParameter")) {
+      urlQueryParameter = _json["urlQueryParameter"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (httpHeader != null) {
+      _json["httpHeader"] = httpHeader;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (urlQueryParameter != null) {
+      _json["urlQueryParameter"] = urlQueryParameter;
+    }
+    return _json;
+  }
+}
+
+/// Define a system parameter rule mapping system parameter definitions to
+/// methods.
+class SystemParameterRule {
+  /// Define parameters. Multiple names may be defined for a parameter.
+  /// For a given method call, only one of them should be used. If multiple
+  /// names are used the behavior is implementation-dependent.
+  /// If none of the specified names are present the behavior is
+  /// parameter-dependent.
+  core.List<SystemParameter> parameters;
+
+  /// Selects the methods to which this rule applies. Use '*' to indicate all
+  /// methods in all APIs.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  SystemParameterRule();
+
+  SystemParameterRule.fromJson(core.Map _json) {
+    if (_json.containsKey("parameters")) {
+      parameters = _json["parameters"]
+          .map((value) => new SystemParameter.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (parameters != null) {
+      _json["parameters"] =
+          parameters.map((value) => (value).toJson()).toList();
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
+
+/// ### System parameter configuration
+///
+/// A system parameter is a special kind of parameter defined by the API
+/// system, not by an individual API. It is typically mapped to an HTTP header
+/// and/or a URL query parameter. This configuration specifies which methods
+/// change the names of the system parameters.
+class SystemParameters {
+  /// Define system parameters.
+  ///
+  /// The parameters defined here will override the default parameters
+  /// implemented by the system. If this field is missing from the service
+  /// config, default system parameters will be used. Default system parameters
+  /// and names is implementation-dependent.
+  ///
+  /// Example: define api key for all methods
+  ///
+  ///     system_parameters
+  ///       rules:
+  ///         - selector: "*"
+  ///           parameters:
+  ///             - name: api_key
+  ///               url_query_parameter: api_key
+  ///
+  ///
+  /// Example: define 2 api key names for a specific method.
+  ///
+  ///     system_parameters
+  ///       rules:
+  ///         - selector: "/ListShelves"
+  ///           parameters:
+  ///             - name: api_key
+  ///               http_header: Api-Key1
+  ///             - name: api_key
+  ///               http_header: Api-Key2
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<SystemParameterRule> rules;
+
+  SystemParameters();
+
+  SystemParameters.fromJson(core.Map _json) {
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new SystemParameterRule.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 (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// A protocol buffer message type.
+class Type {
+  /// The list of fields.
+  core.List<Field> fields;
+
+  /// The fully qualified message name.
+  core.String name;
+
+  /// The list of types appearing in `oneof` definitions in this type.
+  core.List<core.String> oneofs;
+
+  /// The protocol buffer options.
+  core.List<Option> options;
+
+  /// The source context.
+  SourceContext sourceContext;
+
+  /// The source syntax.
+  /// Possible string values are:
+  /// - "SYNTAX_PROTO2" : Syntax `proto2`.
+  /// - "SYNTAX_PROTO3" : Syntax `proto3`.
+  core.String syntax;
+
+  Type();
+
+  Type.fromJson(core.Map _json) {
+    if (_json.containsKey("fields")) {
+      fields =
+          _json["fields"].map((value) => new Field.fromJson(value)).toList();
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("oneofs")) {
+      oneofs = _json["oneofs"];
+    }
+    if (_json.containsKey("options")) {
+      options =
+          _json["options"].map((value) => new Option.fromJson(value)).toList();
+    }
+    if (_json.containsKey("sourceContext")) {
+      sourceContext = new SourceContext.fromJson(_json["sourceContext"]);
+    }
+    if (_json.containsKey("syntax")) {
+      syntax = _json["syntax"];
+    }
+  }
+
+  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 (name != null) {
+      _json["name"] = name;
+    }
+    if (oneofs != null) {
+      _json["oneofs"] = oneofs;
+    }
+    if (options != null) {
+      _json["options"] = options.map((value) => (value).toJson()).toList();
+    }
+    if (sourceContext != null) {
+      _json["sourceContext"] = (sourceContext).toJson();
+    }
+    if (syntax != null) {
+      _json["syntax"] = syntax;
+    }
+    return _json;
+  }
+}
+
+/// Configuration controlling usage of a service.
+class Usage {
+  /// The full resource name of a channel used for sending notifications to the
+  /// service producer.
+  ///
+  /// Google Service Management currently only supports
+  /// [Google Cloud Pub/Sub](https://cloud.google.com/pubsub) as a notification
+  /// channel. To use Google Cloud Pub/Sub as the channel, this must be the name
+  /// of a Cloud Pub/Sub topic that uses the Cloud Pub/Sub topic name format
+  /// documented in https://cloud.google.com/pubsub/docs/overview.
+  core.String producerNotificationChannel;
+
+  /// Requirements that must be satisfied before a consumer project can use the
+  /// service. Each requirement is of the form <service.name>/<requirement-id>;
+  /// for example 'serviceusage.googleapis.com/billing-enabled'.
+  core.List<core.String> requirements;
+
+  /// A list of usage rules that apply to individual API methods.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<UsageRule> rules;
+
+  Usage();
+
+  Usage.fromJson(core.Map _json) {
+    if (_json.containsKey("producerNotificationChannel")) {
+      producerNotificationChannel = _json["producerNotificationChannel"];
+    }
+    if (_json.containsKey("requirements")) {
+      requirements = _json["requirements"];
+    }
+    if (_json.containsKey("rules")) {
+      rules =
+          _json["rules"].map((value) => new UsageRule.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 (producerNotificationChannel != null) {
+      _json["producerNotificationChannel"] = producerNotificationChannel;
+    }
+    if (requirements != null) {
+      _json["requirements"] = requirements;
+    }
+    if (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// Usage configuration rules for the service.
+///
+/// NOTE: Under development.
+///
+///
+/// Use this rule to configure unregistered calls for the service. Unregistered
+/// calls are calls that do not contain consumer project identity.
+/// (Example: calls that do not contain an API key).
+/// By default, API methods do not allow unregistered calls, and each method
+/// call
+/// must be identified by a consumer project identity. Use this rule to
+/// allow/disallow unregistered calls.
+///
+/// Example of an API that wants to allow unregistered calls for entire service.
+///
+///     usage:
+///       rules:
+///       - selector: "*"
+///         allow_unregistered_calls: true
+///
+/// Example of a method that wants to allow unregistered calls.
+///
+///     usage:
+///       rules:
+///       - selector: "google.example.library.v1.LibraryService.CreateBook"
+///         allow_unregistered_calls: true
+class UsageRule {
+  /// 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
+  /// methods in all APIs.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  /// 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();
+
+  UsageRule.fromJson(core.Map _json) {
+    if (_json.containsKey("allowUnregisteredCalls")) {
+      allowUnregisteredCalls = _json["allowUnregisteredCalls"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+    if (_json.containsKey("skipServiceControl")) {
+      skipServiceControl = _json["skipServiceControl"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (allowUnregisteredCalls != null) {
+      _json["allowUnregisteredCalls"] = allowUnregisteredCalls;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    if (skipServiceControl != null) {
+      _json["skipServiceControl"] = skipServiceControl;
+    }
+    return _json;
+  }
+}
+
+/// `Visibility` defines restrictions for the visibility of service
+/// elements.  Restrictions are specified using visibility labels
+/// (e.g., TRUSTED_TESTER) that are elsewhere linked to users and projects.
+///
+/// Users and projects can have access to more than one visibility label. The
+/// effective visibility for multiple labels is the union of each label's
+/// elements, plus any unrestricted elements.
+///
+/// If an element and its parents have no restrictions, visibility is
+/// unconditionally granted.
+///
+/// Example:
+///
+///     visibility:
+///       rules:
+///       - selector: google.calendar.Calendar.EnhancedSearch
+///         restriction: TRUSTED_TESTER
+///       - selector: google.calendar.Calendar.Delegate
+///         restriction: GOOGLE_INTERNAL
+///
+/// Here, all methods are publicly visible except for the restricted methods
+/// EnhancedSearch and Delegate.
+class Visibility {
+  /// A list of visibility rules that apply to individual API elements.
+  ///
+  /// **NOTE:** All service configuration rules follow "last one wins" order.
+  core.List<VisibilityRule> rules;
+
+  Visibility();
+
+  Visibility.fromJson(core.Map _json) {
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"]
+          .map((value) => new VisibilityRule.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 (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// A visibility rule provides visibility configuration for an individual API
+/// element.
+class VisibilityRule {
+  /// A comma-separated list of visibility labels that apply to the `selector`.
+  /// Any of the listed labels can be used to grant the visibility.
+  ///
+  /// If a rule has multiple labels, removing one of the labels but not all of
+  /// them can break clients.
+  ///
+  /// Example:
+  ///
+  ///     visibility:
+  ///       rules:
+  ///       - selector: google.calendar.Calendar.EnhancedSearch
+  ///         restriction: GOOGLE_INTERNAL, TRUSTED_TESTER
+  ///
+  /// Removing GOOGLE_INTERNAL from this restriction will break clients that
+  /// rely on this method and only had access to it through GOOGLE_INTERNAL.
+  core.String restriction;
+
+  /// Selects methods, messages, fields, enums, etc. to which this rule applies.
+  ///
+  /// Refer to selector for syntax details.
+  core.String selector;
+
+  VisibilityRule();
+
+  VisibilityRule.fromJson(core.Map _json) {
+    if (_json.containsKey("restriction")) {
+      restriction = _json["restriction"];
+    }
+    if (_json.containsKey("selector")) {
+      selector = _json["selector"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (restriction != null) {
+      _json["restriction"] = restriction;
+    }
+    if (selector != null) {
+      _json["selector"] = selector;
+    }
+    return _json;
+  }
+}
diff --git a/googleapis/lib/serviceuser/v1.dart b/googleapis/lib/serviceuser/v1.dart
index 74b13b2..141fe4c 100644
--- a/googleapis/lib/serviceuser/v1.dart
+++ b/googleapis/lib/serviceuser/v1.dart
@@ -1375,12 +1375,6 @@
   /// allowed to proceed.
   core.bool allowCors;
 
-  /// The list of APIs served by this endpoint.
-  ///
-  /// If no APIs are specified this translates to "all APIs" exported by the
-  /// service, as defined in the top-level service configuration.
-  core.List<core.String> apis;
-
   /// The list of features enabled on this endpoint.
   core.List<core.String> features;
 
@@ -1404,9 +1398,6 @@
     if (_json.containsKey("allowCors")) {
       allowCors = _json["allowCors"];
     }
-    if (_json.containsKey("apis")) {
-      apis = _json["apis"];
-    }
     if (_json.containsKey("features")) {
       features = _json["features"];
     }
@@ -1427,9 +1418,6 @@
     if (allowCors != null) {
       _json["allowCors"] = allowCors;
     }
-    if (apis != null) {
-      _json["apis"] = apis;
-    }
     if (features != null) {
       _json["features"] = features;
     }
@@ -2018,13 +2006,6 @@
   /// Used for updating a resource.
   core.String put;
 
-  /// The name of the response field whose value is mapped to the HTTP body of
-  /// response. Other response fields are ignored. This field is optional. When
-  /// not set, the response message will be used as HTTP body of response.
-  /// NOTE: the referred field must be not a repeated field and must be present
-  /// at the top-level of response message type.
-  core.String responseBody;
-
   /// Selects methods to which this rule applies.
   ///
   /// Refer to selector for syntax details.
@@ -2065,9 +2046,6 @@
     if (_json.containsKey("put")) {
       put = _json["put"];
     }
-    if (_json.containsKey("responseBody")) {
-      responseBody = _json["responseBody"];
-    }
     if (_json.containsKey("selector")) {
       selector = _json["selector"];
     }
@@ -2107,9 +2085,6 @@
     if (put != null) {
       _json["put"] = put;
     }
-    if (responseBody != null) {
-      _json["responseBody"] = responseBody;
-    }
     if (selector != null) {
       _json["selector"] = selector;
     }
@@ -2710,8 +2685,6 @@
   ///
   /// **Grammar**
   ///
-  /// The grammar includes the dimensionless unit `1`, such as `1/s`.
-  ///
   /// The grammar also includes these connectors:
   ///
   /// * `/`    division (as an infix operator, e.g. `1/s`).
@@ -2721,7 +2694,7 @@
   ///
   ///     Expression = Component { "." Component } { "/" Component } ;
   ///
-  ///     Component = [ PREFIX ] UNIT [ Annotation ]
+  ///     Component = ( [ PREFIX ] UNIT | "%" ) [ Annotation ]
   ///               | Annotation
   ///               | "1"
   ///               ;
@@ -2735,6 +2708,9 @@
   ///    `{requests}/s == 1/s`, `By{transmitted}/s == By/s`.
   /// * `NAME` is a sequence of non-blank printable ASCII characters not
   ///    containing '{' or '}'.
+  /// * `1` represents dimensionless value 1, such as in `1/s`.
+  /// * `%` represents dimensionless value 1/100, and annotates values giving
+  ///    a percentage.
   core.String unit;
 
   /// Whether the measurement is an integer, a floating-point number, etc.
@@ -4593,7 +4569,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
@@ -4602,10 +4579,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/googleapis/lib/sheets/v4.dart b/googleapis/lib/sheets/v4.dart
index 326a0bf..6c6b37a 100644
--- a/googleapis/lib/sheets/v4.dart
+++ b/googleapis/lib/sheets/v4.dart
@@ -197,11 +197,11 @@
   ///
   /// [spreadsheetId] - The spreadsheet to request.
   ///
+  /// [ranges] - The ranges to retrieve from the spreadsheet.
+  ///
   /// [includeGridData] - True if grid data should be returned.
   /// This parameter is ignored if a field mask was set in the request.
   ///
-  /// [ranges] - The ranges to retrieve from the spreadsheet.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -213,8 +213,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<Spreadsheet> get(core.String spreadsheetId,
-      {core.bool includeGridData,
-      core.List<core.String> ranges,
+      {core.List<core.String> ranges,
+      core.bool includeGridData,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -226,12 +226,12 @@
     if (spreadsheetId == null) {
       throw new core.ArgumentError("Parameter spreadsheetId is required.");
     }
-    if (includeGridData != null) {
-      _queryParams["includeGridData"] = ["${includeGridData}"];
-    }
     if (ranges != null) {
       _queryParams["ranges"] = ranges;
     }
+    if (includeGridData != null) {
+      _queryParams["includeGridData"] = ["${includeGridData}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -536,11 +536,6 @@
   /// 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.
@@ -570,6 +565,11 @@
   /// - "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.
+  ///
   /// [$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.bool includeValuesInResponse,
-      core.String responseValueRenderOption,
+      {core.String responseValueRenderOption,
       core.String insertDataOption,
       core.String valueInputOption,
       core.String responseDateTimeRenderOption,
+      core.bool includeValuesInResponse,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -604,9 +604,6 @@
     if (range == null) {
       throw new core.ArgumentError("Parameter range is required.");
     }
-    if (includeValuesInResponse != null) {
-      _queryParams["includeValuesInResponse"] = ["${includeValuesInResponse}"];
-    }
     if (responseValueRenderOption != null) {
       _queryParams["responseValueRenderOption"] = [responseValueRenderOption];
     }
@@ -621,6 +618,9 @@
         responseDateTimeRenderOption
       ];
     }
+    if (includeValuesInResponse != null) {
+      _queryParams["includeValuesInResponse"] = ["${includeValuesInResponse}"];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -758,6 +758,13 @@
   ///
   /// [spreadsheetId] - The ID of the spreadsheet to retrieve data from.
   ///
+  /// [valueRenderOption] - How values should be represented in the output.
+  /// 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.
+  ///
   /// [dateTimeRenderOption] - How dates, times, and durations should be
   /// represented in the output.
   /// This is ignored if value_render_option is
@@ -768,12 +775,7 @@
   /// - "SERIAL_NUMBER" : A SERIAL_NUMBER.
   /// - "FORMATTED_STRING" : A FORMATTED_STRING.
   ///
-  /// [valueRenderOption] - How values should be represented in the output.
-  /// 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.
+  /// [ranges] - The A1 notation of the values to retrieve.
   ///
   /// [majorDimension] - The major dimension that results should use.
   ///
@@ -787,8 +789,6 @@
   /// - "ROWS" : A ROWS.
   /// - "COLUMNS" : A COLUMNS.
   ///
-  /// [ranges] - The A1 notation of the values to retrieve.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -800,10 +800,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<BatchGetValuesResponse> batchGet(core.String spreadsheetId,
-      {core.String dateTimeRenderOption,
-      core.String valueRenderOption,
-      core.String majorDimension,
+      {core.String valueRenderOption,
+      core.String dateTimeRenderOption,
       core.List<core.String> ranges,
+      core.String majorDimension,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -815,18 +815,18 @@
     if (spreadsheetId == null) {
       throw new core.ArgumentError("Parameter spreadsheetId is required.");
     }
-    if (dateTimeRenderOption != null) {
-      _queryParams["dateTimeRenderOption"] = [dateTimeRenderOption];
-    }
     if (valueRenderOption != null) {
       _queryParams["valueRenderOption"] = [valueRenderOption];
     }
-    if (majorDimension != null) {
-      _queryParams["majorDimension"] = [majorDimension];
+    if (dateTimeRenderOption != null) {
+      _queryParams["dateTimeRenderOption"] = [dateTimeRenderOption];
     }
     if (ranges != null) {
       _queryParams["ranges"] = ranges;
     }
+    if (majorDimension != null) {
+      _queryParams["majorDimension"] = [majorDimension];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1092,6 +1092,13 @@
   /// - "ROWS" : A ROWS.
   /// - "COLUMNS" : A COLUMNS.
   ///
+  /// [valueRenderOption] - How values should be represented in the output.
+  /// 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.
+  ///
   /// [dateTimeRenderOption] - How dates, times, and durations should be
   /// represented in the output.
   /// This is ignored if value_render_option is
@@ -1102,13 +1109,6 @@
   /// - "SERIAL_NUMBER" : A SERIAL_NUMBER.
   /// - "FORMATTED_STRING" : A FORMATTED_STRING.
   ///
-  /// [valueRenderOption] - How values should be represented in the output.
-  /// 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.
   ///
@@ -1121,8 +1121,8 @@
   /// this method will complete with the same error.
   async.Future<ValueRange> get(core.String spreadsheetId, core.String range,
       {core.String majorDimension,
-      core.String dateTimeRenderOption,
       core.String valueRenderOption,
+      core.String dateTimeRenderOption,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1140,12 +1140,12 @@
     if (majorDimension != null) {
       _queryParams["majorDimension"] = [majorDimension];
     }
-    if (dateTimeRenderOption != null) {
-      _queryParams["dateTimeRenderOption"] = [dateTimeRenderOption];
-    }
     if (valueRenderOption != null) {
       _queryParams["valueRenderOption"] = [valueRenderOption];
     }
+    if (dateTimeRenderOption != null) {
+      _queryParams["dateTimeRenderOption"] = [dateTimeRenderOption];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -1176,22 +1176,6 @@
   ///
   /// [range] - The A1 notation of the values to update.
   ///
-  /// [valueInputOption] - How the input data should be interpreted.
-  /// Possible string values are:
-  /// - "INPUT_VALUE_OPTION_UNSPECIFIED" : A INPUT_VALUE_OPTION_UNSPECIFIED.
-  /// - "RAW" : A RAW.
-  /// - "USER_ENTERED" : A USER_ENTERED.
-  ///
-  /// [responseDateTimeRenderOption] - Determines how dates, times, and
-  /// durations in the response should be
-  /// rendered. This is ignored if response_value_render_option is
-  /// FORMATTED_VALUE.
-  /// The default dateTime render option is
-  /// [DateTimeRenderOption.SERIAL_NUMBER].
-  /// Possible string values are:
-  /// - "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
@@ -1208,6 +1192,22 @@
   /// - "UNFORMATTED_VALUE" : A UNFORMATTED_VALUE.
   /// - "FORMULA" : A FORMULA.
   ///
+  /// [valueInputOption] - How the input data should be interpreted.
+  /// Possible string values are:
+  /// - "INPUT_VALUE_OPTION_UNSPECIFIED" : A INPUT_VALUE_OPTION_UNSPECIFIED.
+  /// - "RAW" : A RAW.
+  /// - "USER_ENTERED" : A USER_ENTERED.
+  ///
+  /// [responseDateTimeRenderOption] - Determines how dates, times, and
+  /// durations in the response should be
+  /// rendered. This is ignored if response_value_render_option is
+  /// FORMATTED_VALUE.
+  /// The default dateTime render option is
+  /// [DateTimeRenderOption.SERIAL_NUMBER].
+  /// Possible string values are:
+  /// - "SERIAL_NUMBER" : A SERIAL_NUMBER.
+  /// - "FORMATTED_STRING" : A FORMATTED_STRING.
+  ///
   /// [$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 valueInputOption,
-      core.String responseDateTimeRenderOption,
-      core.bool includeValuesInResponse,
+      {core.bool includeValuesInResponse,
       core.String responseValueRenderOption,
+      core.String valueInputOption,
+      core.String responseDateTimeRenderOption,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -1241,6 +1241,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 (valueInputOption != null) {
       _queryParams["valueInputOption"] = [valueInputOption];
     }
@@ -1249,12 +1255,6 @@
         responseDateTimeRenderOption
       ];
     }
-    if (includeValuesInResponse != null) {
-      _queryParams["includeValuesInResponse"] = ["${includeValuesInResponse}"];
-    }
-    if (responseValueRenderOption != null) {
-      _queryParams["responseValueRenderOption"] = [responseValueRenderOption];
-    }
     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;
   }
 }
@@ -6708,6 +6731,82 @@
   }
 }
 
+/// Allows you to organize the numeric values in a source data column into
+/// buckets of a constant size. All values from HistogramRule.start to
+/// HistogramRule.end will be placed into groups of size
+/// HistogramRule.interval. In addition, all values below
+/// HistogramRule.start will be placed in one group, and all values above
+/// HistogramRule.end will be placed in another. Only
+/// HistogramRule.interval is required, though if HistogramRule.start
+/// and HistogramRule.end are both provided, HistogramRule.start must
+/// be less than HistogramRule.end. For example, a pivot table showing
+/// average purchase amount by age that has 50+ rows:
+///
+///     +-----+-------------------+
+///     | Age | AVERAGE of Amount |
+///     +-----+-------------------+
+///     | 16  |            $27.13 |
+///     | 17  |             $5.24 |
+///     | 18  |            $20.15 |
+///     ...
+///     +-----+-------------------+
+/// could be turned into a pivot table that looks like the one below by
+/// applying a histogram group rule with a HistogramRule.start of 25,
+/// an HistogramRule.interval of 20, and an HistogramRule.end
+/// of 65.
+///
+///     +-------------+-------------------+
+///     | Grouped Age | AVERAGE of Amount |
+///     +-------------+-------------------+
+///     | < 25        |            $19.34 |
+///     | 25-45       |            $31.43 |
+///     | 45-65       |            $35.87 |
+///     | > 65        |            $27.55 |
+///     +-------------+-------------------+
+///     | Grand Total |            $29.12 |
+///     +-------------+-------------------+
+class HistogramRule {
+  /// Optional. The maximum value at which items will be placed into buckets
+  /// of constant size. Values above end will be lumped into a single bucket.
+  core.double end;
+
+  /// Required. The size of the buckets that will be created. Must be positive.
+  core.double interval;
+
+  /// Optional. The minimum value at which items will be placed into buckets
+  /// of constant size. Values below start will be lumped into a single bucket.
+  core.double start;
+
+  HistogramRule();
+
+  HistogramRule.fromJson(core.Map _json) {
+    if (_json.containsKey("end")) {
+      end = _json["end"];
+    }
+    if (_json.containsKey("interval")) {
+      interval = _json["interval"];
+    }
+    if (_json.containsKey("start")) {
+      start = _json["start"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (end != null) {
+      _json["end"] = end;
+    }
+    if (interval != null) {
+      _json["interval"] = interval;
+    }
+    if (start != null) {
+      _json["start"] = start;
+    }
+    return _json;
+  }
+}
+
 /// A histogram series containing the series color and data.
 class HistogramSeries {
   /// The color of the column representing this series in each bucket.
@@ -6921,6 +7020,142 @@
   }
 }
 
+/// 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;
+  }
+}
+
+/// Allows you to manually organize the values in a source data column into
+/// buckets with names of your choosing. For example, a pivot table that
+/// aggregates population by state:
+///
+///     +-------+-------------------+
+///     | State | SUM of Population |
+///     +-------+-------------------+
+///     | AK    |               0.7 |
+///     | AL    |               4.8 |
+///     | AR    |               2.9 |
+///     ...
+///     +-------+-------------------+
+/// could be turned into a pivot table that aggregates population by time zone
+/// by providing a list of groups (e.g. groupName = 'Central',
+/// items = ['AL', 'AR', 'IA', ...]) to a manual group rule.
+/// Note that a similar effect could be achieved by adding a time zone column
+/// to the source data and adjusting the pivot table.
+///
+///     +-----------+-------------------+
+///     | Time Zone | SUM of Population |
+///     +-----------+-------------------+
+///     | Central   |             106.3 |
+///     | Eastern   |             151.9 |
+///     | Mountain  |              17.4 |
+///     ...
+///     +-----------+-------------------+
+class ManualRule {
+  /// The list of group names and the corresponding items from the source data
+  /// that map to each group name.
+  core.List<ManualRuleGroup> groups;
+
+  ManualRule();
+
+  ManualRule.fromJson(core.Map _json) {
+    if (_json.containsKey("groups")) {
+      groups = _json["groups"]
+          .map((value) => new ManualRuleGroup.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 (groups != null) {
+      _json["groups"] = groups.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+/// A group name and a list of items from the source data that should be placed
+/// in the group with this name.
+class ManualRuleGroup {
+  /// The group name, which must be a string. Each group in a given
+  /// ManualRule must have a unique group name.
+  ExtendedValue groupName;
+
+  /// The items in the source data that should be placed into this group. Each
+  /// item may be a string, number, or boolean. Items may appear in at most one
+  /// group within a given ManualRule. Items that do not appear in any
+  /// group will appear on their own.
+  core.List<ExtendedValue> items;
+
+  ManualRuleGroup();
+
+  ManualRuleGroup.fromJson(core.Map _json) {
+    if (_json.containsKey("groupName")) {
+      groupName = new ExtendedValue.fromJson(_json["groupName"]);
+    }
+    if (_json.containsKey("items")) {
+      items = _json["items"]
+          .map((value) => new ExtendedValue.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 (groupName != null) {
+      _json["groupName"] = (groupName).toJson();
+    }
+    if (items != null) {
+      _json["items"] = items.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
 /// A developer metadata entry and the data filters specified in the original
 /// request that matched it.
 class MatchedDeveloperMetadata {
@@ -7526,6 +7761,47 @@
 
 /// A single grouping (either row or column) in a pivot table.
 class PivotGroup {
+  /// The group rule to apply to this row/column group.
+  PivotGroupRule groupRule;
+
+  /// The labels to use for the row/column groups which can be customized. For
+  /// example, in the following pivot table, the row label is `Region` (which
+  /// could be renamed to `State`) and the column label is `Product` (which
+  /// could be renamed `Item`). Pivot tables created before December 2017 do
+  /// not have header labels. If you'd like to add header labels to an existing
+  /// pivot table, please delete the existing pivot table and then create a new
+  /// pivot table with same parameters.
+  ///
+  ///     +--------------+---------+-------+
+  ///     | SUM of Units | Product |       |
+  ///     | Region       | Pen     | Paper |
+  ///     +--------------+---------+-------+
+  ///     | New York     |     345 |    98 |
+  ///     | Oregon       |     234 |   123 |
+  ///     | Tennessee    |     531 |   415 |
+  ///     +--------------+---------+-------+
+  ///     | Grand Total  |    1110 |   636 |
+  ///     +--------------+---------+-------+
+  core.String label;
+
+  /// True if the headings in this pivot group should be repeated.
+  /// This is only valid for row groupings and will be ignored by columns.
+  ///
+  /// By default, we minimize repitition of headings by not showing higher
+  /// level headings where they are the same. For example, even though the
+  /// third row below corresponds to "Q1 Mar", "Q1" is not shown because
+  /// it is redundant with previous rows. Setting repeat_headings to true
+  /// would cause "Q1" to be repeated for "Feb" and "Mar".
+  ///
+  ///     +--------------+
+  ///     | Q1     | Jan |
+  ///     |        | Feb |
+  ///     |        | Mar |
+  ///     +--------+-----+
+  ///     | Q1 Total     |
+  ///     +--------------+
+  core.bool repeatHeadings;
+
   /// True if the pivot table should include the totals for this grouping.
   core.bool showTotals;
 
@@ -7553,6 +7829,15 @@
   PivotGroup();
 
   PivotGroup.fromJson(core.Map _json) {
+    if (_json.containsKey("groupRule")) {
+      groupRule = new PivotGroupRule.fromJson(_json["groupRule"]);
+    }
+    if (_json.containsKey("label")) {
+      label = _json["label"];
+    }
+    if (_json.containsKey("repeatHeadings")) {
+      repeatHeadings = _json["repeatHeadings"];
+    }
     if (_json.containsKey("showTotals")) {
       showTotals = _json["showTotals"];
     }
@@ -7576,6 +7861,15 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (groupRule != null) {
+      _json["groupRule"] = (groupRule).toJson();
+    }
+    if (label != null) {
+      _json["label"] = label;
+    }
+    if (repeatHeadings != null) {
+      _json["repeatHeadings"] = repeatHeadings;
+    }
     if (showTotals != null) {
       _json["showTotals"] = showTotals;
     }
@@ -7596,6 +7890,42 @@
   }
 }
 
+/// An optional setting on a PivotGroup that defines buckets for the values
+/// in the source data column rather than breaking out each individual value.
+/// Only one PivotGroup with a group rule may be added for each column in
+/// the source data, though on any given column you may add both a
+/// PivotGroup that has a rule and a PivotGroup that does not.
+class PivotGroupRule {
+  /// A HistogramRule.
+  HistogramRule histogramRule;
+
+  /// A ManualRule.
+  ManualRule manualRule;
+
+  PivotGroupRule();
+
+  PivotGroupRule.fromJson(core.Map _json) {
+    if (_json.containsKey("histogramRule")) {
+      histogramRule = new HistogramRule.fromJson(_json["histogramRule"]);
+    }
+    if (_json.containsKey("manualRule")) {
+      manualRule = new ManualRule.fromJson(_json["manualRule"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (histogramRule != null) {
+      _json["histogramRule"] = (histogramRule).toJson();
+    }
+    if (manualRule != null) {
+      _json["manualRule"] = (manualRule).toJson();
+    }
+    return _json;
+  }
+}
+
 /// Information about which values in a pivot group should be used for sorting.
 class PivotGroupSortValueBucket {
   /// Determines the bucket from which values are chosen to sort.
@@ -7766,6 +8096,23 @@
 
 /// The definition of how a value in a pivot table should be calculated.
 class PivotValue {
+  /// If specified, indicates that pivot values should be displayed as
+  /// the result of a calculation with another pivot value. For example, if
+  /// calculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the
+  /// pivot values will be displayed as the percentage of the grand total. In
+  /// the Sheets UI, this is referred to as "Show As" in the value section of a
+  /// pivot table.
+  /// Possible string values are:
+  /// - "PIVOT_VALUE_CALCULATED_DISPLAY_TYPE_UNSPECIFIED" : Default value, do
+  /// not use.
+  /// - "PERCENT_OF_ROW_TOTAL" : Shows the pivot values as percentage of the row
+  /// total values.
+  /// - "PERCENT_OF_COLUMN_TOTAL" : Shows the pivot values as percentage of the
+  /// column total values.
+  /// - "PERCENT_OF_GRAND_TOTAL" : Shows the pivot values as percentage of the
+  /// grand total values.
+  core.String calculatedDisplayType;
+
   /// A custom formula to calculate the value.  The formula must start
   /// with an `=` character.
   core.String formula;
@@ -7808,6 +8155,9 @@
   PivotValue();
 
   PivotValue.fromJson(core.Map _json) {
+    if (_json.containsKey("calculatedDisplayType")) {
+      calculatedDisplayType = _json["calculatedDisplayType"];
+    }
     if (_json.containsKey("formula")) {
       formula = _json["formula"];
     }
@@ -7825,6 +8175,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (calculatedDisplayType != null) {
+      _json["calculatedDisplayType"] = calculatedDisplayType;
+    }
     if (formula != null) {
       _json["formula"] = formula;
     }
@@ -9592,6 +9945,7 @@
   /// - "PERIOD" : "."
   /// - "SPACE" : " "
   /// - "CUSTOM" : A custom value as defined in delimiter.
+  /// - "AUTODETECT" : Automatically detect columns.
   core.String delimiterType;
 
   /// The source data range.  This must span exactly one column.
@@ -10553,3 +10907,270 @@
     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;
+  }
+}
+
+/// A custom subtotal column for a waterfall chart series.
+class WaterfallChartCustomSubtotal {
+  /// True if the data point at subtotal_index is the subtotal. If false,
+  /// the subtotal will be computed and appear after the data point.
+  core.bool dataIsSubtotal;
+
+  /// A label for the subtotal column.
+  core.String label;
+
+  /// The 0-based index of a data point within the series. If
+  /// data_is_subtotal is true, the data point at this index is the
+  /// subtotal. Otherwise, the subtotal appears after the data point with
+  /// this index. A series can have multiple subtotals at arbitrary indices,
+  /// but subtotals do not affect the indices of the data points. For
+  /// example, if a series has 3 data points, their indices will always be 0,
+  /// 1, and 2, regardless of how many subtotals exist on the series or what
+  /// data points they are associated with.
+  core.int subtotalIndex;
+
+  WaterfallChartCustomSubtotal();
+
+  WaterfallChartCustomSubtotal.fromJson(core.Map _json) {
+    if (_json.containsKey("dataIsSubtotal")) {
+      dataIsSubtotal = _json["dataIsSubtotal"];
+    }
+    if (_json.containsKey("label")) {
+      label = _json["label"];
+    }
+    if (_json.containsKey("subtotalIndex")) {
+      subtotalIndex = _json["subtotalIndex"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (dataIsSubtotal != null) {
+      _json["dataIsSubtotal"] = dataIsSubtotal;
+    }
+    if (label != null) {
+      _json["label"] = label;
+    }
+    if (subtotalIndex != null) {
+      _json["subtotalIndex"] = subtotalIndex;
+    }
+    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 {
+  /// Custom subtotal columns appearing in this series. The order in which
+  /// subtotals are defined is not significant. Only one subtotal may be
+  /// defined for each data point.
+  core.List<WaterfallChartCustomSubtotal> customSubtotals;
+
+  /// 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("customSubtotals")) {
+      customSubtotals = _json["customSubtotals"]
+          .map((value) => new WaterfallChartCustomSubtotal.fromJson(value))
+          .toList();
+    }
+    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 (customSubtotals != null) {
+      _json["customSubtotals"] =
+          customSubtotals.map((value) => (value).toJson()).toList();
+    }
+    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/googleapis/lib/slides/v1.dart b/googleapis/lib/slides/v1.dart
index 168c624..8f33e4c 100644
--- a/googleapis/lib/slides/v1.dart
+++ b/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";
@@ -282,12 +286,22 @@
   /// Generates a thumbnail of the latest version of the specified page in the
   /// presentation and returns a URL to the thumbnail image.
   ///
+  /// This request counts as an [expensive read request](/slides/limits) for
+  /// quota purposes.
+  ///
   /// Request parameters:
   ///
   /// [presentationId] - The ID of the presentation to retrieve.
   ///
   /// [pageObjectId] - The object ID of the page whose thumbnail to retrieve.
   ///
+  /// [thumbnailProperties_mimeType] - The optional mime type of the thumbnail
+  /// image.
+  ///
+  /// If you don't specify the mime type, the default mime type will be PNG.
+  /// Possible string values are:
+  /// - "PNG" : A PNG.
+  ///
   /// [thumbnailProperties_thumbnailSize] - The optional thumbnail image size.
   ///
   /// If you don't specify the size, the server chooses a default size of the
@@ -296,13 +310,6 @@
   /// - "THUMBNAIL_SIZE_UNSPECIFIED" : A THUMBNAIL_SIZE_UNSPECIFIED.
   /// - "LARGE" : A LARGE.
   ///
-  /// [thumbnailProperties_mimeType] - The optional mime type of the thumbnail
-  /// image.
-  ///
-  /// If you don't specify the mime type, the default mime type will be PNG.
-  /// Possible string values are:
-  /// - "PNG" : A PNG.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -315,8 +322,8 @@
   /// this method will complete with the same error.
   async.Future<Thumbnail> getThumbnail(
       core.String presentationId, core.String pageObjectId,
-      {core.String thumbnailProperties_thumbnailSize,
-      core.String thumbnailProperties_mimeType,
+      {core.String thumbnailProperties_mimeType,
+      core.String thumbnailProperties_thumbnailSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -331,16 +338,16 @@
     if (pageObjectId == null) {
       throw new core.ArgumentError("Parameter pageObjectId is required.");
     }
-    if (thumbnailProperties_thumbnailSize != null) {
-      _queryParams["thumbnailProperties.thumbnailSize"] = [
-        thumbnailProperties_thumbnailSize
-      ];
-    }
     if (thumbnailProperties_mimeType != null) {
       _queryParams["thumbnailProperties.mimeType"] = [
         thumbnailProperties_mimeType
       ];
     }
+    if (thumbnailProperties_thumbnailSize != null) {
+      _queryParams["thumbnailProperties.thumbnailSize"] = [
+        thumbnailProperties_thumbnailSize
+      ];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -544,6 +551,9 @@
   /// replies to some requests may be empty.
   core.List<Response> replies;
 
+  /// The updated write control after applying the request.
+  WriteControl writeControl;
+
   BatchUpdatePresentationResponse();
 
   BatchUpdatePresentationResponse.fromJson(core.Map _json) {
@@ -555,6 +565,9 @@
           .map((value) => new Response.fromJson(value))
           .toList();
     }
+    if (_json.containsKey("writeControl")) {
+      writeControl = new WriteControl.fromJson(_json["writeControl"]);
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -566,6 +579,9 @@
     if (replies != null) {
       _json["replies"] = replies.map((value) => (value).toJson()).toList();
     }
+    if (writeControl != null) {
+      _json["writeControl"] = (writeControl).toJson();
+    }
     return _json;
   }
 }
@@ -696,6 +712,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.
@@ -718,7 +743,7 @@
   /// cannot exceed 25 megapixels, and must be in either in PNG, JPEG, or GIF
   /// format.
   ///
-  /// The provided URL can be at maximum 2K bytes large.
+  /// The provided URL can be at most 2 kB in length.
   core.String url;
 
   CreateImageRequest();
@@ -1663,6 +1688,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.
@@ -2270,6 +2304,10 @@
   /// The properties of the image.
   ImageProperties imageProperties;
 
+  /// The source URL is the URL used to insert the image. The source URL can be
+  /// empty.
+  core.String sourceUrl;
+
   Image();
 
   Image.fromJson(core.Map _json) {
@@ -2279,6 +2317,9 @@
     if (_json.containsKey("imageProperties")) {
       imageProperties = new ImageProperties.fromJson(_json["imageProperties"]);
     }
+    if (_json.containsKey("sourceUrl")) {
+      sourceUrl = _json["sourceUrl"];
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -2290,6 +2331,9 @@
     if (imageProperties != null) {
       _json["imageProperties"] = (imageProperties).toJson();
     }
+    if (sourceUrl != null) {
+      _json["sourceUrl"] = sourceUrl;
+    }
     return _json;
   }
 }
@@ -3260,9 +3304,9 @@
 
   /// The outline property state.
   ///
-  /// Updating the the outline on a page element will implicitly update this
-  /// field to`RENDERED`, unless another value is specified in the same request.
-  /// To have no outline on a page element, set this field to `NOT_RENDERED`. In
+  /// Updating the outline on a page element will implicitly update this field
+  /// to `RENDERED`, unless another value is specified in the same request. To
+  /// have no outline on a page element, set this field to `NOT_RENDERED`. In
   /// this case, any other outline fields set in the same request will be
   /// ignored.
   /// Possible string values are:
@@ -4340,6 +4384,30 @@
   /// given text.
   SubstringMatchCriteria containsText;
 
+  /// The image replace method.
+  ///
+  /// If you specify both a `replace_method` and an `image_replace_method`, the
+  /// `image_replace_method` takes precedence.
+  ///
+  /// If you do not specify a value for `image_replace_method`, but specify a
+  /// value for `replace_method`, then the specified `replace_method` value is
+  /// used.
+  ///
+  /// If you do not specify either, then CENTER_INSIDE is used.
+  /// Possible string values are:
+  /// - "IMAGE_REPLACE_METHOD_UNSPECIFIED" : Unspecified image replace method.
+  /// This value must not be used.
+  /// - "CENTER_INSIDE" : Scales and centers the image to fit within the bounds
+  /// of the original
+  /// shape and maintains the image's aspect ratio. The rendered size of the
+  /// image may be smaller than the size of the shape. This is the default
+  /// method when one is not specified.
+  /// - "CENTER_CROP" : Scales and centers the image to fill the bounds of the
+  /// original shape.
+  /// The image may be cropped in order to fill the shape. The rendered size of
+  /// the image will be the same as that of the original shape.
+  core.String imageReplaceMethod;
+
   /// The image URL.
   ///
   /// The image is fetched once at insertion time and a copy is stored for
@@ -4347,7 +4415,7 @@
   /// cannot exceed 25 megapixels, and must be in either in PNG, JPEG, or GIF
   /// format.
   ///
-  /// The provided URL can be at maximum 2K bytes large.
+  /// The provided URL can be at most 2 kB in length.
   core.String imageUrl;
 
   /// If non-empty, limits the matches to page elements only on the given pages.
@@ -4359,6 +4427,10 @@
   core.List<core.String> pageObjectIds;
 
   /// The replace method.
+  /// Deprecated: use `image_replace_method` instead.
+  ///
+  /// If you specify both a `replace_method` and an `image_replace_method`, the
+  /// `image_replace_method` takes precedence.
   /// Possible string values are:
   /// - "CENTER_INSIDE" : Scales and centers the image to fit within the bounds
   /// of the original
@@ -4377,6 +4449,9 @@
     if (_json.containsKey("containsText")) {
       containsText = new SubstringMatchCriteria.fromJson(_json["containsText"]);
     }
+    if (_json.containsKey("imageReplaceMethod")) {
+      imageReplaceMethod = _json["imageReplaceMethod"];
+    }
     if (_json.containsKey("imageUrl")) {
       imageUrl = _json["imageUrl"];
     }
@@ -4394,6 +4469,9 @@
     if (containsText != null) {
       _json["containsText"] = (containsText).toJson();
     }
+    if (imageReplaceMethod != null) {
+      _json["imageReplaceMethod"] = imageReplaceMethod;
+    }
     if (imageUrl != null) {
       _json["imageUrl"] = imageUrl;
     }
@@ -4682,6 +4760,10 @@
   /// Updates the properties of a Line.
   UpdateLinePropertiesRequest updateLineProperties;
 
+  /// Updates the alt text title and/or description of a
+  /// page element.
+  UpdatePageElementAltTextRequest updatePageElementAltText;
+
   /// Updates the transform of a page element.
   UpdatePageElementTransformRequest updatePageElementTransform;
 
@@ -4818,6 +4900,10 @@
       updateLineProperties = new UpdateLinePropertiesRequest.fromJson(
           _json["updateLineProperties"]);
     }
+    if (_json.containsKey("updatePageElementAltText")) {
+      updatePageElementAltText = new UpdatePageElementAltTextRequest.fromJson(
+          _json["updatePageElementAltText"]);
+    }
     if (_json.containsKey("updatePageElementTransform")) {
       updatePageElementTransform =
           new UpdatePageElementTransformRequest.fromJson(
@@ -4952,6 +5038,9 @@
     if (updateLineProperties != null) {
       _json["updateLineProperties"] = (updateLineProperties).toJson();
     }
+    if (updatePageElementAltText != null) {
+      _json["updatePageElementAltText"] = (updatePageElementAltText).toJson();
+    }
     if (updatePageElementTransform != null) {
       _json["updatePageElementTransform"] =
           (updatePageElementTransform).toJson();
@@ -5199,11 +5288,9 @@
 
   /// The shadow property state.
   ///
-  /// Updating the the shadow on a page element will implicitly update this
-  /// field
-  /// to `RENDERED`, unless another value is specified in the same request. To
-  /// have no shadow on a page element, set this field to `NOT_RENDERED`. In
-  /// this
+  /// Updating the shadow on a page element will implicitly update this field to
+  /// `RENDERED`, unless another value is specified in the same request. To have
+  /// no shadow on a page element, set this field to `NOT_RENDERED`. In this
   /// case, any other shadow fields set in the same request will be ignored.
   /// Possible string values are:
   /// - "RENDERED" : If a property's state is RENDERED, then the element has the
@@ -5739,6 +5826,26 @@
 /// Determining the rendered value of the property depends on the corresponding
 /// property_state field value.
 class ShapeProperties {
+  /// The alignment of the content in the shape. If unspecified,
+  /// the alignment is inherited from a parent placeholder if it exists. If the
+  /// shape has no parent, the default alignment matches the alignment for new
+  /// shapes created in the Slides editor.
+  /// Possible string values are:
+  /// - "CONTENT_ALIGNMENT_UNSPECIFIED" : An unspecified content alignment. The
+  /// content alignment is inherited from
+  /// the parent if it exists.
+  /// - "CONTENT_ALIGNMENT_UNSUPPORTED" : An unsupported content alignment.
+  /// - "TOP" : An alignment that aligns the content to the top of the content
+  /// holder.
+  /// Corresponds to ECMA-376 ST_TextAnchoringType 't'.
+  /// - "MIDDLE" : An alignment that aligns the content to the middle of the
+  /// content
+  /// holder. Corresponds to ECMA-376 ST_TextAnchoringType 'ctr'.
+  /// - "BOTTOM" : An alignment that aligns the content to the bottom of the
+  /// content
+  /// holder. Corresponds to ECMA-376 ST_TextAnchoringType 'b'.
+  core.String contentAlignment;
+
   /// The hyperlink destination of the shape. If unset, there is no link. Links
   /// are not inherited from parent placeholders.
   Link link;
@@ -5764,6 +5871,9 @@
   ShapeProperties();
 
   ShapeProperties.fromJson(core.Map _json) {
+    if (_json.containsKey("contentAlignment")) {
+      contentAlignment = _json["contentAlignment"];
+    }
     if (_json.containsKey("link")) {
       link = new Link.fromJson(_json["link"]);
     }
@@ -5782,6 +5892,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (contentAlignment != null) {
+      _json["contentAlignment"] = contentAlignment;
+    }
     if (link != null) {
       _json["link"] = (link).toJson();
     }
@@ -6021,7 +6134,7 @@
   /// cannot exceed 25 megapixels, and must be in either in PNG, JPEG, or GIF
   /// format.
   ///
-  /// The provided URL can be at maximum 2K bytes large.
+  /// The provided URL can be at most 2 kB in length.
   core.String contentUrl;
 
   /// The original size of the picture fill. This field is read-only.
@@ -6473,6 +6586,24 @@
 
 /// The properties of the TableCell.
 class TableCellProperties {
+  /// The alignment of the content in the table cell. The default alignment
+  /// matches the alignment for newly created table cells in the Slides editor.
+  /// Possible string values are:
+  /// - "CONTENT_ALIGNMENT_UNSPECIFIED" : An unspecified content alignment. The
+  /// content alignment is inherited from
+  /// the parent if it exists.
+  /// - "CONTENT_ALIGNMENT_UNSUPPORTED" : An unsupported content alignment.
+  /// - "TOP" : An alignment that aligns the content to the top of the content
+  /// holder.
+  /// Corresponds to ECMA-376 ST_TextAnchoringType 't'.
+  /// - "MIDDLE" : An alignment that aligns the content to the middle of the
+  /// content
+  /// holder. Corresponds to ECMA-376 ST_TextAnchoringType 'ctr'.
+  /// - "BOTTOM" : An alignment that aligns the content to the bottom of the
+  /// content
+  /// holder. Corresponds to ECMA-376 ST_TextAnchoringType 'b'.
+  core.String contentAlignment;
+
   /// The background fill of the table cell. The default fill matches the fill
   /// for newly created table cells in the Slides editor.
   TableCellBackgroundFill tableCellBackgroundFill;
@@ -6480,6 +6611,9 @@
   TableCellProperties();
 
   TableCellProperties.fromJson(core.Map _json) {
+    if (_json.containsKey("contentAlignment")) {
+      contentAlignment = _json["contentAlignment"];
+    }
     if (_json.containsKey("tableCellBackgroundFill")) {
       tableCellBackgroundFill = new TableCellBackgroundFill.fromJson(
           _json["tableCellBackgroundFill"]);
@@ -6489,6 +6623,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (contentAlignment != null) {
+      _json["contentAlignment"] = contentAlignment;
+    }
     if (tableCellBackgroundFill != null) {
       _json["tableCellBackgroundFill"] = (tableCellBackgroundFill).toJson();
     }
@@ -7278,6 +7415,55 @@
   }
 }
 
+/// Updates the alt text title and/or description of a
+/// page element.
+class UpdatePageElementAltTextRequest {
+  /// The updated alt text description of the page element. If unset the
+  /// existing
+  /// value will be maintained. The description is exposed to screen readers
+  /// and other accessibility interfaces. Only use human readable values related
+  /// to the content of the page element.
+  core.String description;
+
+  /// The object ID of the page element the updates are applied to.
+  core.String objectId;
+
+  /// The updated alt text title of the page element. If unset the
+  /// existing value will be maintained. The title is exposed to screen readers
+  /// and other accessibility interfaces. Only use human readable values related
+  /// to the content of the page element.
+  core.String title;
+
+  UpdatePageElementAltTextRequest();
+
+  UpdatePageElementAltTextRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("objectId")) {
+      objectId = _json["objectId"];
+    }
+    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 (objectId != null) {
+      _json["objectId"] = objectId;
+    }
+    if (title != null) {
+      _json["title"] = title;
+    }
+    return _json;
+  }
+}
+
 /// Updates the transform of a page element.
 ///
 /// Updating the transform of a group will change the absolute transform of the
diff --git a/googleapis/lib/sourcerepo/v1.dart b/googleapis/lib/sourcerepo/v1.dart
index bd792ef..f143d5a 100644
--- a/googleapis/lib/sourcerepo/v1.dart
+++ b/googleapis/lib/sourcerepo/v1.dart
@@ -759,7 +759,7 @@
 }
 
 /// Configuration to automatically mirror a repository from another
-/// hosting service, for example GitHub or BitBucket.
+/// hosting service, for example GitHub or Bitbucket.
 class MirrorConfig {
   /// ID of the SSH deploy key at the other hosting service.
   /// Removing this key from the other service would deauthorize
@@ -922,6 +922,7 @@
 /// A repository (or repo) is a Git repository storing versioned source content.
 class Repo {
   /// How this repository mirrors a repository managed by another service.
+  /// Read-only field.
   MirrorConfig mirrorConfig;
 
   /// Resource name of the repository, of the form
@@ -929,11 +930,12 @@
   /// eg, `projects/myproject/repos/name/with/slash`
   core.String name;
 
-  /// The disk usage of the repo, in bytes.
-  /// Only returned by GetRepo.
+  /// The disk usage of the repo, in bytes. Read-only field. Size is only
+  /// returned by GetRepo.
   core.String size;
 
   /// URL to clone the repository from Google Cloud Source Repositories.
+  /// Read-only field.
   core.String url;
 
   Repo();
diff --git a/googleapis/lib/spanner/v1.dart b/googleapis/lib/spanner/v1.dart
index f3793e2..8f6355d 100644
--- a/googleapis/lib/spanner/v1.dart
+++ b/googleapis/lib/spanner/v1.dart
@@ -432,28 +432,24 @@
   /// requested. Values are of the form `projects/<project>`.
   /// Value must have pattern "^projects/[^/]+$".
   ///
-  /// [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:
   ///
-  ///   * name
-  ///   * display_name
-  ///   * labels.key where key is the name of a label
+  ///   * `name`
+  ///   * `display_name`
+  ///   * `labels.key` where key is the name of a label
   ///
   /// Some examples of using filters are:
   ///
-  ///   * name:* --> The instance has a name.
-  ///   * name:Howl --> The instance's name contains the string "howl".
-  ///   * name:HOWL --> Equivalent to above.
-  ///   * NAME:howl --> Equivalent to above.
-  ///   * labels.env:* --> The instance has the label "env".
-  ///   * labels.env:dev --> The instance has the label "env" and the value of
+  ///   * `name:*` --> The instance has a name.
+  ///   * `name:Howl` --> The instance's name contains the string "howl".
+  ///   * `name:HOWL` --> Equivalent to above.
+  ///   * `NAME:howl` --> Equivalent to above.
+  ///   * `labels.env:*` --> The instance has the label "env".
+  /// * `labels.env:dev` --> The instance has the label "env" and the value of
   ///                        the label contains the string "dev".
-  ///   * name:howl labels.env:dev --> The instance's name contains "howl" and
+  /// * `name:howl labels.env:dev` --> The instance's name contains "howl" and
   ///                                  it has the label "env" with its value
   ///                                  containing "dev".
   ///
@@ -461,6 +457,10 @@
   /// 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.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();
@@ -486,15 +486,15 @@
     if (parent == null) {
       throw new core.ArgumentError("Parameter parent 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];
     }
@@ -1003,14 +1003,14 @@
   /// Values are of the form `projects/<project>/instances/<instance>`.
   /// Value must have pattern "^projects/[^/]+/instances/[^/]+$".
   ///
-  /// [pageToken] - If non-empty, `page_token` should contain a
-  /// next_page_token from a
-  /// previous ListDatabasesResponse.
-  ///
   /// [pageSize] - Number of databases to be returned in the response. If 0 or
   /// less,
   /// defaults to the server's maximum allowed page size.
   ///
+  /// [pageToken] - If non-empty, `page_token` should contain a
+  /// next_page_token from a
+  /// previous ListDatabasesResponse.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -1022,7 +1022,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<ListDatabasesResponse> 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;
@@ -1033,12 +1033,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];
     }
@@ -1877,6 +1877,10 @@
   /// 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.
@@ -1885,18 +1889,14 @@
   /// rules are
   /// case insensitive. The fields eligible for filtering are:
   ///
-  ///   * labels.key where key is the name of a label
+  ///   * `labels.key` where key is the name of a label
   ///
   /// Some examples of using filters are:
   ///
-  ///   * labels.env:* --> The session has the label "env".
-  ///   * labels.env:dev --> The session has the label "env" and the value of
+  ///   * `labels.env:*` --> The session has the label "env".
+  ///   * `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.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();
@@ -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];
     }
@@ -1948,6 +1948,127 @@
     return _response.then((data) => new ListSessionsResponse.fromJson(data));
   }
 
+  /// Creates a set of partition tokens that can be used to execute a query
+  /// operation in parallel.  Each of the returned partition tokens can be used
+  /// by ExecuteStreamingSql to specify a subset
+  /// of the query result to read.  The same session and read-only transaction
+  /// must be used by the PartitionQueryRequest used to create the
+  /// partition tokens and the ExecuteSqlRequests that use the partition tokens.
+  /// Partition tokens become invalid when the session used to create them
+  /// is deleted or begins a new transaction.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [session] - Required. The session used to create the partitions.
+  /// Value must have pattern
+  /// "^projects/[^/]+/instances/[^/]+/databases/[^/]+/sessions/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PartitionResponse].
+  ///
+  /// 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<PartitionResponse> partitionQuery(
+      PartitionQueryRequest request, core.String session,
+      {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 (session == null) {
+      throw new core.ArgumentError("Parameter session is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' +
+        commons.Escaper.ecapeVariableReserved('$session') +
+        ':partitionQuery';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new PartitionResponse.fromJson(data));
+  }
+
+  /// Creates a set of partition tokens that can be used to execute a read
+  /// operation in parallel.  Each of the returned partition tokens can be used
+  /// by StreamingRead to specify a subset of the read
+  /// result to read.  The same session and read-only transaction must be used
+  /// by
+  /// the PartitionReadRequest used to create the partition tokens and the
+  /// ReadRequests that use the partition tokens.
+  /// Partition tokens become invalid when the session used to create them
+  /// is deleted or begins a new transaction.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [session] - Required. The session used to create the partitions.
+  /// Value must have pattern
+  /// "^projects/[^/]+/instances/[^/]+/databases/[^/]+/sessions/[^/]+$".
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [PartitionResponse].
+  ///
+  /// 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<PartitionResponse> partitionRead(
+      PartitionReadRequest request, core.String session,
+      {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 (session == null) {
+      throw new core.ArgumentError("Parameter session is required.");
+    }
+    if ($fields != null) {
+      _queryParams["fields"] = [$fields];
+    }
+
+    _url = 'v1/' +
+        commons.Escaper.ecapeVariableReserved('$session') +
+        ':partitionRead';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new PartitionResponse.fromJson(data));
+  }
+
   /// Reads rows from the database using key lookups and scans, as a
   /// simple key/value style alternative to
   /// ExecuteSql.  This method cannot be used to
@@ -2296,12 +2417,12 @@
   /// [name] - The name of the operation's parent resource.
   /// Value must have pattern "^projects/[^/]+/instances/[^/]+/operations$".
   ///
+  /// [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.
   ///
@@ -2313,9 +2434,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 filter,
+      {core.int pageSize,
+      core.String filter,
       core.String pageToken,
-      core.int pageSize,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -2327,15 +2448,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];
     }
@@ -2870,8 +2991,23 @@
   /// `String`, `bool` and `null` as well as `Map` and `List` values.
   core.Map<core.String, core.Object> params;
 
+  /// If present, results will be restricted to the specified partition
+  /// previously created using PartitionQuery().  There must be an exact
+  /// match for the values of fields common to this message and the
+  /// PartitionQueryRequest message used to create this partition_token.
+  core.String partitionToken;
+  core.List<core.int> get partitionTokenAsBytes {
+    return convert.BASE64.decode(partitionToken);
+  }
+
+  void set partitionTokenAsBytes(core.List<core.int> _bytes) {
+    partitionToken =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
   /// Used to control the amount of debugging information returned in
-  /// ResultSetStats.
+  /// ResultSetStats. If partition_token is set, query_mode can only
+  /// be set to QueryMode.NORMAL.
   /// Possible string values are:
   /// - "NORMAL" : The default mode where only the query result, without any
   /// information
@@ -2918,6 +3054,9 @@
     if (_json.containsKey("params")) {
       params = _json["params"];
     }
+    if (_json.containsKey("partitionToken")) {
+      partitionToken = _json["partitionToken"];
+    }
     if (_json.containsKey("queryMode")) {
       queryMode = _json["queryMode"];
     }
@@ -2943,6 +3082,9 @@
     if (params != null) {
       _json["params"] = params;
     }
+    if (partitionToken != null) {
+      _json["partitionToken"] = partitionToken;
+    }
     if (queryMode != null) {
       _json["queryMode"] = queryMode;
     }
@@ -3079,21 +3221,9 @@
   /// Required. The number of nodes allocated to this instance. This may be zero
   /// in API responses for instances that are not yet in state `READY`.
   ///
-  /// Each Spanner node can provide up to 10,000 QPS of reads or 2000 QPS of
-  /// writes (writing single rows at 1KB data per row), and 2 TiB storage.
-  ///
-  /// For optimal performance, we recommend provisioning enough nodes to keep
-  /// overall CPU utilization under 75%.
-  ///
-  /// A minimum of 3 nodes is recommended for production environments.  This
-  /// minimum is required for SLAs to apply to your instance.
-  ///
-  /// Note that Cloud Spanner performance is highly dependent on workload,
-  /// schema
-  /// design, and dataset characteristics. The performance numbers above are
-  /// estimates, and assume [best
-  /// practices](https://cloud.google.com/spanner/docs/bulk-loading)
-  /// are followed.
+  /// See [the
+  /// documentation](https://cloud.google.com/spanner/docs/instances#node_count)
+  /// for more information about nodes.
   core.int nodeCount;
 
   /// Output only. The current instance state. For
@@ -3885,6 +4015,288 @@
   }
 }
 
+/// Information returned for each partition returned in a
+/// PartitionResponse.
+class Partition {
+  /// This token can be passed to Read, StreamingRead, ExecuteSql, or
+  /// ExecuteStreamingSql requests to restrict the results to those identified
+  /// by
+  /// this partition token.
+  core.String partitionToken;
+  core.List<core.int> get partitionTokenAsBytes {
+    return convert.BASE64.decode(partitionToken);
+  }
+
+  void set partitionTokenAsBytes(core.List<core.int> _bytes) {
+    partitionToken =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
+  Partition();
+
+  Partition.fromJson(core.Map _json) {
+    if (_json.containsKey("partitionToken")) {
+      partitionToken = _json["partitionToken"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (partitionToken != null) {
+      _json["partitionToken"] = partitionToken;
+    }
+    return _json;
+  }
+}
+
+/// Options for a PartitionQueryRequest and
+/// PartitionReadRequest.
+class PartitionOptions {
+  /// The desired maximum number of partitions to return.  For example, this may
+  /// be set to the number of workers available.  The default for this option
+  /// is currently 10,000. The maximum value is currently 200,000.  This is only
+  /// a hint.  The actual number of partitions returned may be smaller than
+  /// this maximum count request.
+  core.String maxPartitions;
+
+  /// The desired data size for each partition generated.  The default for this
+  /// option is currently 1 GiB.  This is only a hint. The actual size of each
+  /// partition may be smaller or larger than this size request.
+  core.String partitionSizeBytes;
+
+  PartitionOptions();
+
+  PartitionOptions.fromJson(core.Map _json) {
+    if (_json.containsKey("maxPartitions")) {
+      maxPartitions = _json["maxPartitions"];
+    }
+    if (_json.containsKey("partitionSizeBytes")) {
+      partitionSizeBytes = _json["partitionSizeBytes"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (maxPartitions != null) {
+      _json["maxPartitions"] = maxPartitions;
+    }
+    if (partitionSizeBytes != null) {
+      _json["partitionSizeBytes"] = partitionSizeBytes;
+    }
+    return _json;
+  }
+}
+
+/// The request for PartitionQuery
+class PartitionQueryRequest {
+  /// It is not always possible for Cloud Spanner to infer the right SQL type
+  /// from a JSON value.  For example, values of type `BYTES` and values
+  /// of type `STRING` both appear in params as JSON strings.
+  ///
+  /// In these cases, `param_types` can be used to specify the exact
+  /// SQL type for some or all of the SQL query parameters. See the
+  /// definition of Type for more information
+  /// about SQL types.
+  core.Map<core.String, Type> paramTypes;
+
+  /// The SQL query string can contain parameter placeholders. A parameter
+  /// placeholder consists of `'@'` followed by the parameter
+  /// name. Parameter names consist of any combination of letters,
+  /// numbers, and underscores.
+  ///
+  /// Parameters can appear anywhere that a literal value is expected.  The same
+  /// parameter name can be used more than once, for example:
+  ///   `"WHERE id > @msg_id AND id < @msg_id + 100"`
+  ///
+  /// It is an error to execute an SQL query with unbound parameters.
+  ///
+  /// Parameter values are specified using `params`, which is a JSON
+  /// object whose keys are parameter names, and whose values are the
+  /// corresponding parameter values.
+  ///
+  /// 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> params;
+
+  /// Additional options that affect how many partitions are created.
+  PartitionOptions partitionOptions;
+
+  /// The query request to generate partitions for. The request will fail if
+  /// the query is not root partitionable. The query plan of a root
+  /// partitionable query has a single distributed union operator. A distributed
+  /// union operator conceptually divides one or more tables into multiple
+  /// splits, remotely evaluates a subquery independently on each split, and
+  /// then unions all results.
+  core.String sql;
+
+  /// Read only snapshot transactions are supported, read/write and single use
+  /// transactions are not.
+  TransactionSelector transaction;
+
+  PartitionQueryRequest();
+
+  PartitionQueryRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("paramTypes")) {
+      paramTypes = commons.mapMap<core.Map<core.String, core.Object>, Type>(
+          _json["paramTypes"],
+          (core.Map<core.String, core.Object> item) => new Type.fromJson(item));
+    }
+    if (_json.containsKey("params")) {
+      params = _json["params"];
+    }
+    if (_json.containsKey("partitionOptions")) {
+      partitionOptions =
+          new PartitionOptions.fromJson(_json["partitionOptions"]);
+    }
+    if (_json.containsKey("sql")) {
+      sql = _json["sql"];
+    }
+    if (_json.containsKey("transaction")) {
+      transaction = new TransactionSelector.fromJson(_json["transaction"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (paramTypes != null) {
+      _json["paramTypes"] =
+          commons.mapMap<Type, core.Map<core.String, core.Object>>(
+              paramTypes, (Type item) => (item).toJson());
+    }
+    if (params != null) {
+      _json["params"] = params;
+    }
+    if (partitionOptions != null) {
+      _json["partitionOptions"] = (partitionOptions).toJson();
+    }
+    if (sql != null) {
+      _json["sql"] = sql;
+    }
+    if (transaction != null) {
+      _json["transaction"] = (transaction).toJson();
+    }
+    return _json;
+  }
+}
+
+/// The request for PartitionRead
+class PartitionReadRequest {
+  /// The columns of table to be returned for each row matching
+  /// this request.
+  core.List<core.String> columns;
+
+  /// If non-empty, the name of an index on table. This index is
+  /// used instead of the table primary key when interpreting key_set
+  /// and sorting result rows. See key_set for further information.
+  core.String index;
+
+  /// Required. `key_set` identifies the rows to be yielded. `key_set` names the
+  /// primary keys of the rows in table to be yielded, unless index
+  /// is present. If index is present, then key_set instead names
+  /// index keys in index.
+  ///
+  /// It is not an error for the `key_set` to name rows that do not
+  /// exist in the database. Read yields nothing for nonexistent rows.
+  KeySet keySet;
+
+  /// Additional options that affect how many partitions are created.
+  PartitionOptions partitionOptions;
+
+  /// Required. The name of the table in the database to be read.
+  core.String table;
+
+  /// Read only snapshot transactions are supported, read/write and single use
+  /// transactions are not.
+  TransactionSelector transaction;
+
+  PartitionReadRequest();
+
+  PartitionReadRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("columns")) {
+      columns = _json["columns"];
+    }
+    if (_json.containsKey("index")) {
+      index = _json["index"];
+    }
+    if (_json.containsKey("keySet")) {
+      keySet = new KeySet.fromJson(_json["keySet"]);
+    }
+    if (_json.containsKey("partitionOptions")) {
+      partitionOptions =
+          new PartitionOptions.fromJson(_json["partitionOptions"]);
+    }
+    if (_json.containsKey("table")) {
+      table = _json["table"];
+    }
+    if (_json.containsKey("transaction")) {
+      transaction = new TransactionSelector.fromJson(_json["transaction"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (columns != null) {
+      _json["columns"] = columns;
+    }
+    if (index != null) {
+      _json["index"] = index;
+    }
+    if (keySet != null) {
+      _json["keySet"] = (keySet).toJson();
+    }
+    if (partitionOptions != null) {
+      _json["partitionOptions"] = (partitionOptions).toJson();
+    }
+    if (table != null) {
+      _json["table"] = table;
+    }
+    if (transaction != null) {
+      _json["transaction"] = (transaction).toJson();
+    }
+    return _json;
+  }
+}
+
+/// The response for PartitionQuery
+/// or PartitionRead
+class PartitionResponse {
+  /// Partitions created by this request.
+  core.List<Partition> partitions;
+
+  /// Transaction created by this request.
+  Transaction transaction;
+
+  PartitionResponse();
+
+  PartitionResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("partitions")) {
+      partitions = _json["partitions"]
+          .map((value) => new Partition.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("transaction")) {
+      transaction = new Transaction.fromJson(_json["transaction"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (partitions != null) {
+      _json["partitions"] =
+          partitions.map((value) => (value).toJson()).toList();
+    }
+    if (transaction != null) {
+      _json["transaction"] = (transaction).toJson();
+    }
+    return _json;
+  }
+}
+
 /// Node information for nodes appearing in a QueryPlan.plan_nodes.
 class PlanNode {
   /// List of child node `index`es and their relationship to this parent.
@@ -4029,7 +4441,7 @@
 ///     }
 ///
 /// For a description of IAM and its features, see the
-/// [IAM developer's guide](https://cloud.google.com/iam).
+/// [IAM developer's guide](https://cloud.google.com/iam/docs).
 class Policy {
   /// Associates a list of `members` to a `role`.
   /// `bindings` with no members will result in an error.
@@ -4056,7 +4468,7 @@
         convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
   }
 
-  /// Version of the `Policy`. The default version is 0.
+  /// Deprecated.
   core.int version;
 
   Policy();
@@ -4155,6 +4567,9 @@
   /// previously committed transaction whose timestamp is known.
   ///
   /// Note that this option can only be used in single-use transactions.
+  ///
+  /// A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
+  /// Example: `"2014-10-02T15:01:23.045123456Z"`.
   core.String minReadTimestamp;
 
   /// Executes all reads at the given timestamp. Unlike other modes,
@@ -4166,6 +4581,9 @@
   /// Useful for large scale consistent reads such as mapreduces, or
   /// for coordinating many reads against a consistent snapshot of the
   /// data.
+  ///
+  /// A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
+  /// Example: `"2014-10-02T15:01:23.045123456Z"`.
   core.String readTimestamp;
 
   /// If true, the Cloud Spanner-selected read timestamp is included in
@@ -4241,18 +4659,34 @@
   /// is present. If index is present, then key_set instead names
   /// index keys in index.
   ///
-  /// Rows are yielded in table primary key order (if index is empty)
-  /// or index key order (if index is non-empty).
+  /// If the partition_token field is empty, rows are yielded
+  /// in table primary key order (if index is empty) or index key order
+  /// (if index is non-empty).  If the partition_token field is not
+  /// empty, rows will be yielded in an unspecified order.
   ///
   /// It is not an error for the `key_set` to name rows that do not
   /// exist in the database. Read yields nothing for nonexistent rows.
   KeySet keySet;
 
   /// If greater than zero, only the first `limit` rows are yielded. If `limit`
-  /// is zero, the default is no limit.
-  /// A limit cannot be specified if partition_token is set.
+  /// is zero, the default is no limit. A limit cannot be specified if
+  /// `partition_token` is set.
   core.String limit;
 
+  /// If present, results will be restricted to the specified partition
+  /// previously created using PartitionRead().    There must be an exact
+  /// match for the values of fields common to this message and the
+  /// PartitionReadRequest message used to create this partition_token.
+  core.String partitionToken;
+  core.List<core.int> get partitionTokenAsBytes {
+    return convert.BASE64.decode(partitionToken);
+  }
+
+  void set partitionTokenAsBytes(core.List<core.int> _bytes) {
+    partitionToken =
+        convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
+  }
+
   /// If this request is resuming a previously interrupted read,
   /// `resume_token` should be copied from the last
   /// PartialResultSet yielded before the interruption. Doing this
@@ -4291,6 +4725,9 @@
     if (_json.containsKey("limit")) {
       limit = _json["limit"];
     }
+    if (_json.containsKey("partitionToken")) {
+      partitionToken = _json["partitionToken"];
+    }
     if (_json.containsKey("resumeToken")) {
       resumeToken = _json["resumeToken"];
     }
@@ -4317,6 +4754,9 @@
     if (limit != null) {
       _json["limit"] = limit;
     }
+    if (partitionToken != null) {
+      _json["partitionToken"] = partitionToken;
+    }
     if (resumeToken != null) {
       _json["resumeToken"] = resumeToken;
     }
@@ -4526,10 +4966,13 @@
   ///    the following regular expression: `[a-z]([-a-z0-9]*[a-z0-9])?`.
   ///  * Label values must be between 0 and 63 characters long and must conform
   ///    to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`.
-  ///  * No more than 20 labels can be associated with a given session.
+  ///  * No more than 64 labels can be associated with a given session.
+  ///
+  /// See https://goo.gl/xmQnxf for more information on and examples of labels.
   core.Map<core.String, core.String> labels;
 
-  /// The name of the session.
+  /// The name of the session. This is always system-assigned; values provided
+  /// when creating a session are ignored.
   core.String name;
 
   Session();
@@ -4834,6 +5277,9 @@
   /// For snapshot read-only transactions, the read timestamp chosen
   /// for the transaction. Not returned by default: see
   /// TransactionOptions.ReadOnly.return_read_timestamp.
+  ///
+  /// A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
+  /// Example: `"2014-10-02T15:01:23.045123456Z"`.
   core.String readTimestamp;
 
   Transaction();
diff --git a/googleapis/lib/speech/v1.dart b/googleapis/lib/speech/v1.dart
index 308ca78..dfe8c44 100644
--- a/googleapis/lib/speech/v1.dart
+++ b/googleapis/lib/speech/v1.dart
@@ -37,112 +37,6 @@
 
   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 "^[^/]+$".
-  ///
-  /// [$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/operations/' +
-        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 "^[^/]+$".
-  ///
-  /// [$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/operations/' + 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.
@@ -187,78 +81,6 @@
         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:
-  ///
-  /// [pageToken] - The standard list page token.
-  ///
-  /// [name] - The name of the operation's parent resource.
-  ///
-  /// [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 pageToken,
-      core.String name,
-      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 (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
-    if (name != null) {
-      _queryParams["name"] = [name];
-    }
-    if (pageSize != null) {
-      _queryParams["pageSize"] = ["${pageSize}"];
-    }
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
-    if ($fields != null) {
-      _queryParams["fields"] = [$fields];
-    }
-
-    _url = 'v1/operations';
-
-    var _response = _requester.request(_url, "GET",
-        body: _body,
-        queryParams: _queryParams,
-        uploadOptions: _uploadOptions,
-        uploadMedia: _uploadMedia,
-        downloadOptions: _downloadOptions);
-    return _response.then((data) => new ListOperationsResponse.fromJson(data));
-  }
 }
 
 class SpeechResourceApi {
@@ -358,75 +180,6 @@
   }
 }
 
-/// 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;
-  }
-}
-
-/// 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;
-  }
-}
-
 /// The top-level message sent by the client for the `LongRunningRecognize`
 /// method.
 class LongRunningRecognizeRequest {
@@ -595,6 +348,11 @@
 /// Provides information to the recognizer that specifies how to process the
 /// request.
 class RecognitionConfig {
+  /// *Optional* If `true`, the top result includes a list of words and the
+  /// confidence for those words. If `false`, no word-level confidence
+  /// information is returned. The default is `false`.
+  core.bool enableWordConfidence;
+
   /// *Optional* If `true`, the top result includes a list of words and
   /// the start and end time offsets (timestamps) for those words. If
   /// `false`, no word-level time offset information is returned. The default is
@@ -603,8 +361,7 @@
 
   /// *Required* Encoding of audio data sent in all `RecognitionAudio` messages.
   /// Possible string values are:
-  /// - "ENCODING_UNSPECIFIED" : Not specified. Will return result
-  /// google.rpc.Code.INVALID_ARGUMENT.
+  /// - "ENCODING_UNSPECIFIED" : Not specified.
   /// - "LINEAR16" : Uncompressed 16-bit signed little-endian samples (Linear
   /// PCM).
   /// - "FLAC" : [`FLAC`](https://xiph.org/flac/documentation.html) (Free
@@ -622,7 +379,7 @@
   /// be 16000.
   /// - "OGG_OPUS" : Opus encoded audio frames in Ogg container
   /// ([OggOpus](https://wiki.xiph.org/OggOpus)).
-  /// `sample_rate_hertz` must be 16000.
+  /// `sample_rate_hertz` must be one of 8000, 12000, 16000, 24000, or 48000.
   /// - "SPEEX_WITH_HEADER_BYTE" : Although the use of lossy encodings is not
   /// recommended, if a very low
   /// bitrate encoding is required, `OGG_OPUS` is highly preferred over
@@ -674,6 +431,9 @@
   RecognitionConfig();
 
   RecognitionConfig.fromJson(core.Map _json) {
+    if (_json.containsKey("enableWordConfidence")) {
+      enableWordConfidence = _json["enableWordConfidence"];
+    }
     if (_json.containsKey("enableWordTimeOffsets")) {
       enableWordTimeOffsets = _json["enableWordTimeOffsets"];
     }
@@ -702,6 +462,9 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (enableWordConfidence != null) {
+      _json["enableWordConfidence"] = enableWordConfidence;
+    }
     if (enableWordTimeOffsets != null) {
       _json["enableWordTimeOffsets"] = enableWordTimeOffsets;
     }
@@ -823,10 +586,11 @@
 class SpeechRecognitionAlternative {
   /// *Output-only* The confidence estimate between 0.0 and 1.0. A higher number
   /// indicates an estimated greater likelihood that the recognized words are
-  /// correct. This field is typically provided only for the top hypothesis, and
-  /// only for `is_final=true` results. Clients should not rely on the
-  /// `confidence` field as it is not guaranteed to be accurate, or even set, in
-  /// any of the results.
+  /// correct. This field is set only for the top alternative of a non-streaming
+  /// result or, of a streaming result where `is_final=true`.
+  /// This field is not guaranteed to be accurate and users should not rely on
+  /// it
+  /// to be always provided.
   /// The default of 0.0 is a sentinel value indicating `confidence` was not
   /// set.
   core.double confidence;
@@ -877,12 +641,6 @@
   /// alternative being the most probable, as ranked by the recognizer.
   core.List<SpeechRecognitionAlternative> alternatives;
 
-  /// For multi-channel audio, this is the channel number corresponding to the
-  /// recognized result for the audio from that channel.
-  /// For audio_channel_count = N, its output values can range from '0' to
-  /// 'N-1'.
-  core.int channelTag;
-
   SpeechRecognitionResult();
 
   SpeechRecognitionResult.fromJson(core.Map _json) {
@@ -891,9 +649,6 @@
           .map((value) => new SpeechRecognitionAlternative.fromJson(value))
           .toList();
     }
-    if (_json.containsKey("channelTag")) {
-      channelTag = _json["channelTag"];
-    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -903,9 +658,6 @@
       _json["alternatives"] =
           alternatives.map((value) => (value).toJson()).toList();
     }
-    if (channelTag != null) {
-      _json["channelTag"] = channelTag;
-    }
     return _json;
   }
 }
@@ -1012,9 +764,7 @@
   }
 }
 
-/// Word-specific information for recognized words. Word information is only
-/// included in the response when certain request parameters are set, such
-/// as `enable_word_time_offsets`.
+/// Word-specific information for recognized words.
 class WordInfo {
   /// *Output-only* Time offset relative to the beginning of the audio,
   /// and corresponding to the end of the spoken word.
diff --git a/googleapis/lib/storage/v1.dart b/googleapis/lib/storage/v1.dart
index 0de3dc1..daad0f6 100644
--- a/googleapis/lib/storage/v1.dart
+++ b/googleapis/lib/storage/v1.dart
@@ -663,7 +663,7 @@
   /// - "full" : Include all properties.
   /// - "noAcl" : Omit owner, acl and defaultObjectAcl properties.
   ///
-  /// [userProject] - The project to be billed for this request
+  /// [userProject] - The project to be billed for this request.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -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.
@@ -2307,31 +2367,21 @@
   /// [$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
-  ///
-  /// - [Object] for Metadata downloads (see [downloadOptions]).
-  ///
-  /// - [commons.Media] for Media downloads (see [downloadOptions]).
+  /// Completes with a [Object].
   ///
   /// 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 compose(ComposeRequest request, core.String destinationBucket,
-      core.String destinationObject,
+  async.Future<Object> compose(ComposeRequest request,
+      core.String destinationBucket, core.String destinationObject,
       {core.String destinationPredefinedAcl,
       core.String ifGenerationMatch,
       core.String ifMetagenerationMatch,
       core.String kmsKeyName,
       core.String userProject,
-      core.String $fields,
-      commons.DownloadOptions downloadOptions:
-          commons.DownloadOptions.Metadata}) {
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2367,8 +2417,6 @@
       _queryParams["fields"] = [$fields];
     }
 
-    _downloadOptions = downloadOptions;
-
     _url = 'b/' +
         commons.Escaper.ecapeVariable('$destinationBucket') +
         '/o/' +
@@ -2381,12 +2429,7 @@
         uploadOptions: _uploadOptions,
         uploadMedia: _uploadMedia,
         downloadOptions: _downloadOptions);
-    if (_downloadOptions == null ||
-        _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => new Object.fromJson(data));
-    } else {
-      return _response;
-    }
+    return _response.then((data) => new Object.fromJson(data));
   }
 
   /// Copies a source object to a destination object. Optionally overrides
@@ -2470,22 +2513,14 @@
   /// [$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
-  ///
-  /// - [Object] for Metadata downloads (see [downloadOptions]).
-  ///
-  /// - [commons.Media] for Media downloads (see [downloadOptions]).
+  /// Completes with a [Object].
   ///
   /// 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 copy(
+  async.Future<Object> copy(
       Object request,
       core.String sourceBucket,
       core.String sourceObject,
@@ -2503,9 +2538,7 @@
       core.String projection,
       core.String sourceGeneration,
       core.String userProject,
-      core.String $fields,
-      commons.DownloadOptions downloadOptions:
-          commons.DownloadOptions.Metadata}) {
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2572,8 +2605,6 @@
       _queryParams["fields"] = [$fields];
     }
 
-    _downloadOptions = downloadOptions;
-
     _url = 'b/' +
         commons.Escaper.ecapeVariable('$sourceBucket') +
         '/o/' +
@@ -2589,12 +2620,7 @@
         uploadOptions: _uploadOptions,
         uploadMedia: _uploadMedia,
         downloadOptions: _downloadOptions);
-    if (_downloadOptions == null ||
-        _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => new Object.fromJson(data));
-    } else {
-      return _response;
-    }
+    return _response.then((data) => new Object.fromJson(data));
   }
 
   /// Deletes an object and its metadata. Deletions are permanent if versioning
@@ -2916,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.
@@ -2956,22 +2983,14 @@
   /// the length being known ahead of time is only supported via resumable
   /// uploads.
   ///
-  /// [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
-  ///
-  /// - [Object] for Metadata downloads (see [downloadOptions]).
-  ///
-  /// - [commons.Media] for Media downloads (see [downloadOptions]).
+  /// Completes with a [Object].
   ///
   /// 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 insert(Object request, core.String bucket,
+  async.Future<Object> insert(Object request, core.String bucket,
       {core.String contentEncoding,
       core.String ifGenerationMatch,
       core.String ifGenerationNotMatch,
@@ -2984,9 +3003,7 @@
       core.String userProject,
       core.String $fields,
       commons.UploadOptions uploadOptions: commons.UploadOptions.Default,
-      commons.Media uploadMedia,
-      commons.DownloadOptions downloadOptions:
-          commons.DownloadOptions.Metadata}) {
+      commons.Media uploadMedia}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -3036,7 +3053,6 @@
 
     _uploadMedia = uploadMedia;
     _uploadOptions = uploadOptions;
-    _downloadOptions = downloadOptions;
 
     if (_uploadMedia == null) {
       _url = 'b/' + commons.Escaper.ecapeVariable('$bucket') + '/o';
@@ -3056,12 +3072,7 @@
         uploadOptions: _uploadOptions,
         uploadMedia: _uploadMedia,
         downloadOptions: _downloadOptions);
-    if (_downloadOptions == null ||
-        _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => new Object.fromJson(data));
-    } else {
-      return _response;
-    }
+    return _response.then((data) => new Object.fromJson(data));
   }
 
   /// Retrieves a list of objects matching the criteria.
@@ -3162,7 +3173,7 @@
     return _response.then((data) => new Objects.fromJson(data));
   }
 
-  /// Updates an object's metadata. This method supports patch semantics.
+  /// Patches an object's metadata.
   ///
   /// [request] - The metadata request object.
   ///
@@ -3211,8 +3222,8 @@
   /// - "full" : Include all properties.
   /// - "noAcl" : Omit the owner, acl property.
   ///
-  /// [userProject] - The project to be billed for this request. Required for
-  /// Requester Pays buckets.
+  /// [userProject] - The project to be billed for this request, for Requester
+  /// Pays buckets.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -3717,22 +3728,15 @@
   /// [$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
-  ///
-  /// - [Object] for Metadata downloads (see [downloadOptions]).
-  ///
-  /// - [commons.Media] for Media downloads (see [downloadOptions]).
+  /// Completes with a [Object].
   ///
   /// 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 update(Object request, core.String bucket, core.String object,
+  async.Future<Object> update(
+      Object request, core.String bucket, core.String object,
       {core.String generation,
       core.String ifGenerationMatch,
       core.String ifGenerationNotMatch,
@@ -3741,9 +3745,7 @@
       core.String predefinedAcl,
       core.String projection,
       core.String userProject,
-      core.String $fields,
-      commons.DownloadOptions downloadOptions:
-          commons.DownloadOptions.Metadata}) {
+      core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -3788,8 +3790,6 @@
       _queryParams["fields"] = [$fields];
     }
 
-    _downloadOptions = downloadOptions;
-
     _url = 'b/' +
         commons.Escaper.ecapeVariable('$bucket') +
         '/o/' +
@@ -3801,12 +3801,7 @@
         uploadOptions: _uploadOptions,
         uploadMedia: _uploadMedia,
         downloadOptions: _downloadOptions);
-    if (_downloadOptions == null ||
-        _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => new Object.fromJson(data));
-    } else {
-      return _response;
-    }
+    return _response.then((data) => new Object.fromJson(data));
   }
 
   /// Watch for changes on all objects in a bucket.
@@ -3982,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();
@@ -4060,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();
@@ -4305,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.
@@ -4378,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;
 
@@ -4388,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;
 
@@ -4423,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;
 
@@ -4464,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))
@@ -4505,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"];
     }
@@ -4537,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();
@@ -4577,6 +4661,9 @@
     if (projectNumber != null) {
       _json["projectNumber"] = projectNumber;
     }
+    if (retentionPolicy != null) {
+      _json["retentionPolicy"] = (retentionPolicy).toJson();
+    }
     if (selfLink != null) {
       _json["selfLink"] = selfLink;
     }
@@ -5300,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;
 
@@ -5311,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
@@ -5336,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;
 
@@ -5345,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;
 
@@ -5398,6 +5511,9 @@
     if (_json.containsKey("etag")) {
       etag = _json["etag"];
     }
+    if (_json.containsKey("eventBasedHold")) {
+      eventBasedHold = _json["eventBasedHold"];
+    }
     if (_json.containsKey("generation")) {
       generation = _json["generation"];
     }
@@ -5428,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"];
     }
@@ -5437,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"]);
     }
@@ -5488,6 +5611,9 @@
     if (etag != null) {
       _json["etag"] = etag;
     }
+    if (eventBasedHold != null) {
+      _json["eventBasedHold"] = eventBasedHold;
+    }
     if (generation != null) {
       _json["generation"] = generation;
     }
@@ -5518,6 +5644,10 @@
     if (owner != null) {
       _json["owner"] = (owner).toJson();
     }
+    if (retentionExpirationTime != null) {
+      _json["retentionExpirationTime"] =
+          (retentionExpirationTime).toIso8601String();
+    }
     if (selfLink != null) {
       _json["selfLink"] = selfLink;
     }
@@ -5527,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/googleapis/lib/storagetransfer/v1.dart b/googleapis/lib/storagetransfer/v1.dart
index 1c982b1..649c103 100644
--- a/googleapis/lib/storagetransfer/v1.dart
+++ b/googleapis/lib/storagetransfer/v1.dart
@@ -201,8 +201,6 @@
   ///
   /// Request parameters:
   ///
-  /// [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
@@ -216,6 +214,8 @@
   /// and `job_statuses` are optional.  The valid values for `job_statuses` are
   /// case-insensitive: `ENABLED`, `DISABLED`, and `DELETED`.
   ///
+  /// [pageToken] - The list page token.
+  ///
   /// [$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.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();
@@ -238,15 +238,15 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    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];
     }
@@ -472,10 +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
   /// of {\"project_id\" : \"my_project_id\", \"job_names\" : [\"jobid1\",
   /// \"jobid2\",...], \"operation_names\" : [\"opid1\", \"opid2\",...],
@@ -484,6 +480,10 @@
   /// must be specified with array notation. `job_names`, `operation_names`, and
   /// `transfer_statuses` are optional.
   ///
+  /// [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.
   ///
@@ -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.String filter,
+      core.String pageToken,
       core.int pageSize,
-      core.String filter,
       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 (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];
     }
@@ -1609,14 +1609,15 @@
   core.String bytesFailedToDeleteFromSink;
 
   /// Bytes found in the data source that are scheduled to be transferred,
-  /// which will be copied, excluded based on conditions, or skipped due to
-  /// failures.
+  /// excluding any that are filtered based on object conditions or skipped due
+  /// to sync.
   core.String bytesFoundFromSource;
 
   /// Bytes found only in the data sink that are scheduled to be deleted.
   core.String bytesFoundOnlyFromSink;
 
-  /// Bytes in the data source that failed during the transfer.
+  /// Bytes in the data source that failed to be transferred or that failed to
+  /// be deleted after being transferred.
   core.String bytesFromSourceFailed;
 
   /// Bytes in the data source that are not transferred because they already
@@ -1636,14 +1637,15 @@
   core.String objectsFailedToDeleteFromSink;
 
   /// Objects found in the data source that are scheduled to be transferred,
-  /// which will be copied, excluded based on conditions, or skipped due to
-  /// failures.
+  /// excluding any that are filtered based on object conditions or skipped due
+  /// to sync.
   core.String objectsFoundFromSource;
 
   /// Objects found only in the data sink that are scheduled to be deleted.
   core.String objectsFoundOnlyFromSink;
 
-  /// Objects in the data source that failed during the transfer.
+  /// Objects in the data source that failed to be transferred or that failed
+  /// to be deleted after being transferred.
   core.String objectsFromSourceFailed;
 
   /// Objects in the data source that are not transferred because they already
diff --git a/googleapis/lib/streetviewpublish/v1.dart b/googleapis/lib/streetviewpublish/v1.dart
index 058e287..0bd8548 100644
--- a/googleapis/lib/streetviewpublish/v1.dart
+++ b/googleapis/lib/streetviewpublish/v1.dart
@@ -54,7 +54,8 @@
   ///
   /// This method returns the following error codes:
   ///
-  /// * google.rpc.Code.INVALID_ARGUMENT if the request is malformed.
+  /// * google.rpc.Code.INVALID_ARGUMENT if the request is malformed or if
+  /// the uploaded photo is not a 360 photo.
   /// * google.rpc.Code.NOT_FOUND if the upload reference does not exist.
   /// * google.rpc.Code.RESOURCE_EXHAUSTED if the account has reached the
   /// storage limit.
@@ -156,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:
   ///
@@ -290,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.
   ///
@@ -454,6 +459,10 @@
   ///
   /// Request parameters:
   ///
+  /// [photoIds] - Required. IDs of the Photos. For HTTP
+  /// GET requests, the URL query parameter should be
+  /// `photoIds=<id1>&photoIds=<id2>&...`.
+  ///
   /// [view] - Specifies if a download URL for the photo bytes should be
   /// returned in the
   /// Photo response.
@@ -461,10 +470,6 @@
   /// - "BASIC" : A BASIC.
   /// - "INCLUDE_DOWNLOAD_URL" : A INCLUDE_DOWNLOAD_URL.
   ///
-  /// [photoIds] - Required. IDs of the Photos. For HTTP
-  /// GET requests, the URL query parameter should be
-  /// `photoIds=<id1>&photoIds=<id2>&...`.
-  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -476,8 +481,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<BatchGetPhotosResponse> batchGet(
-      {core.String view,
-      core.List<core.String> photoIds,
+      {core.List<core.String> photoIds,
+      core.String view,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -486,12 +491,12 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (view != null) {
-      _queryParams["view"] = [view];
-    }
     if (photoIds != null) {
       _queryParams["photoIds"] = photoIds;
     }
+    if (view != null) {
+      _queryParams["view"] = [view];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -582,13 +587,11 @@
   /// 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:
-  /// `placeId=ChIJj61dQgK6j4AR4GeTYWZsKWw`.
-  ///
-  /// The only filter supported at the moment is `placeId`.
-  ///
   /// [pageToken] - The
   /// nextPageToken
   /// value returned from a previous
@@ -608,6 +611,11 @@
   /// - "BASIC" : A BASIC.
   /// - "INCLUDE_DOWNLOAD_URL" : A INCLUDE_DOWNLOAD_URL.
   ///
+  /// [filter] - The filter expression. For example:
+  /// `placeId=ChIJj61dQgK6j4AR4GeTYWZsKWw`.
+  ///
+  /// The only filter supported at the moment is `placeId`.
+  ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
   ///
@@ -619,10 +627,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<ListPhotosResponse> list(
-      {core.String filter,
-      core.String pageToken,
+      {core.String pageToken,
       core.int pageSize,
       core.String view,
+      core.String filter,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -631,9 +639,6 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (filter != null) {
-      _queryParams["filter"] = [filter];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
@@ -643,6 +648,9 @@
     if (view != null) {
       _queryParams["view"] = [view];
     }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -845,40 +853,6 @@
 /// specified otherwise, this must conform to the
 /// <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
 /// standard</a>. Values must be within normalized ranges.
-///
-/// Example of normalization code in Python:
-///
-///     def NormalizeLongitude(longitude):
-///       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
-///       q, r = divmod(longitude, 360.0)
-///       if r > 180.0 or (r == 180.0 and q <= -1.0):
-///         return r - 360.0
-///       return r
-///
-///     def NormalizeLatLng(latitude, longitude):
-///       """Wraps decimal degrees latitude and longitude to
-///       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
-///       r = latitude % 360.0
-///       if r <= 90.0:
-///         return r, NormalizeLongitude(longitude)
-///       elif r >= 270.0:
-///         return r - 360, NormalizeLongitude(longitude)
-///       else:
-///         return 180 - r, NormalizeLongitude(longitude + 180.0)
-///
-///     assert 180.0 == NormalizeLongitude(180.0)
-///     assert -180.0 == NormalizeLongitude(-180.0)
-///     assert -179.0 == NormalizeLongitude(181.0)
-///     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
-///     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
-///     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
-///     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
-///     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
-///     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
-///     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
-///     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
-///     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
-///     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
 class LatLng {
   /// The latitude in degrees. It must be in the range [-90.0, +90.0].
   core.double latitude;
@@ -1269,7 +1243,7 @@
 
 /// Raw pose measurement for an entity.
 class Pose {
-  /// Altitude of the pose in meters above ground level (as defined by WGS84).
+  /// Altitude of the pose in meters above WGS84 ellipsoid.
   /// NaN indicates an unmeasured quantity.
   core.double altitude;
 
diff --git a/googleapis/lib/tagmanager/v1.dart b/googleapis/lib/tagmanager/v1.dart
index 1035440..39cf25b 100644
--- a/googleapis/lib/tagmanager/v1.dart
+++ b/googleapis/lib/tagmanager/v1.dart
@@ -4579,6 +4579,9 @@
   /// Parent folder id.
   core.String parentFolderId;
 
+  /// True if the tag is paused.
+  core.bool paused;
+
   /// User defined numeric priority of the tag. Tags are fired asynchronously in
   /// order of priority. Tags with higher numeric value fire first. A tag's
   /// priority can be a positive or negative value. The default value is 0.
@@ -4650,6 +4653,9 @@
     if (_json.containsKey("parentFolderId")) {
       parentFolderId = _json["parentFolderId"];
     }
+    if (_json.containsKey("paused")) {
+      paused = _json["paused"];
+    }
     if (_json.containsKey("priority")) {
       priority = new Parameter.fromJson(_json["priority"]);
     }
@@ -4719,6 +4725,9 @@
     if (parentFolderId != null) {
       _json["parentFolderId"] = parentFolderId;
     }
+    if (paused != null) {
+      _json["paused"] = paused;
+    }
     if (priority != null) {
       _json["priority"] = (priority).toJson();
     }
@@ -4797,15 +4806,14 @@
   /// GTM Container ID.
   core.String containerId;
 
+  /// A visibility trigger minimum continuous visible time (in milliseconds).
+  /// Only valid for AMP Visibility trigger.
+  Parameter continuousTimeMinMilliseconds;
+
   /// Used in the case of custom event, which is fired iff all Conditions are
   /// true.
   core.List<Condition> customEventFilter;
 
-  /// Reloads the videos in the page that don't already have the YT API enabled.
-  /// If false, only capture events from videos that already have the API
-  /// enabled. Only valid for YouTube triggers.
-  Parameter enableAllVideos;
-
   /// Name of the GTM event that is fired. Only valid for Timer triggers.
   Parameter eventName;
 
@@ -4816,39 +4824,68 @@
   /// is recomputed whenever the trigger is modified.
   core.String fingerprint;
 
+  /// List of integer percentage values for scroll triggers. The trigger will
+  /// fire when each percentage is reached when the view is scrolled
+  /// horizontally. Only valid for AMP scroll triggers.
+  Parameter horizontalScrollPercentageList;
+
   /// Time between triggering recurring Timer Events (in milliseconds). Only
   /// valid for Timer triggers.
   Parameter interval;
 
+  /// Time between Timer Events to fire (in seconds). Only valid for AMP Timer
+  /// trigger.
+  Parameter intervalSeconds;
+
   /// Limit of the number of GTM events this Timer Trigger will fire. If no
   /// limit is set, we will continue to fire GTM events until the user leaves
   /// the page. Only valid for Timer triggers.
   Parameter limit;
 
+  /// Max time to fire Timer Events (in seconds). Only valid for AMP Timer
+  /// trigger.
+  Parameter maxTimerLengthSeconds;
+
   /// Trigger display name.
   core.String name;
 
+  /// Additional parameters.
+  core.List<Parameter> parameter;
+
   /// Parent folder id.
   core.String parentFolderId;
 
+  /// A click trigger CSS selector (i.e. "a", "button" etc.). Only valid for AMP
+  /// Click trigger.
+  Parameter selector;
+
+  /// A visibility trigger minimum total visible time (in milliseconds). Only
+  /// valid for AMP Visibility trigger.
+  Parameter totalTimeMinMilliseconds;
+
   /// The Trigger ID uniquely identifies the GTM Trigger.
   core.String triggerId;
 
   /// Defines the data layer event that causes this trigger.
   /// Possible string values are:
-  /// - "ajaxSubmission"
   /// - "always"
+  /// - "ampClick"
+  /// - "ampScroll"
+  /// - "ampTimer"
+  /// - "ampVisibility"
   /// - "click"
   /// - "customEvent"
   /// - "domReady"
+  /// - "elementVisibility"
   /// - "formSubmission"
   /// - "historyChange"
   /// - "jsError"
   /// - "linkClick"
   /// - "pageview"
+  /// - "scrollDepth"
   /// - "timer"
   /// - "windowLoaded"
-  /// - "youTube"
+  /// - "youTubeVideo"
   core.String type;
 
   /// Globally unique id of the trigger that auto-generates this (a Form Submit,
@@ -4859,10 +4896,22 @@
   /// and Timer triggers.
   Parameter uniqueTriggerId;
 
-  /// List of integer percentage values. The trigger will fire as each
-  /// percentage is reached in any instrumented videos. Only valid for YouTube
-  /// triggers.
-  Parameter videoPercentageList;
+  /// List of integer percentage values for scroll triggers. The trigger will
+  /// fire when each percentage is reached when the view is scrolled vertically.
+  /// Only valid for AMP scroll triggers.
+  Parameter verticalScrollPercentageList;
+
+  /// A visibility trigger CSS selector (i.e. "#id"). Only valid for AMP
+  /// Visibility trigger.
+  Parameter visibilitySelector;
+
+  /// A visibility trigger maximum percent visibility. Only valid for AMP
+  /// Visibility trigger.
+  Parameter visiblePercentageMax;
+
+  /// A visibility trigger minimum percent visibility. Only valid for AMP
+  /// Visibility trigger.
+  Parameter visiblePercentageMin;
 
   /// Whether or not we should delay the form submissions or link opening until
   /// all of the tags have fired (by preventing the default action and later
@@ -4892,14 +4941,15 @@
     if (_json.containsKey("containerId")) {
       containerId = _json["containerId"];
     }
+    if (_json.containsKey("continuousTimeMinMilliseconds")) {
+      continuousTimeMinMilliseconds =
+          new Parameter.fromJson(_json["continuousTimeMinMilliseconds"]);
+    }
     if (_json.containsKey("customEventFilter")) {
       customEventFilter = _json["customEventFilter"]
           .map((value) => new Condition.fromJson(value))
           .toList();
     }
-    if (_json.containsKey("enableAllVideos")) {
-      enableAllVideos = new Parameter.fromJson(_json["enableAllVideos"]);
-    }
     if (_json.containsKey("eventName")) {
       eventName = new Parameter.fromJson(_json["eventName"]);
     }
@@ -4911,18 +4961,41 @@
     if (_json.containsKey("fingerprint")) {
       fingerprint = _json["fingerprint"];
     }
+    if (_json.containsKey("horizontalScrollPercentageList")) {
+      horizontalScrollPercentageList =
+          new Parameter.fromJson(_json["horizontalScrollPercentageList"]);
+    }
     if (_json.containsKey("interval")) {
       interval = new Parameter.fromJson(_json["interval"]);
     }
+    if (_json.containsKey("intervalSeconds")) {
+      intervalSeconds = new Parameter.fromJson(_json["intervalSeconds"]);
+    }
     if (_json.containsKey("limit")) {
       limit = new Parameter.fromJson(_json["limit"]);
     }
+    if (_json.containsKey("maxTimerLengthSeconds")) {
+      maxTimerLengthSeconds =
+          new Parameter.fromJson(_json["maxTimerLengthSeconds"]);
+    }
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
+    if (_json.containsKey("parameter")) {
+      parameter = _json["parameter"]
+          .map((value) => new Parameter.fromJson(value))
+          .toList();
+    }
     if (_json.containsKey("parentFolderId")) {
       parentFolderId = _json["parentFolderId"];
     }
+    if (_json.containsKey("selector")) {
+      selector = new Parameter.fromJson(_json["selector"]);
+    }
+    if (_json.containsKey("totalTimeMinMilliseconds")) {
+      totalTimeMinMilliseconds =
+          new Parameter.fromJson(_json["totalTimeMinMilliseconds"]);
+    }
     if (_json.containsKey("triggerId")) {
       triggerId = _json["triggerId"];
     }
@@ -4932,9 +5005,20 @@
     if (_json.containsKey("uniqueTriggerId")) {
       uniqueTriggerId = new Parameter.fromJson(_json["uniqueTriggerId"]);
     }
-    if (_json.containsKey("videoPercentageList")) {
-      videoPercentageList =
-          new Parameter.fromJson(_json["videoPercentageList"]);
+    if (_json.containsKey("verticalScrollPercentageList")) {
+      verticalScrollPercentageList =
+          new Parameter.fromJson(_json["verticalScrollPercentageList"]);
+    }
+    if (_json.containsKey("visibilitySelector")) {
+      visibilitySelector = new Parameter.fromJson(_json["visibilitySelector"]);
+    }
+    if (_json.containsKey("visiblePercentageMax")) {
+      visiblePercentageMax =
+          new Parameter.fromJson(_json["visiblePercentageMax"]);
+    }
+    if (_json.containsKey("visiblePercentageMin")) {
+      visiblePercentageMin =
+          new Parameter.fromJson(_json["visiblePercentageMin"]);
     }
     if (_json.containsKey("waitForTags")) {
       waitForTags = new Parameter.fromJson(_json["waitForTags"]);
@@ -4960,13 +5044,14 @@
     if (containerId != null) {
       _json["containerId"] = containerId;
     }
+    if (continuousTimeMinMilliseconds != null) {
+      _json["continuousTimeMinMilliseconds"] =
+          (continuousTimeMinMilliseconds).toJson();
+    }
     if (customEventFilter != null) {
       _json["customEventFilter"] =
           customEventFilter.map((value) => (value).toJson()).toList();
     }
-    if (enableAllVideos != null) {
-      _json["enableAllVideos"] = (enableAllVideos).toJson();
-    }
     if (eventName != null) {
       _json["eventName"] = (eventName).toJson();
     }
@@ -4976,18 +5061,37 @@
     if (fingerprint != null) {
       _json["fingerprint"] = fingerprint;
     }
+    if (horizontalScrollPercentageList != null) {
+      _json["horizontalScrollPercentageList"] =
+          (horizontalScrollPercentageList).toJson();
+    }
     if (interval != null) {
       _json["interval"] = (interval).toJson();
     }
+    if (intervalSeconds != null) {
+      _json["intervalSeconds"] = (intervalSeconds).toJson();
+    }
     if (limit != null) {
       _json["limit"] = (limit).toJson();
     }
+    if (maxTimerLengthSeconds != null) {
+      _json["maxTimerLengthSeconds"] = (maxTimerLengthSeconds).toJson();
+    }
     if (name != null) {
       _json["name"] = name;
     }
+    if (parameter != null) {
+      _json["parameter"] = parameter.map((value) => (value).toJson()).toList();
+    }
     if (parentFolderId != null) {
       _json["parentFolderId"] = parentFolderId;
     }
+    if (selector != null) {
+      _json["selector"] = (selector).toJson();
+    }
+    if (totalTimeMinMilliseconds != null) {
+      _json["totalTimeMinMilliseconds"] = (totalTimeMinMilliseconds).toJson();
+    }
     if (triggerId != null) {
       _json["triggerId"] = triggerId;
     }
@@ -4997,8 +5101,18 @@
     if (uniqueTriggerId != null) {
       _json["uniqueTriggerId"] = (uniqueTriggerId).toJson();
     }
-    if (videoPercentageList != null) {
-      _json["videoPercentageList"] = (videoPercentageList).toJson();
+    if (verticalScrollPercentageList != null) {
+      _json["verticalScrollPercentageList"] =
+          (verticalScrollPercentageList).toJson();
+    }
+    if (visibilitySelector != null) {
+      _json["visibilitySelector"] = (visibilitySelector).toJson();
+    }
+    if (visiblePercentageMax != null) {
+      _json["visiblePercentageMax"] = (visiblePercentageMax).toJson();
+    }
+    if (visiblePercentageMin != null) {
+      _json["visiblePercentageMin"] = (visiblePercentageMin).toJson();
     }
     if (waitForTags != null) {
       _json["waitForTags"] = (waitForTags).toJson();
diff --git a/googleapis/lib/tagmanager/v2.dart b/googleapis/lib/tagmanager/v2.dart
index 429ade4..3753e94 100644
--- a/googleapis/lib/tagmanager/v2.dart
+++ b/googleapis/lib/tagmanager/v2.dart
@@ -2064,6 +2064,10 @@
   /// - "containerVersion"
   /// - "debugMode"
   /// - "deviceName"
+  /// - "elementVisibilityFirstTime"
+  /// - "elementVisibilityRatio"
+  /// - "elementVisibilityRecentTime"
+  /// - "elementVisibilityTime"
   /// - "environmentName"
   /// - "errorLine"
   /// - "errorMessage"
@@ -2114,10 +2118,12 @@
   /// - "randomNumber"
   /// - "referrer"
   /// - "resolution"
+  /// - "scrollDepthDirection"
+  /// - "scrollDepthThreshold"
+  /// - "scrollDepthUnits"
   /// - "sdkVersion"
   /// - "videoCurrentTime"
   /// - "videoDuration"
-  /// - "videoElapsedTime"
   /// - "videoPercent"
   /// - "videoProvider"
   /// - "videoStatus"
@@ -3973,6 +3979,10 @@
   /// - "containerVersion"
   /// - "debugMode"
   /// - "deviceName"
+  /// - "elementVisibilityFirstTime"
+  /// - "elementVisibilityRatio"
+  /// - "elementVisibilityRecentTime"
+  /// - "elementVisibilityTime"
   /// - "environmentName"
   /// - "errorLine"
   /// - "errorMessage"
@@ -4023,10 +4033,12 @@
   /// - "randomNumber"
   /// - "referrer"
   /// - "resolution"
+  /// - "scrollDepthDirection"
+  /// - "scrollDepthThreshold"
+  /// - "scrollDepthUnits"
   /// - "sdkVersion"
   /// - "videoCurrentTime"
   /// - "videoDuration"
-  /// - "videoElapsedTime"
   /// - "videoPercent"
   /// - "videoProvider"
   /// - "videoStatus"
@@ -5972,6 +5984,9 @@
   /// GTM Tag's API relative path.
   core.String path;
 
+  /// Indicates whether the tag is paused, which prevents the tag from firing.
+  core.bool paused;
+
   /// User defined numeric priority of the tag. Tags are fired asynchronously in
   /// order of priority. Tags with higher numeric value fire first. A tag's
   /// priority can be a positive or negative value. The default value is 0.
@@ -6053,6 +6068,9 @@
     if (_json.containsKey("path")) {
       path = _json["path"];
     }
+    if (_json.containsKey("paused")) {
+      paused = _json["paused"];
+    }
     if (_json.containsKey("priority")) {
       priority = new Parameter.fromJson(_json["priority"]);
     }
@@ -6131,6 +6149,9 @@
     if (path != null) {
       _json["path"] = path;
     }
+    if (paused != null) {
+      _json["paused"] = paused;
+    }
     if (priority != null) {
       _json["priority"] = (priority).toJson();
     }
@@ -6402,6 +6423,7 @@
   /// - "click"
   /// - "customEvent"
   /// - "domReady"
+  /// - "elementVisibility"
   /// - "eventTypeUnspecified"
   /// - "firebaseAppException"
   /// - "firebaseAppUpdate"
@@ -6420,6 +6442,7 @@
   /// - "jsError"
   /// - "linkClick"
   /// - "pageview"
+  /// - "scrollDepth"
   /// - "timer"
   /// - "windowLoaded"
   /// - "youTubeVideo"
diff --git a/googleapis/lib/testing/v1.dart b/googleapis/lib/testing/v1.dart
index 8e1d32f..1c40ca6 100644
--- a/googleapis/lib/testing/v1.dart
+++ b/googleapis/lib/testing/v1.dart
@@ -27,6 +27,8 @@
 
   final commons.ApiRequester _requester;
 
+  ApplicationDetailServiceResourceApi get applicationDetailService =>
+      new ApplicationDetailServiceResourceApi(_requester);
   ProjectsResourceApi get projects => new ProjectsResourceApi(_requester);
   TestEnvironmentCatalogResourceApi get testEnvironmentCatalog =>
       new TestEnvironmentCatalogResourceApi(_requester);
@@ -38,6 +40,56 @@
             new commons.ApiRequester(client, rootUrl, servicePath, USER_AGENT);
 }
 
+class ApplicationDetailServiceResourceApi {
+  final commons.ApiRequester _requester;
+
+  ApplicationDetailServiceResourceApi(commons.ApiRequester client)
+      : _requester = client;
+
+  /// Request the details of an Android application APK.
+  ///
+  /// [request] - The metadata request object.
+  ///
+  /// Request parameters:
+  ///
+  /// [$fields] - Selector specifying which fields to include in a partial
+  /// response.
+  ///
+  /// Completes with a [GetApkDetailsResponse].
+  ///
+  /// 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<GetApkDetailsResponse> getApkDetails(FileReference 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 = 'v1/applicationDetailService/getApkDetails';
+
+    var _response = _requester.request(_url, "POST",
+        body: _body,
+        queryParams: _queryParams,
+        uploadOptions: _uploadOptions,
+        uploadMedia: _uploadMedia,
+        downloadOptions: _downloadOptions);
+    return _response.then((data) => new GetApkDetailsResponse.fromJson(data));
+  }
+}
+
 class ProjectsResourceApi {
   final commons.ApiRequester _requester;
 
@@ -833,6 +885,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 +914,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 +943,10 @@
       _json["roboDirectives"] =
           roboDirectives.map((value) => (value).toJson()).toList();
     }
+    if (startingIntents != null) {
+      _json["startingIntents"] =
+          startingIntents.map((value) => (value).toJson()).toList();
+    }
     return _json;
   }
 }
@@ -1073,6 +1140,91 @@
   }
 }
 
+/// Android application details based on application manifest and apk archive
+/// contents
+class ApkDetail {
+  ApkManifest apkManifest;
+
+  ApkDetail();
+
+  ApkDetail.fromJson(core.Map _json) {
+    if (_json.containsKey("apkManifest")) {
+      apkManifest = new ApkManifest.fromJson(_json["apkManifest"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (apkManifest != null) {
+      _json["apkManifest"] = (apkManifest).toJson();
+    }
+    return _json;
+  }
+}
+
+/// An Android app manifest. See
+/// http://developer.android.com/guide/topics/manifest/manifest-intro.html
+class ApkManifest {
+  /// User-readable name for the application.
+  core.String applicationLabel;
+  core.List<IntentFilter> intentFilters;
+
+  /// Maximum API level on which the application is designed to run.
+  core.int maxSdkVersion;
+
+  /// Minimum API level required for the application to run.
+  core.int minSdkVersion;
+
+  /// Full Java-style package name for this application, e.g.
+  /// "com.example.foo".
+  core.String packageName;
+
+  ApkManifest();
+
+  ApkManifest.fromJson(core.Map _json) {
+    if (_json.containsKey("applicationLabel")) {
+      applicationLabel = _json["applicationLabel"];
+    }
+    if (_json.containsKey("intentFilters")) {
+      intentFilters = _json["intentFilters"]
+          .map((value) => new IntentFilter.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("maxSdkVersion")) {
+      maxSdkVersion = _json["maxSdkVersion"];
+    }
+    if (_json.containsKey("minSdkVersion")) {
+      minSdkVersion = _json["minSdkVersion"];
+    }
+    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 (applicationLabel != null) {
+      _json["applicationLabel"] = applicationLabel;
+    }
+    if (intentFilters != null) {
+      _json["intentFilters"] =
+          intentFilters.map((value) => (value).toJson()).toList();
+    }
+    if (maxSdkVersion != null) {
+      _json["maxSdkVersion"] = maxSdkVersion;
+    }
+    if (minSdkVersion != null) {
+      _json["minSdkVersion"] = minSdkVersion;
+    }
+    if (packageName != null) {
+      _json["packageName"] = packageName;
+    }
+    return _json;
+  }
+}
+
 /// Response containing the current state of the specified test matrix.
 class CancelTestMatrixResponse {
   /// The current rolled-up state of the test matrix.
@@ -1434,6 +1586,29 @@
   }
 }
 
+/// Response containing the details of the specified Android application APK.
+class GetApkDetailsResponse {
+  /// Details of the Android APK.
+  ApkDetail apkDetail;
+
+  GetApkDetailsResponse();
+
+  GetApkDetailsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("apkDetail")) {
+      apkDetail = new ApkDetail.fromJson(_json["apkDetail"]);
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (apkDetail != null) {
+      _json["apkDetail"] = (apkDetail).toJson();
+    }
+    return _json;
+  }
+}
+
 /// Enables automatic Google account login.
 /// If set, the service will automatically generate a Google test account and
 /// add
@@ -1482,6 +1657,61 @@
   }
 }
 
+/// The <intent-filter> section of an <activity> tag.
+/// https://developer.android.com/guide/topics/manifest/intent-filter-element.html
+class IntentFilter {
+  /// The android:name value of the <action> tag
+  core.List<core.String> actionNames;
+
+  /// The android:name value of the <category> tag
+  core.List<core.String> categoryNames;
+
+  /// The android:mimeType value of the <data> tag
+  core.String mimeType;
+
+  IntentFilter();
+
+  IntentFilter.fromJson(core.Map _json) {
+    if (_json.containsKey("actionNames")) {
+      actionNames = _json["actionNames"];
+    }
+    if (_json.containsKey("categoryNames")) {
+      categoryNames = _json["categoryNames"];
+    }
+    if (_json.containsKey("mimeType")) {
+      mimeType = _json["mimeType"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (actionNames != null) {
+      _json["actionNames"] = actionNames;
+    }
+    if (categoryNames != null) {
+      _json["categoryNames"] = categoryNames;
+    }
+    if (mimeType != null) {
+      _json["mimeType"] = mimeType;
+    }
+    return _json;
+  }
+}
+
+/// 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.
@@ -1494,7 +1724,7 @@
   /// @OutputOnly
   core.String name;
 
-  /// A human-friendy string representing the region for this locale.
+  /// A human-friendly string representing the region for this locale.
   /// Example: "United States"
   /// Not present for every locale.
   /// @OutputOnly
@@ -1799,6 +2029,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
@@ -2081,6 +2385,10 @@
   /// - "DEVICE_ADMIN_RECEIVER" : Device administrator applications are not
   /// allowed.
   /// - "TEST_ONLY_APK" : The APK is marked as "testOnly".
+  /// NOT USED
+  /// - "NO_CODE_APK" : APK contains no code.
+  /// See also
+  /// https://developer.android.com/guide/topics/manifest/application-element.html#code
   core.String invalidMatrixDetails;
 
   /// The cloud project that owns the test matrix.
diff --git a/googleapis/lib/translate/v2.dart b/googleapis/lib/translate/v2.dart
index e4d2293..0f7dcce 100644
--- a/googleapis/lib/translate/v2.dart
+++ b/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 model, core.String target, core.String $fields}) {
+      {core.String target, core.String model, 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 (model != null) {
-      _queryParams["model"] = [model];
-    }
     if (target != null) {
       _queryParams["target"] = [target];
     }
+    if (model != null) {
+      _queryParams["model"] = [model];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -207,12 +207,6 @@
   /// one of the
   /// language codes listed in Language Support.
   ///
-  /// [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
-  /// attempt to identify the source language automatically and return it within
-  /// the response.
-  ///
   /// [cid] - The customization id for translate
   ///
   /// [format] - The format of the source text, in either HTML (default) or
@@ -226,6 +220,12 @@
   /// 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
+  /// attempt to identify the source language automatically and return it within
+  /// the response.
+  ///
   /// [$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.List<core.String> cid,
+      {core.List<core.String> cid,
       core.String format,
       core.String model,
+      core.String source,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -258,9 +258,6 @@
       throw new core.ArgumentError("Parameter target is required.");
     }
     _queryParams["target"] = [target];
-    if (source != null) {
-      _queryParams["source"] = [source];
-    }
     if (cid != null) {
       _queryParams["cid"] = cid;
     }
@@ -270,6 +267,9 @@
     if (model != null) {
       _queryParams["model"] = [model];
     }
+    if (source != null) {
+      _queryParams["source"] = [source];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
diff --git a/googleapis/lib/vault/v1.dart b/googleapis/lib/vault/v1.dart
index 13a088e..dbc0377 100644
--- a/googleapis/lib/vault/v1.dart
+++ b/googleapis/lib/vault/v1.dart
@@ -1224,11 +1224,11 @@
 
 /// Query options for group holds.
 class HeldGroupsQuery {
-  /// The end date range for the search query. These timestamps are in GMT and
+  /// The end time range for the search query. These timestamps are in GMT and
   /// rounded down to the start of the given date.
   core.String endTime;
 
-  /// The start date range for the search query. These timestamps are in GMT and
+  /// The start time range for the search query. These timestamps are in GMT and
   /// rounded down to the start of the given date.
   core.String startTime;
 
@@ -1267,11 +1267,11 @@
 
 /// Query options for mail holds.
 class HeldMailQuery {
-  /// The end date range for the search query. These timestamps are in GMT and
+  /// The end time range for the search query. These timestamps are in GMT and
   /// rounded down to the start of the given date.
   core.String endTime;
 
-  /// The start date range for the search query. These timestamps are in GMT and
+  /// The start time range for the search query. These timestamps are in GMT and
   /// rounded down to the start of the given date.
   core.String startTime;
 
diff --git a/googleapis/lib/vision/v1.dart b/googleapis/lib/vision/v1.dart
index c1897b5..df6dea7 100644
--- a/googleapis/lib/vision/v1.dart
+++ b/googleapis/lib/vision/v1.dart
@@ -337,17 +337,25 @@
   /// is represented as around the top-left corner as defined when the text is
   /// read in the 'natural' orientation.
   /// For example:
-  ///   * when the text is horizontal it might look like:
-  ///      0----1
-  ///      |    |
-  ///      3----2
-  ///   * when it's rotated 180 degrees around the top-left corner it becomes:
-  ///      2----3
-  ///      |    |
-  ///      1----0
+  ///
+  /// * when the text is horizontal it might look like:
+  ///
+  ///         0----1
+  ///         |    |
+  ///         3----2
+  ///
+  /// * when it's rotated 180 degrees around the top-left corner it becomes:
+  ///
+  ///         2----3
+  ///         |    |
+  ///         1----0
+  ///
   ///   and the vertice order will still be (0, 1, 2, 3).
   BoundingPoly boundingBox;
 
+  /// Confidence of the OCR results on the block. Range [0, 1].
+  core.double confidence;
+
   /// List of paragraphs in this block (if this blocks is of type text).
   core.List<Paragraph> paragraphs;
 
@@ -363,6 +371,9 @@
     if (_json.containsKey("boundingBox")) {
       boundingBox = new BoundingPoly.fromJson(_json["boundingBox"]);
     }
+    if (_json.containsKey("confidence")) {
+      confidence = _json["confidence"];
+    }
     if (_json.containsKey("paragraphs")) {
       paragraphs = _json["paragraphs"]
           .map((value) => new Paragraph.fromJson(value))
@@ -382,6 +393,9 @@
     if (boundingBox != null) {
       _json["boundingBox"] = (boundingBox).toJson();
     }
+    if (confidence != null) {
+      _json["confidence"] = confidence;
+    }
     if (paragraphs != null) {
       _json["paragraphs"] =
           paragraphs.map((value) => (value).toJson()).toList();
@@ -835,6 +849,7 @@
   /// for `LABEL_DETECTION` features.
   BoundingPoly boundingPoly;
 
+  /// **Deprecated. Use `score` instead.**
   /// The accuracy of the entity detection in an image.
   /// For example, for an image in which the "Eiffel Tower" entity is detected,
   /// this field represents the confidence that there is a tower in the query
@@ -1197,14 +1212,19 @@
   }
 }
 
-/// Users describe the type of Google Cloud Vision API tasks to perform over
-/// images by using *Feature*s. Each Feature indicates a type of image
-/// detection task to perform. Features encode the Cloud Vision API
-/// vertical to operate on and the number of top-scoring results to return.
+/// The type of Google Cloud Vision API detection to perform, and the maximum
+/// number of results to return for that type. Multiple `Feature` objects can
+/// be specified in the `features` list.
 class Feature {
-  /// Maximum number of results of this type.
+  /// Maximum number of results of this type. Does not apply to
+  /// `TEXT_DETECTION`, `DOCUMENT_TEXT_DETECTION`, or `CROP_HINTS`.
   core.int maxResults;
 
+  /// Model to use for the feature.
+  /// Supported values: "builtin/stable" (the default if unset) and
+  /// "builtin/latest".
+  core.String model;
+
   /// The feature type.
   /// Possible string values are:
   /// - "TYPE_UNSPECIFIED" : Unspecified feature type.
@@ -1212,12 +1232,15 @@
   /// - "LANDMARK_DETECTION" : Run landmark detection.
   /// - "LOGO_DETECTION" : Run logo detection.
   /// - "LABEL_DETECTION" : Run label detection.
-  /// - "TEXT_DETECTION" : Run OCR.
+  /// - "TEXT_DETECTION" : Run text detection / optical character recognition
+  /// (OCR). Text detection
+  /// is optimized for areas of text within a larger image; if the image is
+  /// a document, use `DOCUMENT_TEXT_DETECTION` instead.
   /// - "DOCUMENT_TEXT_DETECTION" : Run dense text document OCR. Takes
   /// precedence when both
-  /// DOCUMENT_TEXT_DETECTION and TEXT_DETECTION are present.
-  /// - "SAFE_SEARCH_DETECTION" : Run computer vision models to compute image
-  /// safe-search properties.
+  /// `DOCUMENT_TEXT_DETECTION` and `TEXT_DETECTION` are present.
+  /// - "SAFE_SEARCH_DETECTION" : Run Safe Search to detect potentially unsafe
+  /// or undesirable content.
   /// - "IMAGE_PROPERTIES" : Compute a set of image properties, such as the
   /// image's dominant colors.
   /// - "CROP_HINTS" : Run crop hints.
@@ -1230,6 +1253,9 @@
     if (_json.containsKey("maxResults")) {
       maxResults = _json["maxResults"];
     }
+    if (_json.containsKey("model")) {
+      model = _json["model"];
+    }
     if (_json.containsKey("type")) {
       type = _json["type"];
     }
@@ -1241,6 +1267,9 @@
     if (maxResults != null) {
       _json["maxResults"] = maxResults;
     }
+    if (model != null) {
+      _json["model"] = model;
+    }
     if (type != null) {
       _json["type"] = type;
     }
@@ -1251,7 +1280,7 @@
 /// Client image to perform Google Cloud Vision API tasks over.
 class Image {
   /// Image content, represented as a stream of bytes.
-  /// Note: as with all `bytes` fields, protobuffers use a pure binary
+  /// Note: As with all `bytes` fields, protobuffers use a pure binary
   /// representation, whereas JSON representations use base64.
   core.String content;
   core.List<core.int> get contentAsBytes {
@@ -1263,9 +1292,9 @@
         convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-");
   }
 
-  /// Google Cloud Storage image location. If both `content` and `source`
-  /// are provided for an image, `content` takes precedence and is
-  /// used to perform the image annotation request.
+  /// Google Cloud Storage image location, or publicly-accessible image
+  /// URL. If both `content` and `source` are provided for an image, `content`
+  /// takes precedence and is used to perform the image annotation request.
   ImageSource source;
 
   Image();
@@ -1311,6 +1340,9 @@
   /// lat/long rectangle that specifies the location of the image.
   LatLongRect latLongRect;
 
+  /// Parameters for web detection.
+  WebDetectionParams webDetectionParams;
+
   ImageContext();
 
   ImageContext.fromJson(core.Map _json) {
@@ -1323,6 +1355,10 @@
     if (_json.containsKey("latLongRect")) {
       latLongRect = new LatLongRect.fromJson(_json["latLongRect"]);
     }
+    if (_json.containsKey("webDetectionParams")) {
+      webDetectionParams =
+          new WebDetectionParams.fromJson(_json["webDetectionParams"]);
+    }
   }
 
   core.Map<core.String, core.Object> toJson() {
@@ -1337,6 +1373,9 @@
     if (latLongRect != null) {
       _json["latLongRect"] = (latLongRect).toJson();
     }
+    if (webDetectionParams != null) {
+      _json["webDetectionParams"] = (webDetectionParams).toJson();
+    }
     return _json;
   }
 }
@@ -1365,25 +1404,32 @@
   }
 }
 
-/// External image source (Google Cloud Storage image location).
+/// External image source (Google Cloud Storage or web URL image location).
 class ImageSource {
-  /// NOTE: For new code `image_uri` below is preferred.
-  /// Google Cloud Storage image URI, which must be in the following form:
-  /// `gs://bucket_name/object_name` (for details, see
+  /// **Use `image_uri` instead.**
+  ///
+  /// The Google Cloud Storage  URI of the form
+  /// `gs://bucket_name/object_name`. Object versioning is not supported. See
   /// [Google Cloud Storage Request
-  /// URIs](https://cloud.google.com/storage/docs/reference-uris)).
-  /// NOTE: Cloud Storage object versioning is not supported.
+  /// URIs](https://cloud.google.com/storage/docs/reference-uris) for more info.
   core.String gcsImageUri;
 
-  /// Image URI which supports:
-  /// 1) Google Cloud Storage image URI, which must be in the following form:
-  /// `gs://bucket_name/object_name` (for details, see
-  /// [Google Cloud Storage Request
-  /// URIs](https://cloud.google.com/storage/docs/reference-uris)).
-  /// NOTE: Cloud Storage object versioning is not supported.
-  /// 2) Publicly accessible image HTTP/HTTPS URL.
-  /// This is preferred over the legacy `gcs_image_uri` above. When both
-  /// `gcs_image_uri` and `image_uri` are specified, `image_uri` takes
+  /// The URI of the source image. Can be either:
+  ///
+  /// 1. A Google Cloud Storage URI of the form
+  /// `gs://bucket_name/object_name`. Object versioning is not supported. See
+  ///    [Google Cloud Storage Request
+  ///    URIs](https://cloud.google.com/storage/docs/reference-uris) for more
+  ///    info.
+  ///
+  /// 2. A publicly-accessible image HTTP/HTTPS URL. When fetching images from
+  ///    HTTP/HTTPS URLs, Google cannot guarantee that the request will be
+  ///    completed. Your request may fail if the specified host denies the
+  /// request (e.g. due to request throttling or DOS prevention), or if Google
+  ///    throttles requests to the site for abuse prevention. You should not
+  ///    depend on externally-hosted images for production applications.
+  ///
+  /// When both `gcs_image_uri` and `image_uri` are specified, `image_uri` takes
   /// precedence.
   core.String imageUri;
 
@@ -1412,10 +1458,6 @@
 }
 
 /// A face-specific landmark (for example, a face feature).
-/// Landmark positions may fall outside the bounds of the image
-/// if the face is near one or more edges of the image.
-/// Therefore it is NOT guaranteed that `0 <= x < width` or
-/// `0 <= y < height`.
 class Landmark {
   /// Face landmark position.
   Position position;
@@ -1490,40 +1532,6 @@
 /// specified otherwise, this must conform to the
 /// <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
 /// standard</a>. Values must be within normalized ranges.
-///
-/// Example of normalization code in Python:
-///
-///     def NormalizeLongitude(longitude):
-///       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
-///       q, r = divmod(longitude, 360.0)
-///       if r > 180.0 or (r == 180.0 and q <= -1.0):
-///         return r - 360.0
-///       return r
-///
-///     def NormalizeLatLng(latitude, longitude):
-///       """Wraps decimal degrees latitude and longitude to
-///       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
-///       r = latitude % 360.0
-///       if r <= 90.0:
-///         return r, NormalizeLongitude(longitude)
-///       elif r >= 270.0:
-///         return r - 360, NormalizeLongitude(longitude)
-///       else:
-///         return 180 - r, NormalizeLongitude(longitude + 180.0)
-///
-///     assert 180.0 == NormalizeLongitude(180.0)
-///     assert -180.0 == NormalizeLongitude(-180.0)
-///     assert -179.0 == NormalizeLongitude(181.0)
-///     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
-///     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
-///     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
-///     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
-///     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
-///     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
-///     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
-///     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
-///     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
-///     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
 class LatLng {
   /// The latitude in degrees. It must be in the range [-90.0, +90.0].
   core.double latitude;
@@ -1615,6 +1623,9 @@
   /// List of blocks of text, images etc on this page.
   core.List<Block> blocks;
 
+  /// Confidence of the OCR results on the page. Range [0, 1].
+  core.double confidence;
+
   /// Page height in pixels.
   core.int height;
 
@@ -1631,6 +1642,9 @@
       blocks =
           _json["blocks"].map((value) => new Block.fromJson(value)).toList();
     }
+    if (_json.containsKey("confidence")) {
+      confidence = _json["confidence"];
+    }
     if (_json.containsKey("height")) {
       height = _json["height"];
     }
@@ -1648,6 +1662,9 @@
     if (blocks != null) {
       _json["blocks"] = blocks.map((value) => (value).toJson()).toList();
     }
+    if (confidence != null) {
+      _json["confidence"] = confidence;
+    }
     if (height != null) {
       _json["height"] = height;
     }
@@ -1680,6 +1697,9 @@
   ///   and the vertice order will still be (0, 1, 2, 3).
   BoundingPoly boundingBox;
 
+  /// Confidence of the OCR results for the paragraph. Range [0, 1].
+  core.double confidence;
+
   /// Additional information detected for the paragraph.
   TextProperty property;
 
@@ -1692,6 +1712,9 @@
     if (_json.containsKey("boundingBox")) {
       boundingBox = new BoundingPoly.fromJson(_json["boundingBox"]);
     }
+    if (_json.containsKey("confidence")) {
+      confidence = _json["confidence"];
+    }
     if (_json.containsKey("property")) {
       property = new TextProperty.fromJson(_json["property"]);
     }
@@ -1706,6 +1729,9 @@
     if (boundingBox != null) {
       _json["boundingBox"] = (boundingBox).toJson();
     }
+    if (confidence != null) {
+      _json["confidence"] = confidence;
+    }
     if (property != null) {
       _json["property"] = (property).toJson();
     }
@@ -1836,6 +1862,24 @@
   /// specified vertical.
   core.String medical;
 
+  /// Likelihood that the request image contains racy content. Racy content may
+  /// include (but is not limited to) skimpy or sheer clothing, strategically
+  /// covered nudity, lewd or provocative poses, or close-ups of sensitive
+  /// body areas.
+  /// Possible string values are:
+  /// - "UNKNOWN" : Unknown likelihood.
+  /// - "VERY_UNLIKELY" : It is very unlikely that the image belongs to the
+  /// specified vertical.
+  /// - "UNLIKELY" : It is unlikely that the image belongs to the specified
+  /// vertical.
+  /// - "POSSIBLE" : It is possible that the image belongs to the specified
+  /// vertical.
+  /// - "LIKELY" : It is likely that the image belongs to the specified
+  /// vertical.
+  /// - "VERY_LIKELY" : It is very likely that the image belongs to the
+  /// specified vertical.
+  core.String racy;
+
   /// Spoof likelihood. The likelihood that an modification
   /// was made to the image's canonical version to make it appear
   /// funny or offensive.
@@ -1877,6 +1921,9 @@
     if (_json.containsKey("medical")) {
       medical = _json["medical"];
     }
+    if (_json.containsKey("racy")) {
+      racy = _json["racy"];
+    }
     if (_json.containsKey("spoof")) {
       spoof = _json["spoof"];
     }
@@ -1894,6 +1941,9 @@
     if (medical != null) {
       _json["medical"] = medical;
     }
+    if (racy != null) {
+      _json["racy"] = racy;
+    }
     if (spoof != null) {
       _json["spoof"] = spoof;
     }
@@ -2025,6 +2075,9 @@
   ///   and the vertice order will still be (0, 1, 2, 3).
   BoundingPoly boundingBox;
 
+  /// Confidence of the OCR results for the symbol. Range [0, 1].
+  core.double confidence;
+
   /// Additional information detected for the symbol.
   TextProperty property;
 
@@ -2037,6 +2090,9 @@
     if (_json.containsKey("boundingBox")) {
       boundingBox = new BoundingPoly.fromJson(_json["boundingBox"]);
     }
+    if (_json.containsKey("confidence")) {
+      confidence = _json["confidence"];
+    }
     if (_json.containsKey("property")) {
       property = new TextProperty.fromJson(_json["property"]);
     }
@@ -2051,6 +2107,9 @@
     if (boundingBox != null) {
       _json["boundingBox"] = (boundingBox).toJson();
     }
+    if (confidence != null) {
+      _json["confidence"] = confidence;
+    }
     if (property != null) {
       _json["property"] = (property).toJson();
     }
@@ -2066,8 +2125,9 @@
 ///     TextAnnotation -> Page -> Block -> Paragraph -> Word -> Symbol
 /// Each structural component, starting from Page, may further have their own
 /// properties. Properties describe detected languages, breaks etc.. Please
-/// refer to the google.cloud.vision.v1.TextAnnotation.TextProperty message
-/// definition below for more detail.
+/// refer
+/// to the TextAnnotation.TextProperty message definition below for more
+/// detail.
 class TextAnnotation {
   /// List of pages detected by OCR.
   core.List<Page> pages;
@@ -2169,6 +2229,9 @@
 
 /// Relevant information for the image from the Internet.
 class WebDetection {
+  /// Best guess text labels for the request image.
+  core.List<WebLabel> bestGuessLabels;
+
   /// Fully matching images from the Internet.
   /// Can include resized copies of the query image.
   core.List<WebImage> fullMatchingImages;
@@ -2190,6 +2253,11 @@
   WebDetection();
 
   WebDetection.fromJson(core.Map _json) {
+    if (_json.containsKey("bestGuessLabels")) {
+      bestGuessLabels = _json["bestGuessLabels"]
+          .map((value) => new WebLabel.fromJson(value))
+          .toList();
+    }
     if (_json.containsKey("fullMatchingImages")) {
       fullMatchingImages = _json["fullMatchingImages"]
           .map((value) => new WebImage.fromJson(value))
@@ -2220,6 +2288,10 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (bestGuessLabels != null) {
+      _json["bestGuessLabels"] =
+          bestGuessLabels.map((value) => (value).toJson()).toList();
+    }
     if (fullMatchingImages != null) {
       _json["fullMatchingImages"] =
           fullMatchingImages.map((value) => (value).toJson()).toList();
@@ -2244,6 +2316,29 @@
   }
 }
 
+/// Parameters for web detection request.
+class WebDetectionParams {
+  /// Whether to include results derived from the geo information in the image.
+  core.bool includeGeoResults;
+
+  WebDetectionParams();
+
+  WebDetectionParams.fromJson(core.Map _json) {
+    if (_json.containsKey("includeGeoResults")) {
+      includeGeoResults = _json["includeGeoResults"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (includeGeoResults != null) {
+      _json["includeGeoResults"] = includeGeoResults;
+    }
+    return _json;
+  }
+}
+
 /// Entity deduced from similar images on the Internet.
 class WebEntity {
   /// Canonical description of the entity, in English.
@@ -2318,8 +2413,55 @@
   }
 }
 
+/// Label to provide extra metadata for the web detection.
+class WebLabel {
+  /// Label for extra metadata.
+  core.String label;
+
+  /// The BCP-47 language code for `label`, such as "en-US" or "sr-Latn".
+  /// For more information, see
+  /// http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+  core.String languageCode;
+
+  WebLabel();
+
+  WebLabel.fromJson(core.Map _json) {
+    if (_json.containsKey("label")) {
+      label = _json["label"];
+    }
+    if (_json.containsKey("languageCode")) {
+      languageCode = _json["languageCode"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (label != null) {
+      _json["label"] = label;
+    }
+    if (languageCode != null) {
+      _json["languageCode"] = languageCode;
+    }
+    return _json;
+  }
+}
+
 /// Metadata for web pages.
 class WebPage {
+  /// Fully matching images on the page.
+  /// Can include resized copies of the query image.
+  core.List<WebImage> fullMatchingImages;
+
+  /// Title for the web page, may contain HTML markups.
+  core.String pageTitle;
+
+  /// Partial matching images on the page.
+  /// Those images are similar enough to share some key-point features. For
+  /// example an original image will likely have partial matching for its
+  /// crops.
+  core.List<WebImage> partialMatchingImages;
+
   /// (Deprecated) Overall relevancy score for the web page.
   core.double score;
 
@@ -2329,6 +2471,19 @@
   WebPage();
 
   WebPage.fromJson(core.Map _json) {
+    if (_json.containsKey("fullMatchingImages")) {
+      fullMatchingImages = _json["fullMatchingImages"]
+          .map((value) => new WebImage.fromJson(value))
+          .toList();
+    }
+    if (_json.containsKey("pageTitle")) {
+      pageTitle = _json["pageTitle"];
+    }
+    if (_json.containsKey("partialMatchingImages")) {
+      partialMatchingImages = _json["partialMatchingImages"]
+          .map((value) => new WebImage.fromJson(value))
+          .toList();
+    }
     if (_json.containsKey("score")) {
       score = _json["score"];
     }
@@ -2340,6 +2495,17 @@
   core.Map<core.String, core.Object> toJson() {
     final core.Map<core.String, core.Object> _json =
         new core.Map<core.String, core.Object>();
+    if (fullMatchingImages != null) {
+      _json["fullMatchingImages"] =
+          fullMatchingImages.map((value) => (value).toJson()).toList();
+    }
+    if (pageTitle != null) {
+      _json["pageTitle"] = pageTitle;
+    }
+    if (partialMatchingImages != null) {
+      _json["partialMatchingImages"] =
+          partialMatchingImages.map((value) => (value).toJson()).toList();
+    }
     if (score != null) {
       _json["score"] = score;
     }
@@ -2369,6 +2535,9 @@
   ///   and the vertice order will still be (0, 1, 2, 3).
   BoundingPoly boundingBox;
 
+  /// Confidence of the OCR results for the word. Range [0, 1].
+  core.double confidence;
+
   /// Additional information detected for the word.
   TextProperty property;
 
@@ -2382,6 +2551,9 @@
     if (_json.containsKey("boundingBox")) {
       boundingBox = new BoundingPoly.fromJson(_json["boundingBox"]);
     }
+    if (_json.containsKey("confidence")) {
+      confidence = _json["confidence"];
+    }
     if (_json.containsKey("property")) {
       property = new TextProperty.fromJson(_json["property"]);
     }
@@ -2397,6 +2569,9 @@
     if (boundingBox != null) {
       _json["boundingBox"] = (boundingBox).toJson();
     }
+    if (confidence != null) {
+      _json["confidence"] = confidence;
+    }
     if (property != null) {
       _json["property"] = (property).toJson();
     }
diff --git a/googleapis/lib/webfonts/v1.dart b/googleapis/lib/webfonts/v1.dart
index 2cfcdc2..ee62b22 100644
--- a/googleapis/lib/webfonts/v1.dart
+++ b/googleapis/lib/webfonts/v1.dart
@@ -4,7 +4,6 @@
 
 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;
diff --git a/googleapis/lib/webmasters/v3.dart b/googleapis/lib/webmasters/v3.dart
index 86746db..76738fa 100644
--- a/googleapis/lib/webmasters/v3.dart
+++ b/googleapis/lib/webmasters/v3.dart
@@ -375,7 +375,9 @@
   /// Request parameters:
   ///
   /// [siteUrl] - The URI of the property as defined in Search Console.
-  /// Examples: http://www.example.com/ or android-app://com.example/
+  /// Examples: http://www.example.com/ or android-app://com.example/ Note: for
+  /// property-sets, use the URI that starts with sc-set: which is used in
+  /// Search Console URLs.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
@@ -418,7 +420,9 @@
   /// Request parameters:
   ///
   /// [siteUrl] - The URI of the property as defined in Search Console.
-  /// Examples: http://www.example.com/ or android-app://com.example/
+  /// Examples: http://www.example.com/ or android-app://com.example/ Note: for
+  /// property-sets, use the URI that starts with sc-set: which is used in
+  /// Search Console URLs.
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
   /// response.
diff --git a/googleapis/lib/youtube/v3.dart b/googleapis/lib/youtube/v3.dart
index 8547830..b747da6 100644
--- a/googleapis/lib/youtube/v3.dart
+++ b/googleapis/lib/youtube/v3.dart
@@ -7781,6 +7781,7 @@
   /// Possible string values are:
   /// - "30fps"
   /// - "60fps"
+  /// - "variable"
   core.String frameRate;
 
   /// The ingestionInfo object contains information that YouTube provides that
@@ -7802,6 +7803,7 @@
   /// - "360p"
   /// - "480p"
   /// - "720p"
+  /// - "variable"
   core.String resolution;
 
   CdnSettings();
@@ -9016,7 +9018,6 @@
 }
 
 /// Basic details about a channel, including title, description and thumbnails.
-/// Next available id: 15.
 class ChannelSnippet {
   /// The country of the channel.
   core.String country;
@@ -10465,6 +10466,7 @@
   /// - "oflcR18"
   /// - "oflcRp13"
   /// - "oflcRp16"
+  /// - "oflcRp18"
   /// - "oflcUnrated"
   core.String oflcRating;
 
@@ -12357,6 +12359,9 @@
   /// - "closedCaptionsHttpPost"
   core.String closedCaptionsType;
 
+  /// This setting indicates whether auto start is enabled for this broadcast.
+  core.bool enableAutoStart;
+
   /// This setting indicates whether HTTP POST closed captioning is enabled for
   /// this broadcast. The ingestion URL of the closed captions is returned
   /// through the liveStreams API. This is mutually exclusive with using the
@@ -12452,6 +12457,9 @@
     if (_json.containsKey("closedCaptionsType")) {
       closedCaptionsType = _json["closedCaptionsType"];
     }
+    if (_json.containsKey("enableAutoStart")) {
+      enableAutoStart = _json["enableAutoStart"];
+    }
     if (_json.containsKey("enableClosedCaptions")) {
       enableClosedCaptions = _json["enableClosedCaptions"];
     }
@@ -12500,6 +12508,9 @@
     if (closedCaptionsType != null) {
       _json["closedCaptionsType"] = closedCaptionsType;
     }
+    if (enableAutoStart != null) {
+      _json["enableAutoStart"] = enableAutoStart;
+    }
     if (enableClosedCaptions != null) {
       _json["enableClosedCaptions"] = enableClosedCaptions;
     }
@@ -14093,6 +14104,7 @@
   /// - "videoBitrateMismatch"
   /// - "videoCodec"
   /// - "videoCodecMismatch"
+  /// - "videoIngestionFasterThanRealtime"
   /// - "videoIngestionStarved"
   /// - "videoInterlaceMismatch"
   /// - "videoProfileMismatch"
@@ -14542,6 +14554,59 @@
   }
 }
 
+/// Nonprofit information.
+class Nonprofit {
+  /// Id of the nonprofit.
+  NonprofitId nonprofitId;
+
+  /// Legal name of the nonprofit.
+  core.String nonprofitLegalName;
+
+  Nonprofit();
+
+  Nonprofit.fromJson(core.Map _json) {
+    if (_json.containsKey("nonprofitId")) {
+      nonprofitId = new NonprofitId.fromJson(_json["nonprofitId"]);
+    }
+    if (_json.containsKey("nonprofitLegalName")) {
+      nonprofitLegalName = _json["nonprofitLegalName"];
+    }
+  }
+
+  core.Map<core.String, core.Object> toJson() {
+    final core.Map<core.String, core.Object> _json =
+        new core.Map<core.String, core.Object>();
+    if (nonprofitId != null) {
+      _json["nonprofitId"] = (nonprofitId).toJson();
+    }
+    if (nonprofitLegalName != null) {
+      _json["nonprofitLegalName"] = nonprofitLegalName;
+    }
+    return _json;
+  }
+}
+
+class NonprofitId {
+  core.String value;
+
+  NonprofitId();
+
+  NonprofitId.fromJson(core.Map _json) {
+    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 (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
 /// Paging details for lists of resources, including total number of items
 /// available and number of resources returned in a single page.
 class PageInfo {
@@ -16514,10 +16579,17 @@
   /// "$1.00"). The string is rendered for the given language.
   core.String displayString;
 
+  /// True if this event is a Super Chat for Good purchase.
+  core.bool isSuperChatForGood;
+
   /// The tier for the paid message, which is based on the amount of money spent
   /// to purchase the message.
   core.int messageType;
 
+  /// If this event is a Super Chat for Good purchase, this field will contain
+  /// information about the charity the purchase is donated to.
+  Nonprofit nonprofit;
+
   /// Details about the supporter.
   ChannelProfileDetails supporterDetails;
 
@@ -16542,9 +16614,15 @@
     if (_json.containsKey("displayString")) {
       displayString = _json["displayString"];
     }
+    if (_json.containsKey("isSuperChatForGood")) {
+      isSuperChatForGood = _json["isSuperChatForGood"];
+    }
     if (_json.containsKey("messageType")) {
       messageType = _json["messageType"];
     }
+    if (_json.containsKey("nonprofit")) {
+      nonprofit = new Nonprofit.fromJson(_json["nonprofit"]);
+    }
     if (_json.containsKey("supporterDetails")) {
       supporterDetails =
           new ChannelProfileDetails.fromJson(_json["supporterDetails"]);
@@ -16572,9 +16650,15 @@
     if (displayString != null) {
       _json["displayString"] = displayString;
     }
+    if (isSuperChatForGood != null) {
+      _json["isSuperChatForGood"] = isSuperChatForGood;
+    }
     if (messageType != null) {
       _json["messageType"] = messageType;
     }
+    if (nonprofit != null) {
+      _json["nonprofit"] = (nonprofit).toJson();
+    }
     if (supporterDetails != null) {
       _json["supporterDetails"] = (supporterDetails).toJson();
     }
@@ -16798,7 +16882,7 @@
   /// video in an embedded player.
   VideoPlayer player;
 
-  /// The processingProgress object encapsulates information about YouTube's
+  /// The processingDetails object encapsulates information about YouTube's
   /// progress in processing the uploaded video file. The properties in the
   /// object identify the current processing status and an estimate of the time
   /// remaining until YouTube finishes processing the video. This part also
diff --git a/googleapis/lib/youtubereporting/v1.dart b/googleapis/lib/youtubereporting/v1.dart
index 632ebd5..529c033 100644
--- a/googleapis/lib/youtubereporting/v1.dart
+++ b/googleapis/lib/youtubereporting/v1.dart
@@ -213,17 +213,17 @@
   /// the user is acting on. If
   /// not set, the user is acting for himself (his own channel).
   ///
-  /// [includeSystemManaged] - If set to true, also system-managed jobs will be
-  /// returned; otherwise only
-  /// user-created jobs will be returned. System-managed jobs can neither be
-  /// modified nor deleted.
-  ///
   /// [pageToken] - A token identifying a page of results the server should
   /// return. Typically,
   /// this is the value of
   /// ListReportTypesResponse.next_page_token
   /// returned in response to the previous call to the `ListJobs` method.
   ///
+  /// [includeSystemManaged] - If set to true, also system-managed jobs will be
+  /// returned; otherwise only
+  /// 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.
@@ -240,8 +240,8 @@
   /// this method will complete with the same error.
   async.Future<ListJobsResponse> list(
       {core.String onBehalfOfContentOwner,
-      core.bool includeSystemManaged,
       core.String pageToken,
+      core.bool includeSystemManaged,
       core.int pageSize,
       core.String $fields}) {
     var _url = null;
@@ -254,12 +254,12 @@
     if (onBehalfOfContentOwner != null) {
       _queryParams["onBehalfOfContentOwner"] = [onBehalfOfContentOwner];
     }
-    if (includeSystemManaged != null) {
-      _queryParams["includeSystemManaged"] = ["${includeSystemManaged}"];
-    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (includeSystemManaged != null) {
+      _queryParams["includeSystemManaged"] = ["${includeSystemManaged}"];
+    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
@@ -349,14 +349,6 @@
   ///
   /// [jobId] - The ID of the job.
   ///
-  /// [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).
-  ///
-  /// [startTimeBefore] - If set, only reports whose start time is smaller than
-  /// the specified
-  /// date/time are returned.
-  ///
   /// [createdAfter] - If set, only reports created after the specified
   /// date/time are returned.
   ///
@@ -374,6 +366,14 @@
   /// 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).
+  ///
+  /// [startTimeBefore] - If set, only reports whose start time is smaller than
+  /// the specified
+  /// date/time are returned.
+  ///
   /// [$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.String onBehalfOfContentOwner,
-      core.String startTimeBefore,
-      core.String createdAfter,
+      {core.String createdAfter,
       core.String startTimeAtOrAfter,
       core.String pageToken,
       core.int pageSize,
+      core.String onBehalfOfContentOwner,
+      core.String startTimeBefore,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -402,12 +402,6 @@
     if (jobId == null) {
       throw new core.ArgumentError("Parameter jobId is required.");
     }
-    if (onBehalfOfContentOwner != null) {
-      _queryParams["onBehalfOfContentOwner"] = [onBehalfOfContentOwner];
-    }
-    if (startTimeBefore != null) {
-      _queryParams["startTimeBefore"] = [startTimeBefore];
-    }
     if (createdAfter != null) {
       _queryParams["createdAfter"] = [createdAfter];
     }
@@ -420,6 +414,12 @@
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (onBehalfOfContentOwner != null) {
+      _queryParams["onBehalfOfContentOwner"] = [onBehalfOfContentOwner];
+    }
+    if (startTimeBefore != null) {
+      _queryParams["startTimeBefore"] = [startTimeBefore];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -446,8 +446,7 @@
   ///
   /// Request parameters:
   ///
-  /// [resourceName] - Name of the media that is being downloaded.  See
-  /// ReadRequest.resource_name.
+  /// [resourceName] - Name of the media that is being downloaded.
   /// Value must have pattern "^.+$".
   ///
   /// [$fields] - Selector specifying which fields to include in a partial
@@ -459,7 +458,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 +497,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,25 +513,25 @@
   ///
   /// Request parameters:
   ///
-  /// [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).
-  ///
-  /// [includeSystemManaged] - If set to true, also system-managed report types
-  /// will be returned;
-  /// otherwise only the report types that can be used to create new reporting
-  /// jobs will be returned.
-  ///
   /// [pageToken] - A token identifying a page of results the server should
   /// return. Typically,
   /// this is the value of
   /// ListReportTypesResponse.next_page_token
   /// returned in response to the previous call to the `ListReportTypes` method.
   ///
+  /// [includeSystemManaged] - If set to true, also system-managed report types
+  /// will be returned;
+  /// 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 +543,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.String onBehalfOfContentOwner,
+      {core.String pageToken,
       core.bool includeSystemManaged,
-      core.String pageToken,
       core.int pageSize,
+      core.String onBehalfOfContentOwner,
       core.String $fields}) {
     var _url = null;
     var _queryParams = new core.Map();
@@ -556,18 +555,18 @@
     var _downloadOptions = commons.DownloadOptions.Metadata;
     var _body = null;
 
-    if (onBehalfOfContentOwner != null) {
-      _queryParams["onBehalfOfContentOwner"] = [onBehalfOfContentOwner];
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
     }
     if (includeSystemManaged != null) {
       _queryParams["includeSystemManaged"] = ["${includeSystemManaged}"];
     }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
     if (pageSize != null) {
       _queryParams["pageSize"] = ["${pageSize}"];
     }
+    if (onBehalfOfContentOwner != null) {
+      _queryParams["onBehalfOfContentOwner"] = [onBehalfOfContentOwner];
+    }
     if ($fields != null) {
       _queryParams["fields"] = [$fields];
     }
@@ -605,6 +604,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 +1719,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/googleapis/pubspec.yaml b/googleapis/pubspec.yaml
index 887b49a..9c00c4a 100644
--- a/googleapis/pubspec.yaml
+++ b/googleapis/pubspec.yaml
@@ -1,7 +1,7 @@
 name: googleapis
-version: 0.46.0
+version: 0.50.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, 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, pagespeedonline:v1, pagespeedonline:v2, partners:v2, people:v1, playcustomapp:v1, playmoviespartner:v1, plus:v1, plusDomains:v1, prediction:v1.6, pubsub:v1, reseller:v1, runtimeconfig:v1, safebrowsing:v4, script:v1, searchconsole: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, serviceusage: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/protobuf/BUILD.gn b/protobuf/BUILD.gn
index 79b61b0..9421a9b 100644
--- a/protobuf/BUILD.gn
+++ b/protobuf/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for protobuf-0.7.0
+# This file is generated by importer.py for protobuf-0.7.1
 
 import("//build/dart/dart_library.gni")
 
diff --git a/protobuf/CHANGELOG.md b/protobuf/CHANGELOG.md
index 583d4e0..b486646 100644
--- a/protobuf/CHANGELOG.md
+++ b/protobuf/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.7.1
+
+* Fix type in PbList.fold() for Dart 2.
+* Small performance tweaks for DDC.
+
 ## 0.7.0
 
 * Added fast getters for common types.
diff --git a/protobuf/lib/meta.dart b/protobuf/lib/meta.dart
index 6be707d..dbaaffe 100644
--- a/protobuf/lib/meta.dart
+++ b/protobuf/lib/meta.dart
@@ -51,6 +51,7 @@
   'clone',
   r'$_get',
   r'$_getI64',
+  r'$_getList',
   r'$_getN',
   r'$_getS',
   r'$_has',
diff --git a/protobuf/lib/mixins_meta.dart b/protobuf/lib/mixins_meta.dart
index 4ffa0dc..1536c77 100644
--- a/protobuf/lib/mixins_meta.dart
+++ b/protobuf/lib/mixins_meta.dart
@@ -74,15 +74,23 @@
   '[]',
   '[]=',
   'addAll',
+  'addEntries',
+  'cast',
   'containsKey',
   'containsValue',
+  'entries',
   'forEach',
-  'putIfAbsent',
-  'remove',
   'isEmpty',
   'isNotEmpty',
   'keys',
   'length',
+  'map',
+  'putIfAbsent',
+  'remove',
+  'removeWhere',
+  'retype',
+  'update',
+  'updateAll',
   'values',
 ];
 
diff --git a/protobuf/lib/src/protobuf/field_info.dart b/protobuf/lib/src/protobuf/field_info.dart
index b036ddc..ee836b0 100644
--- a/protobuf/lib/src/protobuf/field_info.dart
+++ b/protobuf/lib/src/protobuf/field_info.dart
@@ -133,5 +133,17 @@
     return m.createRepeatedField<T>(tagNumber, this);
   }
 
+  /// Same as above, but allow a tighter typed List to be created.
+  List<S> _createRepeatedFieldWithType<S extends T>(GeneratedMessage m) {
+    assert(isRepeated);
+    return m.createRepeatedField<S>(tagNumber, this);
+  }
+
+  /// Convenience method to thread this FieldInfo's reified type parameter to
+  /// _FieldSet._ensureRepeatedField.
+  List<T> _ensureRepeatedField(_FieldSet fs) {
+    return fs._ensureRepeatedField<T>(this);
+  }
+
   String toString() => name;
 }
diff --git a/protobuf/lib/src/protobuf/field_set.dart b/protobuf/lib/src/protobuf/field_set.dart
index 34e57c9..2f962b4 100644
--- a/protobuf/lib/src/protobuf/field_set.dart
+++ b/protobuf/lib/src/protobuf/field_set.dart
@@ -127,6 +127,18 @@
     return value;
   }
 
+  List<T> _getDefaultList<T>(FieldInfo<T> fi) {
+    assert(fi.isRepeated);
+    if (_isReadOnly) return const [];
+
+    // TODO(skybrian) we could avoid this by generating another
+    // method for repeated fields:
+    //   msg.mutableFoo().add(123);
+    var value = fi._createRepeatedFieldWithType<T>(_message);
+    _setNonExtensionFieldUnchecked(fi, value);
+    return value;
+  }
+
   _getFieldOrNullByTag(int tagNumber) {
     var fi = _getFieldInfoOrNull(tagNumber);
     if (fi == null) return null;
@@ -256,6 +268,13 @@
     return _getDefault(_nonExtensionInfoByIndex(index)) as T;
   }
 
+  /// The implementation of a generated getter for repeated fields.
+  List<T> _$getList<T>(int index) {
+    var value = _values[index];
+    if (value != null) return value as List<T>;
+    return _getDefaultList<T>(_nonExtensionInfoByIndex(index));
+  }
+
   /// The implementation of a generated getter for String fields.
   String _$getS(int index, String defaultValue) {
     var value = _values[index];
@@ -520,14 +539,14 @@
       if (mustClone) {
         // fieldValue must be a PbList of GeneratedMessage.
         PbList<GeneratedMessage> pbList = fieldValue;
-        // Copy the mapped values to a List to avoid redundant cloning (since
-        // PbList.addAll iterates over its argument twice).
-        _ensureRepeatedField(fi)
-            .addAll(new List.from(pbList.map(_cloneMessage)));
+        var repeatedFields = fi._ensureRepeatedField(this);
+        for (int i = 0; i < pbList.length; ++i) {
+          repeatedFields.add(_cloneMessage(pbList[i]));
+        }
       } else {
         // fieldValue must be at least a PbList.
         PbList pbList = fieldValue;
-        _ensureRepeatedField(fi).addAll(pbList);
+        fi._ensureRepeatedField(this).addAll(pbList);
       }
       return;
     }
diff --git a/protobuf/lib/src/protobuf/generated_message.dart b/protobuf/lib/src/protobuf/generated_message.dart
index 338fbc5..8f8ac29 100644
--- a/protobuf/lib/src/protobuf/generated_message.dart
+++ b/protobuf/lib/src/protobuf/generated_message.dart
@@ -290,6 +290,9 @@
   T $_getN<T>(int index) => _fieldSet._$getN<T>(index);
 
   /// For generated code only.
+  List<T> $_getList<T>(int index) => _fieldSet._$getList<T>(index);
+
+  /// For generated code only.
   String $_getS(int index, String defaultValue) =>
       _fieldSet._$getS(index, defaultValue);
 
diff --git a/protobuf/lib/src/protobuf/json.dart b/protobuf/lib/src/protobuf/json.dart
index 62d276e..21094b1 100644
--- a/protobuf/lib/src/protobuf/json.dart
+++ b/protobuf/lib/src/protobuf/json.dart
@@ -87,7 +87,7 @@
 
 void _appendJsonList(
     _FieldSet fs, List jsonList, FieldInfo fi, ExtensionRegistry registry) {
-  List repeated = fs._ensureRepeatedField(fi);
+  var repeated = fi._ensureRepeatedField(fs);
   // Micro optimization. Using "for in" generates the following and iterator
   // alloc:
   //   for (t1 = J.get$iterator$ax(json), t2 = fi.tagNumber, t3 = fi.type,
diff --git a/protobuf/lib/src/protobuf/pb_list.dart b/protobuf/lib/src/protobuf/pb_list.dart
index 85f7025..b1de07d 100644
--- a/protobuf/lib/src/protobuf/pb_list.dart
+++ b/protobuf/lib/src/protobuf/pb_list.dart
@@ -65,7 +65,7 @@
 
   /// Reduces a collection to a single value by iteratively combining each
   /// element of the collection with an existing value.
-  T fold<T>(T initialValue, T combine(dynamic previousValue, E element)) =>
+  T fold<T>(T initialValue, T combine(T previousValue, E element)) =>
       _wrappedList.fold(initialValue, combine);
 
   /// Checks whether every element of this iterable satisfies [test].
diff --git a/protobuf/pubspec.yaml b/protobuf/pubspec.yaml
index b5f017a..96de5cb 100644
--- a/protobuf/pubspec.yaml
+++ b/protobuf/pubspec.yaml
@@ -1,5 +1,5 @@
 name: protobuf
-version: 0.7.0
+version: 0.7.1
 author: Dart Team <misc@dartlang.org>
 description: Runtime library for protocol buffers support.
 homepage: https://github.com/dart-lang/protobuf
diff --git a/test/.travis.yml b/test/.travis.yml
index 15e8a5d..e03235b 100644
--- a/test/.travis.yml
+++ b/test/.travis.yml
@@ -5,12 +5,10 @@
 dist: trusty
 
 dart:
- - dev
  - stable
  - 1.23.0
 
-env:
- - FORCE_TEST_EXIT=true
+env: FORCE_TEST_EXIT=true DARTIUM_EXPIRATION_TIME=1550044800LL
 
 # Content shell needs these fonts.
 addons:
@@ -59,6 +57,23 @@
 
 matrix:
   include:
+    # Browser tests take particularly long, so we split them up into different tasks.
+    - dart: dev
+      dart_task: {test: --platform chrome}
+
+    # Split the tests into five shards to help parallelize them across Travis workers.
+    # Don't run Dartium tests on dev because 2.0.0 doesn't support Dartium anymore.
+    - dart: dev
+      dart_task: {test: --preset travis --total-shards 5 --shard-index 0 -x dartium -x content-shell}
+    - dart: dev
+      dart_task: {test: --preset travis --total-shards 5 --shard-index 1 -x dartium -x content-shell}
+    - dart: dev
+      dart_task: {test: --preset travis --total-shards 5 --shard-index 2 -x dartium -x content-shell}
+    - dart: dev
+      dart_task: {test: --preset travis --total-shards 5 --shard-index 3 -x dartium -x content-shell}
+    - dart: dev
+      dart_task: {test: --preset travis --total-shards 5 --shard-index 4 -x dartium -x content-shell}
+
     - dart: dev
       dart_task: dartfmt
     - dart: dev
diff --git a/test/BUILD.gn b/test/BUILD.gn
index 90f6d53..49388a8 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for test-0.12.30+3
+# This file is generated by importer.py for test-0.12.30+4
 
 import("//build/dart/dart_library.gni")
 
diff --git a/test/CHANGELOG.md b/test/CHANGELOG.md
index fd8ff1c..772ff42 100644
--- a/test/CHANGELOG.md
+++ b/test/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 0.12.30+4
+
+* No longer run with headless mode as there are issues with the browser.
+  The headless option will be added in the future when issues are
+  resolved. 
+
 ## 0.12.30+3
 
 * Fix a memory leak when loading browser tests.
diff --git a/test/lib/src/backend/invoker.dart b/test/lib/src/backend/invoker.dart
index e2a8b89..0283886 100644
--- a/test/lib/src/backend/invoker.dart
+++ b/test/lib/src/backend/invoker.dart
@@ -198,7 +198,7 @@
   /// before considering the test successful.
   ///
   /// Each call to [addOutstandingCallback] should be followed by a call to
-  /// [removeOutstandingCallback] once the callbak is no longer running. Note
+  /// [removeOutstandingCallback] once the callback is no longer running. Note
   /// that only successful tests wait for outstanding callbacks; as soon as a
   /// test experiences an error, any further calls to [addOutstandingCallback]
   /// or [removeOutstandingCallback] will do nothing.
diff --git a/test/lib/src/backend/stack_trace_formatter.dart b/test/lib/src/backend/stack_trace_formatter.dart
new file mode 100644
index 0000000..9ef3d90
--- /dev/null
+++ b/test/lib/src/backend/stack_trace_formatter.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import '../util/stack_trace_mapper.dart';
+import 'invoker.dart';
+
+/// The key used to look up [StackTraceFormatter.current] in a zone.
+final _currentKey = new Object();
+
+/// A class that tracks how to format a stack trace according to the user's
+/// configuration.
+///
+/// This can convert JavaScript stack traces to Dart using source maps, and fold
+/// irrelevant frames out of the stack trace.
+class StackTraceFormatter {
+  /// A class that converts [trace] into a Dart stack trace, or `null` to use it
+  /// as-is.
+  StackTraceMapper _mapper;
+
+  /// The list of packages to fold when producing terse [Chain]s.
+  var _except = new Set<String>.from(['test', 'stream_channel']);
+
+  /// If non-empty, all packages not in this list will be folded when producing
+  /// terse [Chain]s.
+  var _only = new Set<String>();
+
+  /// Returns the current manager, or `null` if this isn't called within a call
+  /// to [asCurrent].
+  static StackTraceFormatter get current =>
+      Zone.current[_currentKey] as StackTraceFormatter;
+
+  /// Runs [body] with [this] as [StackTraceFormatter.current].
+  ///
+  /// This is zone-scoped, so [this] will be the current configuration in any
+  /// asynchronous callbacks transitively created by [body].
+  T asCurrent<T>(T body()) => runZoned(body, zoneValues: {_currentKey: this});
+
+  /// Configure how stack traces are formatted.
+  ///
+  /// The [mapper] is used to convert JavaScript traces into Dart traces. The
+  /// [except] set indicates packages whose frames should be folded away. If
+  /// [only] is non-empty, it indicates packages whose frames should *not* be
+  /// folded away.
+  void configure(
+      {StackTraceMapper mapper, Set<String> except, Set<String> only}) {
+    if (mapper != null) _mapper = mapper;
+    if (except != null) _except = except;
+    if (only != null) _only = only;
+  }
+
+  /// Converts [stackTrace] to a [Chain] and formats it according to the user's
+  /// preferences.
+  ///
+  /// If [verbose] is `true`, this doesn't fold out irrelevant stack frames. It
+  /// defaults to the current test's [Metadata.verboseTrace] configuration, or
+  /// `false` if there is no current test.
+  Chain formatStackTrace(StackTrace stackTrace, {bool verbose}) {
+    verbose ??=
+        Invoker.current?.liveTest?.test?.metadata?.verboseTrace ?? false;
+
+    var chain =
+        new Chain.forTrace(_mapper?.mapStackTrace(stackTrace) ?? stackTrace);
+    if (verbose) return chain;
+
+    return chain.foldFrames((frame) {
+      if (_only.isNotEmpty) return !_only.contains(frame.package);
+      return _except.contains(frame.package);
+    }, terse: true);
+  }
+}
diff --git a/test/lib/src/bootstrap/browser.dart b/test/lib/src/bootstrap/browser.dart
index cb79cc1..a802be2 100644
--- a/test/lib/src/bootstrap/browser.dart
+++ b/test/lib/src/bootstrap/browser.dart
@@ -4,12 +4,18 @@
 
 import "../runner/browser/post_message_channel.dart";
 import "../runner/plugin/remote_platform_helpers.dart";
+import "../util/stack_trace_mapper.dart";
 
 /// Bootstraps a browser test to communicate with the test runner.
 ///
 /// This should NOT be used directly, instead use the `test/pub_serve`
 /// transformer which will bootstrap your test and call this method.
 void internalBootstrapBrowserTest(Function getMain()) {
-  var channel = serializeSuite(getMain, hidePrints: false);
+  var channel =
+      serializeSuite(getMain, hidePrints: false, beforeLoad: () async {
+    var serialized = await suiteChannel("test.browser.mapper").stream.first;
+    if (serialized == null) return;
+    setStackTraceMapper(StackTraceMapper.deserialize(serialized));
+  });
   postMessageChannel().pipe(channel);
 }
diff --git a/test/lib/src/bootstrap/node.dart b/test/lib/src/bootstrap/node.dart
index baf4283..35ed62e 100644
--- a/test/lib/src/bootstrap/node.dart
+++ b/test/lib/src/bootstrap/node.dart
@@ -4,12 +4,17 @@
 
 import "../runner/plugin/remote_platform_helpers.dart";
 import "../runner/node/socket_channel.dart";
+import "../util/stack_trace_mapper.dart";
 
 /// Bootstraps a browser test to communicate with the test runner.
 ///
 /// This should NOT be used directly, instead use the `test/pub_serve`
 /// transformer which will bootstrap your test and call this method.
 void internalBootstrapNodeTest(Function getMain()) {
-  var channel = serializeSuite(getMain);
+  var channel = serializeSuite(getMain, beforeLoad: () async {
+    var serialized = await suiteChannel("test.node.mapper").stream.first;
+    if (serialized == null) return;
+    setStackTraceMapper(StackTraceMapper.deserialize(serialized));
+  });
   socketChannel().pipe(channel);
 }
diff --git a/test/lib/src/frontend/format_stack_trace.dart b/test/lib/src/frontend/format_stack_trace.dart
new file mode 100644
index 0000000..0d981b9
--- /dev/null
+++ b/test/lib/src/frontend/format_stack_trace.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:stack_trace/stack_trace.dart';
+
+import '../backend/stack_trace_formatter.dart';
+
+/// Converts [stackTrace] to a [Chain] according to the current test's
+/// configuration.
+///
+/// If [verbose] is `true`, this doesn't fold out irrelevant stack frames. It
+/// defaults to the current test's `verbose_trace` configuration.
+Chain formatStackTrace(StackTrace stackTrace, {bool verbose}) =>
+    StackTraceFormatter.current.formatStackTrace(stackTrace, verbose: verbose);
diff --git a/test/lib/src/frontend/stream_matcher.dart b/test/lib/src/frontend/stream_matcher.dart
index 8392d96..535ca4a 100644
--- a/test/lib/src/frontend/stream_matcher.dart
+++ b/test/lib/src/frontend/stream_matcher.dart
@@ -8,8 +8,8 @@
 import 'package:matcher/matcher.dart';
 
 import '../utils.dart';
-import 'test_chain.dart';
 import 'async_matcher.dart';
+import 'format_stack_trace.dart';
 
 /// The type for [_StreamMatcher._matchQueue].
 typedef Future<String> _MatchQueue(StreamQueue queue);
@@ -165,7 +165,7 @@
           return addBullet(event.asValue.value.toString());
         } else {
           var error = event.asError;
-          var chain = testChain(error.stackTrace);
+          var chain = formatStackTrace(error.stackTrace);
           var text = "${error.error}\n$chain";
           return prefixLines(text, "  ", first: "! ");
         }
diff --git a/test/lib/src/frontend/test_chain.dart b/test/lib/src/frontend/test_chain.dart
deleted file mode 100644
index 41bd9e7..0000000
--- a/test/lib/src/frontend/test_chain.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:stack_trace/stack_trace.dart';
-
-import '../backend/invoker.dart';
-import '../util/stack_trace_mapper.dart';
-
-/// Converts [trace] into a Dart stack trace
-StackTraceMapper _mapper;
-
-/// The list of packages to fold when producing [Chain]s.
-Set<String> _exceptPackages = new Set.from(['test', 'stream_channel']);
-
-/// If non-empty, all packages not in this list will be folded when producing
-/// [Chain]s.
-Set<String> _onlyPackages = new Set();
-
-/// Configure the resources used for test chaining.
-///
-/// [mapper] is used to convert traces into Dart stack traces.
-/// [exceptPackages] is the list of packages to fold when producing a [Chain].
-/// [onlyPackages] is the list of packages to keep in a [Chain]. If non-empty,
-/// all packages not in this will be folded.
-void configureTestChaining(
-    {StackTraceMapper mapper,
-    Set<String> exceptPackages,
-    Set<String> onlyPackages}) {
-  if (mapper != null) _mapper = mapper;
-  if (exceptPackages != null) _exceptPackages = exceptPackages;
-  if (onlyPackages != null) _onlyPackages = onlyPackages;
-}
-
-/// Returns [stackTrace] converted to a [Chain] with all irrelevant frames
-/// folded together.
-///
-/// If [verbose] is `true`, returns the chain for [stackTrace] unmodified.
-Chain terseChain(StackTrace stackTrace, {bool verbose: false}) {
-  var testTrace = _mapper?.mapStackTrace(stackTrace) ?? stackTrace;
-  if (verbose) return new Chain.forTrace(testTrace);
-  return new Chain.forTrace(testTrace).foldFrames((frame) {
-    if (_onlyPackages.isNotEmpty) {
-      return !_onlyPackages.contains(frame.package);
-    }
-    return _exceptPackages.contains(frame.package);
-  }, terse: true);
-}
-
-/// Converts [stackTrace] to a [Chain] following the test's configuration.
-Chain testChain(StackTrace stackTrace) => terseChain(stackTrace,
-    verbose: Invoker.current?.liveTest?.test?.metadata?.verboseTrace ?? true);
diff --git a/test/lib/src/frontend/throws_matcher.dart b/test/lib/src/frontend/throws_matcher.dart
index c0164ae..b6f1b06 100644
--- a/test/lib/src/frontend/throws_matcher.dart
+++ b/test/lib/src/frontend/throws_matcher.dart
@@ -8,7 +8,7 @@
 
 import '../utils.dart';
 import 'async_matcher.dart';
-import '../frontend/test_chain.dart';
+import 'format_stack_trace.dart';
 
 /// This function is deprecated.
 ///
@@ -94,7 +94,8 @@
     var buffer = new StringBuffer();
     buffer.writeln(indent(prettyPrint(error), first: 'threw '));
     if (trace != null) {
-      buffer.writeln(indent(testChain(trace).toString(), first: 'stack '));
+      buffer
+          .writeln(indent(formatStackTrace(trace).toString(), first: 'stack '));
     }
     if (result.isNotEmpty) buffer.writeln(indent(result, first: 'which '));
     return buffer.toString().trimRight();
diff --git a/test/lib/src/runner/browser/browser_manager.dart b/test/lib/src/runner/browser/browser_manager.dart
index 3472325..cee1fd9 100644
--- a/test/lib/src/runner/browser/browser_manager.dart
+++ b/test/lib/src/runner/browser/browser_manager.dart
@@ -241,11 +241,13 @@
       });
 
       try {
-        controller = await deserializeSuite(path, _platform, suiteConfig,
-            await _environment, suiteChannel, message,
-            mapper: mapper);
+        controller = deserializeSuite(path, _platform, suiteConfig,
+            await _environment, suiteChannel, message);
+
+        controller.channel("test.browser.mapper").sink.add(mapper?.serialize());
+
         _controllers.add(controller);
-        return controller.suite;
+        return await controller.suite;
       } catch (_) {
         closeIframe();
         rethrow;
diff --git a/test/lib/src/runner/browser/chrome.dart b/test/lib/src/runner/browser/chrome.dart
index 9fe727b..ae2a2f4 100644
--- a/test/lib/src/runner/browser/chrome.dart
+++ b/test/lib/src/runner/browser/chrome.dart
@@ -46,7 +46,6 @@
 
         if (!debug) {
           args.addAll([
-            "--headless",
             "--disable-gpu",
             // We don't actually connect to the remote debugger, but Chrome will
             // close as soon as the page is loaded if we don't turn it on.
diff --git a/test/lib/src/runner/browser/firefox.dart b/test/lib/src/runner/browser/firefox.dart
index 4e3ee8e..ba00de7 100644
--- a/test/lib/src/runner/browser/firefox.dart
+++ b/test/lib/src/runner/browser/firefox.dart
@@ -35,7 +35,7 @@
   /// Starts a new instance of Firefox open to the given [url], which may be a
   /// [Uri] or a [String].
   static Future<Process> _startBrowser(url, ExecutableSettings settings) async {
-    settings ??= defaultSettings[TestPlatform.dartium];
+    settings ??= defaultSettings[TestPlatform.firefox];
     var dir = createTempDir();
     new File(p.join(dir, 'prefs.js')).writeAsStringSync(_preferences);
 
diff --git a/test/lib/src/runner/browser/internet_explorer.dart b/test/lib/src/runner/browser/internet_explorer.dart
index eee4524..a2731bb 100644
--- a/test/lib/src/runner/browser/internet_explorer.dart
+++ b/test/lib/src/runner/browser/internet_explorer.dart
@@ -22,7 +22,7 @@
   /// Starts a new instance of Internet Explorer open to the given [url], which
   /// may be a [Uri] or a [String].
   static Future<Process> _startBrowser(url, ExecutableSettings settings) {
-    settings ??= defaultSettings[TestPlatform.dartium];
+    settings ??= defaultSettings[TestPlatform.internetExplorer];
 
     return Process.start(settings.executable,
         ['-extoff', url.toString()]..addAll(settings.arguments));
diff --git a/test/lib/src/runner/load_suite.dart b/test/lib/src/runner/load_suite.dart
index 1241ad2..6f4b48a 100644
--- a/test/lib/src/runner/load_suite.dart
+++ b/test/lib/src/runner/load_suite.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 
 import 'package:stack_trace/stack_trace.dart';
+import 'package:stream_channel/stream_channel.dart';
 
 import '../../test.dart';
 import '../backend/group.dart';
@@ -193,5 +194,8 @@
     return new LoadSuite._filtered(this, filtered);
   }
 
+  StreamChannel channel(String name) =>
+      throw new UnsupportedError("LoadSuite.channel() is not supported.");
+
   Future close() async {}
 }
diff --git a/test/lib/src/runner/node/platform.dart b/test/lib/src/runner/node/platform.dart
index 520639b..db9de7e 100644
--- a/test/lib/src/runner/node/platform.dart
+++ b/test/lib/src/runner/node/platform.dart
@@ -80,10 +80,12 @@
     assert(platform == TestPlatform.nodeJS);
 
     var pair = await _loadChannel(path, platform, suiteConfig);
-    var controller = await deserializeSuite(path, platform, suiteConfig,
-        new PluginEnvironment(), pair.first, message,
-        mapper: pair.last);
-    return controller.suite;
+    var controller = deserializeSuite(path, platform, suiteConfig,
+        new PluginEnvironment(), pair.first, message);
+
+    controller.channel("test.node.mapper").sink.add(pair.last?.serialize());
+
+    return await controller.suite;
   }
 
   /// Loads a [StreamChannel] communicating with the test suite at [path].
diff --git a/test/lib/src/runner/plugin/platform.dart b/test/lib/src/runner/plugin/platform.dart
index 744c463..465511a 100644
--- a/test/lib/src/runner/plugin/platform.dart
+++ b/test/lib/src/runner/plugin/platform.dart
@@ -60,9 +60,9 @@
     // loadChannel may throw an exception. That's fine; it will cause the
     // LoadSuite to emit an error, which will be presented to the user.
     var channel = loadChannel(path, platform);
-    var controller = await deserializeSuite(
+    var controller = deserializeSuite(
         path, platform, suiteConfig, new PluginEnvironment(), channel, message);
-    return controller.suite;
+    return await controller.suite;
   }
 
   Future closeEphemeral() async {}
diff --git a/test/lib/src/runner/plugin/platform_helpers.dart b/test/lib/src/runner/plugin/platform_helpers.dart
index dba0f5d..bdeea31 100644
--- a/test/lib/src/runner/plugin/platform_helpers.dart
+++ b/test/lib/src/runner/plugin/platform_helpers.dart
@@ -14,7 +14,6 @@
 import '../../backend/test_platform.dart';
 import '../../util/io.dart';
 import '../../util/remote_exception.dart';
-import '../../util/stack_trace_mapper.dart';
 import '../configuration.dart';
 import '../configuration/suite.dart';
 import '../environment.dart';
@@ -36,18 +35,18 @@
 ///
 /// If [mapper] is passed, it will be used to adjust stack traces for any errors
 /// emitted by tests.
-Future<RunnerSuiteController> deserializeSuite(
+RunnerSuiteController deserializeSuite(
     String path,
     TestPlatform platform,
     SuiteConfiguration suiteConfig,
     Environment environment,
     StreamChannel channel,
-    Object message,
-    {StackTraceMapper mapper}) async {
+    Object message) {
   var disconnector = new Disconnector();
   var suiteChannel = new MultiChannel(channel.transform(disconnector));
 
   suiteChannel.sink.add({
+    'type': 'initial',
     'platform': platform.serialize(),
     'metadata': suiteConfig.metadata.serialize(),
     'os': (platform == TestPlatform.vm || platform == TestPlatform.nodeJS)
@@ -57,7 +56,6 @@
     'path': path,
     'collectTraces': Configuration.current.reporter == 'json',
     'noRetry': Configuration.current.noRetry,
-    'stackTraceMapper': mapper?.serialize(),
     'foldTraceExcept': Configuration.current.foldTraceExcept.toList(),
     'foldTraceOnly': Configuration.current.foldTraceOnly.toList(),
   }..addAll(message as Map));
@@ -112,7 +110,7 @@
       });
 
   return new RunnerSuiteController(
-      environment, suiteConfig, await completer.future,
+      environment, suiteConfig, suiteChannel, completer.future,
       path: path,
       platform: platform,
       os: currentOS,
diff --git a/test/lib/src/runner/plugin/remote_platform_helpers.dart b/test/lib/src/runner/plugin/remote_platform_helpers.dart
index cccaeb7..61e6c40 100644
--- a/test/lib/src/runner/plugin/remote_platform_helpers.dart
+++ b/test/lib/src/runner/plugin/remote_platform_helpers.dart
@@ -2,9 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
+
 import 'package:stream_channel/stream_channel.dart';
 
+import '../../backend/stack_trace_formatter.dart';
+import '../../util/stack_trace_mapper.dart';
 import '../remote_listener.dart';
+import '../suite_channel_manager.dart';
 
 /// Returns a channel that will emit a serialized representation of the tests
 /// defined in [getMain].
@@ -21,5 +26,44 @@
 /// suite will not be forwarded to the parent zone's print handler. However, the
 /// caller may want them to be forwarded in (for example) a browser context
 /// where they'll be visible in the development console.
-StreamChannel serializeSuite(Function getMain(), {bool hidePrints: true}) =>
-    RemoteListener.start(getMain, hidePrints: hidePrints);
+///
+/// If [beforeLoad] is passed, it's called before the tests have been declared
+/// for this worker.
+StreamChannel serializeSuite(Function getMain(),
+        {bool hidePrints: true, Future beforeLoad()}) =>
+    RemoteListener.start(getMain,
+        hidePrints: hidePrints, beforeLoad: beforeLoad);
+
+/// Returns a channel that communicates with a plugin in the test runner.
+///
+/// This connects to a channel created by code in the test runner calling
+/// `RunnerSuite.channel()` with the same name. It can be used used to send and
+/// receive any JSON-serializable object.
+///
+/// Throws a [StateError] if [name] has already been used for a channel, or if
+/// this is called outside a worker context (such as within a running test or
+/// `serializeSuite()`'s `onLoad()` function).
+StreamChannel suiteChannel(String name) {
+  var manager = SuiteChannelManager.current;
+  if (manager == null) {
+    throw new StateError(
+        'suiteChannel() may only be called within a test worker.');
+  }
+
+  return manager.connectOut(name);
+}
+
+/// Sets the stack trace mapper for the current test suite.
+///
+/// This is used to convert JavaScript stack traces into their Dart equivalents
+/// using source maps. It should be set before any tests run, usually in the
+/// `onLoad()` callback to [serializeSuite].
+void setStackTraceMapper(StackTraceMapper mapper) {
+  var formatter = StackTraceFormatter.current;
+  if (formatter == null) {
+    throw new StateError(
+        'setStackTraceMapper() may only be called within a test worker.');
+  }
+
+  formatter.configure(mapper: mapper);
+}
diff --git a/test/lib/src/runner/remote_listener.dart b/test/lib/src/runner/remote_listener.dart
index 29f7ebc..1143523 100644
--- a/test/lib/src/runner/remote_listener.dart
+++ b/test/lib/src/runner/remote_listener.dart
@@ -4,6 +4,7 @@
 
 import 'dart:async';
 
+import 'package:async/async.dart';
 import 'package:stream_channel/stream_channel.dart';
 import 'package:term_glyph/term_glyph.dart' as glyph;
 
@@ -13,13 +14,13 @@
 import '../backend/live_test.dart';
 import '../backend/metadata.dart';
 import '../backend/operating_system.dart';
+import '../backend/stack_trace_formatter.dart';
 import '../backend/suite.dart';
 import '../backend/test.dart';
 import '../backend/test_platform.dart';
-import '../frontend/test_chain.dart';
 import '../util/remote_exception.dart';
-import '../util/stack_trace_mapper.dart';
 import '../utils.dart';
+import 'suite_channel_manager.dart';
 
 class RemoteListener {
   /// The test suite to run.
@@ -41,7 +42,11 @@
   /// suite will not be forwarded to the parent zone's print handler. However,
   /// the caller may want them to be forwarded in (for example) a browser
   /// context where they'll be visible in the development console.
-  static StreamChannel start(AsyncFunction getMain(), {bool hidePrints: true}) {
+  ///
+  /// If [beforeLoad] is passed, it's called before the tests have been declared
+  /// for this worker.
+  static StreamChannel start(AsyncFunction getMain(),
+      {bool hidePrints: true, Future beforeLoad()}) {
     // This has to be synchronous to work around sdk#25745. Otherwise, there'll
     // be an asynchronous pause before a syntax error notification is sent,
     // which will cause the send to fail entirely.
@@ -52,66 +57,83 @@
     var verboseChain = true;
 
     var printZone = hidePrints ? null : Zone.current;
-    runZoned(() async {
-      var main;
-      try {
-        main = getMain();
-      } on NoSuchMethodError catch (_) {
-        _sendLoadException(channel, "No top-level main() function defined.");
-        return;
-      } catch (error, stackTrace) {
-        _sendError(channel, error, stackTrace, verboseChain);
-        return;
-      }
-
-      if (main is! Function) {
-        _sendLoadException(channel, "Top-level main getter is not a function.");
-        return;
-      } else if (main is! AsyncFunction) {
-        _sendLoadException(
-            channel, "Top-level main() function takes arguments.");
-        return;
-      }
-
-      var message = await channel.stream.first;
-
-      if (message['asciiGlyphs'] ?? false) glyph.ascii = true;
-      var metadata = new Metadata.deserialize(message['metadata']);
-      verboseChain = metadata.verboseTrace;
-      var declarer = new Declarer(
-          metadata: metadata,
-          platformVariables: new Set.from(message['platformVariables']),
-          collectTraces: message['collectTraces'],
-          noRetry: message['noRetry']);
-
-      configureTestChaining(
-          mapper: StackTraceMapper.deserialize(message['stackTraceMapper']),
-          exceptPackages: _deserializeSet(message['foldTraceExcept']),
-          onlyPackages: _deserializeSet(message['foldTraceOnly']));
-
-      await declarer.declare(main);
-
-      var suite = new Suite(declarer.build(),
-          platform: new TestPlatform.deserialize(message['platform']),
-          os: message['os'] == null
-              ? null
-              : OperatingSystem.find(message['os']),
-          path: message['path']);
-
-      runZoned(() {
-        Invoker.guard(
-            () => new RemoteListener._(suite, printZone)._listen(channel));
-      },
-          // Make the declarer visible to running tests so that they'll throw
-          // useful errors when calling `test()` and `group()` within a test,
-          // and so they can add to the declarer's `tearDownAll()` list.
-          zoneValues: {#test.declarer: declarer});
-    }, onError: (error, stackTrace) {
-      _sendError(channel, error, stackTrace, verboseChain);
-    }, zoneSpecification: new ZoneSpecification(print: (_, __, ___, line) {
+    var spec = new ZoneSpecification(print: (_, __, ___, line) {
       if (printZone != null) printZone.print(line);
       channel.sink.add({"type": "print", "line": line});
-    }));
+    });
+
+    new SuiteChannelManager().asCurrent(() {
+      new StackTraceFormatter().asCurrent(() {
+        runZoned(() async {
+          var main;
+          try {
+            main = getMain();
+          } on NoSuchMethodError catch (_) {
+            _sendLoadException(
+                channel, "No top-level main() function defined.");
+            return;
+          } catch (error, stackTrace) {
+            _sendError(channel, error, stackTrace, verboseChain);
+            return;
+          }
+
+          if (main is! Function) {
+            _sendLoadException(
+                channel, "Top-level main getter is not a function.");
+            return;
+          } else if (main is! AsyncFunction) {
+            _sendLoadException(
+                channel, "Top-level main() function takes arguments.");
+            return;
+          }
+
+          var queue = new StreamQueue(channel.stream);
+          var message = await queue.next;
+          assert(message['type'] == 'initial');
+
+          queue.rest.listen((message) {
+            assert(message["type"] == "suiteChannel");
+            SuiteChannelManager.current.connectIn(
+                message['name'], channel.virtualChannel(message['id']));
+          });
+
+          if (message['asciiGlyphs'] ?? false) glyph.ascii = true;
+          var metadata = new Metadata.deserialize(message['metadata']);
+          verboseChain = metadata.verboseTrace;
+          var declarer = new Declarer(
+              metadata: metadata,
+              platformVariables: new Set.from(message['platformVariables']),
+              collectTraces: message['collectTraces'],
+              noRetry: message['noRetry']);
+
+          StackTraceFormatter.current.configure(
+              except: _deserializeSet(message['foldTraceExcept']),
+              only: _deserializeSet(message['foldTraceOnly']));
+
+          if (beforeLoad != null) await beforeLoad();
+
+          await declarer.declare(main);
+
+          var suite = new Suite(declarer.build(),
+              platform: new TestPlatform.deserialize(message['platform']),
+              os: message['os'] == null
+                  ? null
+                  : OperatingSystem.find(message['os']),
+              path: message['path']);
+
+          runZoned(() {
+            Invoker.guard(
+                () => new RemoteListener._(suite, printZone)._listen(channel));
+          },
+              // Make the declarer visible to running tests so that they'll throw
+              // useful errors when calling `test()` and `group()` within a test,
+              // and so they can add to the declarer's `tearDownAll()` list.
+              zoneValues: {#test.declarer: declarer});
+        }, onError: (error, stackTrace) {
+          _sendError(channel, error, stackTrace, verboseChain);
+        }, zoneSpecification: spec);
+      });
+    });
 
     return controller.foreign;
   }
@@ -136,7 +158,9 @@
     channel.sink.add({
       "type": "error",
       "error": RemoteException.serialize(
-          error, terseChain(stackTrace, verbose: verboseChain))
+          error,
+          StackTraceFormatter.current
+              .formatStackTrace(stackTrace, verbose: verboseChain))
     });
   }
 
@@ -215,7 +239,7 @@
         "type": "error",
         "error": RemoteException.serialize(
             asyncError.error,
-            terseChain(asyncError.stackTrace,
+            StackTraceFormatter.current.formatStackTrace(asyncError.stackTrace,
                 verbose: liveTest.test.metadata.verboseTrace))
       });
     });
diff --git a/test/lib/src/runner/runner_suite.dart b/test/lib/src/runner/runner_suite.dart
index 45cb6d9..c63369f 100644
--- a/test/lib/src/runner/runner_suite.dart
+++ b/test/lib/src/runner/runner_suite.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 
 import 'package:async/async.dart';
+import 'package:stream_channel/stream_channel.dart';
 
 import '../backend/group.dart';
 import '../backend/operating_system.dart';
@@ -45,17 +46,26 @@
   /// The event is `true` when debugging starts and `false` when it ends.
   Stream<bool> get onDebugging => _controller._onDebuggingController.stream;
 
+  /// Returns a channel that communicates with the remote suite.
+  ///
+  /// This connects to a channel created by code in the test worker calling
+  /// `suiteChannel()` from `remote_platform_helpers.dart` with the same name.
+  /// It can be used used to send and receive any JSON-serializable object.
+  StreamChannel channel(String name) => _controller.channel(name);
+
   /// A shortcut constructor for creating a [RunnerSuite] that never goes into
-  /// debugging mode.
+  /// debugging mode and doesn't support suite channels.
   factory RunnerSuite(
       Environment environment, SuiteConfiguration config, Group group,
       {String path,
       TestPlatform platform,
       OperatingSystem os,
       AsyncFunction onClose}) {
-    var controller = new RunnerSuiteController(environment, config, group,
-        path: path, platform: platform, os: os, onClose: onClose);
-    return controller.suite;
+    var controller =
+        new RunnerSuiteController._local(environment, config, onClose: onClose);
+    var suite = new RunnerSuite._(controller, group, path, platform, os);
+    controller._suite = new Future.value(suite);
+    return suite;
   }
 
   RunnerSuite._(this._controller, Group group, String path,
@@ -75,8 +85,8 @@
 /// A class that exposes and controls a [RunnerSuite].
 class RunnerSuiteController {
   /// The suite controlled by this controller.
-  RunnerSuite get suite => _suite;
-  RunnerSuite _suite;
+  Future<RunnerSuite> get suite => _suite;
+  Future<RunnerSuite> _suite;
 
   /// The backing value for [suite.environment].
   final Environment _environment;
@@ -84,6 +94,9 @@
   /// The configuration for this suite.
   final SuiteConfiguration _config;
 
+  /// A channel that communicates with the remote suite.
+  final MultiChannel _suiteChannel;
+
   /// The function to call when the suite is closed.
   final AsyncFunction _onClose;
 
@@ -93,15 +106,27 @@
   /// The controller for [suite.onDebugging].
   final _onDebuggingController = new StreamController<bool>.broadcast();
 
-  RunnerSuiteController(this._environment, this._config, Group group,
+  /// The channel names that have already been used.
+  final _channelNames = new Set<String>();
+
+  RunnerSuiteController(this._environment, this._config, this._suiteChannel,
+      Future<Group> groupFuture,
       {String path,
       TestPlatform platform,
       OperatingSystem os,
       AsyncFunction onClose})
       : _onClose = onClose {
-    _suite = new RunnerSuite._(this, group, path, platform, os);
+    _suite = groupFuture
+        .then((group) => new RunnerSuite._(this, group, path, platform, os));
   }
 
+  /// Used by [new RunnerSuite] to create a runner suite that's not loaded from
+  /// an external source.
+  RunnerSuiteController._local(this._environment, this._config,
+      {AsyncFunction onClose})
+      : _suiteChannel = null,
+        _onClose = onClose;
+
   /// Sets whether the suite is paused for debugging.
   ///
   /// If this is different than [suite.isDebugging], this will automatically
@@ -112,6 +137,27 @@
     _onDebuggingController.add(debugging);
   }
 
+  /// Returns a channel that communicates with the remote suite.
+  ///
+  /// This connects to a channel created by code in the test worker calling
+  /// `suiteChannel()` from `remote_platform_helpers.dart` with the same name.
+  /// It can be used used to send and receive any JSON-serializable object.
+  ///
+  /// This is exposed on the [RunnerSuiteController] so that runner plugins can
+  /// communicate with the workers they spawn before the associated [suite] is
+  /// fully loaded.
+  StreamChannel channel(String name) {
+    if (!_channelNames.add(name)) {
+      throw new StateError(
+          'Duplicate RunnerSuite.channel() connection "$name".');
+    }
+
+    var channel = _suiteChannel.virtualChannel();
+    _suiteChannel.sink
+        .add({"type": "suiteChannel", "name": name, "id": channel.id});
+    return channel;
+  }
+
   /// The backing function for [suite.close].
   Future _close() => _closeMemo.runOnce(() async {
         _onDebuggingController.close();
diff --git a/test/lib/src/runner/suite_channel_manager.dart b/test/lib/src/runner/suite_channel_manager.dart
new file mode 100644
index 0000000..dffd0cc
--- /dev/null
+++ b/test/lib/src/runner/suite_channel_manager.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:stream_channel/stream_channel.dart';
+
+/// The key used to look up [SuiteChannelManager.current] in a zone.
+final _currentKey = new Object();
+
+/// A class that connects incoming and outgoing channels with the same names.
+class SuiteChannelManager {
+  /// Connections from the test runner that have yet to connect to corresponding
+  /// calls to [suiteChannel] within this worker.
+  final _incomingConnections = <String, StreamChannel>{};
+
+  /// Connections from calls to [suiteChannel] that have yet to connect to
+  /// corresponding connections from the test runner.
+  final _outgoingConnections = <String, StreamChannelCompleter>{};
+
+  /// The channel names that have already been used.
+  final _names = new Set<String>();
+
+  /// Returns the current manager, or `null` if this isn't called within a call
+  /// to [asCurrent].
+  static SuiteChannelManager get current =>
+      Zone.current[_currentKey] as SuiteChannelManager;
+
+  /// Runs [body] with [this] as [SuiteChannelManager.current].
+  ///
+  /// This is zone-scoped, so [this] will be the current configuration in any
+  /// asynchronous callbacks transitively created by [body].
+  T asCurrent<T>(T body()) => runZoned(body, zoneValues: {_currentKey: this});
+
+  /// Creates a connection to the test runnner's channel with the given [name].
+  StreamChannel connectOut(String name) {
+    if (_incomingConnections.containsKey(name)) {
+      return _incomingConnections[name];
+    } else if (_names.contains(name)) {
+      throw new StateError('Duplicate suiteChannel() connection "$name".');
+    } else {
+      _names.add(name);
+      var completer = new StreamChannelCompleter();
+      _outgoingConnections[name] = completer;
+      return completer.channel;
+    }
+  }
+
+  /// Connects [channel] to this worker's channel with the given [name].
+  void connectIn(String name, StreamChannel channel) {
+    if (_outgoingConnections.containsKey(name)) {
+      _outgoingConnections.remove(name).setChannel(channel);
+    } else if (_incomingConnections.containsKey(name)) {
+      throw new StateError(
+          'Duplicate RunnerSuite.channel() connection "$name".');
+    } else {
+      _incomingConnections[name] = channel;
+    }
+  }
+}
diff --git a/test/pubspec.yaml b/test/pubspec.yaml
index d595e3b..8bac00e 100644
--- a/test/pubspec.yaml
+++ b/test/pubspec.yaml
@@ -1,5 +1,5 @@
 name: test
-version: 0.12.30+3
+version: 0.12.30+4
 author: Dart Team <misc@dartlang.org>
 description: A library for writing dart unit tests.
 homepage: https://github.com/dart-lang/test
diff --git a/unittest/.analysis_options b/unittest/.analysis_options
deleted file mode 100644
index a10d4c5..0000000
--- a/unittest/.analysis_options
+++ /dev/null
@@ -1,2 +0,0 @@
-analyzer:
-  strong-mode: true
diff --git a/unittest/.gitignore b/unittest/.gitignore
deleted file mode 100644
index e2552ea..0000000
--- a/unittest/.gitignore
+++ /dev/null
@@ -1,15 +0,0 @@
-# Don’t commit the following files and directories created by pub.
-.buildlog
-.pub/
-build/
-packages
-.packages
-
-# Or the files created by dart2js.
-*.dart.js
-*.js_
-*.js.deps
-*.js.map
-
-# Include when developing application packages.
-pubspec.lock
\ No newline at end of file
diff --git a/unittest/.status b/unittest/.status
deleted file mode 100644
index c5c82bb..0000000
--- a/unittest/.status
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# Skip non-test files ending with "_test".
-packages/*: Skip
-*/packages/*: Skip
-*/*/packages/*: Skip
-*/*/*/packages/*: Skip
-*/*/*/*packages/*: Skip
-*/*/*/*/*packages/*: Skip
-
-# Only run tests from the build directory, since we don't care about the
-# difference between transformed an untransformed code.
-test/*: Skip
-
-[ $runtime == jsshell ]
-build/test/missing_tick_test: Fail # Timer interface not supported: dartbug.com/7728
-build/test/nested_groups_setup_teardown_test: RuntimeError # http://dartbug.com/10109
-
-[ $compiler == none && ( $runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) ]
-# Skip serialization test that explicitly has no library declaration in the
-# test on Dartium, which requires all tests to have a library.
-build/test/async_exception_test: RuntimeError # 13921
-build/test/async_exception_with_future_test: RuntimeError # 13921
-build/test/async_setup_teardown_test: RuntimeError # 13921
-build/test/completion_test: RuntimeError # 13921
-build/test/correct_callback_test: RuntimeError # 13921
-build/test/exception_test: RuntimeError # 13921
-build/test/excess_callback_test: RuntimeError # 13921
-build/test/expect_async_args_test: RuntimeError # 13921
-build/test/expect_async_test: RuntimeError # 13921
-build/test/group_name_test: RuntimeError # 13921
-build/test/invalid_ops_test: RuntimeError # 13921
-build/test/late_exception_test: RuntimeError # 13921
-build/test/middle_exception_test: RuntimeError # 13921
-build/test/nested_groups_setup_teardown_test: RuntimeError # 13921
-build/test/protect_async_test: RuntimeError # 13921
-build/test/returning_future_test: RuntimeError # 13921
-build/test/returning_future_using_runasync_test: RuntimeError # 13921
-build/test/runtests_without_tests_test: RuntimeError # 13921
-build/test/setup_and_teardown_test: RuntimeError # 13921
-build/test/setup_test: RuntimeError # 13921
-build/test/single_correct_test: RuntimeError # 13921
-build/test/single_failing_test: RuntimeError # 13921
-build/test/skipped_soloed_nested_test: RuntimeError # 13921
-build/test/teardown_test: RuntimeError # 13921
-build/test/testcases_immutable_test: RuntimeError # 13921
-
-[ $compiler == none && $browser ]
-build/test/missing_tick_test: RuntimeError # Expected to fail, due to timeout.
diff --git a/unittest/BUILD.gn b/unittest/BUILD.gn
deleted file mode 100644
index 1f6e2ae..0000000
--- a/unittest/BUILD.gn
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is generated by importer.py for unittest-0.11.7
-
-import("//build/dart/dart_library.gni")
-
-dart_library("unittest") {
-  package_name = "unittest"
-
-  source_dir = "lib"
-
-  disable_analysis = true
-
-  deps = [
-    "//third_party/dart-pkg/pub/stack_trace",
-  ]
-}
diff --git a/unittest/CHANGELOG.md b/unittest/CHANGELOG.md
deleted file mode 100644
index b60e66b..0000000
--- a/unittest/CHANGELOG.md
+++ /dev/null
@@ -1,156 +0,0 @@
-##0.11.7
-
-* Add separate methods for `expectAysnc` based on number of callback arguments 
-  `expectAsync0`, `expectAsync1`, ... `expectAsync6`.
-* Fix all strong mode warnings.
-
-##0.11.6+4
-
-* Fix some strong mode warnings we missed in the `vm_config.dart` and
-  `html_config.dart` libraries.
-
-##0.11.6+3
-
-* Fix a bug introduced in 0.11.6+2 in which operator matchers broke when taking
-  lists of matchers.
-
-##0.11.6+2
-
-* Fix all strong mode warnings.
-
-##0.11.6+1
-
-* Give tests more time to start running.
-
-##0.11.6
-
-* Merge in the last `0.11.x` release of `matcher` to allow projects to use both
-  `test` and `unittest` without conflicts.
-
-* Fix running individual tests with `HtmlIndividualConfiguration` when the test
-  name contains URI-escaped values and is provided with the `group` query
-  parameter.
-
-##0.11.5+4
-
-* Improved the output of `TestCase` failures in `HtmlConfig`.
-
-##0.11.5+3
-
-* Fixed issue with handling exceptions.
-
-##0.11.5+2
-
-* Properly detect when tests are finished being run on content shell.
-
-##0.11.5+1
-
-* Internal code cleanups and documentation improvements.
-
-##0.11.5
-
-* Bumped the version constraint for `matcher`.
-
-##0.11.4
-
-* Bump the version constraint for `matcher`.
-
-##0.11.3
-
-* Narrow the constraint on matcher to ensure that new features are reflected in
-  unittest's version.
-
-##0.11.2
-
-* Prints a warning instead of throwing an error when setting the test
-  configuration after it has already been set. The first configuration is always
-  used.
-
-##0.11.1+1
-
-* Fix bug in withTestEnvironment where test cases were not reinitialized if
-  called multiple times.
-
-##0.11.1
-
-* Add `reason` named argument to `expectAsync` and `expectAsyncUntil`, which has
-  the same definition as `expect`'s `reason` argument.
-* Added support for private test environments.
-
-##0.11.0+6
-
-* Refactored package tests.
-
-##0.11.0+5
-
-* Release test functions after each test is run.
-
-##0.11.0+4
-
-* Fix for [20153](https://code.google.com/p/dart/issues/detail?id=20153)
-
-##0.11.0+3
-
-* Updated maximum `matcher` version.
-
-##0.11.0+2
-
-*  Removed unused files from tests and standardized remaining test file names.
-
-##0.11.0+1
-
-* Widen the version constraint for `stack_trace`.
-
-##0.11.0
-
-* Deprecated methods have been removed:
-    * `expectAsync0`, `expectAsync1`, and `expectAsync2` - use `expectAsync`
-      instead
-    * `expectAsyncUntil0`, `expectAsyncUntil1`, and `expectAsyncUntil2` - use
-      `expectAsyncUntil` instead
-    * `guardAsync` - no longer needed
-    * `protectAsync0`, `protectAsync1`, and `protectAsync2` - no longer needed
-* `matcher.dart` and `mirror_matchers.dart` have been removed. They are now in
-  the `matcher` package.
-* `mock.dart` has been removed. It is now in the `mock` package.
-
-##0.10.1+2
-
-* Fixed deprecation message for `mock`.
-
-##0.10.1+1
-
-* Fixed CHANGELOG
-* Moved to triple-slash for all doc comments.
-
-##0.10.1
-
-* **DEPRECATED**
-    * `matcher.dart` and `mirror_matchers.dart` are now in the `matcher`
-      package.
-    * `mock.dart` is now in the `mock` package.
-* `equals` now allows a nested matcher as an expected list element or map value
-  when doing deep matching.
-* `expectAsync` and `expectAsyncUntil` now support up to 6 positional arguments
-  and correctly handle functions with optional positional arguments with default
-  values.
-
-##0.10.0
-
-* Each test is run in a separate `Zone`. This ensures that any exceptions that
-occur is async operations are reported back to the source test case.
-* **DEPRECATED** `guardAsync`, `protectAsync0`, `protectAsync1`,
-and `protectAsync2`
-    * Running each test in a `Zone` addresses the need for these methods.
-* **NEW!** `expectAsync` replaces the now deprecated `expectAsync0`,
-    `expectAsync1` and `expectAsync2`
-* **NEW!** `expectAsyncUntil` replaces the now deprecated `expectAsyncUntil0`,
-    `expectAsyncUntil1` and `expectAsyncUntil2`
-* `TestCase`:
-    * Removed properties: `setUp`, `tearDown`, `testFunction`
-    * `enabled` is now get-only
-    * Removed methods: `pass`, `fail`, `error`
-* `interactive_html_config.dart` has been removed.
-* `runTests`, `tearDown`, `setUp`, `test`, `group`, `solo_test`, and
-  `solo_group` now throw a `StateError` if called while tests are running.
-* `rerunTests` has been removed.
diff --git a/unittest/LICENSE b/unittest/LICENSE
deleted file mode 100644
index 5c60afe..0000000
--- a/unittest/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-Copyright 2014, the Dart project authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-    * Neither the name of Google Inc. nor the names of its
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/unittest/README.md b/unittest/README.md
deleted file mode 100644
index faad9a8..0000000
--- a/unittest/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-The `unittest` package has been renamed [`test`][test]. It will export `test`'s
-API through the `0.12.x` branch, but it is deprecated and `test` should be used
-instead.
-
-[test]: https://pub.dartlang.org/packages/test
diff --git a/unittest/codereview.settings b/unittest/codereview.settings
deleted file mode 100644
index bd401b1..0000000
--- a/unittest/codereview.settings
+++ /dev/null
@@ -1,3 +0,0 @@
-CODE_REVIEW_SERVER: https://codereview.chromium.org/
-VIEW_VC: https://github.com/dart-lang/unittest/commit/
-CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/unittest/lib/compact_vm_config.dart b/unittest/lib/compact_vm_config.dart
deleted file mode 100644
index 1fadfc1..0000000
--- a/unittest/lib/compact_vm_config.dart
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// A test configuration that generates a compact 1-line progress bar. The bar
-/// is updated in-place before and after each test is executed. If all tests
-/// pass, only a couple of lines are printed in the terminal. If a test fails,
-/// the failure is shown and the progress bar continues to be updated below it.
-library unittest.compact_vm_config;
-
-import 'dart:async';
-import 'dart:io';
-import 'dart:isolate';
-
-import 'unittest.dart';
-import 'src/utils.dart';
-import 'vm_config.dart';
-
-const String _GREEN = '\u001b[32m';
-const String _RED = '\u001b[31m';
-const String _NONE = '\u001b[0m';
-
-const int MAX_LINE = 80;
-
-class CompactVMConfiguration extends VMConfiguration {
-  // The VM won't shut down if a receive port is open. Use this to make sure
-  // we correctly wait for asynchronous tests.
-  ReceivePort _receivePort;
-
-  DateTime _start;
-  Set<int> _passing = new Set();
-  Set<int> _failing = new Set();
-  int get _pass => _passing.length;
-  int get _fail => _failing.length;
-
-  void onInit() {
-    _receivePort = new ReceivePort();
-    // Override and don't call the superclass onInit() to avoid printing the
-    // "unittest-suite-..." boilerplate.
-  }
-
-  void onStart() {
-    _start = new DateTime.now();
-  }
-
-  void onTestStart(TestCase test) {
-    super.onTestStart(test);
-    _progressLine(test.description);
-  }
-
-  void onTestResult(TestCase test) {
-    super.onTestResult(test);
-    if (test.result == PASS) {
-      _passing.add(test.id);
-      _progressLine(test.description);
-    } else {
-      _failing.add(test.id);
-      _progressLine(test.description);
-      _print();
-      if (test.message != '') {
-        _print(indent(test.message));
-      }
-
-      if (test.stackTrace != null) {
-        _print(indent(test.stackTrace.toString()));
-      }
-    }
-  }
-
-  void onTestResultChanged(TestCase test) {
-    _passing.remove(test.id);
-    _failing.add(test.id);
-    _progressLine(test.description);
-    _print();
-    if (test.message != '') {
-      _print(indent(test.message));
-    }
-
-    if (test.stackTrace != null) {
-      _print(indent(test.stackTrace.toString()));
-    }
-  }
-
-  void onDone(bool success) {
-    // Override and don't call the superclass onDone() to avoid printing the
-    // "unittest-suite-..." boilerplate.
-    Future.wait([stdout.close(), stderr.close()]).then((_) {
-      _receivePort.close();
-      exit(success ? 0 : 1);
-    });
-  }
-
-  void onSummary(int passed, int failed, int errors, List<TestCase> results,
-      String uncaughtError) {
-    if (passed == 0 && failed == 0 && errors == 0 && uncaughtError == null) {
-      _print('\nNo tests ran.');
-    } else if (failed == 0 && errors == 0 && uncaughtError == null) {
-      _progressLine('All tests passed!', _NONE);
-      _print();
-    } else {
-      _progressLine('Some tests failed.', _RED);
-      _print();
-      if (uncaughtError != null) {
-        _print('Top-level uncaught error: $uncaughtError');
-      }
-      _print('$passed PASSED, $failed FAILED, $errors ERRORS');
-    }
-  }
-
-  int _lastLength = 0;
-
-  final int _nonVisiblePrefix = 1 + _GREEN.length + _NONE.length;
-
-  void _progressLine(String message, [String color = _NONE]) {
-    var duration = (new DateTime.now()).difference(_start);
-    var buffer = new StringBuffer();
-    // \r moves back to the beginning of the current line.
-    buffer.write('\r${_timeString(duration)} ');
-    buffer.write(_GREEN);
-    buffer.write('+');
-    buffer.write(_pass);
-    buffer.write(_NONE);
-    if (_fail != 0) {
-      buffer.write(_RED);
-      buffer.write(' -');
-      buffer.write(_fail);
-      buffer.write(_NONE);
-    }
-    buffer.write(': ');
-    buffer.write(color);
-
-    // Ensure the line fits under MAX_LINE. [buffer] includes the color escape
-    // sequences too. Because these sequences are not visible characters, we
-    // make sure they are not counted towards the limit.
-    int nonVisible = _nonVisiblePrefix +
-        color.length +
-        (_fail != 0 ? (_RED.length + _NONE.length) : 0);
-    int len = buffer.length - nonVisible;
-    buffer.write(_snippet(message, MAX_LINE - len));
-    buffer.write(_NONE);
-
-    // Pad the rest of the line so that it looks erased.
-    len = buffer.length - nonVisible - _NONE.length;
-    if (len > _lastLength) {
-      _lastLength = len;
-    } else {
-      while (len < _lastLength) {
-        buffer.write(' ');
-        _lastLength--;
-      }
-    }
-    stdout.write(buffer.toString());
-  }
-
-  String _padTime(int time) =>
-      (time == 0) ? '00' : ((time < 10) ? '0$time' : '$time');
-
-  String _timeString(Duration duration) {
-    var min = duration.inMinutes;
-    var sec = duration.inSeconds % 60;
-    return '${_padTime(min)}:${_padTime(sec)}';
-  }
-
-  String _snippet(String text, int maxLength) {
-    // Return the full message if it fits
-    if (text.length <= maxLength) return text;
-
-    // If we can fit the first and last three words, do so.
-    var words = text.split(' ');
-    if (words.length > 1) {
-      int i = words.length;
-      var len = words.first.length + 4;
-      do {
-        len += 1 + words[--i].length;
-      } while (len <= maxLength && i > 0);
-      if (len > maxLength || i == 0) i++;
-      if (i < words.length - 4) {
-        // Require at least 3 words at the end.
-        var buffer = new StringBuffer();
-        buffer.write(words.first);
-        buffer.write(' ...');
-        for ( ; i < words.length; i++) {
-          buffer.write(' ');
-          buffer.write(words[i]);
-        }
-        return buffer.toString();
-      }
-    }
-
-    // Otherwise truncate to return the trailing text, but attempt to start at
-    // the beginning of a word.
-    var res = text.substring(text.length - maxLength + 4);
-    var firstSpace = res.indexOf(' ');
-    if (firstSpace > 0) {
-      res = res.substring(firstSpace);
-    }
-    return '...$res';
-  }
-}
-
-// TODO(sigmund): delete when dartbug.com/17269 is fixed (use `print` instead).
-_print([value = '']) => stdout.write('$value\n');
-
-void useCompactVMConfiguration() {
-  // If the test is running on the Dart buildbots, we don't want to use this
-  // config since it's output may not be what the bots expect.
-  if (Platform.environment['LOGNAME'] == 'chrome-bot') {
-    return;
-  }
-
-  unittestConfiguration = _singleton;
-}
-
-final _singleton = new CompactVMConfiguration();
diff --git a/unittest/lib/html_config.dart b/unittest/lib/html_config.dart
deleted file mode 100644
index dc866a0..0000000
--- a/unittest/lib/html_config.dart
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// A simple unit test library for running tests in a browser.
-library unittest.html_config;
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:html';
-import 'dart:js' as js;
-import 'unittest.dart';
-
-/// Creates a table showing tests results in HTML.
-void _showResultsInPage(int passed, int failed, int errors,
-    List<TestCase> results, bool isLayoutTest, String uncaughtError) {
-  if (isLayoutTest && (passed == results.length) && uncaughtError == null) {
-    document.body.innerHtml = "PASS";
-  } else {
-    var newBody = new StringBuffer();
-    newBody.write("<table class='unittest-table'><tbody>");
-    newBody.write(passed == results.length && uncaughtError == null
-        ? "<tr><td colspan='3' class='unittest-pass'>PASS</td></tr>"
-        : "<tr><td colspan='3' class='unittest-fail'>FAIL</td></tr>");
-
-    for (final test_ in results) {
-      newBody.write(_toHtml(test_));
-    }
-
-    if (uncaughtError != null) {
-      newBody.write('''<tr>
-          <td>--</td>
-          <td class="unittest-error">ERROR</td>
-          <td>Uncaught error: $uncaughtError</td>
-        </tr>''');
-    }
-
-    if (passed == results.length && uncaughtError == null) {
-      newBody.write("""
-          <tr><td colspan='3' class='unittest-pass'>
-            All ${passed} tests passed
-          </td></tr>""");
-    } else {
-      newBody.write("""
-          <tr><td colspan='3'>Total
-            <span class='unittest-pass'>${passed} passed</span>,
-            <span class='unittest-fail'>${failed} failed</span>
-            <span class='unittest-error'>
-            ${errors + (uncaughtError == null ? 0 : 1)} errors</span>
-          </td></tr>""");
-    }
-    newBody.write("</tbody></table>");
-    document.body.innerHtml = newBody.toString();
-
-    window.onHashChange.listen((_) {
-      // Location may change from individual tests setting the hash tag.
-      if (window.location.hash != null &&
-          window.location.hash.contains('testFilter')) {
-        window.location.reload();
-      }
-    });
-  }
-}
-
-String _toHtml(TestCase testCase) {
-  if (!testCase.isComplete) {
-    return '''
-        <tr>
-          <td>${testCase.id}</td>
-          <td class="unittest-error">NO STATUS</td>
-          <td>Test did not complete</td>
-        </tr>''';
-  }
-
-  var html = '''
-      <tr>
-        <td>${testCase.id}</td>
-        <td class="unittest-${testCase.result}">
-          ${testCase.result.toUpperCase()}
-        </td>
-        <td>
-          <p>Expectation: 
-            <a href="#testFilter=${testCase.description}">
-              ${testCase.description}
-            </a>.
-          </p>
-          <pre>${HTML_ESCAPE.convert(testCase.message)}</pre>
-        </td>
-      </tr>''';
-
-  if (testCase.stackTrace != null) {
-    html = '$html<tr><td></td><td colspan="2"><pre>' +
-        HTML_ESCAPE.convert(testCase.stackTrace.toString()) +
-        '</pre></td></tr>';
-  }
-
-  return html;
-}
-
-class HtmlConfiguration extends SimpleConfiguration {
-  /// Whether this is run within dartium layout tests.
-  final bool _isLayoutTest;
-  HtmlConfiguration(this._isLayoutTest);
-
-  StreamSubscription<Event> _onErrorSubscription;
-  StreamSubscription<Event> _onMessageSubscription;
-
-  void _installHandlers() {
-    if (_onErrorSubscription == null) {
-      _onErrorSubscription = window.onError.listen((e) {
-        // Some tests may expect this and have no way to suppress the error.
-        if (js.context['testExpectsGlobalError'] != true) {
-          handleExternalError(e, '(DOM callback has errors)');
-        }
-      });
-    }
-    if (_onMessageSubscription == null) {
-      _onMessageSubscription =
-          window.onMessage.listen((e) => processMessage(e));
-    }
-  }
-
-  void _uninstallHandlers() {
-    if (_onErrorSubscription != null) {
-      _onErrorSubscription.cancel();
-      _onErrorSubscription = null;
-    }
-    if (_onMessageSubscription != null) {
-      _onMessageSubscription.cancel();
-      _onMessageSubscription = null;
-    }
-  }
-
-  void processMessage(e) {
-    if ('unittest-suite-external-error' == e.data) {
-      handleExternalError('<unknown>', '(external error detected)');
-    }
-  }
-
-  void onInit() {
-    // For Dart internal tests, we want to turn off stack frame
-    // filtering, which we do with this meta-header.
-    MetaElement meta = querySelector('meta[name="dart.unittest"]');
-    filterStacks =
-        meta == null ? true : !meta.content.contains('full-stack-traces');
-    _installHandlers();
-    window.postMessage('unittest-suite-wait-for-done', '*');
-  }
-
-  void onStart() {
-    // If the URL has a #testFilter=testName then filter tests to that.
-    // This is used to make it easy to run a single test- but is only intended
-    // for interactive debugging scenarios.
-    var hash = window.location.hash;
-    if (hash != null && hash.length > 1) {
-      var params = hash.substring(1).split('&');
-      for (var param in params) {
-        var parts = param.split('=');
-        if (parts.length == 2 && parts[0] == 'testFilter') {
-          filterTests('^${parts[1]}');
-        }
-      }
-    }
-    super.onStart();
-  }
-
-  void onSummary(int passed, int failed, int errors, List<TestCase> results,
-      String uncaughtError) {
-    _showResultsInPage(
-        passed, failed, errors, results, _isLayoutTest, uncaughtError);
-  }
-
-  void onDone(bool success) {
-    _uninstallHandlers();
-    window.postMessage('unittest-suite-done', '*');
-  }
-}
-
-void useHtmlConfiguration([bool isLayoutTest = false]) {
-  unittestConfiguration = isLayoutTest ? _singletonLayout : _singletonNotLayout;
-}
-
-final _singletonLayout = new HtmlConfiguration(true);
-final _singletonNotLayout = new HtmlConfiguration(false);
diff --git a/unittest/lib/html_enhanced_config.dart b/unittest/lib/html_enhanced_config.dart
deleted file mode 100644
index 0178ccb..0000000
--- a/unittest/lib/html_enhanced_config.dart
+++ /dev/null
@@ -1,405 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// A simple unit test library for running tests in a browser.
-///
-/// Provides enhanced HTML output with collapsible group headers
-/// and other at-a-glance information about the test results.
-library unittest.html_enhanced_config;
-
-import 'dart:collection' show LinkedHashMap;
-import 'dart:convert';
-import 'dart:html';
-import 'unittest.dart';
-
-class HtmlEnhancedConfiguration extends SimpleConfiguration {
-  /// Whether this is run within dartium layout tests.
-  final bool _isLayoutTest;
-  HtmlEnhancedConfiguration(this._isLayoutTest);
-
-  var _onErrorSubscription = null;
-  var _onMessageSubscription = null;
-
-  void _installOnErrorHandler() {
-    if (_onErrorSubscription == null) {
-      // Listen for uncaught errors.
-      _onErrorSubscription = window.onError
-          .listen((e) => handleExternalError(e, '(DOM callback has errors)'));
-    }
-  }
-
-  void _installOnMessageHandler() {
-    if (_onMessageSubscription == null) {
-      // Listen for errors from JS.
-      _onMessageSubscription =
-          window.onMessage.listen((e) => processMessage(e));
-    }
-  }
-
-  void _installHandlers() {
-    _installOnErrorHandler();
-    _installOnMessageHandler();
-  }
-
-  void _uninstallHandlers() {
-    if (_onErrorSubscription != null) {
-      _onErrorSubscription.cancel();
-      _onErrorSubscription = null;
-    }
-    if (_onMessageSubscription != null) {
-      _onMessageSubscription.cancel();
-      _onMessageSubscription = null;
-    }
-  }
-
-  void processMessage(e) {
-    if ('unittest-suite-external-error' == e.data) {
-      handleExternalError('<unknown>', '(external error detected)');
-    }
-  }
-
-  void onInit() {
-    _installHandlers();
-    //initialize and load CSS
-    final String _CSSID = '_unittestcss_';
-
-    var cssElement = document.head.querySelector('#${_CSSID}');
-    if (cssElement == null) {
-      cssElement = new StyleElement();
-      cssElement.id = _CSSID;
-      document.head.append(cssElement);
-    }
-
-    cssElement.text = _htmlTestCSS;
-    window.postMessage('unittest-suite-wait-for-done', '*');
-  }
-
-  void onStart() {
-    // Listen for uncaught errors.
-    _installOnErrorHandler();
-  }
-
-  void onSummary(int passed, int failed, int errors, List<TestCase> results,
-      String uncaughtError) {
-    _showInteractiveResultsInPage(
-        passed, failed, errors, results, _isLayoutTest, uncaughtError);
-  }
-
-  void onDone(bool success) {
-    _uninstallHandlers();
-    window.postMessage('unittest-suite-done', '*');
-  }
-
-  void _showInteractiveResultsInPage(int passed, int failed, int errors,
-      List<TestCase> results, bool isLayoutTest, String uncaughtError) {
-    if (isLayoutTest && passed == results.length) {
-      document.body.innerHtml = "PASS";
-    } else {
-      // changed the StringBuffer to an Element fragment
-      Element te = new Element.html('<div class="unittest-table"></div>');
-
-      te.children.add(new Element.html(passed == results.length
-          ? "<div class='unittest-overall unittest-pass'>PASS</div>"
-          : "<div class='unittest-overall unittest-fail'>FAIL</div>"));
-
-      // moved summary to the top since web browsers
-      // don't auto-scroll to the bottom like consoles typically do.
-      if (passed == results.length && uncaughtError == null) {
-        te.children.add(new Element.html("""
-          <div class='unittest-pass'>All ${passed} tests passed</div>"""));
-      } else {
-        if (uncaughtError != null) {
-          te.children.add(new Element.html("""
-            <div class='unittest-summary'>
-              <span class='unittest-error'>Uncaught error: $uncaughtError</span>
-            </div>"""));
-        }
-
-        te.children.add(new Element.html("""
-          <div class='unittest-summary'>
-            <span class='unittest-pass'>Total ${passed} passed</span>,
-            <span class='unittest-fail'>${failed} failed</span>,
-            <span class='unittest-error'>
-            ${errors + (uncaughtError == null ? 0 : 1)} errors</span>
-          </div>"""));
-      }
-
-      te.children.add(new Element.html("""
-        <div><button id='btnCollapseAll'>Collapse All</button></div>
-       """));
-
-      // handle the click event for the collapse all button
-      te.querySelector('#btnCollapseAll').onClick.listen((_) {
-        document
-            .querySelectorAll('.unittest-row')
-            .forEach((el) => el.attributes['class'] = el.attributes['class']
-                .replaceAll('unittest-row ', 'unittest-row-hidden '));
-      });
-
-      var previousGroup = '';
-      var groupPassFail = true;
-
-      // order by group and sort numerically within each group
-      var groupedBy = new LinkedHashMap<String, List<TestCase>>();
-
-      for (final t in results) {
-        if (!groupedBy.containsKey(t.currentGroup)) {
-          groupedBy[t.currentGroup] = new List<TestCase>();
-        }
-
-        groupedBy[t.currentGroup].add(t);
-      }
-
-      // flatten the list again with tests ordered
-      List<TestCase> flattened = new List<TestCase>();
-
-      groupedBy.values.forEach((tList) {
-        tList.sort((tcA, tcB) => tcA.id - tcB.id);
-        flattened.addAll(tList);
-      });
-
-      var nonAlphanumeric = new RegExp('[^a-z0-9A-Z]');
-
-      // output group headers and test rows
-      for (final test_ in flattened) {
-
-        // replace everything but numbers and letters from the group name with
-        // '_' so we can use in id and class properties.
-        var safeGroup = test_.currentGroup.replaceAll(nonAlphanumeric, '_');
-
-        if (test_.currentGroup != previousGroup) {
-          previousGroup = test_.currentGroup;
-
-          var testsInGroup = results
-              .where((TestCase t) => t.currentGroup == previousGroup)
-              .toList();
-          var groupTotalTestCount = testsInGroup.length;
-          var groupTestPassedCount =
-              testsInGroup.where((TestCase t) => t.result == 'pass').length;
-          groupPassFail = groupTotalTestCount == groupTestPassedCount;
-          var passFailClass = "unittest-group-status unittest-group-"
-              "status-${groupPassFail ? 'pass' : 'fail'}";
-
-          te.children.add(new Element.html("""
-            <div>
-              <div id='${safeGroup}'
-                   class='unittest-group ${safeGroup} test${safeGroup}'>
-                <div ${_isIE ? "style='display:inline-block' ": ""}
-                     class='unittest-row-status'>
-                  <div class='$passFailClass'></div>
-                </div>
-                <div ${_isIE ? "style='display:inline-block' ": ""}>
-                    ${test_.currentGroup}</div>
-                &nbsp;
-                <div ${_isIE ? "style='display:inline-block' ": ""}>
-                    (${groupTestPassedCount}/${groupTotalTestCount})</div>
-              </div>
-            </div>"""));
-
-          // 'safeGroup' could be empty
-          var grp =
-              (safeGroup == '') ? null : te.querySelector('#${safeGroup}');
-          if (grp != null) {
-            grp.onClick.listen((_) {
-              var row = document.querySelector('.unittest-row-${safeGroup}');
-              if (row.attributes['class'].contains('unittest-row ')) {
-                document.querySelectorAll('.unittest-row-${safeGroup}').forEach(
-                    (e) => e.attributes['class'] = e.attributes['class']
-                        .replaceAll('unittest-row ', 'unittest-row-hidden '));
-              } else {
-                document.querySelectorAll('.unittest-row-${safeGroup}').forEach(
-                    (e) => e.attributes['class'] = e.attributes['class']
-                        .replaceAll('unittest-row-hidden', 'unittest-row'));
-              }
-            });
-          }
-        }
-
-        _buildRow(test_, te, safeGroup, !groupPassFail);
-      }
-
-      document.body.children.clear();
-      document.body.children.add(te);
-    }
-  }
-
-  void _buildRow(TestCase test_, Element te, String groupID, bool isVisible) {
-    var background = 'unittest-row-${test_.id % 2 == 0 ? "even" : "odd"}';
-    var display = '${isVisible ? "unittest-row" : "unittest-row-hidden"}';
-
-    addRowElement(id, status, description) {
-      te.children.add(new Element.html(''' <div>
-                <div class='$display unittest-row-${groupID} $background'>
-                  <div ${_isIE ? "style='display:inline-block' ": ""}
-                       class='unittest-row-id'>$id</div>
-                  <div ${_isIE ? "style='display:inline-block' ": ""}
-                       class="unittest-row-status unittest-${test_.result}">
-                       $status</div>
-                  <div ${_isIE ? "style='display:inline-block' ": ""}
-                       class='unittest-row-description'>$description</div>
-                </div>
-              </div>'''));
-    }
-
-    if (!test_.isComplete) {
-      addRowElement('${test_.id}', 'NO STATUS', 'Test did not complete.');
-      return;
-    }
-
-    addRowElement('${test_.id}', '${test_.result.toUpperCase()}',
-        '${test_.description}. ${HTML_ESCAPE.convert(test_.message)}');
-
-    if (test_.stackTrace != null) {
-      addRowElement('', '',
-          '<pre>${HTML_ESCAPE.convert(test_.stackTrace.toString())}</pre>');
-    }
-  }
-
-  static bool get _isIE => window.navigator.userAgent.contains('MSIE');
-
-  String get _htmlTestCSS => '''
-  body{
-    font-size: 14px;
-    font-family: 'Open Sans', 'Lucida Sans Unicode', 'Lucida Grande','''
-      ''' sans-serif;
-    background: WhiteSmoke;
-  }
-
-  .unittest-group
-  {
-    background: rgb(75,75,75);
-    width:98%;
-    color: WhiteSmoke;
-    font-weight: bold;
-    padding: 6px;
-    cursor: pointer;
-
-    /* Provide some visual separation between groups for IE */
-    ${_isIE ? "border-bottom:solid black 1px;": ""}
-    ${_isIE ? "border-top:solid #777777 1px;": ""}
-
-    background-image: -webkit-linear-gradient(bottom, rgb(50,50,50) 0%, '''
-      '''rgb(100,100,100) 100%);
-    background-image: -moz-linear-gradient(bottom, rgb(50,50,50) 0%, '''
-      '''rgb(100,100,100) 100%);
-    background-image: -ms-linear-gradient(bottom, rgb(50,50,50) 0%, '''
-      '''rgb(100,100,100) 100%);
-    background-image: linear-gradient(bottom, rgb(50,50,50) 0%, '''
-      '''rgb(100,100,100) 100%);
-
-    display: -webkit-box;
-    display: -moz-box;
-    display: -ms-box;
-    display: box;
-
-    -webkit-box-orient: horizontal;
-    -moz-box-orient: horizontal;
-    -ms-box-orient: horizontal;
-    box-orient: horizontal;
-
-    -webkit-box-align: center;
-    -moz-box-align: center;
-    -ms-box-align: center;
-    box-align: center;
-   }
-
-  .unittest-group-status
-  {
-    width: 20px;
-    height: 20px;
-    border-radius: 20px;
-    margin-left: 10px;
-  }
-
-  .unittest-group-status-pass{
-    background: Green;
-    background: '''
-      '''-webkit-radial-gradient(center, ellipse cover, #AAFFAA 0%,Green 100%);
-    background: '''
-      '''-moz-radial-gradient(center, ellipse cover, #AAFFAA 0%,Green 100%);
-    background: '''
-      '''-ms-radial-gradient(center, ellipse cover, #AAFFAA 0%,Green 100%);
-    background: '''
-      '''radial-gradient(center, ellipse cover, #AAFFAA 0%,Green 100%);
-  }
-
-  .unittest-group-status-fail{
-    background: Red;
-    background: '''
-      '''-webkit-radial-gradient(center, ellipse cover, #FFAAAA 0%,Red 100%);
-    background: '''
-      '''-moz-radial-gradient(center, ellipse cover, #FFAAAA 0%,Red 100%);
-    background: '''
-      '''-ms-radial-gradient(center, ellipse cover, #AAFFAA 0%,Green 100%);
-    background: radial-gradient(center, ellipse cover, #FFAAAA 0%,Red 100%);
-  }
-
-  .unittest-overall{
-    font-size: 20px;
-  }
-
-  .unittest-summary{
-    font-size: 18px;
-  }
-
-  .unittest-pass{
-    color: Green;
-  }
-
-  .unittest-fail, .unittest-error
-  {
-    color: Red;
-  }
-
-  .unittest-row
-  {
-    display: -webkit-box;
-    display: -moz-box;
-    display: -ms-box;
-    display: box;
-    -webkit-box-orient: horizontal;
-    -moz-box-orient: horizontal;
-    -ms-box-orient: horizontal;
-    box-orient: horizontal;
-    width: 100%;
-  }
-
-  .unittest-row-hidden
-  {
-    display: none;
-  }
-
-  .unittest-row-odd
-  {
-    background: WhiteSmoke;
-  }
-
-  .unittest-row-even
-  {
-    background: #E5E5E5;
-  }
-
-  .unittest-row-id
-  {
-    width: 3em;
-  }
-
-  .unittest-row-status
-  {
-    width: 4em;
-  }
-
-  .unittest-row-description
-  {
-  }
-
-  ''';
-}
-
-void useHtmlEnhancedConfiguration([bool isLayoutTest = false]) {
-  unittestConfiguration = isLayoutTest ? _singletonLayout : _singletonNotLayout;
-}
-
-final _singletonLayout = new HtmlEnhancedConfiguration(true);
-final _singletonNotLayout = new HtmlEnhancedConfiguration(false);
diff --git a/unittest/lib/html_individual_config.dart b/unittest/lib/html_individual_config.dart
deleted file mode 100644
index b9ec4e6..0000000
--- a/unittest/lib/html_individual_config.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// A unit test library for running groups of tests in a browser, instead of the
-/// entire test file. This is especially used for large tests files that have
-/// many subtests, so we can mark groups as failing at a finer granularity than
-/// the entire test file.
-///
-/// To use, import this file, and call [useHtmlIndividualConfiguration] at the
-/// start of your set sequence. Important constraint: your group descriptions
-/// MUST NOT contain spaces.
-library unittest.html_individual_config;
-
-import 'dart:html';
-import 'unittest.dart' as unittest;
-import 'html_config.dart' as htmlconfig;
-
-class HtmlIndividualConfiguration extends htmlconfig.HtmlConfiguration {
-  HtmlIndividualConfiguration(bool isLayoutTest) : super(isLayoutTest);
-
-  void onStart() {
-    var uri = Uri.parse(window.location.href);
-
-    var groups = 'group='.allMatches(uri.query).toList();
-
-    if (groups.length > 1) {
-      throw new ArgumentError('More than one "group" parameter provided.');
-    }
-
-    var testGroupName = uri.queryParameters['group'];
-
-    if (testGroupName != null) {
-      var startsWith = "$testGroupName${unittest.groupSep}";
-      unittest.filterTests(
-          (unittest.TestCase tc) => tc.description.startsWith(startsWith));
-    }
-    super.onStart();
-  }
-}
-
-void useHtmlIndividualConfiguration([bool isLayoutTest = false]) {
-  unittest.unittestConfiguration =
-      isLayoutTest ? _singletonLayout : _singletonNotLayout;
-}
-
-final _singletonLayout = new HtmlIndividualConfiguration(true);
-final _singletonNotLayout = new HtmlIndividualConfiguration(false);
diff --git a/unittest/lib/src/configuration.dart b/unittest/lib/src/configuration.dart
deleted file mode 100644
index 1aef043..0000000
--- a/unittest/lib/src/configuration.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.configuration;
-
-import 'simple_configuration.dart';
-import 'test_case.dart';
-
-/// Describes the interface used by the unit test system for communicating the
-/// results of a test run.
-abstract class Configuration {
-  /// Creates an instance of [SimpleConfiguration].
-  factory Configuration() => new SimpleConfiguration();
-
-  /// Creates an [Configuration] instances that does nothing.
-  ///
-  /// For use by subclasses which wish to implement only a subset of features.
-  Configuration.blank();
-
-  /// If `true`, tests are started automatically once they're finished being defined.
-  ///
-  /// Otherwise, [runTests] must be called explicitly after tests are set up.
-  final autoStart = true;
-
-  /// How long a [TestCase] can run before it is considered an error.
-  /// A [timeout] value of [:null:] means that the limit is infinite.
-  Duration timeout = const Duration(minutes: 2);
-
-  /// Called as soon as the unittest framework becomes initialized.
-  ///
-  /// This is done even before tests are added to the test framework. It might
-  /// be used to determine/debug errors that occur before the test harness
-  /// starts executing. It is also used to tell the vm or browser that tests are
-  /// going to be run asynchronously and that the process should wait until they
-  /// are done.
-  void onInit() {}
-
-  /// Called as soon as the unittest framework starts running.
-  void onStart() {}
-
-  /// Called when each test starts. Useful to show intermediate progress on
-  /// a test suite.
-  void onTestStart(TestCase testCase) {}
-
-  /// Called when each test is first completed. Useful to show intermediate
-  /// progress on a test suite.
-  void onTestResult(TestCase testCase) {}
-
-  /// Called when an already completed test changes state. For example: a test
-  /// that was marked as passing may later be marked as being in error because
-  /// it still had callbacks being invoked.
-  void onTestResultChanged(TestCase testCase) {}
-
-  /// Handles the logging of messages by a test case.
-  void onLogMessage(TestCase testCase, String message) {}
-
-  /// Called when the unittest framework is done running. [success] indicates
-  /// whether all tests passed successfully.
-  void onDone(bool success) {}
-
-  /// Called with the result of all test cases. Browser tests commonly override
-  /// this to reformat the output.
-  ///
-  /// When [uncaughtError] is not null, it contains an error that occured outside
-  /// of tests (e.g. setting up the test).
-  void onSummary(int passed, int failed, int errors, List<TestCase> results,
-      String uncaughtError) {}
-}
diff --git a/unittest/lib/src/expected_function.dart b/unittest/lib/src/expected_function.dart
deleted file mode 100644
index 5a92d14..0000000
--- a/unittest/lib/src/expected_function.dart
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.expected_function;
-
-import '../unittest.dart';
-
-import 'internal_test_case.dart';
-
-/// An object used to detect unpassed arguments.
-const _PLACEHOLDER = const Object();
-
-// Functions used to check how many arguments a callback takes.
-typedef _Func0();
-typedef _Func1(a);
-typedef _Func2(a, b);
-typedef _Func3(a, b, c);
-typedef _Func4(a, b, c, d);
-typedef _Func5(a, b, c, d, e);
-typedef _Func6(a, b, c, d, e, f);
-
-typedef bool _IsDoneCallback();
-
-/// A wrapper for a function that ensures that it's called the appropriate
-/// number of times.
-///
-/// The containing test won't be considered to have completed successfully until
-/// this function has been called the appropriate number of times.
-///
-/// The wrapper function is accessible via [func]. It supports up to six
-/// optional and/or required positional arguments, but no named arguments.
-class ExpectedFunction<T> {
-  /// The wrapped callback.
-  final Function _callback;
-
-  /// The minimum number of calls that are expected to be made to the function.
-  ///
-  /// If fewer calls than this are made, the test will fail.
-  final int _minExpectedCalls;
-
-  /// The maximum number of calls that are expected to be made to the function.
-  ///
-  /// If more calls than this are made, the test will fail.
-  final int _maxExpectedCalls;
-
-  /// A callback that should return whether the function is not expected to have
-  /// any more calls.
-  ///
-  /// This will be called after every time the function is run. The test case
-  /// won't be allowed to terminate until it returns `true`.
-  ///
-  /// This may be `null`. If so, the function is considered to be done after
-  /// it's been run once.
-  final _IsDoneCallback _isDone;
-
-  /// A descriptive name for the function.
-  final String _id;
-
-  /// An optional description of why the function is expected to be called.
-  ///
-  /// If not passed, this will be an empty string.
-  final String _reason;
-
-  /// The number of times the function has been called.
-  int _actualCalls = 0;
-
-  /// The test case in which this function was wrapped.
-  final InternalTestCase _testCase;
-
-  /// Whether this function has been called the requisite number of times.
-  bool _complete;
-
-  /// Wraps [callback] in a function that asserts that it's called at least
-  /// [minExpected] times and no more than [maxExpected] times.
-  ///
-  /// If passed, [id] is used as a descriptive name fo the function and [reason]
-  /// as a reason it's expected to be called. If [isDone] is passed, the test
-  /// won't be allowed to complete until it returns `true`.
-  ExpectedFunction(Function callback, int minExpected, int maxExpected,
-      {String id, String reason, bool isDone()})
-      : this._callback = callback,
-        _minExpectedCalls = minExpected,
-        _maxExpectedCalls = (maxExpected == 0 && minExpected > 0)
-            ? minExpected
-            : maxExpected,
-        this._isDone = isDone,
-        this._reason = reason == null ? '' : '\n$reason',
-        this._testCase = currentTestCase as InternalTestCase,
-        this._id = _makeCallbackId(id, callback) {
-    ensureInitialized();
-    if (_testCase == null) {
-      throw new StateError("No valid test. Did you forget to run your test "
-          "inside a call to test()?");
-    }
-
-    if (isDone != null || minExpected > 0) {
-      _testCase.callbackFunctionsOutstanding++;
-      _complete = false;
-    } else {
-      _complete = true;
-    }
-  }
-
-  /// Tries to find a reasonable name for [callback].
-  ///
-  /// If [id] is passed, uses that. Otherwise, tries to determine a name from
-  /// calling `toString`. If no name can be found, returns the empty string.
-  static String _makeCallbackId(String id, Function callback) {
-    if (id != null) return "$id ";
-
-    // If the callback is not an anonymous closure, try to get the
-    // name.
-    var toString = callback.toString();
-    var prefix = "Function '";
-    var start = toString.indexOf(prefix);
-    if (start == -1) return '';
-
-    start += prefix.length;
-    var end = toString.indexOf("'", start);
-    if (end == -1) return '';
-    return "${toString.substring(start, end)} ";
-  }
-
-  /// Returns a function that has the same number of positional arguments as the
-  /// wrapped function (up to a total of 6).
-  Function get func {
-    if (_callback is _Func6) return max6;
-    if (_callback is _Func5) return max5;
-    if (_callback is _Func4) return max4;
-    if (_callback is _Func3) return max3;
-    if (_callback is _Func2) return max2;
-    if (_callback is _Func1) return max1;
-    if (_callback is _Func0) return max0;
-
-    throw new ArgumentError(
-        'The wrapped function has more than 6 required arguments');
-  }
-
-  T max0() => max6();
-
-  // This indirection is critical. It ensures the returned function has an
-  // argument count of zero.
-  T max1([Object a0 = _PLACEHOLDER]) => max6(a0);
-
-  T max2([Object a0 = _PLACEHOLDER, Object a1 = _PLACEHOLDER]) => max6(a0, a1);
-
-  T max3(
-          [Object a0 = _PLACEHOLDER, 
-          Object a1 = _PLACEHOLDER, 
-          Object a2 = _PLACEHOLDER]) =>  
-      max6(a0, a1, a2);
-
-  T max4(
-          [Object a0 = _PLACEHOLDER,
-          Object a1 = _PLACEHOLDER,
-          Object a2 = _PLACEHOLDER,
-          Object a3 = _PLACEHOLDER]) =>
-      max6(a0, a1, a2, a3);
-
-  T max5(
-          [Object a0 = _PLACEHOLDER,
-          Object a1 = _PLACEHOLDER,
-          Object a2 = _PLACEHOLDER,
-          Object a3 = _PLACEHOLDER,
-          Object a4 = _PLACEHOLDER]) =>
-      max6(a0, a1, a2, a3, a4);
-
-  T max6(
-          [Object a0 = _PLACEHOLDER,
-          Object a1 = _PLACEHOLDER,
-          Object a2 = _PLACEHOLDER,
-          Object a3 = _PLACEHOLDER,
-          Object a4 = _PLACEHOLDER,
-          Object a5 = _PLACEHOLDER]) =>
-      _run([a0, a1, a2, a3, a4, a5].where((a) => a != _PLACEHOLDER));
-
-  /// Runs the wrapped function with [args] and returns its return value.
-  ///
-  /// This will pass any errors on to [_testCase] and return `null`.
-  T _run(Iterable args) {
-    try {
-      _actualCalls++;
-      if (_testCase.isComplete) {
-        // Don't run the callback if the test is done. We don't throw here as
-        // this is not the current test, but we do mark the old test as having
-        // an error if it previously passed.
-        if (_testCase.result == PASS) {
-          _testCase.error(
-              'Callback ${_id}called ($_actualCalls) after test case '
-              '${_testCase.description} had already been marked as '
-              '${_testCase.result}.$_reason');
-        }
-        return null;
-      } else if (_maxExpectedCalls >= 0 && _actualCalls > _maxExpectedCalls) {
-        throw new TestFailure('Callback ${_id}called more times than expected '
-            '($_maxExpectedCalls).$_reason');
-      }
-
-      return Function.apply(_callback, args.toList()) as T;
-    } catch (error, stackTrace) {
-      _testCase.registerException(error, stackTrace);
-      return null;
-    } finally {
-      _afterRun();
-    }
-  }
-
-  /// After each time the function is run, check to see if it's complete.
-  void _afterRun() {
-    if (_complete) return;
-    if (_minExpectedCalls > 0 && _actualCalls < _minExpectedCalls) return;
-    if (_isDone != null && !_isDone()) return;
-
-    // Mark this callback as complete and remove it from the test case's
-    // oustanding callback count; if that hits zero the test is done.
-    _complete = true;
-    _testCase.markCallbackComplete();
-  }
-}
diff --git a/unittest/lib/src/group_context.dart b/unittest/lib/src/group_context.dart
deleted file mode 100644
index 78f347b..0000000
--- a/unittest/lib/src/group_context.dart
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.group_context;
-
-import 'dart:async';
-
-import '../unittest.dart';
-
-/// Setup and teardown functions for a group and its parents, the latter
-/// for chaining.
-class GroupContext {
-  /// The parent context, or `null`.
-  final GroupContext parent;
-
-  /// Whether this is the root context.
-  bool get isRoot => parent == null;
-
-  /// Description text of the current test group.
-  final String _name;
-
-  /// The set-up function called before each test in a group.
-  Function get testSetUp => _testSetUp;
-  Function _testSetUp;
-
-  set testSetUp(Function setUp) {
-    if (parent == null || parent.testSetUp == null) {
-      _testSetUp = setUp;
-      return;
-    }
-
-    _testSetUp = () {
-      var f = parent.testSetUp();
-      if (f is Future) {
-        return f.then((_) => setUp());
-      } else {
-        return setUp();
-      }
-    };
-  }
-
-  /// The tear-down function called after each test in a group.
-  Function get testTearDown => _testTearDown;
-  Function _testTearDown;
-
-  set testTearDown(Function tearDown) {
-    if (parent == null || parent.testTearDown == null) {
-      _testTearDown = tearDown;
-      return;
-    }
-
-    _testTearDown = () {
-      var f = tearDown();
-      if (f is Future) {
-        return f.then((_) => parent.testTearDown());
-      } else {
-        return parent.testTearDown();
-      }
-    };
-  }
-
-  /// Returns the fully-qualified name of this context.
-  String get fullName =>
-      (isRoot || parent.isRoot) ? _name : "${parent.fullName}$groupSep$_name";
-
-  GroupContext.root()
-      : parent = null,
-        _name = '';
-
-  GroupContext(this.parent, this._name) {
-    _testSetUp = parent.testSetUp;
-    _testTearDown = parent.testTearDown;
-  }
-}
diff --git a/unittest/lib/src/internal_test_case.dart b/unittest/lib/src/internal_test_case.dart
deleted file mode 100644
index 9763666..0000000
--- a/unittest/lib/src/internal_test_case.dart
+++ /dev/null
@@ -1,227 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.internal_test_case;
-
-import 'dart:async';
-
-import '../unittest.dart';
-import 'test_environment.dart';
-import 'utils.dart';
-
-/// An implementation of [TestCase] that exposes internal properties for other
-/// unittest use.
-class InternalTestCase implements TestCase {
-  final int id;
-  final String description;
-
-  /// The setup function to call before the test, if any.
-  Function _setUp;
-
-  /// The teardown function to call after the test, if any.
-  Function _tearDown;
-
-  /// The body of the test case.
-  TestFunction _testFunction;
-
-  /// Remaining number of callback functions that must reach a 'done' state
-  /// before the test completes.
-  int callbackFunctionsOutstanding = 0;
-
-  /// The error or failure message for the tests.
-  ///
-  /// Initially an empty string.
-  String message = '';
-
-  /// The result of the test case.
-  ///
-  /// If the test case has is completed, this will be one of [PASS], [FAIL], or
-  /// [ERROR]. Otherwise, it will be `null`.
-  String result;
-
-  /// Returns whether this test case passed.
-  bool get passed => result == PASS;
-
-  /// The stack trace for the error that caused this test case to fail, or
-  /// `null` if it succeeded.
-  StackTrace stackTrace;
-
-  /// The name of the group within which this test is running.
-  final String currentGroup;
-
-  /// The time the test case started running.
-  ///
-  /// `null` if the test hasn't yet begun running.
-  DateTime get startTime => _startTime;
-  DateTime _startTime;
-
-  /// The amount of time the test case took.
-  ///
-  /// `null` if the test hasn't finished running.
-  Duration get runningTime => _runningTime;
-  Duration _runningTime;
-
-  /// Whether this test is enabled.
-  ///
-  /// Disabled tests won't be run.
-  bool enabled = true;
-
-  /// A completer that will complete when the test is finished.
-  ///
-  /// This is only non-`null` when outstanding callbacks exist.
-  Completer _testComplete;
-
-  /// Whether this test case has finished running.
-  bool get isComplete => !enabled || result != null;
-
-  InternalTestCase(this.id, this.description, this._testFunction)
-      : currentGroup = environment.currentContext.fullName,
-        _setUp = environment.currentContext.testSetUp,
-        _tearDown = environment.currentContext.testTearDown;
-
-  /// A function that returns another function to handle errors from [Future]s.
-  ///
-  /// [stage] is a string description of the stage of testing that failed.
-  Function _errorHandler(String stage) => (e, stack) {
-    if (stack == null && e is Error) {
-      stack = e.stackTrace;
-    }
-    if (result == null || result == PASS) {
-      if (e is TestFailure) {
-        fail("$e", stack);
-      } else {
-        error("$stage failed: Caught $e", stack);
-      }
-    }
-  };
-
-  /// Performs any associated [_setUp] function and runs the test.
-  ///
-  /// Returns a [Future] that can be used to schedule the next test. If the test
-  /// runs to completion synchronously, or is disabled, null is returned, to
-  /// tell unittest to schedule the next test immediately.
-  Future run() {
-    if (!enabled) return new Future.value();
-
-    result = stackTrace = null;
-    message = '';
-
-    // Avoid calling [new Future] to avoid issue 11911.
-    return new Future.value().then((_) {
-      if (_setUp != null) return _setUp();
-    }).catchError(_errorHandler('Setup')).then((_) {
-      // Skip the test if setup failed.
-      if (result != null) return new Future.value();
-      config.onTestStart(this);
-      _startTime = new DateTime.now();
-      _runningTime = null;
-      callbackFunctionsOutstanding++;
-      var testReturn = _testFunction();
-      // If _testFunction() returned a future, we want to wait for it like we
-      // would a callback, so if a failure occurs while waiting, we can abort.
-      if (testReturn is Future) {
-        callbackFunctionsOutstanding++;
-        testReturn
-            .catchError(_errorHandler('Test'))
-            .whenComplete(markCallbackComplete);
-      }
-    }).catchError(_errorHandler('Test')).then((_) {
-      markCallbackComplete();
-      if (result == null) {
-        // Outstanding callbacks exist; we need to return a Future.
-        _testComplete = new Completer();
-        return _testComplete.future.whenComplete(() {
-          if (_tearDown != null) {
-            return _tearDown();
-          }
-        }).catchError(_errorHandler('Teardown'));
-      } else if (_tearDown != null) {
-        return _tearDown();
-      }
-    }).catchError(_errorHandler('Teardown')).whenComplete(() {
-      _setUp = null;
-      _tearDown = null;
-      _testFunction = null;
-    });
-  }
-
-  /// Marks the test as having completed with [testResult], which should be one
-  /// of [PASS], [FAIL], or [ERROR].
-  void _complete(String testResult,
-      [String messageText = '', StackTrace stack]) {
-    if (runningTime == null) {
-      // The startTime can be `null` if an error happened during setup. In this
-      // case we simply report a running time of 0.
-      if (startTime != null) {
-        _runningTime = new DateTime.now().difference(startTime);
-      } else {
-        _runningTime = const Duration(seconds: 0);
-      }
-    }
-    _setResult(testResult, messageText, stack);
-    if (_testComplete != null) {
-      var t = _testComplete;
-      _testComplete = null;
-      t.complete(this);
-    }
-  }
-
-  // Sets [this]'s fields to reflect the test result, and notifies the current
-  // configuration that the test has completed.
-  //
-  // Returns true if this is the first time the result has been set.
-  void _setResult(String testResult, String messageText, StackTrace stack) {
-    message = messageText;
-    stackTrace = getTrace(stack, formatStacks, filterStacks);
-    if (stackTrace == null) stackTrace = stack;
-    if (result == null) {
-      result = testResult;
-      config.onTestResult(this);
-    } else {
-      result = testResult;
-      config.onTestResultChanged(this);
-    }
-  }
-
-  /// Marks the test as having passed.
-  void pass() {
-    _complete(PASS);
-  }
-
-  void registerException(error, [StackTrace stackTrace]) {
-    var message = error is TestFailure ? error.message : 'Caught $error';
-    if (result == null) {
-      fail(message, stackTrace);
-    } else {
-      this.error(message, stackTrace);
-    }
-  }
-
-  /// Marks the test as having failed.
-  void fail(String messageText, [StackTrace stack]) {
-    if (result != null) {
-      var newMessage = result == PASS
-          ? 'Test failed after initially passing: $messageText'
-          : 'Test failed more than once: $messageText';
-      // TODO(gram): Should we combine the stack with the old one?
-      _complete(ERROR, newMessage, stack);
-    } else {
-      _complete(FAIL, messageText, stack);
-    }
-  }
-
-  /// Marks the test as having had an unexpected error.
-  void error(String messageText, [StackTrace stack]) {
-    _complete(ERROR, messageText, stack);
-  }
-
-  /// Indicates that an asynchronous callback has completed, and marks the test
-  /// as passing if all outstanding callbacks are complete.
-  void markCallbackComplete() {
-    callbackFunctionsOutstanding--;
-    if (callbackFunctionsOutstanding == 0 && !isComplete) pass();
-  }
-
-  String toString() => result != null ? "$description: $result" : description;
-}
diff --git a/unittest/lib/src/matcher.dart b/unittest/lib/src/matcher.dart
deleted file mode 100644
index cfd5857..0000000
--- a/unittest/lib/src/matcher.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Support for specifying test expectations, such as for unit tests.
-library unittest.matcher;
-
-export 'matcher/core_matchers.dart';
-export 'matcher/description.dart';
-export 'matcher/error_matchers.dart';
-export 'matcher/expect.dart';
-export 'matcher/future_matchers.dart';
-export 'matcher/interfaces.dart';
-export 'matcher/iterable_matchers.dart';
-export 'matcher/map_matchers.dart';
-export 'matcher/numeric_matchers.dart';
-export 'matcher/operator_matchers.dart';
-export 'matcher/prints_matcher.dart';
-export 'matcher/string_matchers.dart';
-export 'matcher/throws_matcher.dart';
-export 'matcher/throws_matchers.dart';
-export 'matcher/util.dart';
diff --git a/unittest/lib/src/matcher/core_matchers.dart b/unittest/lib/src/matcher/core_matchers.dart
deleted file mode 100644
index dbba367..0000000
--- a/unittest/lib/src/matcher/core_matchers.dart
+++ /dev/null
@@ -1,645 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.core_matchers;
-
-import 'description.dart';
-import 'interfaces.dart';
-import 'util.dart';
-
-/// Returns a matcher that matches the isEmpty property.
-const Matcher isEmpty = const _Empty();
-
-class _Empty extends Matcher {
-  const _Empty();
-
-  bool matches(item, Map matchState) => item.isEmpty;
-
-  Description describe(Description description) => description.add('empty');
-}
-
-/// Returns a matcher that matches the isNotEmpty property.
-const Matcher isNotEmpty = const _NotEmpty();
-
-class _NotEmpty extends Matcher {
-  const _NotEmpty();
-
-  bool matches(item, Map matchState) => item.isNotEmpty;
-
-  Description describe(Description description) => description.add('non-empty');
-}
-
-/// A matcher that matches any null value.
-const Matcher isNull = const _IsNull();
-
-/// A matcher that matches any non-null value.
-const Matcher isNotNull = const _IsNotNull();
-
-class _IsNull extends Matcher {
-  const _IsNull();
-  bool matches(item, Map matchState) => item == null;
-  Description describe(Description description) => description.add('null');
-}
-
-class _IsNotNull extends Matcher {
-  const _IsNotNull();
-  bool matches(item, Map matchState) => item != null;
-  Description describe(Description description) => description.add('not null');
-}
-
-/// A matcher that matches the Boolean value true.
-const Matcher isTrue = const _IsTrue();
-
-/// A matcher that matches anything except the Boolean value true.
-const Matcher isFalse = const _IsFalse();
-
-class _IsTrue extends Matcher {
-  const _IsTrue();
-  bool matches(item, Map matchState) => item == true;
-  Description describe(Description description) => description.add('true');
-}
-
-class _IsFalse extends Matcher {
-  const _IsFalse();
-  bool matches(item, Map matchState) => item == false;
-  Description describe(Description description) => description.add('false');
-}
-
-/// A matcher that matches the numeric value NaN.
-const Matcher isNaN = const _IsNaN();
-
-/// A matcher that matches any non-NaN value.
-const Matcher isNotNaN = const _IsNotNaN();
-
-class _IsNaN extends Matcher {
-  const _IsNaN();
-  bool matches(item, Map matchState) => double.NAN.compareTo(item) == 0;
-  Description describe(Description description) => description.add('NaN');
-}
-
-class _IsNotNaN extends Matcher {
-  const _IsNotNaN();
-  bool matches(item, Map matchState) => double.NAN.compareTo(item) != 0;
-  Description describe(Description description) => description.add('not NaN');
-}
-
-/// Returns a matches that matches if the value is the same instance
-/// as [expected], using [identical].
-Matcher same(expected) => new _IsSameAs(expected);
-
-class _IsSameAs extends Matcher {
-  final _expected;
-  const _IsSameAs(this._expected);
-  bool matches(item, Map matchState) => identical(item, _expected);
-  // If all types were hashable we could show a hash here.
-  Description describe(Description description) =>
-      description.add('same instance as ').addDescriptionOf(_expected);
-}
-
-/// Returns a matcher that matches if the value is structurally equal to
-/// [expected].
-///
-/// If [expected] is a [Matcher], then it matches using that. Otherwise it tests
-/// for equality using `==` on the expected value.
-///
-/// For [Iterable]s and [Map]s, this will recursively match the elements. To
-/// handle cyclic structures a recursion depth [limit] can be provided. The
-/// default limit is 100. [Set]s will be compared order-independently.
-Matcher equals(expected, [int limit = 100]) => expected is String
-    ? new _StringEqualsMatcher(expected)
-    : new _DeepMatcher(expected, limit);
-
-class _DeepMatcher extends Matcher {
-  final _expected;
-  final int _limit;
-  var count;
-
-  _DeepMatcher(this._expected, [int limit = 1000]) : this._limit = limit;
-
-  // Returns a pair (reason, location)
-  List _compareIterables(expected, actual, matcher, depth, location) {
-    if (actual is! Iterable) return ['is not Iterable', location];
-
-    var expectedIterator = expected.iterator;
-    var actualIterator = actual.iterator;
-    for (var index = 0; ; index++) {
-      // Advance in lockstep.
-      var expectedNext = expectedIterator.moveNext();
-      var actualNext = actualIterator.moveNext();
-
-      // If we reached the end of both, we succeeded.
-      if (!expectedNext && !actualNext) return null;
-
-      // Fail if their lengths are different.
-      var newLocation = '${location}[${index}]';
-      if (!expectedNext) return ['longer than expected', newLocation];
-      if (!actualNext) return ['shorter than expected', newLocation];
-
-      // Match the elements.
-      var rp = matcher(
-          expectedIterator.current, actualIterator.current, newLocation, depth);
-      if (rp != null) return rp;
-    }
-  }
-
-  List _compareSets(Set expected, actual, matcher, depth, location) {
-    if (actual is! Iterable) return ['is not Iterable', location];
-    actual = actual.toSet();
-
-    for (var expectedElement in expected) {
-      if (actual.every((actualElement) =>
-          matcher(expectedElement, actualElement, location, depth) != null)) {
-        return ['does not contain $expectedElement', location];
-      }
-    }
-
-    if (actual.length > expected.length) {
-      return ['larger than expected', location];
-    } else if (actual.length < expected.length) {
-      return ['smaller than expected', location];
-    } else {
-      return null;
-    }
-  }
-
-  List _recursiveMatch(expected, actual, String location, int depth) {
-    // If the expected value is a matcher, try to match it.
-    if (expected is Matcher) {
-      var matchState = {};
-      if (expected.matches(actual, matchState)) return null;
-
-      var description = new StringDescription();
-      expected.describe(description);
-      return ['does not match $description', location];
-    } else {
-      // Otherwise, test for equality.
-      try {
-        if (expected == actual) return null;
-      } catch (e) {
-        // TODO(gram): Add a test for this case.
-        return ['== threw "$e"', location];
-      }
-    }
-
-    if (depth > _limit) return ['recursion depth limit exceeded', location];
-
-    // If _limit is 1 we can only recurse one level into object.
-    if (depth == 0 || _limit > 1) {
-      if (expected is Set) {
-        return _compareSets(
-            expected, actual, _recursiveMatch, depth + 1, location);
-      } else if (expected is Iterable) {
-        return _compareIterables(
-            expected, actual, _recursiveMatch, depth + 1, location);
-      } else if (expected is Map) {
-        if (actual is! Map) return ['expected a map', location];
-
-        var err = (expected.length == actual.length)
-            ? ''
-            : 'has different length and ';
-        for (var key in expected.keys) {
-          if (!actual.containsKey(key)) {
-            return ["${err}is missing map key '$key'", location];
-          }
-        }
-
-        for (var key in actual.keys) {
-          if (!expected.containsKey(key)) {
-            return ["${err}has extra map key '$key'", location];
-          }
-        }
-
-        for (var key in expected.keys) {
-          var rp = _recursiveMatch(
-              expected[key], actual[key], "${location}['${key}']", depth + 1);
-          if (rp != null) return rp;
-        }
-
-        return null;
-      }
-    }
-
-    var description = new StringDescription();
-
-    // If we have recursed, show the expected value too; if not, expect() will
-    // show it for us.
-    if (depth > 0) {
-      description
-          .add('was ')
-          .addDescriptionOf(actual)
-          .add(' instead of ')
-          .addDescriptionOf(expected);
-      return [description.toString(), location];
-    }
-
-    // We're not adding any value to the actual value.
-    return ["", location];
-  }
-
-  String _match(expected, actual, Map matchState) {
-    var rp = _recursiveMatch(expected, actual, '', 0);
-    if (rp == null) return null;
-    var reason;
-    if (rp[0].length > 0) {
-      if (rp[1].length > 0) {
-        reason = "${rp[0]} at location ${rp[1]}";
-      } else {
-        reason = rp[0];
-      }
-    } else {
-      reason = '';
-    }
-    // Cache the failure reason in the matchState.
-    addStateInfo(matchState, {'reason': reason});
-    return reason;
-  }
-
-  bool matches(item, Map matchState) =>
-      _match(_expected, item, matchState) == null;
-
-  Description describe(Description description) =>
-      description.addDescriptionOf(_expected);
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    var reason = matchState['reason'];
-    // If we didn't get a good reason, that would normally be a
-    // simple 'is <value>' message. We only add that if the mismatch
-    // description is non empty (so we are supplementing the mismatch
-    // description).
-    if (reason.length == 0 && mismatchDescription.length > 0) {
-      mismatchDescription.add('is ').addDescriptionOf(item);
-    } else {
-      mismatchDescription.add(reason);
-    }
-    return mismatchDescription;
-  }
-}
-
-/// A special equality matcher for strings.
-class _StringEqualsMatcher extends Matcher {
-  final String _value;
-
-  _StringEqualsMatcher(this._value);
-
-  bool get showActualValue => true;
-
-  bool matches(item, Map matchState) => _value == item;
-
-  Description describe(Description description) =>
-      description.addDescriptionOf(_value);
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (item is! String) {
-      return mismatchDescription.addDescriptionOf(item).add('is not a string');
-    } else {
-      var buff = new StringBuffer();
-      buff.write('is different.');
-      var escapedItem = escape(item);
-      var escapedValue = escape(_value);
-      int minLength = escapedItem.length < escapedValue.length
-          ? escapedItem.length
-          : escapedValue.length;
-      int start;
-      for (start = 0; start < minLength; start++) {
-        if (escapedValue.codeUnitAt(start) != escapedItem.codeUnitAt(start)) {
-          break;
-        }
-      }
-      if (start == minLength) {
-        if (escapedValue.length < escapedItem.length) {
-          buff.write(' Both strings start the same, but the given value also'
-              ' has the following trailing characters: ');
-          _writeTrailing(buff, escapedItem, escapedValue.length);
-        } else {
-          buff.write(' Both strings start the same, but the given value is'
-              ' missing the following trailing characters: ');
-          _writeTrailing(buff, escapedValue, escapedItem.length);
-        }
-      } else {
-        buff.write('\nExpected: ');
-        _writeLeading(buff, escapedValue, start);
-        _writeTrailing(buff, escapedValue, start);
-        buff.write('\n  Actual: ');
-        _writeLeading(buff, escapedItem, start);
-        _writeTrailing(buff, escapedItem, start);
-        buff.write('\n          ');
-        for (int i = (start > 10 ? 14 : start); i > 0; i--) buff.write(' ');
-        buff.write('^\n Differ at offset $start');
-      }
-
-      return mismatchDescription.replace(buff.toString());
-    }
-  }
-
-  static void _writeLeading(StringBuffer buff, String s, int start) {
-    if (start > 10) {
-      buff.write('... ');
-      buff.write(s.substring(start - 10, start));
-    } else {
-      buff.write(s.substring(0, start));
-    }
-  }
-
-  static void _writeTrailing(StringBuffer buff, String s, int start) {
-    if (start + 10 > s.length) {
-      buff.write(s.substring(start));
-    } else {
-      buff.write(s.substring(start, start + 10));
-      buff.write(' ...');
-    }
-  }
-}
-
-/// A matcher that matches any value.
-const Matcher anything = const _IsAnything();
-
-class _IsAnything extends Matcher {
-  const _IsAnything();
-  bool matches(item, Map matchState) => true;
-  Description describe(Description description) => description.add('anything');
-}
-
-/// Returns a matcher that matches if an object is an instance
-/// of [type] (or a subtype).
-///
-/// As types are not first class objects in Dart we can only
-/// approximate this test by using a generic wrapper class.
-///
-/// For example, to test whether 'bar' is an instance of type
-/// 'Foo', we would write:
-///
-///     expect(bar, new isInstanceOf<Foo>());
-class isInstanceOf<T> extends Matcher {
-  /// The [name] parameter does nothing; it's deprecated and will be removed in
-  /// future version of [matcher].
-  const isInstanceOf([@deprecated String name]);
-
-  bool matches(obj, Map matchState) => obj is T;
-
-  Description describe(Description description) =>
-      description.add('an instance of $T');
-}
-
-/// A matcher that matches a function call against no exception.
-///
-/// The function will be called once. Any exceptions will be silently swallowed.
-/// The value passed to expect() should be a reference to the function.
-/// Note that the function cannot take arguments; to handle this
-/// a wrapper will have to be created.
-const Matcher returnsNormally = const _ReturnsNormally();
-
-class _ReturnsNormally extends Matcher {
-  const _ReturnsNormally();
-
-  bool matches(f, Map matchState) {
-    try {
-      f();
-      return true;
-    } catch (e, s) {
-      addStateInfo(matchState, {'exception': e, 'stack': s});
-      return false;
-    }
-  }
-
-  Description describe(Description description) =>
-      description.add("return normally");
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    mismatchDescription.add('threw ').addDescriptionOf(matchState['exception']);
-    if (verbose) {
-      mismatchDescription.add(' at ').add(matchState['stack'].toString());
-    }
-    return mismatchDescription;
-  }
-}
-
-/*
- * Matchers for different exception types. Ideally we should just be able to
- * use something like:
- *
- * final Matcher throwsException =
- *     const _Throws(const isInstanceOf<Exception>());
- *
- * Unfortunately instanceOf is not working with dart2js.
- *
- * Alternatively, if static functions could be used in const expressions,
- * we could use:
- *
- * bool _isException(x) => x is Exception;
- * final Matcher isException = const _Predicate(_isException, "Exception");
- * final Matcher throwsException = const _Throws(isException);
- *
- * But currently using static functions in const expressions is not supported.
- * For now the only solution for all platforms seems to be separate classes
- * for each exception type.
- */
-
-abstract class TypeMatcher extends Matcher {
-  final String _name;
-  const TypeMatcher(this._name);
-  Description describe(Description description) => description.add(_name);
-}
-
-/// A matcher for Map types.
-const Matcher isMap = const _IsMap();
-
-class _IsMap extends TypeMatcher {
-  const _IsMap() : super("Map");
-  bool matches(item, Map matchState) => item is Map;
-}
-
-/// A matcher for List types.
-const Matcher isList = const _IsList();
-
-class _IsList extends TypeMatcher {
-  const _IsList() : super("List");
-  bool matches(item, Map matchState) => item is List;
-}
-
-/// Returns a matcher that matches if an object has a length property
-/// that matches [matcher].
-Matcher hasLength(matcher) => new _HasLength(wrapMatcher(matcher));
-
-class _HasLength extends Matcher {
-  final Matcher _matcher;
-  const _HasLength([Matcher matcher = null]) : this._matcher = matcher;
-
-  bool matches(item, Map matchState) {
-    try {
-      // This is harmless code that will throw if no length property
-      // but subtle enough that an optimizer shouldn't strip it out.
-      if (item.length * item.length >= 0) {
-        return _matcher.matches(item.length, matchState);
-      }
-    } catch (e) {}
-    return false;
-  }
-
-  Description describe(Description description) =>
-      description.add('an object with length of ').addDescriptionOf(_matcher);
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    try {
-      // We want to generate a different description if there is no length
-      // property; we use the same trick as in matches().
-      if (item.length * item.length >= 0) {
-        return mismatchDescription
-            .add('has length of ')
-            .addDescriptionOf(item.length);
-      }
-    } catch (e) {}
-    return mismatchDescription.add('has no length property');
-  }
-}
-
-/// Returns a matcher that matches if the match argument contains the expected
-/// value.
-///
-/// For [String]s this means substring matching;
-/// for [Map]s it means the map has the key, and for [Iterable]s
-/// it means the iterable has a matching element. In the case of iterables,
-/// [expected] can itself be a matcher.
-Matcher contains(expected) => new _Contains(expected);
-
-class _Contains extends Matcher {
-  final _expected;
-
-  const _Contains(this._expected);
-
-  bool matches(item, Map matchState) {
-    if (item is String) {
-      return item.indexOf(_expected) >= 0;
-    } else if (item is Iterable) {
-      if (_expected is Matcher) {
-        return item.any((e) => _expected.matches(e, matchState));
-      } else {
-        return item.contains(_expected);
-      }
-    } else if (item is Map) {
-      return item.containsKey(_expected);
-    }
-    return false;
-  }
-
-  Description describe(Description description) =>
-      description.add('contains ').addDescriptionOf(_expected);
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (item is String || item is Iterable || item is Map) {
-      return super.describeMismatch(
-          item, mismatchDescription, matchState, verbose);
-    } else {
-      return mismatchDescription.add('is not a string, map or iterable');
-    }
-  }
-}
-
-/// Returns a matcher that matches if the match argument is in
-/// the expected value. This is the converse of [contains].
-Matcher isIn(expected) => new _In(expected);
-
-class _In extends Matcher {
-  final _expected;
-
-  const _In(this._expected);
-
-  bool matches(item, Map matchState) {
-    if (_expected is String) {
-      return _expected.indexOf(item) >= 0;
-    } else if (_expected is Iterable) {
-      return _expected.any((e) => e == item);
-    } else if (_expected is Map) {
-      return _expected.containsKey(item);
-    }
-    return false;
-  }
-
-  Description describe(Description description) =>
-      description.add('is in ').addDescriptionOf(_expected);
-}
-
-/// Returns a matcher that uses an arbitrary function that returns
-/// true or false for the actual value.
-///
-/// For example:
-///
-///     expect(v, predicate((x) => ((x % 2) == 0), "is even"))
-Matcher predicate(bool f(value), [String description = 'satisfies function']) =>
-    new _Predicate(f, description);
-
-typedef bool _PredicateFunction(value);
-
-class _Predicate extends Matcher {
-  final _PredicateFunction _matcher;
-  final String _description;
-
-  const _Predicate(this._matcher, this._description);
-
-  bool matches(item, Map matchState) => _matcher(item);
-
-  Description describe(Description description) =>
-      description.add(_description);
-}
-
-/// A useful utility class for implementing other matchers through inheritance.
-/// Derived classes should call the base constructor with a feature name and
-/// description, and an instance matcher, and should implement the
-/// [featureValueOf] abstract method.
-///
-/// The feature description will typically describe the item and the feature,
-/// while the feature name will just name the feature. For example, we may
-/// have a Widget class where each Widget has a price; we could make a
-/// [CustomMatcher] that can make assertions about prices with:
-///
-///     class HasPrice extends CustomMatcher {
-///       const HasPrice(matcher) :
-///           super("Widget with price that is", "price", matcher);
-///       featureValueOf(actual) => actual.price;
-///     }
-///
-/// and then use this for example like:
-///
-///      expect(inventoryItem, new HasPrice(greaterThan(0)));
-class CustomMatcher extends Matcher {
-  final String _featureDescription;
-  final String _featureName;
-  final Matcher _matcher;
-
-  CustomMatcher(this._featureDescription, this._featureName, matcher)
-      : this._matcher = wrapMatcher(matcher);
-
-  /// Override this to extract the interesting feature.
-  featureValueOf(actual) => actual;
-
-  bool matches(item, Map matchState) {
-    var f = featureValueOf(item);
-    if (_matcher.matches(f, matchState)) return true;
-    addStateInfo(matchState, {'feature': f});
-    return false;
-  }
-
-  Description describe(Description description) =>
-      description.add(_featureDescription).add(' ').addDescriptionOf(_matcher);
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    mismatchDescription
-        .add('has ')
-        .add(_featureName)
-        .add(' with value ')
-        .addDescriptionOf(matchState['feature']);
-    var innerDescription = new StringDescription();
-    _matcher.describeMismatch(
-        matchState['feature'], innerDescription, matchState['state'], verbose);
-    if (innerDescription.length > 0) {
-      mismatchDescription.add(' which ').add(innerDescription.toString());
-    }
-    return mismatchDescription;
-  }
-}
diff --git a/unittest/lib/src/matcher/description.dart b/unittest/lib/src/matcher/description.dart
deleted file mode 100644
index 3f2862f..0000000
--- a/unittest/lib/src/matcher/description.dart
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.description;
-
-import 'interfaces.dart';
-import 'pretty_print.dart';
-
-/// The default implementation of [Description]. This should rarely need
-/// substitution, although conceivably it is a place where other languages
-/// could be supported.
-class StringDescription implements Description {
-  final StringBuffer _out = new StringBuffer();
-
-  /// Initialize the description with initial contents [init].
-  StringDescription([String init = '']) {
-    _out.write(init);
-  }
-
-  int get length => _out.length;
-
-  /// Get the description as a string.
-  String toString() => _out.toString();
-
-  /// Append [text] to the description.
-  Description add(String text) {
-    _out.write(text);
-    return this;
-  }
-
-  /// Change the value of the description.
-  Description replace(String text) {
-    _out.clear();
-    return add(text);
-  }
-
-  /// Appends a description of [value]. If it is an IMatcher use its
-  /// describe method; if it is a string use its literal value after
-  /// escaping any embedded control characters; otherwise use its
-  /// toString() value and wrap it in angular "quotes".
-  Description addDescriptionOf(value) {
-    if (value is Matcher) {
-      value.describe(this);
-    } else {
-      add(prettyPrint(value, maxLineLength: 80, maxItems: 25));
-    }
-    return this;
-  }
-
-  /// Append an [Iterable] [list] of objects to the description, using the
-  /// specified [separator] and framing the list with [start]
-  /// and [end].
-  Description addAll(
-      String start, String separator, String end, Iterable list) {
-    var separate = false;
-    add(start);
-    for (var item in list) {
-      if (separate) {
-        add(separator);
-      }
-      addDescriptionOf(item);
-      separate = true;
-    }
-    add(end);
-    return this;
-  }
-}
diff --git a/unittest/lib/src/matcher/error_matchers.dart b/unittest/lib/src/matcher/error_matchers.dart
deleted file mode 100644
index 503f32d..0000000
--- a/unittest/lib/src/matcher/error_matchers.dart
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.error_matchers;
-
-import 'core_matchers.dart';
-import 'interfaces.dart';
-
-/// A matcher for ArgumentErrors.
-const Matcher isArgumentError = const _ArgumentError();
-
-class _ArgumentError extends TypeMatcher {
-  const _ArgumentError() : super("ArgumentError");
-  bool matches(item, Map matchState) => item is ArgumentError;
-}
-
-/// A matcher for ConcurrentModificationError.
-const Matcher isConcurrentModificationError =
-    const _ConcurrentModificationError();
-
-class _ConcurrentModificationError extends TypeMatcher {
-  const _ConcurrentModificationError() : super("ConcurrentModificationError");
-  bool matches(item, Map matchState) => item is ConcurrentModificationError;
-}
-
-/// A matcher for CyclicInitializationError.
-const Matcher isCyclicInitializationError = const _CyclicInitializationError();
-
-class _CyclicInitializationError extends TypeMatcher {
-  const _CyclicInitializationError() : super("CyclicInitializationError");
-  bool matches(item, Map matchState) => item is CyclicInitializationError;
-}
-
-/// A matcher for Exceptions.
-const Matcher isException = const _Exception();
-
-class _Exception extends TypeMatcher {
-  const _Exception() : super("Exception");
-  bool matches(item, Map matchState) => item is Exception;
-}
-
-/// A matcher for FormatExceptions.
-const Matcher isFormatException = const _FormatException();
-
-class _FormatException extends TypeMatcher {
-  const _FormatException() : super("FormatException");
-  bool matches(item, Map matchState) => item is FormatException;
-}
-
-/// A matcher for NoSuchMethodErrors.
-const Matcher isNoSuchMethodError = const _NoSuchMethodError();
-
-class _NoSuchMethodError extends TypeMatcher {
-  const _NoSuchMethodError() : super("NoSuchMethodError");
-  bool matches(item, Map matchState) => item is NoSuchMethodError;
-}
-
-/// A matcher for NullThrownError.
-const Matcher isNullThrownError = const _NullThrownError();
-
-class _NullThrownError extends TypeMatcher {
-  const _NullThrownError() : super("NullThrownError");
-  bool matches(item, Map matchState) => item is NullThrownError;
-}
-
-/// A matcher for RangeErrors.
-const Matcher isRangeError = const _RangeError();
-
-class _RangeError extends TypeMatcher {
-  const _RangeError() : super("RangeError");
-  bool matches(item, Map matchState) => item is RangeError;
-}
-
-/// A matcher for StateErrors.
-const Matcher isStateError = const _StateError();
-
-class _StateError extends TypeMatcher {
-  const _StateError() : super("StateError");
-  bool matches(item, Map matchState) => item is StateError;
-}
-
-/// A matcher for UnimplementedErrors.
-const Matcher isUnimplementedError = const _UnimplementedError();
-
-class _UnimplementedError extends TypeMatcher {
-  const _UnimplementedError() : super("UnimplementedError");
-  bool matches(item, Map matchState) => item is UnimplementedError;
-}
-
-/// A matcher for UnsupportedError.
-const Matcher isUnsupportedError = const _UnsupportedError();
-
-class _UnsupportedError extends TypeMatcher {
-  const _UnsupportedError() : super("UnsupportedError");
-  bool matches(item, Map matchState) => item is UnsupportedError;
-}
diff --git a/unittest/lib/src/matcher/expect.dart b/unittest/lib/src/matcher/expect.dart
deleted file mode 100644
index eeeeeff..0000000
--- a/unittest/lib/src/matcher/expect.dart
+++ /dev/null
@@ -1,177 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.expect;
-
-import 'core_matchers.dart';
-import 'description.dart';
-import 'interfaces.dart';
-import 'util.dart';
-
-/// The objects thrown by the default failure handler.
-class TestFailure extends Error {
-  final String message;
-
-  TestFailure(this.message);
-
-  String toString() => message;
-}
-
-/// Failed matches are reported using a default IFailureHandler.
-/// The default implementation simply throws [TestFailure]s;
-/// this can be replaced by some other implementation of
-/// IFailureHandler by calling configureExpectHandler.
-abstract class FailureHandler {
-  /// This handles failures given a textual decription
-  void fail(String reason);
-
-  /// This handles failures given the actual [value], the [matcher]
-  /// the [reason] (argument from [expect]), some additonal [matchState]
-  /// generated by the [matcher], and a verbose flag which controls in
-  /// some cases how much [matchState] information is used. It will use
-  /// these to create a detailed error message (typically by calling
-  /// an [ErrorFormatter]) and then call [fail] with this message.
-  void failMatch(
-      actual, Matcher matcher, String reason, Map matchState, bool verbose);
-}
-
-/// The ErrorFormatter type is used for functions that
-/// can be used to build up error reports upon [expect] failures.
-/// There is one built-in implementation ([defaultErrorFormatter])
-/// which is used by the default failure handler. If the failure handler
-/// is replaced it may be desirable to replace the [stringDescription]
-/// error formatter with another.
-typedef String ErrorFormatter(
-    actual, Matcher matcher, String reason, Map matchState, bool verbose);
-
-/// This Function is used by certain Matchers to catch certain exceptions.
-///
-/// Some matchers, like those for Futures and exception testing,
-/// can fail in asynchronous sections, and throw exceptions.
-/// A user of this library will typically want to catch and handle
-/// such exceptions. The [wrapAsync] property is a function that
-/// can wrap callbacks used by these Matchers so that they can be
-/// used safely. For example, the unittest library will set this
-/// to be `expectAsync`. By default this is an identity function.
-Function wrapAsync = (Function f, [id]) => f;
-
-/// Assert that [actual] matches [matcher].
-///
-/// This is the main assertion function. [reason] is optional and is typically
-/// not supplied, as a reason is generated from the matcher; if [reason]
-/// is included it is appended to the reason generated by the matcher.
-///
-/// [matcher] can be a value in which case it will be wrapped in an
-/// [equals] matcher.
-///
-/// If the assertion fails, then the default behavior is to throw a
-/// [TestFailure], but this behavior can be changed by calling
-/// [configureExpectFailureHandler] and providing an alternative handler that
-/// implements the [IFailureHandler] interface. It is also possible to
-/// pass a [failureHandler] to [expect] as a final parameter for fine-
-/// grained control.
-///
-/// In some cases extra diagnostic info can be produced on failure (for
-/// example, stack traces on mismatched exceptions). To enable these,
-/// [verbose] should be specified as true;
-void expect(actual, matcher,
-    {String reason, FailureHandler failureHandler, bool verbose: false}) {
-  matcher = wrapMatcher(matcher);
-  bool doesMatch;
-  var matchState = {};
-  try {
-    doesMatch = matcher.matches(actual, matchState);
-  } catch (e, trace) {
-    doesMatch = false;
-    if (reason == null) {
-      reason = '${(e is String) ? e : e.toString()} at $trace';
-    }
-  }
-  if (!doesMatch) {
-    if (failureHandler == null) {
-      failureHandler = getOrCreateExpectFailureHandler();
-    }
-    failureHandler.failMatch(actual, matcher, reason, matchState, verbose);
-  }
-}
-
-void fail(String message, {FailureHandler failureHandler}) {
-  if (failureHandler == null) {
-    failureHandler = getOrCreateExpectFailureHandler();
-  }
-  failureHandler.fail(message);
-}
-
-// The handler for failed asserts.
-FailureHandler _assertFailureHandler = null;
-
-// The default failure handler that throws [TestFailure]s.
-class DefaultFailureHandler implements FailureHandler {
-  DefaultFailureHandler() {
-    if (_assertErrorFormatter == null) {
-      _assertErrorFormatter = _defaultErrorFormatter;
-    }
-  }
-  void fail(String reason) {
-    throw new TestFailure(reason);
-  }
-  void failMatch(
-      actual, Matcher matcher, String reason, Map matchState, bool verbose) {
-    fail(_assertErrorFormatter(actual, matcher, reason, matchState, verbose));
-  }
-}
-
-/// Changes the default failure handler for [expect].
-///
-/// [handler] is a reference to the new handler; if this is omitted
-/// or null then the failure handler is reset to the default, which
-/// throws [TestFailure]s on [expect] assertion failures.
-void configureExpectFailureHandler([FailureHandler handler = null]) {
-  if (handler == null) {
-    handler = new DefaultFailureHandler();
-  }
-  _assertFailureHandler = handler;
-}
-
-FailureHandler getOrCreateExpectFailureHandler() {
-  if (_assertFailureHandler == null) {
-    configureExpectFailureHandler();
-  }
-  return _assertFailureHandler;
-}
-
-// The error message formatter for failed asserts.
-ErrorFormatter _assertErrorFormatter = null;
-
-// The default error formatter implementation.
-String _defaultErrorFormatter(
-    actual, Matcher matcher, String reason, Map matchState, bool verbose) {
-  var description = new StringDescription();
-  description.add('Expected: ').addDescriptionOf(matcher).add('\n');
-  description.add('  Actual: ').addDescriptionOf(actual).add('\n');
-
-  var mismatchDescription = new StringDescription();
-  matcher.describeMismatch(actual, mismatchDescription, matchState, verbose);
-
-  if (mismatchDescription.length > 0) {
-    description.add('   Which: ${mismatchDescription}\n');
-  }
-  if (reason != null) {
-    description.add(reason).add('\n');
-  }
-  return description.toString();
-}
-
-/// Changes the failure message formatter for expect().
-///
-/// [formatter] is a reference to the new formatter; if this is omitted or
-/// null then the failure formatter is reset to the default. The new
-/// formatter is returned; this allows custom expect handlers to easily
-/// get a reference to the default formatter.
-ErrorFormatter configureExpectFormatter([ErrorFormatter formatter = null]) {
-  if (formatter == null) {
-    formatter = _defaultErrorFormatter;
-  }
-  return _assertErrorFormatter = formatter;
-}
diff --git a/unittest/lib/src/matcher/future_matchers.dart b/unittest/lib/src/matcher/future_matchers.dart
deleted file mode 100644
index 9b6319b..0000000
--- a/unittest/lib/src/matcher/future_matchers.dart
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.future_matchers;
-
-import 'dart:async';
-
-import 'expect.dart';
-import 'interfaces.dart';
-import 'util.dart';
-
-/// Matches a [Future] that completes successfully with a value.
-///
-/// Note that this creates an asynchronous expectation. The call to `expect()`
-/// that includes this will return immediately and execution will continue.
-/// Later, when the future completes, the actual expectation will run.
-///
-/// To test that a Future completes with an exception, you can use [throws] and
-/// [throwsA].
-final Matcher completes = const _Completes(null, '');
-
-/// Matches a [Future] that completes succesfully with a value that matches
-/// [matcher].
-///
-/// Note that this creates an asynchronous expectation. The call to
-/// `expect()` that includes this will return immediately and execution will
-/// continue. Later, when the future completes, the actual expectation will run.
-///
-/// To test that a Future completes with an exception, you can use [throws] and
-/// [throwsA].
-///
-/// [id] is an optional tag that can be used to identify the completion matcher
-/// in error messages.
-Matcher completion(matcher, [String id = '']) =>
-    new _Completes(wrapMatcher(matcher), id);
-
-class _Completes extends Matcher {
-  final Matcher _matcher;
-  final String _id;
-
-  const _Completes(this._matcher, this._id);
-
-  bool matches(item, Map matchState) {
-    if (item is! Future) return false;
-    var done = wrapAsync((fn) => fn(), _id);
-
-    item.then((value) {
-      done(() {
-        if (_matcher != null) expect(value, _matcher);
-      });
-    }, onError: (error, trace) {
-      var id = _id == '' ? '' : '${_id} ';
-      var reason = 'Expected future ${id}to complete successfully, '
-          'but it failed with ${error}';
-      if (trace != null) {
-        var stackTrace = trace.toString();
-        stackTrace = '  ${stackTrace.replaceAll('\n', '\n  ')}';
-        reason = '$reason\nStack trace:\n$stackTrace';
-      }
-      done(() => fail(reason));
-    });
-
-    return true;
-  }
-
-  Description describe(Description description) {
-    if (_matcher == null) {
-      description.add('completes successfully');
-    } else {
-      description.add('completes to a value that ').addDescriptionOf(_matcher);
-    }
-    return description;
-  }
-}
diff --git a/unittest/lib/src/matcher/interfaces.dart b/unittest/lib/src/matcher/interfaces.dart
deleted file mode 100644
index 3e68d2d..0000000
--- a/unittest/lib/src/matcher/interfaces.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.interfaces;
-
-// To decouple the reporting of errors, and allow for extensibility of
-// matchers, we make use of some interfaces.
-
-/// Matchers build up their error messages by appending to
-/// Description objects. This interface is implemented by
-/// StringDescription. This interface is unlikely to need
-/// other implementations, but could be useful to replace in
-/// some cases - e.g. language conversion.
-abstract class Description {
-  int get length;
-
-  /// Change the value of the description.
-  Description replace(String text);
-
-  /// This is used to add arbitrary text to the description.
-  Description add(String text);
-
-  /// This is used to add a meaningful description of a value.
-  Description addDescriptionOf(value);
-
-  /// This is used to add a description of an [Iterable] [list],
-  /// with appropriate [start] and [end] markers and inter-element [separator].
-  Description addAll(String start, String separator, String end, Iterable list);
-}
-
-/// [expect] Matchers must implement/extend the Matcher class.
-/// The base Matcher class has a generic implementation of [describeMismatch]
-/// so this does not need to be provided unless a more clear description is
-/// required. The other two methods ([matches] and [describe])
-/// must always be provided as they are highly matcher-specific.
-abstract class Matcher {
-  const Matcher();
-
-  /// This does the matching of the actual vs expected values.
-  /// [item] is the actual value. [matchState] can be supplied
-  /// and may be used to add details about the mismatch that are too
-  /// costly to determine in [describeMismatch].
-  bool matches(item, Map matchState);
-
-  /// This builds a textual description of the matcher.
-  Description describe(Description description);
-
-  /// This builds a textual description of a specific mismatch. [item]
-  /// is the value that was tested by [matches]; [matchState] is
-  /// the [Map] that was passed to and supplemented by [matches]
-  /// with additional information about the mismatch, and [mismatchDescription]
-  /// is the [Description] that is being built to decribe the mismatch.
-  /// A few matchers make use of the [verbose] flag to provide detailed
-  /// information that is not typically included but can be of help in
-  /// diagnosing failures, such as stack traces.
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) =>
-      mismatchDescription;
-}
diff --git a/unittest/lib/src/matcher/iterable_matchers.dart b/unittest/lib/src/matcher/iterable_matchers.dart
deleted file mode 100644
index 22465f6..0000000
--- a/unittest/lib/src/matcher/iterable_matchers.dart
+++ /dev/null
@@ -1,267 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.iterable_matchers;
-
-import 'core_matchers.dart';
-import 'description.dart';
-import 'interfaces.dart';
-import 'util.dart';
-
-/// Returns a matcher which matches [Iterable]s in which all elements
-/// match the given [matcher].
-Matcher everyElement(matcher) => new _EveryElement(wrapMatcher(matcher));
-
-class _EveryElement extends _IterableMatcher {
-  final Matcher _matcher;
-
-  _EveryElement(Matcher this._matcher);
-
-  bool matches(item, Map matchState) {
-    if (item is! Iterable) {
-      return false;
-    }
-    var i = 0;
-    for (var element in item) {
-      if (!_matcher.matches(element, matchState)) {
-        addStateInfo(matchState, {'index': i, 'element': element});
-        return false;
-      }
-      ++i;
-    }
-    return true;
-  }
-
-  Description describe(Description description) =>
-      description.add('every element(').addDescriptionOf(_matcher).add(')');
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (matchState['index'] != null) {
-      var index = matchState['index'];
-      var element = matchState['element'];
-      mismatchDescription
-          .add('has value ')
-          .addDescriptionOf(element)
-          .add(' which ');
-      var subDescription = new StringDescription();
-      _matcher.describeMismatch(
-          element, subDescription, matchState['state'], verbose);
-      if (subDescription.length > 0) {
-        mismatchDescription.add(subDescription.toString());
-      } else {
-        mismatchDescription.add("doesn't match ");
-        _matcher.describe(mismatchDescription);
-      }
-      mismatchDescription.add(' at index $index');
-      return mismatchDescription;
-    }
-    return super.describeMismatch(
-        item, mismatchDescription, matchState, verbose);
-  }
-}
-
-/// Returns a matcher which matches [Iterable]s in which at least one
-/// element matches the given [matcher].
-Matcher anyElement(matcher) => new _AnyElement(wrapMatcher(matcher));
-
-class _AnyElement extends _IterableMatcher {
-  final Matcher _matcher;
-
-  _AnyElement(this._matcher);
-
-  bool matches(item, Map matchState) {
-    return item.any((e) => _matcher.matches(e, matchState));
-  }
-
-  Description describe(Description description) =>
-      description.add('some element ').addDescriptionOf(_matcher);
-}
-
-/// Returns a matcher which matches [Iterable]s that have the same
-/// length and the same elements as [expected], in the same order.
-///
-/// This is equivalent to [equals] but does not recurse.
-Matcher orderedEquals(Iterable expected) => new _OrderedEquals(expected);
-
-class _OrderedEquals extends Matcher {
-  final Iterable _expected;
-  Matcher _matcher;
-
-  _OrderedEquals(this._expected) {
-    _matcher = equals(_expected, 1);
-  }
-
-  bool matches(item, Map matchState) =>
-      (item is Iterable) && _matcher.matches(item, matchState);
-
-  Description describe(Description description) =>
-      description.add('equals ').addDescriptionOf(_expected).add(' ordered');
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (item is! Iterable) {
-      return mismatchDescription.add('is not an Iterable');
-    } else {
-      return _matcher.describeMismatch(
-          item, mismatchDescription, matchState, verbose);
-    }
-  }
-}
-
-/// Returns a matcher which matches [Iterable]s that have the same length and
-/// the same elements as [expected], but not necessarily in the same order.
-///
-/// Note that this is O(n^2) so should only be used on small objects.
-Matcher unorderedEquals(Iterable expected) => new _UnorderedEquals(expected);
-
-class _UnorderedEquals extends _UnorderedMatches {
-  final List _expectedValues;
-
-  _UnorderedEquals(Iterable expected)
-      : _expectedValues = expected.toList(),
-        super(expected.map(equals));
-
-  Description describe(Description description) => description
-      .add('equals ')
-      .addDescriptionOf(_expectedValues)
-      .add(' unordered');
-}
-
-/// Iterable matchers match against [Iterable]s. We add this intermediate
-/// class to give better mismatch error messages than the base Matcher class.
-abstract class _IterableMatcher extends Matcher {
-  const _IterableMatcher();
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (item is! Iterable) {
-      return mismatchDescription.addDescriptionOf(item).add(' not an Iterable');
-    } else {
-      return super.describeMismatch(
-          item, mismatchDescription, matchState, verbose);
-    }
-  }
-}
-
-/// Returns a matcher which matches [Iterable]s whose elements match the
-/// matchers in [expected], but not necessarily in the same order.
-///
-///  Note that this is `O(n^2)` and so should only be used on small objects.
-Matcher unorderedMatches(Iterable expected) => new _UnorderedMatches(expected);
-
-class _UnorderedMatches extends Matcher {
-  final List<Matcher> _expected;
-
-  _UnorderedMatches(Iterable expected)
-      : _expected = expected.map(wrapMatcher).toList();
-
-  String _test(item) {
-    if (item is! Iterable) return 'not iterable';
-    item = item.toList();
-
-    // Check the lengths are the same.
-    if (_expected.length > item.length) {
-      return 'has too few elements (${item.length} < ${_expected.length})';
-    } else if (_expected.length < item.length) {
-      return 'has too many elements (${item.length} > ${_expected.length})';
-    }
-
-    var matched = new List<bool>.filled(item.length, false);
-    var expectedPosition = 0;
-    for (var expectedMatcher in _expected) {
-      var actualPosition = 0;
-      var gotMatch = false;
-      for (var actualElement in item) {
-        if (!matched[actualPosition]) {
-          if (expectedMatcher.matches(actualElement, {})) {
-            matched[actualPosition] = gotMatch = true;
-            break;
-          }
-        }
-        ++actualPosition;
-      }
-
-      if (!gotMatch) {
-        return new StringDescription()
-            .add('has no match for ')
-            .addDescriptionOf(expectedMatcher)
-            .add(' at index ${expectedPosition}')
-            .toString();
-      }
-
-      ++expectedPosition;
-    }
-    return null;
-  }
-
-  bool matches(item, Map mismatchState) => _test(item) == null;
-
-  Description describe(Description description) => description
-      .add('matches ')
-      .addAll('[', ', ', ']', _expected)
-      .add(' unordered');
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) =>
-      mismatchDescription.add(_test(item));
-}
-
-/// A pairwise matcher for [Iterable]s.
-///
-/// The [comparator] function, taking an expected and an actual argument, and
-/// returning whether they match, will be applied to each pair in order.
-/// [description] should be a meaningful name for the comparator.
-Matcher pairwiseCompare(
-    Iterable expected, bool comparator(a, b), String description) =>
-        new _PairwiseCompare(expected, comparator, description);
-
-typedef bool _Comparator(a, b);
-
-class _PairwiseCompare extends _IterableMatcher {
-  final Iterable _expected;
-  final _Comparator _comparator;
-  final String _description;
-
-  _PairwiseCompare(this._expected, this._comparator, this._description);
-
-  bool matches(item, Map matchState) {
-    if (item is! Iterable) return false;
-    if (item.length != _expected.length) return false;
-    var iterator = item.iterator;
-    var i = 0;
-    for (var e in _expected) {
-      iterator.moveNext();
-      if (!_comparator(e, iterator.current)) {
-        addStateInfo(matchState, {
-          'index': i,
-          'expected': e,
-          'actual': iterator.current
-        });
-        return false;
-      }
-      i++;
-    }
-    return true;
-  }
-
-  Description describe(Description description) =>
-      description.add('pairwise $_description ').addDescriptionOf(_expected);
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (item is! Iterable) {
-      return mismatchDescription.add('is not an Iterable');
-    } else if (item.length != _expected.length) {
-      return mismatchDescription
-          .add('has length ${item.length} instead of ${_expected.length}');
-    } else {
-      return mismatchDescription
-          .add('has ')
-          .addDescriptionOf(matchState["actual"])
-          .add(' which is not $_description ')
-          .addDescriptionOf(matchState["expected"])
-          .add(' at index ${matchState["index"]}');
-    }
-  }
-}
diff --git a/unittest/lib/src/matcher/map_matchers.dart b/unittest/lib/src/matcher/map_matchers.dart
deleted file mode 100644
index 98e89af..0000000
--- a/unittest/lib/src/matcher/map_matchers.dart
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.map_matchers;
-
-import 'interfaces.dart';
-import 'util.dart';
-
-/// Returns a matcher which matches maps containing the given [value].
-Matcher containsValue(value) => new _ContainsValue(value);
-
-class _ContainsValue extends Matcher {
-  final _value;
-
-  const _ContainsValue(this._value);
-
-  bool matches(item, Map matchState) => item.containsValue(_value);
-  Description describe(Description description) =>
-      description.add('contains value ').addDescriptionOf(_value);
-}
-
-/// Returns a matcher which matches maps containing the key-value pair
-/// with [key] => [value].
-Matcher containsPair(key, value) =>
-    new _ContainsMapping(key, wrapMatcher(value));
-
-class _ContainsMapping extends Matcher {
-  final _key;
-  final Matcher _valueMatcher;
-
-  const _ContainsMapping(this._key, Matcher this._valueMatcher);
-
-  bool matches(item, Map matchState) =>
-      item.containsKey(_key) && _valueMatcher.matches(item[_key], matchState);
-
-  Description describe(Description description) {
-    return description
-        .add('contains pair ')
-        .addDescriptionOf(_key)
-        .add(' => ')
-        .addDescriptionOf(_valueMatcher);
-  }
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (!item.containsKey(_key)) {
-      return mismatchDescription
-          .add(" doesn't contain key ")
-          .addDescriptionOf(_key);
-    } else {
-      mismatchDescription
-          .add(' contains key ')
-          .addDescriptionOf(_key)
-          .add(' but with value ');
-      _valueMatcher.describeMismatch(
-          item[_key], mismatchDescription, matchState, verbose);
-      return mismatchDescription;
-    }
-  }
-}
diff --git a/unittest/lib/src/matcher/numeric_matchers.dart b/unittest/lib/src/matcher/numeric_matchers.dart
deleted file mode 100644
index 18c498e..0000000
--- a/unittest/lib/src/matcher/numeric_matchers.dart
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.numeric_matchers;
-
-import 'interfaces.dart';
-
-/// Returns a matcher which matches if the match argument is greater
-/// than the given [value].
-Matcher greaterThan(value) =>
-    new _OrderingComparison(value, false, false, true, 'a value greater than');
-
-/// Returns a matcher which matches if the match argument is greater
-/// than or equal to the given [value].
-Matcher greaterThanOrEqualTo(value) => new _OrderingComparison(
-    value, true, false, true, 'a value greater than or equal to');
-
-/// Returns a matcher which matches if the match argument is less
-/// than the given [value].
-Matcher lessThan(value) =>
-    new _OrderingComparison(value, false, true, false, 'a value less than');
-
-/// Returns a matcher which matches if the match argument is less
-/// than or equal to the given [value].
-Matcher lessThanOrEqualTo(value) => new _OrderingComparison(
-    value, true, true, false, 'a value less than or equal to');
-
-/// A matcher which matches if the match argument is zero.
-const Matcher isZero =
-    const _OrderingComparison(0, true, false, false, 'a value equal to');
-
-/// A matcher which matches if the match argument is non-zero.
-const Matcher isNonZero =
-    const _OrderingComparison(0, false, true, true, 'a value not equal to');
-
-/// A matcher which matches if the match argument is positive.
-const Matcher isPositive =
-    const _OrderingComparison(0, false, false, true, 'a positive value', false);
-
-/// A matcher which matches if the match argument is zero or negative.
-const Matcher isNonPositive = const _OrderingComparison(
-    0, true, true, false, 'a non-positive value', false);
-
-/// A matcher which matches if the match argument is negative.
-const Matcher isNegative =
-    const _OrderingComparison(0, false, true, false, 'a negative value', false);
-
-/// A matcher which matches if the match argument is zero or positive.
-const Matcher isNonNegative = const _OrderingComparison(
-    0, true, false, true, 'a non-negative value', false);
-
-bool _isNumeric(value) {
-  return value is num;
-}
-
-// TODO(kevmoo) Note that matchers that use _OrderingComparison only use
-// `==` and `<` operators to evaluate the match. Or change the matcher.
-class _OrderingComparison extends Matcher {
-  /// Expected value.
-  final _value;
-  /// What to return if actual == expected
-  final bool _equalValue;
-  /// What to return if actual < expected
-  final bool _lessThanValue;
-  /// What to return if actual > expected
-  final bool _greaterThanValue;
-  /// Textual name of the inequality
-  final String _comparisonDescription;
-  /// Whether to include the expected value in the description
-  final bool _valueInDescription;
-
-  const _OrderingComparison(this._value, this._equalValue, this._lessThanValue,
-      this._greaterThanValue, this._comparisonDescription,
-      [bool valueInDescription = true])
-      : this._valueInDescription = valueInDescription;
-
-  bool matches(item, Map matchState) {
-    if (item == _value) {
-      return _equalValue;
-    } else if (item < _value) {
-      return _lessThanValue;
-    } else {
-      return _greaterThanValue;
-    }
-  }
-
-  Description describe(Description description) {
-    if (_valueInDescription) {
-      return description
-          .add(_comparisonDescription)
-          .add(' ')
-          .addDescriptionOf(_value);
-    } else {
-      return description.add(_comparisonDescription);
-    }
-  }
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    mismatchDescription.add('is not ');
-    return describe(mismatchDescription);
-  }
-}
-
-/// Returns a matcher which matches if the match argument is within [delta]
-/// of some [value].
-///
-/// In other words, this matches if the match argument is greater than
-/// than or equal [value]-[delta] and less than or equal to [value]+[delta].
-Matcher closeTo(num value, num delta) => new _IsCloseTo(value, delta);
-
-class _IsCloseTo extends Matcher {
-  final num _value, _delta;
-
-  const _IsCloseTo(this._value, this._delta);
-
-  bool matches(item, Map matchState) {
-    if (!_isNumeric(item)) {
-      return false;
-    }
-    var diff = item - _value;
-    if (diff < 0) diff = -diff;
-    return (diff <= _delta);
-  }
-
-  Description describe(Description description) => description
-      .add('a numeric value within ')
-      .addDescriptionOf(_delta)
-      .add(' of ')
-      .addDescriptionOf(_value);
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (item is! num) {
-      return mismatchDescription.add(' not numeric');
-    } else {
-      var diff = item - _value;
-      if (diff < 0) diff = -diff;
-      return mismatchDescription.add(' differs by ').addDescriptionOf(diff);
-    }
-  }
-}
-
-/// Returns a matcher which matches if the match argument is greater
-/// than or equal to [low] and less than or equal to [high].
-Matcher inInclusiveRange(num low, num high) =>
-    new _InRange(low, high, true, true);
-
-/// Returns a matcher which matches if the match argument is greater
-/// than [low] and less than [high].
-Matcher inExclusiveRange(num low, num high) =>
-    new _InRange(low, high, false, false);
-
-/// Returns a matcher which matches if the match argument is greater
-/// than [low] and less than or equal to [high].
-Matcher inOpenClosedRange(num low, num high) =>
-    new _InRange(low, high, false, true);
-
-/// Returns a matcher which matches if the match argument is greater
-/// than or equal to a [low] and less than [high].
-Matcher inClosedOpenRange(num low, num high) =>
-    new _InRange(low, high, true, false);
-
-class _InRange extends Matcher {
-  final num _low, _high;
-  final bool _lowMatchValue, _highMatchValue;
-
-  const _InRange(
-      this._low, this._high, this._lowMatchValue, this._highMatchValue);
-
-  bool matches(value, Map matchState) {
-    if (value is! num) {
-      return false;
-    }
-    if (value < _low || value > _high) {
-      return false;
-    }
-    if (value == _low) {
-      return _lowMatchValue;
-    }
-    if (value == _high) {
-      return _highMatchValue;
-    }
-    return true;
-  }
-
-  Description describe(Description description) => description.add(
-      "be in range from "
-      "$_low (${_lowMatchValue ? 'inclusive' : 'exclusive'}) to "
-      "$_high (${_highMatchValue ? 'inclusive' : 'exclusive'})");
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (item is! num) {
-      return mismatchDescription.addDescriptionOf(item).add(' not numeric');
-    } else {
-      return super.describeMismatch(
-          item, mismatchDescription, matchState, verbose);
-    }
-  }
-}
diff --git a/unittest/lib/src/matcher/operator_matchers.dart b/unittest/lib/src/matcher/operator_matchers.dart
deleted file mode 100644
index cb4ee33..0000000
--- a/unittest/lib/src/matcher/operator_matchers.dart
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.operator_matchers;
-
-import 'interfaces.dart';
-import 'util.dart';
-
-/// This returns a matcher that inverts [matcher] to its logical negation.
-Matcher isNot(matcher) => new _IsNot(wrapMatcher(matcher));
-
-class _IsNot extends Matcher {
-  final Matcher _matcher;
-
-  const _IsNot(this._matcher);
-
-  bool matches(item, Map matchState) => !_matcher.matches(item, matchState);
-
-  Description describe(Description description) =>
-      description.add('not ').addDescriptionOf(_matcher);
-}
-
-/// This returns a matcher that matches if all of the matchers passed as
-/// arguments (up to 7) match.
-///
-/// Instead of passing the matchers separately they can be passed as a single
-/// List argument. Any argument that is not a matcher is implicitly wrapped in a
-/// Matcher to check for equality.
-Matcher allOf(arg0, [arg1, arg2, arg3, arg4, arg5, arg6]) {
-  return new _AllOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
-}
-
-class _AllOf extends Matcher {
-  final List<Matcher> _matchers;
-
-  const _AllOf(this._matchers);
-
-  bool matches(item, Map matchState) {
-    for (var matcher in _matchers) {
-      if (!matcher.matches(item, matchState)) {
-        addStateInfo(matchState, {'matcher': matcher});
-        return false;
-      }
-    }
-    return true;
-  }
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    var matcher = matchState['matcher'];
-    matcher.describeMismatch(
-        item, mismatchDescription, matchState['state'], verbose);
-    return mismatchDescription;
-  }
-
-  Description describe(Description description) =>
-      description.addAll('(', ' and ', ')', _matchers);
-}
-
-/// Matches if any of the given matchers evaluate to true.
-///
-/// The arguments can be a set of matchers as separate parameters
-/// (up to 7), or a List of matchers.
-///
-/// The matchers are evaluated from left to right using short-circuit
-/// evaluation, so evaluation stops as soon as a matcher returns true.
-///
-/// Any argument that is not a matcher is implicitly wrapped in a
-/// Matcher to check for equality.
-Matcher anyOf(arg0, [arg1, arg2, arg3, arg4, arg5, arg6]) {
-  return new _AnyOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
-}
-
-class _AnyOf extends Matcher {
-  final List<Matcher> _matchers;
-
-  const _AnyOf(this._matchers);
-
-  bool matches(item, Map matchState) {
-    for (var matcher in _matchers) {
-      if (matcher.matches(item, matchState)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  Description describe(Description description) =>
-      description.addAll('(', ' or ', ')', _matchers);
-}
-
-List<Matcher> _wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
-  Iterable args;
-  if (arg0 is List) {
-    if (arg1 != null ||
-        arg2 != null ||
-        arg3 != null ||
-        arg4 != null ||
-        arg5 != null ||
-        arg6 != null) {
-      throw new ArgumentError('If arg0 is a List, all other arguments must be'
-          ' null.');
-    }
-
-    args = arg0;
-  } else {
-    args = [arg0, arg1, arg2, arg3, arg4, arg5, arg6].where((e) => e != null);
-  }
-
-  return args.map((e) => wrapMatcher(e)).toList();
-}
diff --git a/unittest/lib/src/matcher/pretty_print.dart b/unittest/lib/src/matcher/pretty_print.dart
deleted file mode 100644
index 8e96c04..0000000
--- a/unittest/lib/src/matcher/pretty_print.dart
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.pretty_print;
-
-import 'description.dart';
-import 'interfaces.dart';
-import 'util.dart';
-
-/// Returns a pretty-printed representation of [object].
-///
-/// If [maxLineLength] is passed, this will attempt to ensure that each line is
-/// no longer than [maxLineLength] characters long. This isn't guaranteed, since
-/// individual objects may have string representations that are too long, but
-/// most lines will be less than [maxLineLength] long.
-///
-/// If [maxItems] is passed, [Iterable]s and [Map]s will only print their first
-/// [maxItems] members or key/value pairs, respectively.
-String prettyPrint(object, {int maxLineLength, int maxItems}) {
-  String _prettyPrint(object, int indent, Set seen, bool top) {
-    // If the object is a matcher, use its description.
-    if (object is Matcher) {
-      var description = new StringDescription();
-      object.describe(description);
-      return "<$description>";
-    }
-
-    // Avoid looping infinitely on recursively-nested data structures.
-    if (seen.contains(object)) return "(recursive)";
-    seen = seen.union(new Set.from([object]));
-    String pp(child) => _prettyPrint(child, indent + 2, seen, false);
-
-    if (object is Iterable) {
-      // Print the type name for non-List iterables.
-      var type = object is List ? "" : _typeName(object) + ":";
-
-      // Truncate the list of strings if it's longer than [maxItems].
-      var strings = object.map(pp).toList();
-      if (maxItems != null && strings.length > maxItems) {
-        strings.replaceRange(maxItems - 1, strings.length, ['...']);
-      }
-
-      // If the printed string is short and doesn't contain a newline, print it
-      // as a single line.
-      var singleLine = "$type[${strings.join(', ')}]";
-      if ((maxLineLength == null ||
-              singleLine.length + indent <= maxLineLength) &&
-          !singleLine.contains("\n")) {
-        return singleLine;
-      }
-
-      // Otherwise, print each member on its own line.
-      return "$type[\n" + strings.map((string) {
-        return _indent(indent + 2) + string;
-      }).join(",\n") + "\n" + _indent(indent) + "]";
-    } else if (object is Map) {
-      // Convert the contents of the map to string representations.
-      var strings = object.keys.map((key) {
-        return '${pp(key)}: ${pp(object[key])}';
-      }).toList();
-
-      // Truncate the list of strings if it's longer than [maxItems].
-      if (maxItems != null && strings.length > maxItems) {
-        strings.replaceRange(maxItems - 1, strings.length, ['...']);
-      }
-
-      // If the printed string is short and doesn't contain a newline, print it
-      // as a single line.
-      var singleLine = "{${strings.join(", ")}}";
-      if ((maxLineLength == null ||
-              singleLine.length + indent <= maxLineLength) &&
-          !singleLine.contains("\n")) {
-        return singleLine;
-      }
-
-      // Otherwise, print each key/value pair on its own line.
-      return "{\n" + strings.map((string) {
-        return _indent(indent + 2) + string;
-      }).join(",\n") + "\n" + _indent(indent) + "}";
-    } else if (object is String) {
-      // Escape strings and print each line on its own line.
-      var lines = object.split("\n");
-      return "'" +
-          lines.map(_escapeString).join("\\n'\n${_indent(indent + 2)}'") +
-          "'";
-    } else {
-      var value = object.toString().replaceAll("\n", _indent(indent) + "\n");
-      var defaultToString = value.startsWith("Instance of ");
-
-      // If this is the top-level call to [prettyPrint], wrap the value on angle
-      // brackets to set it apart visually.
-      if (top) value = "<$value>";
-
-      // Print the type of objects with custom [toString] methods. Primitive
-      // objects and objects that don't implement a custom [toString] don't need
-      // to have their types printed.
-      if (object is num ||
-          object is bool ||
-          object is Function ||
-          object == null ||
-          defaultToString) {
-        return value;
-      } else {
-        return "${_typeName(object)}:$value";
-      }
-    }
-  }
-
-  return _prettyPrint(object, 0, new Set(), true);
-}
-
-String _indent(int length) => new List.filled(length, ' ').join('');
-
-/// Returns the name of the type of [x], or "Unknown" if the type name can't be
-/// determined.
-String _typeName(x) {
-  // dart2js blows up on some objects (e.g. window.navigator).
-  // So we play safe here.
-  try {
-    if (x == null) return "null";
-    var type = x.runtimeType.toString();
-    // TODO(nweiz): if the object's type is private, find a public superclass to
-    // display once there's a portable API to do that.
-    return type.startsWith("_") ? "?" : type;
-  } catch (e) {
-    return "?";
-  }
-}
-
-/// Returns [source] with any control characters replaced by their escape
-/// sequences.
-///
-/// This doesn't add quotes to the string, but it does escape single quote
-/// characters so that single quotes can be applied externally.
-String _escapeString(String source) => escape(source).replaceAll("'", r"\'");
diff --git a/unittest/lib/src/matcher/prints_matcher.dart b/unittest/lib/src/matcher/prints_matcher.dart
deleted file mode 100644
index 03c0eaf..0000000
--- a/unittest/lib/src/matcher/prints_matcher.dart
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.prints_matcher;
-
-import 'dart:async';
-
-import 'description.dart';
-import 'expect.dart';
-import 'interfaces.dart';
-import 'future_matchers.dart';
-import 'util.dart';
-
-/// Matches a [Function] that prints text that matches [matcher].
-///
-/// [matcher] may be a String or a [Matcher].
-///
-/// If the function this runs against returns a [Future], all text printed by
-/// the function (using [Zone] scoping) until that Future completes is matched.
-///
-/// This only tracks text printed using the [print] function.
-Matcher prints(matcher) => new _Prints(wrapMatcher(matcher));
-
-class _Prints extends Matcher {
-  final Matcher _matcher;
-
-  _Prints(this._matcher);
-
-  bool matches(item, Map matchState) {
-    if (item is! Function) return false;
-
-    var buffer = new StringBuffer();
-    var result = runZoned(item,
-        zoneSpecification: new ZoneSpecification(print: (_, __, ____, line) {
-      buffer.writeln(line);
-    }));
-
-    if (result is! Future) {
-      var actual = buffer.toString();
-      matchState['prints.actual'] = actual;
-      return _matcher.matches(actual, matchState);
-    }
-
-    return completes.matches(result.then(wrapAsync((_) {
-      expect(buffer.toString(), _matcher);
-    }, 'prints')), matchState);
-  }
-
-  Description describe(Description description) =>
-      description.add('prints ').addDescriptionOf(_matcher);
-
-  Description describeMismatch(
-      item, Description description, Map matchState, bool verbose) {
-    var actual = matchState.remove('prints.actual');
-    if (actual == null) return description;
-    if (actual.isEmpty) return description.add("printed nothing.");
-
-    description.add('printed ').addDescriptionOf(actual);
-
-    // Create a new description for the matcher because at least
-    // [_StringEqualsMatcher] replaces the previous contents of the description.
-    var innerMismatch = _matcher
-        .describeMismatch(actual, new StringDescription(), matchState, verbose)
-        .toString();
-
-    if (innerMismatch.isNotEmpty) {
-      description.add('\n   Which: ').add(innerMismatch.toString());
-    }
-
-    return description;
-  }
-}
diff --git a/unittest/lib/src/matcher/string_matchers.dart b/unittest/lib/src/matcher/string_matchers.dart
deleted file mode 100644
index bf26e5b..0000000
--- a/unittest/lib/src/matcher/string_matchers.dart
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.string_matchers;
-
-import 'interfaces.dart';
-
-/// Returns a matcher which matches if the match argument is a string and
-/// is equal to [value] when compared case-insensitively.
-Matcher equalsIgnoringCase(String value) => new _IsEqualIgnoringCase(value);
-
-class _IsEqualIgnoringCase extends _StringMatcher {
-  final String _value;
-  final String _matchValue;
-
-  _IsEqualIgnoringCase(String value)
-      : _value = value,
-        _matchValue = value.toLowerCase();
-
-  bool matches(item, Map matchState) =>
-      item is String && _matchValue == item.toLowerCase();
-
-  Description describe(Description description) =>
-      description.addDescriptionOf(_value).add(' ignoring case');
-}
-
-/// Returns a matcher which matches if the match argument is a string and
-/// is equal to [value], ignoring whitespace.
-///
-/// In this matcher, "ignoring whitespace" means comparing with all runs of
-/// whitespace collapsed to single space characters and leading and trailing
-/// whitespace removed.
-///
-/// For example, the following will all match successfully:
-///
-///     expect("hello   world", equalsIgnoringWhitespace("hello world"));
-///     expect("  hello world", equalsIgnoringWhitespace("hello world"));
-///     expect("hello world  ", equalsIgnoringWhitespace("hello world"));
-///
-/// The following will not match:
-///
-///     expect("helloworld", equalsIgnoringWhitespace("hello world"));
-///     expect("he llo world", equalsIgnoringWhitespace("hello world"));
-Matcher equalsIgnoringWhitespace(String value) =>
-    new _IsEqualIgnoringWhitespace(value);
-
-class _IsEqualIgnoringWhitespace extends _StringMatcher {
-  final String _value;
-  final String _matchValue;
-
-  _IsEqualIgnoringWhitespace(String value)
-      : _value = value,
-        _matchValue = collapseWhitespace(value);
-
-  bool matches(item, Map matchState) =>
-      item is String && _matchValue == collapseWhitespace(item);
-
-  Description describe(Description description) =>
-      description.addDescriptionOf(_matchValue).add(' ignoring whitespace');
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (item is String) {
-      return mismatchDescription
-          .add('is ')
-          .addDescriptionOf(collapseWhitespace(item))
-          .add(' with whitespace compressed');
-    } else {
-      return super.describeMismatch(
-          item, mismatchDescription, matchState, verbose);
-    }
-  }
-}
-
-/// Returns a matcher that matches if the match argument is a string and
-/// starts with [prefixString].
-Matcher startsWith(String prefixString) => new _StringStartsWith(prefixString);
-
-class _StringStartsWith extends _StringMatcher {
-  final String _prefix;
-
-  const _StringStartsWith(this._prefix);
-
-  bool matches(item, Map matchState) =>
-      item is String && item.startsWith(_prefix);
-
-  Description describe(Description description) =>
-      description.add('a string starting with ').addDescriptionOf(_prefix);
-}
-
-/// Returns a matcher that matches if the match argument is a string and
-/// ends with [suffixString].
-Matcher endsWith(String suffixString) => new _StringEndsWith(suffixString);
-
-class _StringEndsWith extends _StringMatcher {
-  final String _suffix;
-
-  const _StringEndsWith(this._suffix);
-
-  bool matches(item, Map matchState) =>
-      item is String && item.endsWith(_suffix);
-
-  Description describe(Description description) =>
-      description.add('a string ending with ').addDescriptionOf(_suffix);
-}
-
-/// Returns a matcher that matches if the match argument is a string and
-/// contains a given list of [substrings] in relative order.
-///
-/// For example, `stringContainsInOrder(["a", "e", "i", "o", "u"])` will match
-/// "abcdefghijklmnopqrstuvwxyz".
-
-Matcher stringContainsInOrder(List<String> substrings) =>
-    new _StringContainsInOrder(substrings);
-
-class _StringContainsInOrder extends _StringMatcher {
-  final List<String> _substrings;
-
-  const _StringContainsInOrder(this._substrings);
-
-  bool matches(item, Map matchState) {
-    if (!(item is String)) {
-      return false;
-    }
-    var from_index = 0;
-    for (var s in _substrings) {
-      from_index = item.indexOf(s, from_index);
-      if (from_index < 0) return false;
-    }
-    return true;
-  }
-
-  Description describe(Description description) => description.addAll(
-      'a string containing ', ', ', ' in order', _substrings);
-}
-
-/// Returns a matcher that matches if the match argument is a string and
-/// matches the regular expression given by [re].
-///
-/// [re] can be a [RegExp] instance or a [String]; in the latter case it will be
-/// used to create a RegExp instance.
-Matcher matches(re) => new _MatchesRegExp(re);
-
-class _MatchesRegExp extends _StringMatcher {
-  RegExp _regexp;
-
-  _MatchesRegExp(re) {
-    if (re is String) {
-      _regexp = new RegExp(re);
-    } else if (re is RegExp) {
-      _regexp = re;
-    } else {
-      throw new ArgumentError('matches requires a regexp or string');
-    }
-  }
-
-  bool matches(item, Map matchState) =>
-      item is String ? _regexp.hasMatch(item) : false;
-
-  Description describe(Description description) =>
-      description.add("match '${_regexp.pattern}'");
-}
-
-// String matchers match against a string. We add this intermediate
-// class to give better mismatch error messages than the base Matcher class.
-abstract class _StringMatcher extends Matcher {
-  const _StringMatcher();
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (!(item is String)) {
-      return mismatchDescription.addDescriptionOf(item).add(' not a string');
-    } else {
-      return super.describeMismatch(
-          item, mismatchDescription, matchState, verbose);
-    }
-  }
-}
-
-/// Utility function to collapse whitespace runs to single spaces
-/// and strip leading/trailing whitespace.
-String collapseWhitespace(String string) {
-  var result = new StringBuffer();
-  var skipSpace = true;
-  for (var i = 0; i < string.length; i++) {
-    var character = string[i];
-    if (_isWhitespace(character)) {
-      if (!skipSpace) {
-        result.write(' ');
-        skipSpace = true;
-      }
-    } else {
-      result.write(character);
-      skipSpace = false;
-    }
-  }
-  return result.toString().trim();
-}
-
-bool _isWhitespace(String ch) =>
-    ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
diff --git a/unittest/lib/src/matcher/throws_matcher.dart b/unittest/lib/src/matcher/throws_matcher.dart
deleted file mode 100644
index 72f726d..0000000
--- a/unittest/lib/src/matcher/throws_matcher.dart
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.throws_matcher;
-
-import 'dart:async';
-
-import 'expect.dart';
-import 'interfaces.dart';
-import 'util.dart';
-
-/// This can be used to match two kinds of objects:
-///
-///   * A [Function] that throws an exception when called. The function cannot
-///     take any arguments. If you want to test that a function expecting
-///     arguments throws, wrap it in another zero-argument function that calls
-///     the one you want to test.
-///
-///   * A [Future] that completes with an exception. Note that this creates an
-///     asynchronous expectation. The call to `expect()` that includes this will
-///     return immediately and execution will continue. Later, when the future
-///     completes, the actual expectation will run.
-const Matcher throws = const Throws();
-
-/// This can be used to match two kinds of objects:
-///
-///   * A [Function] that throws an exception when called. The function cannot
-///     take any arguments. If you want to test that a function expecting
-///     arguments throws, wrap it in another zero-argument function that calls
-///     the one you want to test.
-///
-///   * A [Future] that completes with an exception. Note that this creates an
-///     asynchronous expectation. The call to `expect()` that includes this will
-///     return immediately and execution will continue. Later, when the future
-///     completes, the actual expectation will run.
-///
-/// In both cases, when an exception is thrown, this will test that the exception
-/// object matches [matcher]. If [matcher] is not an instance of [Matcher], it
-/// will implicitly be treated as `equals(matcher)`.
-Matcher throwsA(matcher) => new Throws(wrapMatcher(matcher));
-
-class Throws extends Matcher {
-  final Matcher _matcher;
-
-  const Throws([Matcher matcher]) : this._matcher = matcher;
-
-  bool matches(item, Map matchState) {
-    if (item is! Function && item is! Future) return false;
-    if (item is Future) {
-      var done = wrapAsync((fn) => fn());
-
-      // Queue up an asynchronous expectation that validates when the future
-      // completes.
-      item.then((value) {
-        done(() {
-          fail("Expected future to fail, but succeeded with '$value'.");
-        });
-      }, onError: (error, trace) {
-        done(() {
-          if (_matcher == null) return;
-          var reason;
-          if (trace != null) {
-            var stackTrace = trace.toString();
-            stackTrace = "  ${stackTrace.replaceAll("\n", "\n  ")}";
-            reason = "Actual exception trace:\n$stackTrace";
-          }
-          expect(error, _matcher, reason: reason);
-        });
-      });
-      // It hasn't failed yet.
-      return true;
-    }
-
-    try {
-      item();
-      return false;
-    } catch (e, s) {
-      if (_matcher == null || _matcher.matches(e, matchState)) {
-        return true;
-      } else {
-        addStateInfo(matchState, {'exception': e, 'stack': s});
-        return false;
-      }
-    }
-  }
-
-  Description describe(Description description) {
-    if (_matcher == null) {
-      return description.add("throws");
-    } else {
-      return description.add('throws ').addDescriptionOf(_matcher);
-    }
-  }
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (item is! Function && item is! Future) {
-      return mismatchDescription.add('is not a Function or Future');
-    } else if (_matcher == null || matchState['exception'] == null) {
-      return mismatchDescription.add('did not throw');
-    } else {
-      mismatchDescription
-          .add('threw ')
-          .addDescriptionOf(matchState['exception']);
-      if (verbose) {
-        mismatchDescription.add(' at ').add(matchState['stack'].toString());
-      }
-      return mismatchDescription;
-    }
-  }
-}
diff --git a/unittest/lib/src/matcher/throws_matchers.dart b/unittest/lib/src/matcher/throws_matchers.dart
deleted file mode 100644
index 92accfd..0000000
--- a/unittest/lib/src/matcher/throws_matchers.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.throws_matchers;
-
-import 'error_matchers.dart';
-import 'interfaces.dart';
-import 'throws_matcher.dart';
-
-/// A matcher for functions that throw ArgumentError.
-const Matcher throwsArgumentError = const Throws(isArgumentError);
-
-/// A matcher for functions that throw ConcurrentModificationError.
-const Matcher throwsConcurrentModificationError =
-    const Throws(isConcurrentModificationError);
-
-/// A matcher for functions that throw CyclicInitializationError.
-const Matcher throwsCyclicInitializationError =
-    const Throws(isCyclicInitializationError);
-
-/// A matcher for functions that throw Exception.
-const Matcher throwsException = const Throws(isException);
-
-/// A matcher for functions that throw FormatException.
-const Matcher throwsFormatException = const Throws(isFormatException);
-
-/// A matcher for functions that throw NoSuchMethodError.
-const Matcher throwsNoSuchMethodError = const Throws(isNoSuchMethodError);
-
-/// A matcher for functions that throw NullThrownError.
-const Matcher throwsNullThrownError = const Throws(isNullThrownError);
-
-/// A matcher for functions that throw RangeError.
-const Matcher throwsRangeError = const Throws(isRangeError);
-
-/// A matcher for functions that throw StateError.
-const Matcher throwsStateError = const Throws(isStateError);
-
-/// A matcher for functions that throw Exception.
-const Matcher throwsUnimplementedError = const Throws(isUnimplementedError);
-
-/// A matcher for functions that throw UnsupportedError.
-const Matcher throwsUnsupportedError = const Throws(isUnsupportedError);
diff --git a/unittest/lib/src/matcher/util.dart b/unittest/lib/src/matcher/util.dart
deleted file mode 100644
index 1550974..0000000
--- a/unittest/lib/src/matcher/util.dart
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.matcher.util;
-
-import 'core_matchers.dart';
-import 'interfaces.dart';
-
-typedef bool _Predicate(value);
-
-/// A [Map] between whitespace characters and their escape sequences.
-const _escapeMap = const {
-  '\n': r'\n',
-  '\r': r'\r',
-  '\f': r'\f',
-  '\b': r'\b',
-  '\t': r'\t',
-  '\v': r'\v',
-  '\x7F': r'\x7F', // delete
-};
-
-/// A [RegExp] that matches whitespace characters that should be escaped.
-final _escapeRegExp = new RegExp(
-    "[\\x00-\\x07\\x0E-\\x1F${_escapeMap.keys.map(_getHexLiteral).join()}]");
-
-/// Useful utility for nesting match states.
-void addStateInfo(Map matchState, Map values) {
-  var innerState = new Map.from(matchState);
-  matchState.clear();
-  matchState['state'] = innerState;
-  matchState.addAll(values);
-}
-
-/// Takes an argument and returns an equivalent [Matcher].
-///
-/// If the argument is already a matcher this does nothing,
-/// else if the argument is a function, it generates a predicate
-/// function matcher, else it generates an equals matcher.
-Matcher wrapMatcher(x) {
-  if (x is Matcher) {
-    return x;
-  } else if (x is _Predicate) {
-    return predicate(x);
-  } else {
-    return equals(x);
-  }
-}
-
-/// Returns [str] with all whitespace characters represented as their escape
-/// sequences.
-///
-/// Backslash characters are escaped as `\\`
-String escape(String str) {
-  str = str.replaceAll('\\', r'\\');
-  return str.replaceAllMapped(_escapeRegExp, (match) {
-    var mapped = _escapeMap[match[0]];
-    if (mapped != null) return mapped;
-    return _getHexLiteral(match[0]);
-  });
-}
-
-/// Given single-character string, return the hex-escaped equivalent.
-String _getHexLiteral(String input) {
-  int rune = input.runes.single;
-  return r'\x' + rune.toRadixString(16).toUpperCase().padLeft(2, '0');
-}
diff --git a/unittest/lib/src/simple_configuration.dart b/unittest/lib/src/simple_configuration.dart
deleted file mode 100644
index 8eac371..0000000
--- a/unittest/lib/src/simple_configuration.dart
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.simple_configuration;
-
-import 'dart:isolate';
-
-import 'matcher.dart'
-    show DefaultFailureHandler, configureExpectFailureHandler, TestFailure;
-
-import '../unittest.dart';
-import 'internal_test_case.dart';
-import 'utils.dart';
-
-// A custom failure handler for [expect] that routes failures to the
-// [SimpleConfiguration].
-class _ExpectFailureHandler extends DefaultFailureHandler {
-  final SimpleConfiguration _config;
-
-  _ExpectFailureHandler(this._config);
-
-  void fail(String reason) {
-    _config.onExpectFailure(reason);
-  }
-}
-
-/// A configuration that provides hooks to configure the unittest library for
-/// different platforms.
-///
-/// This class implements the [Configuration] API in a platform-independent way.
-/// Tests that want to take advantage of the platform can create a subclass and
-/// override methods from this class.
-class SimpleConfiguration extends Configuration {
-  /// A port that keeps the VM alive while we wait for asynchronous tests to
-  /// finish.
-  ///
-  /// The VM won't shut down as long as there's an open receive port.
-  ReceivePort _receivePort;
-
-  /// The name of the configuration.
-  ///
-  /// Subclasses can override this with something useful for diagnostics. It's
-  /// particularly useful for parent/child configurations such as layout tests.
-  final name = 'Configuration';
-
-  /// If true (the default), throw an exception once all tests have run if any failed.
-  bool throwOnTestFailures = true;
-
-  /// If true (the default), then tests will stop after the first failed
-  /// [expect].
-  ///
-  /// If false, failed [expect]s will not cause the test to stop. Other
-  /// exceptions will still terminate the test.
-  bool stopTestOnExpectFailure = true;
-
-  // If [stopTestOnExpectFailure] is false, the list of failed [expect]s.
-  final _testLogBuffer = <Pair<String, StackTrace>>[];
-
-  /// The constructor sets up a failure handler for [expect] that redirects
-  /// [expect] failures to [onExpectFailure].
-  SimpleConfiguration() : super.blank() {
-    configureExpectFailureHandler(new _ExpectFailureHandler(this));
-  }
-
-  void onInit() {
-    // For Dart internal tests, we don't want stack frame filtering.
-    // We turn it off here in the default config, but by default turn
-    // it back on in the vm and html configs.
-    filterStacks = false;
-    _receivePort = new ReceivePort();
-    _postMessage('unittest-suite-wait-for-done');
-  }
-
-  /// Called when a test starts.
-  ///
-  /// Derived classes should call this first before their own override code.
-  void onTestStart(TestCase testCase) => _testLogBuffer.clear();
-
-  /// Called when a test completes.
-  ///
-  /// Derived classes should call this first before their own override code.
-  void onTestResult(TestCase externalTestCase) {
-    if (stopTestOnExpectFailure || _testLogBuffer.isEmpty) return;
-
-    var testCase = externalTestCase as InternalTestCase;
-
-    // Write the message/stack pairs up to the last pairs.
-    var reason = new StringBuffer();
-    for (var reasonAndTrace in _testLogBuffer.take(_testLogBuffer.length - 1)) {
-      reason.write(reasonAndTrace.first);
-      reason.write('\n');
-      reason.write(reasonAndTrace.last);
-      reason.write('\n');
-    }
-
-    var lastReasonAndTrace = _testLogBuffer.last;
-    // Write the last message.
-    reason.write(lastReasonAndTrace.first);
-    if (testCase.result == PASS) {
-      testCase.result = FAIL;
-      testCase.message = reason.toString();
-      // Use the last stack as the overall failure stack.
-      testCase.stackTrace = lastReasonAndTrace.last;
-    } else {
-      // Add the last stack to the message; we have a further stack
-      // caused by some other failure.
-      reason.write(lastReasonAndTrace.last);
-      reason.write('\n');
-      // Add the existing reason to the end of the expect log to
-      // create the final message.
-      testCase.message = '${reason.toString()}\n${testCase.message}';
-    }
-  }
-
-  /// Handles the logging of messages by a test case.
-  ///
-  /// The default in this base configuration is to call [print].
-  void onLogMessage(TestCase testCase, String message) {
-    print(message);
-  }
-
-  /// Handles failures from [expect].
-  ///
-  /// If [stopTestOnExpectFailure] is true, this throws a [TestFailure].
-  /// Otherwise, this stores the error.
-  void onExpectFailure(String reason) {
-    if (stopTestOnExpectFailure) throw new TestFailure(reason);
-
-    try {
-      throw '';
-    } catch (_, stack) {
-      var trace = getTrace(stack, formatStacks, filterStacks);
-      if (trace == null) trace = stack;
-      _testLogBuffer.add(new Pair<String, StackTrace>(reason, trace));
-    }
-  }
-
-  /// Returns a formatted string description of a test result.
-  String formatResult(TestCase testCase) {
-    var result = new StringBuffer();
-    result.write(testCase.result.toUpperCase());
-    result.write(": ");
-    result.write(testCase.description);
-    result.write("\n");
-
-    if (testCase.message != '') {
-      result.write(indent(testCase.message));
-      result.write("\n");
-    }
-
-    if (testCase.stackTrace != null) {
-      result.write(indent(testCase.stackTrace.toString()));
-      result.write("\n");
-    }
-    return result.toString();
-  }
-
-  /// Called with the result of all test cases.
-  ///
-  /// The default implementation prints the result summary using [print],
-  /// formatted with [formatResult]. Browser tests commonly override this to
-  /// reformat the output.
-  ///
-  /// When [uncaughtError] is not null, it contains an error that occured
-  /// outside of tests (e.g. setting up the test).
-  void onSummary(int passed, int failed, int errors, List<TestCase> results,
-      String uncaughtError) {
-    // Print each test's result.
-    for (var test in results) {
-      print(formatResult(test).trim());
-    }
-
-    // Show the summary.
-    print('');
-
-    if (passed == 0 && failed == 0 && errors == 0 && uncaughtError == null) {
-      print('No tests found.');
-      // This is considered a failure too.
-    } else if (failed == 0 && errors == 0 && uncaughtError == null) {
-      print('All $passed tests passed.');
-    } else {
-      if (uncaughtError != null) {
-        print('Top-level uncaught error: $uncaughtError');
-      }
-      print('$passed PASSED, $failed FAILED, $errors ERRORS');
-    }
-  }
-
-  void onDone(bool success) {
-    if (success) {
-      _postMessage('unittest-suite-success');
-      _receivePort.close();
-    } else {
-      _receivePort.close();
-      if (throwOnTestFailures) {
-        throw new Exception('Some tests failed.');
-      }
-    }
-  }
-
-  void _postMessage(String message) {
-    // In dart2js browser tests, the JavaScript-based test controller
-    // intercepts calls to print and listens for "secret" messages.
-    print(message);
-  }
-}
diff --git a/unittest/lib/src/test_case.dart b/unittest/lib/src/test_case.dart
deleted file mode 100644
index 37596ff..0000000
--- a/unittest/lib/src/test_case.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.test_case;
-
-import '../unittest.dart';
-
-/// An individual unit test.
-abstract class TestCase {
-  /// A unique numeric identifier for this test case.
-  int get id;
-
-  /// A description of what the test is specifying.
-  String get description;
-
-  /// The error or failure message for the tests.
-  ///
-  /// Initially an empty string.
-  String get message;
-
-  /// The result of the test case.
-  ///
-  /// If the test case has is completed, this will be one of [PASS], [FAIL], or
-  /// [ERROR]. Otherwise, it will be `null`.
-  String get result;
-
-  /// Returns whether this test case passed.
-  bool get passed;
-
-  /// The stack trace for the error that caused this test case to fail, or
-  /// `null` if it succeeded.
-  StackTrace get stackTrace;
-
-  /// The name of the group within which this test is running.
-  String get currentGroup;
-
-  /// The time the test case started running.
-  ///
-  /// `null` if the test hasn't yet begun running.
-  DateTime get startTime;
-
-  /// The amount of time the test case took.
-  ///
-  /// `null` if the test hasn't finished running.
-  Duration get runningTime;
-
-  /// Whether this test is enabled.
-  ///
-  /// Disabled tests won't be run.
-  bool get enabled;
-
-  /// Whether this test case has finished running.
-  bool get isComplete => !enabled || result != null;
-}
diff --git a/unittest/lib/src/test_environment.dart b/unittest/lib/src/test_environment.dart
deleted file mode 100644
index 6c205a9..0000000
--- a/unittest/lib/src/test_environment.dart
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.test_environment;
-
-import 'dart:async';
-
-import 'configuration.dart';
-import 'group_context.dart';
-import 'internal_test_case.dart';
-
-/// The default unittest environment.
-final _defaultEnvironment = new TestEnvironment();
-
-/// The current unittest environment.
-TestEnvironment get environment {
-  var environment = Zone.current[#unittest.environment];
-  return environment == null ? _defaultEnvironment : environment;
-}
-
-// The current environment's configuration.
-Configuration get config => environment.config;
-
-/// Encapsulates the state of the test environment.
-///
-/// This is used by the [withTestEnvironment] method to support multiple
-/// invocations of the unittest library within the same application
-/// instance.
-class TestEnvironment {
-  /// The environment's configuration.
-  Configuration config;
-
-  /// The top-level group context.
-  ///
-  /// We use a 'dummy' context for the top level to eliminate null checks when
-  /// querying the context. This allows us to easily support top-level
-  /// [setUp]/[tearDown] functions as well.
-  final rootContext = new GroupContext.root();
-
-  /// The current group context.
-  GroupContext currentContext;
-
-  /// The [currentTestCaseIndex] represents the index of the currently running
-  /// test case.
-  ///
-  /// If this is -1 it implies the test system is not running.
-  /// It will be set to [number of test cases] as a short-lived state flagging
-  /// that the last test has completed.
-  int currentTestCaseIndex = -1;
-
-  /// The [initialized] variable specifies whether the framework
-  /// has been initialized.
-  bool initialized = false;
-
-  /// The time since we last gave asynchronous code a chance to be scheduled.
-  int lastBreath = new DateTime.now().millisecondsSinceEpoch;
-
-  /// The number of [solo_group]s deep we are currently.
-  int soloNestingLevel = 0;
-
-  /// Whether we've seen a [solo_test].
-  bool soloTestSeen = false;
-
-  /// The list of test cases to run.
-  final testCases = new List<InternalTestCase>();
-
-  /// The error message that is printed in the test summary.
-  String uncaughtErrorMessage;
-
-  TestEnvironment() {
-    currentContext = rootContext;
-  }
-}
diff --git a/unittest/lib/src/utils.dart b/unittest/lib/src/utils.dart
deleted file mode 100644
index ea1e92e..0000000
--- a/unittest/lib/src/utils.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest.utils;
-
-import 'package:stack_trace/stack_trace.dart';
-
-/// Indent each line in [str] by two spaces.
-String indent(String str) =>
-    str.replaceAll(new RegExp("^", multiLine: true), "  ");
-
-/// A pair of values.
-class Pair<E, F> {
-  final E first;
-  final F last;
-
-  Pair(this.first, this.last);
-
-  String toString() => '($first, $last)';
-
-  bool operator ==(other) {
-    if (other is! Pair) return false;
-    return other.first == first && other.last == last;
-  }
-
-  int get hashCode => first.hashCode ^ last.hashCode;
-}
-
-/// Returns a Trace object from a StackTrace object or a String, or the
-/// unchanged input if formatStacks is false;
-Trace getTrace(stack, bool formatStacks, bool filterStacks) {
-  Trace trace;
-  if (stack == null || !formatStacks) return null;
-  if (stack is String) {
-    trace = new Trace.parse(stack);
-  } else if (stack is StackTrace) {
-    trace = new Trace.from(stack);
-  } else {
-    throw new Exception('Invalid stack type ${stack.runtimeType} for $stack.');
-  }
-
-  if (!filterStacks) return trace;
-
-  // Format the stack trace by removing everything above TestCase._runTest,
-  // which is usually going to be irrelevant. Also fold together unittest and
-  // core library calls so only the function the user called is visible.
-  return new Trace(trace.frames.takeWhile((frame) {
-    return frame.package != 'unittest' || frame.member != 'TestCase._runTest';
-  })).terse.foldFrames((frame) => frame.package == 'unittest' || frame.isCore);
-}
diff --git a/unittest/lib/unittest.dart b/unittest/lib/unittest.dart
deleted file mode 100644
index 852b60d..0000000
--- a/unittest/lib/unittest.dart
+++ /dev/null
@@ -1,682 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittest;
-
-import 'dart:async';
-import 'dart:collection';
-
-import 'src/configuration.dart';
-import 'src/expected_function.dart';
-import 'src/group_context.dart';
-import 'src/internal_test_case.dart';
-import 'src/matcher.dart' show TestFailure, wrapAsync;
-import 'src/test_case.dart';
-import 'src/test_environment.dart';
-
-export 'src/configuration.dart';
-export 'src/matcher.dart';
-export 'src/simple_configuration.dart';
-export 'src/test_case.dart';
-
-/// The signature for a function passed to [test].
-typedef dynamic TestFunction();
-
-/// [Configuration] used by the unittest library.
-///
-/// Note that if a configuration has not been set, calling this getter will
-/// create a default configuration.
-Configuration get unittestConfiguration {
-  if (config == null) environment.config = new Configuration();
-  return config;
-}
-
-/// If `true`, stack traces are reformatted to be more readable.
-bool formatStacks = true;
-
-/// If `true`, irrelevant frames are filtered from the stack trace.
-///
-/// This does nothing if [formatStacks] is false.
-bool filterStacks = true;
-
-/// Separator used between group names and test names.
-String groupSep = ' ';
-
-/// Sets the [Configuration] used by the unittest library.
-///
-/// Throws a [StateError] if there is an existing, incompatible value.
-void set unittestConfiguration(Configuration value) {
-  if (identical(config, value)) return;
-  if (config != null) {
-    logMessage('Warning: The unittestConfiguration has already been set. New '
-        'unittestConfiguration ignored.');
-  } else {
-    environment.config = value;
-  }
-}
-
-/// Logs [message] associated with the current test case.
-///
-/// Tests should use this instead of [print].
-void logMessage(String message) =>
-    config.onLogMessage(currentTestCase, message);
-
-/// The test cases that have been defined so far.
-List<TestCase> get testCases =>
-    new UnmodifiableListView<TestCase>(environment.testCases);
-
-/// The interval (in milliseconds) after which a non-microtask asynchronous
-/// delay will be scheduled between tests.
-///
-/// This is used to avoid starving the DOM or other non-microtask events.
-const int BREATH_INTERVAL = 200;
-
-/// The [TestCase] currently being executed.
-TestCase get currentTestCase => (environment.currentTestCaseIndex >= 0 &&
-        environment.currentTestCaseIndex < testCases.length)
-    ? testCases[environment.currentTestCaseIndex]
-    : null;
-
-/// The same as [currentTestCase], but typed as an [InternalTestCase].
-InternalTestCase get _currentTestCase => currentTestCase as InternalTestCase;
-
-/// The result string for a passing test case.
-const PASS = 'pass';
-
-/// The result string for a failing test case.
-const FAIL = 'fail';
-
-/// The result string for an test case with an error.
-const ERROR = 'error';
-
-/// Creates a new test case with the given description and body.
-///
-/// The description will be added to the descriptions of any surrounding
-/// [group]s.
-void test(String description, TestFunction body) {
-  _requireNotRunning();
-  ensureInitialized();
-
-  if (environment.soloTestSeen && environment.soloNestingLevel == 0) return;
-  var testCase = new InternalTestCase(
-      testCases.length + 1, _fullDescription(description), body);
-  environment.testCases.add(testCase);
-}
-
-/// Returns [description] with all of its group prefixes prepended.
-String _fullDescription(String description) {
-  var group = environment.currentContext.fullName;
-  if (description == null) return group;
-  return group != '' ? '$group$groupSep$description' : description;
-}
-
-/// A convenience function for skipping a test.
-void skip_test(String spec, TestFunction body) {}
-
-/// Creates a new test case with the given description and body.
-///
-/// If [solo_test] is used instead of [test], then all non-solo tests will be
-/// disabled. Note that if [solo_group] is used as well, all tests in the group
-/// will be enabled, regardless of whether they use [test] or [solo_test], or
-/// whether they are in a nested [group] versus [solo_group]. Put another way,
-/// if there are any calls to [solo_test] or [solo_group] in a test file, all
-/// tests that are not inside a [solo_group] will be disabled unless they are
-/// [solo_test]s.
-void solo_test(String spec, TestFunction body) {
-  _requireNotRunning();
-  ensureInitialized();
-  if (!environment.soloTestSeen) {
-    environment.soloTestSeen = true;
-    // This is the first solo-ed test. Discard all tests up to now.
-    environment.testCases.clear();
-  }
-  environment.soloNestingLevel++;
-  try {
-    test(spec, body);
-  } finally {
-    environment.soloNestingLevel--;
-  }
-}
-
-/// Indicate that [callback] is expected to be called [count] number of times
-/// (by default 1).
-///
-/// The unittest framework will wait for the callback to run the [count] times
-/// before it considers the current test to be complete. Using [expectAsync]
-/// will also ensure that errors that occur within [callback] are tracked and
-/// reported. [callback] may take up to six optional or required positional
-/// arguments; named arguments are not supported.
-///
-/// [max] can be used to specify an upper bound on the number of calls; if this
-/// is exceeded the test will fail. If [max] is `0` (the default), the callback
-/// is expected to be called exactly [count] times. If [max] is `-1`, the
-/// callback is allowed to be called any number of times greater than [count].
-///
-/// Both [id] and [reason] are optional and provide extra information about the
-/// callback when debugging. [id] should be the name of the callback, while
-/// [reason] should be the reason the callback is expected to be called.
-Function expectAsync(Function callback,
-    {int count: 1, int max: 0, String id, String reason}) =>
-        new ExpectedFunction(callback, count, max, id: id, reason: reason).func;
-
-// Functions used to check how many arguments a callback takes.
-typedef T Func0<T>();
-typedef T Func1<T, A>(A a);
-typedef T Func2<T, A, B>(A a, B b);
-typedef T Func3<T, A, B, C>(A a, B b, C c);
-typedef T Func4<T, A, B, C, D>(A a, B b, C c, D d);
-typedef T Func5<T, A, B, C, D, E>(A a, B b, C c, D d, E e);
-typedef T Func6<T, A, B, C, D, E, F>(A a, B b, C c, D d, E e, F f);
-
-/// Informs the framework that the given [callback] of arity 0 is expected to be
-/// called [count] number of times (by default 1).
-///
-/// Returns a wrapped function that should be used as a replacement of the
-/// original callback.
-///
-/// The test framework will wait for the callback to run the [count] times
-/// before it considers the current test to be complete.
-///
-/// [max] can be used to specify an upper bound on the number of calls; if this
-/// is exceeded the test will fail. If [max] is `0` (the default), the callback
-/// is expected to be called exactly [count] times. If [max] is `-1`, the
-/// callback is allowed to be called any number of times greater than [count].
-///
-/// Both [id] and [reason] are optional and provide extra information about the
-/// callback when debugging. [id] should be the name of the callback, while
-/// [reason] should be the reason the callback is expected to be called.
-///
-/// This method takes callbacks with zero arguments. See also
-/// [expectAsync1], [expectAsync2], [expectAsync3], [expectAsync4],
-/// [expectAsync5], and [expectAsync6] for callbacks with different arity.
-Func0<dynamic/*=T*/ > expectAsync0/*<T>*/(dynamic/*=T*/ callback(),
-    {int count: 1, int max: 0, String id, String reason}) {
-  return new ExpectedFunction/*<T>*/(callback, count, max,
-      id: id, reason: reason)
-      .max0;
-}
-
-/// Informs the framework that the given [callback] of arity 1 is expected to be
-/// called [count] number of times (by default 1).
-///
-/// Returns a wrapped function that should be used as a replacement of the
-/// original callback.
-///
-/// The test framework will wait for the callback to run the [count] times
-/// before it considers the current test to be complete.
-///
-/// [max] can be used to specify an upper bound on the number of calls; if this
-/// is exceeded the test will fail. If [max] is `0` (the default), the callback
-/// is expected to be called exactly [count] times. If [max] is `-1`, the
-/// callback is allowed to be called any number of times greater than [count].
-///
-/// Both [id] and [reason] are optional and provide extra information about the
-/// callback when debugging. [id] should be the name of the callback, while
-/// [reason] should be the reason the callback is expected to be called.
-///
-/// This method takes callbacks with one argument. See also
-/// [expectAsync0], [expectAsync2], [expectAsync3], [expectAsync4],
-/// [expectAsync5], and [expectAsync6] for callbacks with different arity.
-Func1<dynamic/*=T*/, dynamic/*=A*/ > expectAsync1/*<T, A>*/(
-    dynamic/*=T*/ callback(dynamic/*=A*/ a),
-    {int count: 1,
-    int max: 0,
-    String id,
-    String reason}) {
-  return new ExpectedFunction/*<T>*/(callback, count, max,
-      id: id, reason: reason)
-      .max1;
-}
-
-/// Informs the framework that the given [callback] of arity 2 is expected to be
-/// called [count] number of times (by default 1).
-///
-/// Returns a wrapped function that should be used as a replacement of the
-/// original callback.
-///
-/// The test framework will wait for the callback to run the [count] times
-/// before it considers the current test to be complete.
-///
-/// [max] can be used to specify an upper bound on the number of calls; if this
-/// is exceeded the test will fail. If [max] is `0` (the default), the callback
-/// is expected to be called exactly [count] times. If [max] is `-1`, the
-/// callback is allowed to be called any number of times greater than [count].
-///
-/// Both [id] and [reason] are optional and provide extra information about the
-/// callback when debugging. [id] should be the name of the callback, while
-/// [reason] should be the reason the callback is expected to be called.
-///
-/// This method takes callbacks with two arguments. See also
-/// [expectAsync0], [expectAsync1], [expectAsync3], [expectAsync4],
-/// [expectAsync5], and [expectAsync6] for callbacks with different arity.
-Func2<dynamic/*=T*/, dynamic/*=A*/, dynamic/*=B*/ > expectAsync2/*<T, A, B>*/(
-    dynamic/*=T*/ callback(dynamic/*=A*/ a, dynamic/*=B*/ b),
-    {int count: 1,
-    int max: 0,
-    String id,
-    String reason}) {
-  return new ExpectedFunction/*<T>*/(callback, count, max,
-      id: id, reason: reason)
-      .max2;
-}
-
-/// Informs the framework that the given [callback] of arity 3 is expected to be
-/// called [count] number of times (by default 1).
-///
-/// Returns a wrapped function that should be used as a replacement of the
-/// original callback.
-///
-/// The test framework will wait for the callback to run the [count] times
-/// before it considers the current test to be complete.
-///
-/// [max] can be used to specify an upper bound on the number of calls; if this
-/// is exceeded the test will fail. If [max] is `0` (the default), the callback
-/// is expected to be called exactly [count] times. If [max] is `-1`, the
-/// callback is allowed to be called any number of times greater than [count].
-///
-/// Both [id] and [reason] are optional and provide extra information about the
-/// callback when debugging. [id] should be the name of the callback, while
-/// [reason] should be the reason the callback is expected to be called.
-///
-/// This method takes callbacks with three arguments. See also
-/// [expectAsync0], [expectAsync1], [expectAsync2], [expectAsync4],
-/// [expectAsync5], and [expectAsync6] for callbacks with different arity.
-Func3<dynamic/*=T*/, dynamic/*=A*/, dynamic/*=B*/, dynamic/*=C*/ >
-expectAsync3/*<T, A, B, C>*/(
-    dynamic/*=T*/ callback(
-        dynamic/*=A*/ a, dynamic/*=B*/ b, dynamic/*=C*/ c),
-    {int count: 1,
-    int max: 0,
-    String id,
-    String reason}) {
-  return new ExpectedFunction/*<T>*/(callback, count, max,
-      id: id, reason: reason)
-      .max3;
-}
-
-/// Informs the framework that the given [callback] of arity 4 is expected to be
-/// called [count] number of times (by default 1).
-///
-/// Returns a wrapped function that should be used as a replacement of the
-/// original callback.
-///
-/// The test framework will wait for the callback to run the [count] times
-/// before it considers the current test to be complete.
-///
-/// [max] can be used to specify an upper bound on the number of calls; if this
-/// is exceeded the test will fail. If [max] is `0` (the default), the callback
-/// is expected to be called exactly [count] times. If [max] is `-1`, the
-/// callback is allowed to be called any number of times greater than [count].
-///
-/// Both [id] and [reason] are optional and provide extra information about the
-/// callback when debugging. [id] should be the name of the callback, while
-/// [reason] should be the reason the callback is expected to be called.
-///
-/// This method takes callbacks with four arguments. See also
-/// [expectAsync0], [expectAsync1], [expectAsync2], [expectAsync3],
-/// [expectAsync5], and [expectAsync6] for callbacks with different arity.
-Func4<dynamic/*=T*/, dynamic/*=A*/, dynamic/*=B*/, dynamic/*=C*/,
-    dynamic/*=D*/ >
-expectAsync4/*<T, A, B, C, D>*/(
-    dynamic/*=T*/ callback(
-        dynamic/*=A*/ a, dynamic/*=B*/ b, dynamic/*=C*/ c, dynamic/*=D*/ d),
-    {int count: 1,
-    int max: 0,
-    String id,
-    String reason}) {
-  return new ExpectedFunction/*<T>*/(callback, count, max,
-      id: id, reason: reason)
-      .max4;
-}
-
-/// Informs the framework that the given [callback] of arity 5 is expected to be
-/// called [count] number of times (by default 1).
-///
-/// Returns a wrapped function that should be used as a replacement of the
-/// original callback.
-///
-/// The test framework will wait for the callback to run the [count] times
-/// before it considers the current test to be complete.
-///
-/// [max] can be used to specify an upper bound on the number of calls; if this
-/// is exceeded the test will fail. If [max] is `0` (the default), the callback
-/// is expected to be called exactly [count] times. If [max] is `-1`, the
-/// callback is allowed to be called any number of times greater than [count].
-///
-/// Both [id] and [reason] are optional and provide extra information about the
-/// callback when debugging. [id] should be the name of the callback, while
-/// [reason] should be the reason the callback is expected to be called.
-///
-/// This method takes callbacks with five arguments. See also
-/// [expectAsync0], [expectAsync1], [expectAsync2], [expectAsync3],
-/// [expectAsync4], and [expectAsync6] for callbacks with different arity.
-Func5<dynamic/*=T*/, dynamic/*=A*/, dynamic/*=B*/, dynamic/*=C*/, dynamic/*=D*/,
-    dynamic/*=E*/ >
-expectAsync5/*<T, A, B, C, D, E>*/(
-    dynamic/*=T*/ callback(dynamic/*=A*/ a, dynamic/*=B*/ b,
-        dynamic/*=C*/ c, dynamic/*=D*/ d, dynamic/*=E*/ e),
-    {int count: 1,
-    int max: 0,
-    String id,
-    String reason}) {
-  return new ExpectedFunction/*<T>*/(callback, count, max,
-      id: id, reason: reason)
-      .max5;
-}
-
-/// Informs the framework that the given [callback] of arity 6 is expected to be
-/// called [count] number of times (by default 1).
-///
-/// Returns a wrapped function that should be used as a replacement of the
-/// original callback.
-///
-/// The test framework will wait for the callback to run the [count] times
-/// before it considers the current test to be complete.
-///
-/// [max] can be used to specify an upper bound on the number of calls; if this
-/// is exceeded the test will fail. If [max] is `0` (the default), the callback
-/// is expected to be called exactly [count] times. If [max] is `-1`, the
-/// callback is allowed to be called any number of times greater than [count].
-///
-/// Both [id] and [reason] are optional and provide extra information about the
-/// callback when debugging. [id] should be the name of the callback, while
-/// [reason] should be the reason the callback is expected to be called.
-///
-/// This method takes callbacks with six arguments. See also
-/// [expectAsync0], [expectAsync1], [expectAsync2], [expectAsync3],
-/// [expectAsync4], and [expectAsync5] for callbacks with different arity.
-Func6<dynamic/*=T*/, dynamic/*=A*/, dynamic/*=B*/, dynamic/*=C*/, dynamic/*=D*/,
-    dynamic/*=E*/, dynamic/*=F*/ >
-expectAsync6/*<T, A, B, C, D, E, F>*/(
-    dynamic/*=T*/ callback(dynamic/*=A*/ a, dynamic/*=B*/ b,
-        dynamic/*=C*/ c, dynamic/*=D*/ d, dynamic/*=E*/ e, dynamic/*=F*/ f),
-    {int count: 1,
-    int max: 0,
-    String id,
-    String reason}) {
-  return new ExpectedFunction/*<T>*/(callback, count, max,
-      id: id, reason: reason)
-      .max6;
-}
-
-/// Indicate that [callback] is expected to be called until [isDone] returns
-/// true.
-///
-/// [isDone] is called after each time the function is run. Only when it returns
-/// true will the callback be considered complete. Using [expectAsyncUntil] will
-/// also ensure that errors that occur within [callback] are tracked and
-/// reported. [callback] may take up to six optional or required positional
-/// arguments; named arguments are not supported.
-///
-/// Both [id] and [reason] are optional and provide extra information about the
-/// callback when debugging. [id] should be the name of the callback, while
-/// [reason] should be the reason the callback is expected to be called.
-Function expectAsyncUntil(Function callback, bool isDone(),
-    {String id, String reason}) => new ExpectedFunction(callback, 0, -1,
-        id: id, reason: reason, isDone: isDone).func;
-
-/// Creates a group of tests.
-///
-/// A group's description is included in the descriptions of any tests or
-/// sub-groups it contains. [setUp] and [tearDown] are also scoped to the
-/// containing group.
-void group(String description, void body()) {
-  ensureInitialized();
-  _requireNotRunning();
-  environment.currentContext =
-      new GroupContext(environment.currentContext, description);
-  try {
-    body();
-  } catch (e, trace) {
-    var stack = (trace == null) ? '' : ': ${trace.toString()}';
-    environment.uncaughtErrorMessage = "${e.toString()}$stack";
-  } finally {
-    // Now that the group is over, restore the previous one.
-    environment.currentContext = environment.currentContext.parent;
-  }
-}
-
-/// A convenience function for skipping a group of tests.
-void skip_group(String description, void body()) {}
-
-/// Creates a group of tests.
-///
-/// If [solo_group] is used instead of [group], then all tests not declared with
-/// [solo_test] or in a [solo_group] will be disabled. Note that all tests in a
-/// [solo_group] will be run, regardless of whether they're declared with [test]
-/// or [solo_test].
-///
-/// [skip_test] and [skip_group] take precedence over [solo_group].
-void solo_group(String description, void body()) {
-  _requireNotRunning();
-  ensureInitialized();
-  if (!environment.soloTestSeen) {
-    environment.soloTestSeen = true;
-    // This is the first solo-ed group. Discard all tests up to now.
-    environment.testCases.clear();
-  }
-  ++environment.soloNestingLevel;
-  try {
-    group(description, body);
-  } finally {
-    --environment.soloNestingLevel;
-  }
-}
-
-/// Registers a function to be run before tests.
-///
-/// This function will be called before each test is run. [callback] may be
-/// asynchronous; if so, it must return a [Future].
-///
-/// If this is called within a test group, it applies only to tests in that
-/// group. [callback] will be run after any set-up callbacks in parent groups or
-/// at the top level.
-void setUp(Function callback) {
-  _requireNotRunning();
-  environment.currentContext.testSetUp = callback;
-}
-
-/// Registers a function to be run after tests.
-///
-/// This function will be called after each test is run. [callback] may be
-/// asynchronous; if so, it must return a [Future].
-///
-/// If this is called within a test group, it applies only to tests in that
-/// group. [callback] will be run before any tear-down callbacks in parent groups or
-/// at the top level.
-void tearDown(Function callback) {
-  _requireNotRunning();
-  environment.currentContext.testTearDown = callback;
-}
-
-/// Advance to the next test case.
-void _nextTestCase() {
-  environment.currentTestCaseIndex++;
-  _runTest();
-}
-
-/// Handle an error that occurs outside of any test.
-void handleExternalError(e, String message, [stackTrace]) {
-  var msg = '$message\nCaught $e';
-
-  if (currentTestCase != null) {
-    _currentTestCase.error(msg, stackTrace);
-  } else {
-    environment.uncaughtErrorMessage = "$msg: $stackTrace";
-  }
-}
-
-typedef bool _TestFilter(InternalTestCase arg);
-
-/// Remove any tests that match [testFilter].
-///
-/// [testFilter] can be a predicate function, a [RegExp], or a [String]. If it's
-/// a function, it's called with each [TestCase]. If it's a [String], it's
-/// parsed as a [RegExp] and matched against each [TestCase.description].
-///
-/// This is different from enabling or disabling tests in that it removes the
-/// tests completely.
-void filterTests(testFilter) {
-  _TestFilter filterFunction;
-  if (testFilter is String) {
-    var re = new RegExp(testFilter);
-    filterFunction = (t) => re.hasMatch(t.description);
-  } else if (testFilter is RegExp) {
-    filterFunction = (t) => testFilter.hasMatch(t.description);
-  } else if (testFilter is _TestFilter) {
-    filterFunction = testFilter;
-  }
-  environment.testCases.retainWhere(filterFunction);
-}
-
-/// Runs all queued tests, one at a time.
-void runTests() {
-  _requireNotRunning();
-  _ensureInitialized(false);
-  environment.currentTestCaseIndex = 0;
-  config.onStart();
-  _runTest();
-}
-
-/// Registers an exception that was caught for the current test.
-void registerException(error, [StackTrace stackTrace]) =>
-    _currentTestCase.registerException(error, stackTrace);
-
-/// Runs the next test.
-void _runTest() {
-  if (environment.currentTestCaseIndex >= testCases.length) {
-    assert(environment.currentTestCaseIndex == testCases.length);
-    _completeTests();
-    return;
-  }
-
-  var testCase = _currentTestCase;
-  var f = runZoned(testCase.run, onError: (error, stack) {
-    // TODO(kevmoo) Do a better job of flagging these are async errors.
-    // https://code.google.com/p/dart/issues/detail?id=16530
-    testCase.registerException(error, stack);
-  });
-
-  var timer;
-  var timeout = unittestConfiguration.timeout;
-  if (timeout != null) {
-    try {
-      timer = new Timer(timeout, () {
-        testCase.error("Test timed out after ${timeout.inSeconds} seconds.");
-        _nextTestCase();
-      });
-    } on UnsupportedError catch (e) {
-      if (e.message != "Timer greater than 0.") rethrow;
-      // Support running on d8 and jsshell which don't support timers.
-    }
-  }
-
-  f.whenComplete(() {
-    if (timer != null) timer.cancel();
-    var now = new DateTime.now().millisecondsSinceEpoch;
-    if (now - environment.lastBreath >= BREATH_INTERVAL) {
-      environment.lastBreath = now;
-      Timer.run(_nextTestCase);
-    } else {
-      scheduleMicrotask(_nextTestCase); // Schedule the next test.
-    }
-  });
-}
-
-/// Notify the configuration that the testing has finished.
-void _completeTests() {
-  if (!environment.initialized) return;
-
-  var passed = 0;
-  var failed = 0;
-  var errors = 0;
-  for (var testCase in testCases) {
-    switch (testCase.result) {
-      case PASS:
-        passed++;
-        break;
-      case FAIL:
-        failed++;
-        break;
-      case ERROR:
-        errors++;
-        break;
-    }
-  }
-
-  config.onSummary(
-      passed, failed, errors, testCases, environment.uncaughtErrorMessage);
-  config.onDone(passed > 0 &&
-      failed == 0 &&
-      errors == 0 &&
-      environment.uncaughtErrorMessage == null);
-  environment.initialized = false;
-  environment.currentTestCaseIndex = -1;
-}
-
-/// Initializes the test environment if it hasn't already been initialized.
-void ensureInitialized() {
-  _ensureInitialized(true);
-}
-
-/// Initializes the test environment.
-///
-/// If [configAutoStart] is `true`, schedule a microtask to run the tests. This
-/// microtask is expected to run after all the tests are defined.
-void _ensureInitialized(bool configAutoStart) {
-  if (environment.initialized) return;
-
-  environment.initialized = true;
-  // Hook our async guard into the matcher library.
-  wrapAsync = (f, [id]) => expectAsync(f, id: id);
-
-  environment.uncaughtErrorMessage = null;
-
-  unittestConfiguration.onInit();
-
-  // Immediately queue the suite up. It will run after a timeout (i.e. after
-  // main() has returned).
-  if (configAutoStart && config.autoStart) scheduleMicrotask(runTests);
-}
-
-/// Remove all tests other than the one identified by [id].
-void setSoloTest(int id) =>
-    environment.testCases.retainWhere((t) => t.id == id);
-
-/// Enable the test identified by [id].
-void enableTest(int id) => _setTestEnabledState(id, enable: true);
-
-/// Disable the test by [id].
-void disableTest(int id) => _setTestEnabledState(id, enable: false);
-
-/// Enable or disable the test identified by [id].
-void _setTestEnabledState(int id, {bool enable: true}) {
-  // Try fast path first.
-  if (testCases.length > id && testCases[id].id == id) {
-    environment.testCases[id].enabled = enable;
-  } else {
-    for (var i = 0; i < testCases.length; i++) {
-      if (testCases[i].id != id) continue;
-      environment.testCases[i].enabled = enable;
-      break;
-    }
-  }
-}
-
-/// Throws a [StateError] if tests are running.
-void _requireNotRunning() {
-  if (environment.currentTestCaseIndex == -1) return;
-  throw new StateError('Not allowed when tests are running.');
-}
-
-/// Creates a test environment running in its own zone scope.
-///
-/// This allows for multiple invocations of the unittest library in the same
-/// application instance. This is useful when, for example, creating a test
-/// runner application which needs to create a new pristine test environment on
-/// each invocation to run a given set of tests.
-withTestEnvironment(callback()) {
-  return runZoned(callback,
-      zoneValues: {#unittest.environment: new TestEnvironment()});
-}
diff --git a/unittest/lib/vm_config.dart b/unittest/lib/vm_config.dart
deleted file mode 100644
index de214f3..0000000
--- a/unittest/lib/vm_config.dart
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// A simple unit test library for running tests on the VM.
-library unittest.vm_config;
-
-import 'dart:async';
-import 'dart:io';
-import 'unittest.dart';
-
-class VMConfiguration extends SimpleConfiguration {
-  // Color constants used for generating messages.
-  final String GREEN_COLOR = '\u001b[32m';
-  final String RED_COLOR = '\u001b[31m';
-  final String MAGENTA_COLOR = '\u001b[35m';
-  final String NO_COLOR = '\u001b[0m';
-
-  // We make this public so the user can turn it off if they want.
-  bool useColor;
-
-  VMConfiguration()
-      : useColor = stdioType(stdout) == StdioType.TERMINAL,
-        super();
-
-  String formatResult(TestCase testCase) {
-    String result = super.formatResult(testCase);
-    if (useColor) {
-      if (testCase.result == PASS) {
-        return "${GREEN_COLOR}${result}${NO_COLOR}";
-      } else if (testCase.result == FAIL) {
-        return "${RED_COLOR}${result}${NO_COLOR}";
-      } else if (testCase.result == ERROR) {
-        return "${MAGENTA_COLOR}${result}${NO_COLOR}";
-      }
-    }
-    return result;
-  }
-
-  void onInit() {
-    super.onInit();
-    filterStacks = formatStacks = true;
-  }
-
-  void onDone(bool success) {
-    int status;
-    try {
-      super.onDone(success);
-      status = 0;
-    } catch (ex) {
-      // A non-zero exit code is used by the test infrastructure to detect
-      // failure.
-      status = 1;
-    }
-    Future.wait([stdout.close(), stderr.close()]).then((_) {
-      exit(status);
-    });
-  }
-}
-
-void useVMConfiguration() {
-  unittestConfiguration = _singleton;
-}
-
-final _singleton = new VMConfiguration();
diff --git a/unittest/pubspec.yaml b/unittest/pubspec.yaml
deleted file mode 100644
index bc94363..0000000
--- a/unittest/pubspec.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-name: unittest
-version: 0.11.7
-author: Dart Team <misc@dartlang.org>
-description: A library for writing dart unit tests.
-homepage: https://github.com/dart-lang/old_unittest
-environment:
-  sdk: '>=1.0.0 <2.0.0'
-dependencies:
-  stack_trace: '>=0.9.0 <2.0.0'
-dev_dependencies:
-  metatest: '>=0.1.0 <0.2.0'