Regen all docs. (#700)

* Stop recursing if discovery == {}

* Generate docs with 'make docs'.
diff --git a/docs/dyn/people_v1.contactGroups.html b/docs/dyn/people_v1.contactGroups.html
new file mode 100644
index 0000000..947f0b9
--- /dev/null
+++ b/docs/dyn/people_v1.contactGroups.html
@@ -0,0 +1,465 @@
+<html><body>
+<style>
+
+body, h1, h2, h3, div, span, p, pre, a {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+body {
+  font-size: 13px;
+  padding: 1em;
+}
+
+h1 {
+  font-size: 26px;
+  margin-bottom: 1em;
+}
+
+h2 {
+  font-size: 24px;
+  margin-bottom: 1em;
+}
+
+h3 {
+  font-size: 20px;
+  margin-bottom: 1em;
+  margin-top: 1em;
+}
+
+pre, code {
+  line-height: 1.5;
+  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
+}
+
+pre {
+  margin-top: 0.5em;
+}
+
+h1, h2, h3, p {
+  font-family: Arial, sans serif;
+}
+
+h1, h2, h3 {
+  border-bottom: solid #CCC 1px;
+}
+
+.toc_element {
+  margin-top: 0.5em;
+}
+
+.firstline {
+  margin-left: 2 em;
+}
+
+.method  {
+  margin-top: 1em;
+  border: solid 1px #CCC;
+  padding: 1em;
+  background: #EEE;
+}
+
+.details {
+  font-weight: bold;
+  font-size: 14px;
+}
+
+</style>
+
+<h1><a href="people_v1.html">People API</a> . <a href="people_v1.contactGroups.html">contactGroups</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="people_v1.contactGroups.members.html">members()</a></code>
+</p>
+<p class="firstline">Returns the members Resource.</p>
+
+<p class="toc_element">
+  <code><a href="#batchGet">batchGet(resourceNames=None, maxMembers=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Get a list of contact groups owned by the authenticated user by specifying</p>
+<p class="toc_element">
+  <code><a href="#create">create(body, x__xgafv=None)</a></code></p>
+<p class="firstline">Create a new contact group owned by the authenticated user.</p>
+<p class="toc_element">
+  <code><a href="#delete">delete(resourceName, deleteContacts=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Delete an existing contact group owned by the authenticated user by</p>
+<p class="toc_element">
+  <code><a href="#get">get(resourceName, maxMembers=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Get a specific contact group owned by the authenticated user by specifying</p>
+<p class="toc_element">
+  <code><a href="#list">list(pageSize=None, syncToken=None, pageToken=None, x__xgafv=None)</a></code></p>
+<p class="firstline">List all contact groups owned by the authenticated user. Members of the</p>
+<p class="toc_element">
+  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
+<p class="firstline">Retrieves the next page of results.</p>
+<p class="toc_element">
+  <code><a href="#update">update(resourceName, body, x__xgafv=None)</a></code></p>
+<p class="firstline">Update the name of an existing contact group owned by the authenticated</p>
+<h3>Method Details</h3>
+<div class="method">
+    <code class="details" id="batchGet">batchGet(resourceNames=None, maxMembers=None, x__xgafv=None)</code>
+  <pre>Get a list of contact groups owned by the authenticated user by specifying
+a list of contact group resource names.
+
+Args:
+  resourceNames: string, The resource names of the contact groups to get. (repeated)
+  maxMembers: integer, Specifies the maximum number of members to return for each group.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # The response to a batch get contact groups request.
+    "responses": [ # The list of responses for each requested contact group resource.
+      { # The response for a specific contact group.
+        "status": { # The `Status` type defines a logical error model that is suitable for # The status of the response.
+            # different programming environments, including REST APIs and RPC APIs. It is
+            # used by [gRPC](https://github.com/grpc). Each `Status` message contains
+            # three pieces of data: error code, error message, and error details.
+            #
+            # You can find out more about this error model and how to work with it in the
+            # [API Design Guide](https://cloud.google.com/apis/design/errors).
+          "message": "A String", # 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.
+          "code": 42, # The status code, which should be an enum value of google.rpc.Code.
+          "details": [ # A list of messages that carry the error details.  There is a common set of
+              # message types for APIs to use.
+            {
+              "a_key": "", # Properties of the object. Contains field @type with type URL.
+            },
+          ],
+        },
+        "requestedResourceName": "A String", # The original requested resource name.
+        "contactGroup": { # A contact group. # The contact group.
+          "formattedName": "A String", # The read-only name translated and formatted in the viewer's account locale
+              # or the `Accept-Language` HTTP header locale for system groups names.
+              # Group names set by the owner are the same as name.
+          "groupType": "A String", # The read-only contact group type.
+          "name": "A String", # The contact group name set by the group owner or a system provided name
+              # for system groups.
+          "memberResourceNames": [ # The list of contact person resource names that are members of the contact
+              # group. The field is not populated for LIST requests and can only be updated
+              # through the
+              # [ModifyContactGroupMembers](/people/api/rest/v1/contactgroups/members/modify).
+            "A String",
+          ],
+          "memberCount": 42, # The total number of contacts in the group irrespective of max members in
+              # specified in the request.
+          "etag": "A String", # The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the
+              # resource. Used for web cache validation.
+          "resourceName": "A String", # The resource name for the contact group, assigned by the server. An ASCII
+              # string, in the form of `contactGroups/`<var>contact_group_id</var>.
+          "metadata": { # The read-only metadata about a contact group. # Metadata about the contact group.
+            "deleted": True or False, # True if the contact group resource has been deleted. Populated only for
+                # [`ListContactGroups`](/people/api/rest/v1/contactgroups/list) requests
+                # that include a sync token.
+            "updateTime": "A String", # The time the group was last updated.
+          },
+        },
+      },
+    ],
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="create">create(body, x__xgafv=None)</code>
+  <pre>Create a new contact group owned by the authenticated user.
+
+Args:
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # A request to create a new contact group.
+    "contactGroup": { # A contact group. # The contact group to create.
+      "formattedName": "A String", # The read-only name translated and formatted in the viewer's account locale
+          # or the `Accept-Language` HTTP header locale for system groups names.
+          # Group names set by the owner are the same as name.
+      "groupType": "A String", # The read-only contact group type.
+      "name": "A String", # The contact group name set by the group owner or a system provided name
+          # for system groups.
+      "memberResourceNames": [ # The list of contact person resource names that are members of the contact
+          # group. The field is not populated for LIST requests and can only be updated
+          # through the
+          # [ModifyContactGroupMembers](/people/api/rest/v1/contactgroups/members/modify).
+        "A String",
+      ],
+      "memberCount": 42, # The total number of contacts in the group irrespective of max members in
+          # specified in the request.
+      "etag": "A String", # The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the
+          # resource. Used for web cache validation.
+      "resourceName": "A String", # The resource name for the contact group, assigned by the server. An ASCII
+          # string, in the form of `contactGroups/`<var>contact_group_id</var>.
+      "metadata": { # The read-only metadata about a contact group. # Metadata about the contact group.
+        "deleted": True or False, # True if the contact group resource has been deleted. Populated only for
+            # [`ListContactGroups`](/people/api/rest/v1/contactgroups/list) requests
+            # that include a sync token.
+        "updateTime": "A String", # The time the group was last updated.
+      },
+    },
+  }
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A contact group.
+    "formattedName": "A String", # The read-only name translated and formatted in the viewer's account locale
+        # or the `Accept-Language` HTTP header locale for system groups names.
+        # Group names set by the owner are the same as name.
+    "groupType": "A String", # The read-only contact group type.
+    "name": "A String", # The contact group name set by the group owner or a system provided name
+        # for system groups.
+    "memberResourceNames": [ # The list of contact person resource names that are members of the contact
+        # group. The field is not populated for LIST requests and can only be updated
+        # through the
+        # [ModifyContactGroupMembers](/people/api/rest/v1/contactgroups/members/modify).
+      "A String",
+    ],
+    "memberCount": 42, # The total number of contacts in the group irrespective of max members in
+        # specified in the request.
+    "etag": "A String", # The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the
+        # resource. Used for web cache validation.
+    "resourceName": "A String", # The resource name for the contact group, assigned by the server. An ASCII
+        # string, in the form of `contactGroups/`<var>contact_group_id</var>.
+    "metadata": { # The read-only metadata about a contact group. # Metadata about the contact group.
+      "deleted": True or False, # True if the contact group resource has been deleted. Populated only for
+          # [`ListContactGroups`](/people/api/rest/v1/contactgroups/list) requests
+          # that include a sync token.
+      "updateTime": "A String", # The time the group was last updated.
+    },
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="delete">delete(resourceName, deleteContacts=None, x__xgafv=None)</code>
+  <pre>Delete an existing contact group owned by the authenticated user by
+specifying a contact group resource name.
+
+Args:
+  resourceName: string, The resource name of the contact group to delete. (required)
+  deleteContacts: boolean, Set to true to also delete the contacts in the specified group.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # 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 `{}`.
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="get">get(resourceName, maxMembers=None, x__xgafv=None)</code>
+  <pre>Get a specific contact group owned by the authenticated user by specifying
+a contact group resource name.
+
+Args:
+  resourceName: string, The resource name of the contact group to get. (required)
+  maxMembers: integer, Specifies the maximum number of members to return.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A contact group.
+    "formattedName": "A String", # The read-only name translated and formatted in the viewer's account locale
+        # or the `Accept-Language` HTTP header locale for system groups names.
+        # Group names set by the owner are the same as name.
+    "groupType": "A String", # The read-only contact group type.
+    "name": "A String", # The contact group name set by the group owner or a system provided name
+        # for system groups.
+    "memberResourceNames": [ # The list of contact person resource names that are members of the contact
+        # group. The field is not populated for LIST requests and can only be updated
+        # through the
+        # [ModifyContactGroupMembers](/people/api/rest/v1/contactgroups/members/modify).
+      "A String",
+    ],
+    "memberCount": 42, # The total number of contacts in the group irrespective of max members in
+        # specified in the request.
+    "etag": "A String", # The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the
+        # resource. Used for web cache validation.
+    "resourceName": "A String", # The resource name for the contact group, assigned by the server. An ASCII
+        # string, in the form of `contactGroups/`<var>contact_group_id</var>.
+    "metadata": { # The read-only metadata about a contact group. # Metadata about the contact group.
+      "deleted": True or False, # True if the contact group resource has been deleted. Populated only for
+          # [`ListContactGroups`](/people/api/rest/v1/contactgroups/list) requests
+          # that include a sync token.
+      "updateTime": "A String", # The time the group was last updated.
+    },
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list">list(pageSize=None, syncToken=None, pageToken=None, x__xgafv=None)</code>
+  <pre>List all contact groups owned by the authenticated user. Members of the
+contact groups are not populated.
+
+Args:
+  pageSize: integer, The maximum number of resources to return.
+  syncToken: string, A sync token, returned by a previous call to `contactgroups.list`.
+Only resources changed since the sync token was created will be returned.
+  pageToken: string, The next_page_token value returned from a previous call to
+[ListContactGroups](/people/api/rest/v1/contactgroups/list).
+Requests the next page of resources.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # The response to a list contact groups request.
+    "nextPageToken": "A String", # The token that can be used to retrieve the next page of results.
+    "contactGroups": [ # The list of contact groups. Members of the contact groups are not
+        # populated.
+      { # A contact group.
+        "formattedName": "A String", # The read-only name translated and formatted in the viewer's account locale
+            # or the `Accept-Language` HTTP header locale for system groups names.
+            # Group names set by the owner are the same as name.
+        "groupType": "A String", # The read-only contact group type.
+        "name": "A String", # The contact group name set by the group owner or a system provided name
+            # for system groups.
+        "memberResourceNames": [ # The list of contact person resource names that are members of the contact
+            # group. The field is not populated for LIST requests and can only be updated
+            # through the
+            # [ModifyContactGroupMembers](/people/api/rest/v1/contactgroups/members/modify).
+          "A String",
+        ],
+        "memberCount": 42, # The total number of contacts in the group irrespective of max members in
+            # specified in the request.
+        "etag": "A String", # The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the
+            # resource. Used for web cache validation.
+        "resourceName": "A String", # The resource name for the contact group, assigned by the server. An ASCII
+            # string, in the form of `contactGroups/`<var>contact_group_id</var>.
+        "metadata": { # The read-only metadata about a contact group. # Metadata about the contact group.
+          "deleted": True or False, # True if the contact group resource has been deleted. Populated only for
+              # [`ListContactGroups`](/people/api/rest/v1/contactgroups/list) requests
+              # that include a sync token.
+          "updateTime": "A String", # The time the group was last updated.
+        },
+      },
+    ],
+    "nextSyncToken": "A String", # The token that can be used to retrieve changes since the last request.
+    "totalItems": 42, # The total number of items in the list without pagination.
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
+  <pre>Retrieves the next page of results.
+
+Args:
+  previous_request: The request for the previous page. (required)
+  previous_response: The response from the request for the previous page. (required)
+
+Returns:
+  A request object that you can call 'execute()' on to request the next
+  page. Returns None if there are no more items in the collection.
+    </pre>
+</div>
+
+<div class="method">
+    <code class="details" id="update">update(resourceName, body, x__xgafv=None)</code>
+  <pre>Update the name of an existing contact group owned by the authenticated
+user.
+
+Args:
+  resourceName: string, The resource name for the contact group, assigned by the server. An ASCII
+string, in the form of `contactGroups/`<var>contact_group_id</var>. (required)
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # A request to update an existing user contact group. All updated fields will
+      # be replaced.
+    "contactGroup": { # A contact group. # The contact group to update.
+      "formattedName": "A String", # The read-only name translated and formatted in the viewer's account locale
+          # or the `Accept-Language` HTTP header locale for system groups names.
+          # Group names set by the owner are the same as name.
+      "groupType": "A String", # The read-only contact group type.
+      "name": "A String", # The contact group name set by the group owner or a system provided name
+          # for system groups.
+      "memberResourceNames": [ # The list of contact person resource names that are members of the contact
+          # group. The field is not populated for LIST requests and can only be updated
+          # through the
+          # [ModifyContactGroupMembers](/people/api/rest/v1/contactgroups/members/modify).
+        "A String",
+      ],
+      "memberCount": 42, # The total number of contacts in the group irrespective of max members in
+          # specified in the request.
+      "etag": "A String", # The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the
+          # resource. Used for web cache validation.
+      "resourceName": "A String", # The resource name for the contact group, assigned by the server. An ASCII
+          # string, in the form of `contactGroups/`<var>contact_group_id</var>.
+      "metadata": { # The read-only metadata about a contact group. # Metadata about the contact group.
+        "deleted": True or False, # True if the contact group resource has been deleted. Populated only for
+            # [`ListContactGroups`](/people/api/rest/v1/contactgroups/list) requests
+            # that include a sync token.
+        "updateTime": "A String", # The time the group was last updated.
+      },
+    },
+  }
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A contact group.
+    "formattedName": "A String", # The read-only name translated and formatted in the viewer's account locale
+        # or the `Accept-Language` HTTP header locale for system groups names.
+        # Group names set by the owner are the same as name.
+    "groupType": "A String", # The read-only contact group type.
+    "name": "A String", # The contact group name set by the group owner or a system provided name
+        # for system groups.
+    "memberResourceNames": [ # The list of contact person resource names that are members of the contact
+        # group. The field is not populated for LIST requests and can only be updated
+        # through the
+        # [ModifyContactGroupMembers](/people/api/rest/v1/contactgroups/members/modify).
+      "A String",
+    ],
+    "memberCount": 42, # The total number of contacts in the group irrespective of max members in
+        # specified in the request.
+    "etag": "A String", # The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the
+        # resource. Used for web cache validation.
+    "resourceName": "A String", # The resource name for the contact group, assigned by the server. An ASCII
+        # string, in the form of `contactGroups/`<var>contact_group_id</var>.
+    "metadata": { # The read-only metadata about a contact group. # Metadata about the contact group.
+      "deleted": True or False, # True if the contact group resource has been deleted. Populated only for
+          # [`ListContactGroups`](/people/api/rest/v1/contactgroups/list) requests
+          # that include a sync token.
+      "updateTime": "A String", # The time the group was last updated.
+    },
+  }</pre>
+</div>
+
+</body></html>
\ No newline at end of file